Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00042 #include "uip-neighbor.h"
00043
00044 #include <string.h>
00045 #include <stdio.h>
00046
00047 #define MAX_TIME 128
00048
00049 #ifdef UIP_NEIGHBOR_CONF_ENTRIES
00050 #define ENTRIES UIP_NEIGHBOR_CONF_ENTRIES
00051 #else
00052 #define ENTRIES 8
00053 #endif
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
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
00152
00153
00154
00155 return &e->addr;
00156 }
00157 return NULL;
00158 }
00159