uIP 1.0
C:/asm/STM32-ethernet/ENC28J60prj/uip-master/uip/uip-neighbor.c
См. документацию.
00001 /*
00002  * Copyright (c) 2006, Swedish Institute of Computer Science.
00003  * Все права зарезервированы. *
00004  * Повторное распространение, использование в исходном и двоичном виде,
00005  * с модификацией или без - разрешается, если выполняются следующие
00006  * условия:
00007  * 1. Распространение исходного кода должно сохранить вышеуказанную пометку
00008  *    копирайта, этот список условий и следующую правовую оговорку.
00009  * 2. Распространение исходного кода должно сохранить вышеуказанную пометку
00010  *    копирайта, этот список условий и следующую правовую оговорку в
00011  *    документации и/или других материалах, которые будут предоставлены
00012  *    вместе с распространяемыми материалами.
00013  * 3. Имя автора не может использоваться, чтобы подтвердить или продвинуть
00014  *    продукты, написанные с использованием этого программного обеспечения
00015  *    без специального на то разрешения.
00016  *
00017  * ЭТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ АВТОРОМ ``КАК ЕСТЬ'', БЕЗ
00018  * КАКОЙ-ЛИБО ЛЮБОЙ РАСШИРЕННОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ГАРАНТИИ, ВКЛЮЧАЯ,
00019  * НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ГАРАНТИИ ВЫСОКОГО СПРОСА И ПРИГОДНОСТИ
00020  * ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. АВТОР НИ ПРИ КАКИХ УСЛОВИЯХ НЕ ОТВЕТСТВЕНЕН
00021  * ЗА ЛЮБЫЕ УБЫТКИ - ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ОБРАЗЦОВЫЕ
00022  * ИЛИ ПОСЛЕДОВАТЕЛЬНЫЕ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМ, ТРЕБОВАНИЯ
00023  * ЗАМЕНЫ ТОВАРА ИЛИ СЕРВИСА; ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ВЫГОДЫ;
00024  * ИЛИ ПРЕКРАЩЕНИЕ БИЗНЕСА), ОДНАКО ВЫЗВАННЫЕ ПО ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ,
00025  * ЛИБО В КОНТРАКТЕ, ПРЯМОЙ ОТВЕТСТВЕННОСТИ, ЛИБО В НАРУШЕНИИ ЗАКОННЫХ ПРАВ
00026  * (ВКЛЮЧАЯ ТАК ИЛИ ИНАЧЕ НЕБРЕЖНОСТЬ), ВОЗНИКАЮЩИЕ ВСЕГДА ИЗ ИСПОЛЬЗОВАНИЯ
00027  * ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ
00028  * ТАКОГО ПОВРЕЖДЕНИЯ.
00029  *
00030  * Этот файл является частью стека uIP TCP/IP.
00031  *
00032  * $Id: uip-neighbor.c,v 1.2 2006/06/12 08:00:30 adam Exp $
00033  */
00034 
00035 /**
00036  * \file
00037  *         База данных локальных связей с соседями, используемая кодом IPv6,
00038  *         что будет задействовано в будущей ревизии кода ARP.
00039  * \author
00040  *         Adam Dunkels <adam@sics.se>
00041  */
00042 
00043 #include "uip-neighbor.h"
00044 
00045 #include <string.h>
00046 
00047 #define MAX_TIME 128
00048 
00049 #ifdef UIP_NEIGHBOR_CONF_ENTRIES
00050 #define ENTRIES UIP_NEIGHBOR_CONF_ENTRIES
00051 #else /* UIP_NEIGHBOR_CONF_ENTRIES */
00052 #define ENTRIES 8
00053 #endif /* UIP_NEIGHBOR_CONF_ENTRIES */
00054 
00055 struct neighbor_entry {
00056   uip_ipaddr_t ipaddr;
00057   struct uip_neighbor_addr addr;
00058   u8_t time;
00059 };
00060 static struct neighbor_entry entries[ENTRIES];
00061 
00062 /*---------------------------------------------------------------------------*/
00063 void
00064 uip_neighbor_init(void)
00065 {
00066   int i;
00067 
00068   for(i = 0; i < ENTRIES; ++i) {
00069     entries[i].time = MAX_TIME;
00070   }
00071 }
00072 /*---------------------------------------------------------------------------*/
00073 void
00074 uip_neighbor_periodic(void)
00075 {
00076   int i;
00077 
00078   for(i = 0; i < ENTRIES; ++i) {
00079     if(entries[i].time < MAX_TIME) {
00080       entries[i].time++;
00081     }
00082   }
00083 }
00084 /*---------------------------------------------------------------------------*/
00085 void
00086 uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr)
00087 {
00088   int i, oldest;
00089   u8_t oldest_time;
00090 
00091   printf("Adding neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n",
00092       addr->addr.addr[0], addr->addr.addr[1], addr->addr.addr[2], addr->addr.addr[3],
00093       addr->addr.addr[4], addr->addr.addr[5]);
00094   
00095   /* Найдем первую свободную запист или самую старую используемую запись. */
00096   oldest_time = 0;
00097   oldest = 0;
00098   for(i = 0; i < ENTRIES; ++i) {
00099     if(entries[i].time == MAX_TIME) {
00100       oldest = i;
00101       break;
00102     }
00103     if(uip_ipaddr_cmp(entries[i].ipaddr, addr)) {
00104       oldest = i;
00105       break;
00106     }
00107     if(entries[i].time > oldest_time) {
00108       oldest = i;
00109       oldest_time = entries[i].time;
00110     }
00111   }
00112 
00113   /* Использование старейшей или первой свободной записи (любой, на которую
00114      указывает переменная "oldest"). */
00115   entries[oldest].time = 0;
00116   uip_ipaddr_copy(entries[oldest].ipaddr, ipaddr);
00117   memcpy(&entries[oldest].addr, addr, sizeof(struct uip_neighbor_addr));
00118 }
00119 /*---------------------------------------------------------------------------*/
00120 static struct neighbor_entry *
00121 find_entry(uip_ipaddr_t ipaddr)
00122 {
00123   int i;
00124   
00125   for(i = 0; i < ENTRIES; ++i) {
00126     if(uip_ipaddr_cmp(entries[i].ipaddr, ipaddr)) {
00127       return &entries[i];
00128     }
00129   }
00130   return NULL;
00131 }
00132 /*---------------------------------------------------------------------------*/
00133 void
00134 uip_neighbor_update(uip_ipaddr_t ipaddr)
00135 {
00136   struct neighbor_entry *e;
00137 
00138   e = find_entry(ipaddr);
00139   if(e != NULL) {
00140     e->time = 0;
00141   }
00142 }
00143 /*---------------------------------------------------------------------------*/
00144 struct uip_neighbor_addr *
00145 uip_neighbor_lookup(uip_ipaddr_t ipaddr)
00146 {
00147   struct neighbor_entry *e;
00148 
00149   e = find_entry(ipaddr);
00150   if(e != NULL) {
00151     /* printf("Lookup neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n",
00152          e->addr.addr.addr[0], e->addr.addr.addr[1], e->addr.addr.addr[2], e->addr.addr.addr[3],
00153          e->addr.addr.addr[4], e->addr.addr.addr[5]);*/
00154 
00155     return &e->addr;
00156   }
00157   return NULL;
00158 }
00159 /*---------------------------------------------------------------------------*/