3 |
* Address Resolution Protocol module for IP over Ethernet |
* Address Resolution Protocol module for IP over Ethernet |
4 |
* |
* |
5 |
* $Log$ |
* $Log$ |
6 |
|
* Revision 1.22 2003/01/13 09:38:21 jani |
7 |
|
* remove global ctime.Each entry's ctime is now absolute.This avoids wrapping and also solves naming clash reported on the list |
8 |
|
* |
9 |
* Revision 1.21 2003/01/08 11:04:36 likewise |
* Revision 1.21 2003/01/08 11:04:36 likewise |
10 |
* Moved ETHARP_ALWAYS_INSERT switch to lwipopts.h |
* Moved ETHARP_ALWAYS_INSERT switch to lwipopts.h |
11 |
* |
* |
140 |
|
|
141 |
static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}; |
static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}; |
142 |
static struct etharp_entry arp_table[ARP_TABLE_SIZE]; |
static struct etharp_entry arp_table[ARP_TABLE_SIZE]; |
|
static u8_t ctime; |
|
143 |
|
|
144 |
static struct pbuf *update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags); |
static struct pbuf *update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags); |
145 |
#define ARP_INSERT_FLAG 1 |
#define ARP_INSERT_FLAG 1 |
158 |
arp_table[i].p = NULL; |
arp_table[i].p = NULL; |
159 |
#endif |
#endif |
160 |
} |
} |
|
/* reset ARP current time */ |
|
|
ctime = 0; |
|
161 |
} |
} |
162 |
|
|
163 |
/** |
/** |
171 |
{ |
{ |
172 |
u8_t i; |
u8_t i; |
173 |
|
|
|
++ctime; |
|
174 |
DEBUGF(ETHARP_DEBUG, ("etharp_timer\n")); |
DEBUGF(ETHARP_DEBUG, ("etharp_timer\n")); |
175 |
/* remove expired entries from the ARP table */ |
/* remove expired entries from the ARP table */ |
176 |
for(i = 0; i < ARP_TABLE_SIZE; ++i) { |
for(i = 0; i < ARP_TABLE_SIZE; ++i) { |
177 |
|
arp_table[i].ctime++; |
178 |
if((arp_table[i].state == ETHARP_STATE_STABLE) && |
if((arp_table[i].state == ETHARP_STATE_STABLE) && |
179 |
(ctime - arp_table[i].ctime >= ARP_MAXAGE)) { |
(arp_table[i].ctime >= ARP_MAXAGE)) { |
180 |
DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired stable entry %u.\n", i)); |
DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired stable entry %u.\n", i)); |
181 |
arp_table[i].state = ETHARP_STATE_EMPTY; |
arp_table[i].state = ETHARP_STATE_EMPTY; |
182 |
#if ARP_QUEUEING |
#if ARP_QUEUEING |
185 |
arp_table[i].p = NULL; |
arp_table[i].p = NULL; |
186 |
#endif |
#endif |
187 |
} else if((arp_table[i].state == ETHARP_STATE_PENDING) && |
} else if((arp_table[i].state == ETHARP_STATE_PENDING) && |
188 |
(ctime - arp_table[i].ctime >= ARP_MAXPENDING)) { |
(arp_table[i].ctime >= ARP_MAXPENDING)) { |
189 |
arp_table[i].state = ETHARP_STATE_EMPTY; |
arp_table[i].state = ETHARP_STATE_EMPTY; |
190 |
#if ARP_QUEUEING |
#if ARP_QUEUEING |
191 |
DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired pending entry %u - dequeueing %p.\n", i, (void *)(arp_table[i].p))); |
DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired pending entry %u - dequeueing %p.\n", i, (void *)(arp_table[i].p))); |
227 |
for(i = 0; i < ARP_TABLE_SIZE; ++i) { |
for(i = 0; i < ARP_TABLE_SIZE; ++i) { |
228 |
/* remember entry with oldest stable entry in j*/ |
/* remember entry with oldest stable entry in j*/ |
229 |
if((arp_table[i].state == ETHARP_STATE_STABLE) && |
if((arp_table[i].state == ETHARP_STATE_STABLE) && |
230 |
(ctime - arp_table[i].ctime > maxtime)) { |
(arp_table[i].ctime > maxtime)) { |
231 |
maxtime = ctime - arp_table[i].ctime; |
maxtime = arp_table[i].ctime; |
232 |
j = i; |
j = i; |
233 |
} |
} |
234 |
} |
} |
289 |
for(k = 0; k < 6; ++k) { |
for(k = 0; k < 6; ++k) { |
290 |
arp_table[i].ethaddr.addr[k] = ethaddr->addr[k]; |
arp_table[i].ethaddr.addr[k] = ethaddr->addr[k]; |
291 |
} |
} |
292 |
/* time stamp */ |
/* reset time stamp */ |
293 |
arp_table[i].ctime = ctime; |
arp_table[i].ctime = 0; |
294 |
#if ARP_QUEUEING |
#if ARP_QUEUEING |
295 |
/* queued packet present? */ |
/* queued packet present? */ |
296 |
if(arp_table[i].p != NULL) { |
if(arp_table[i].p != NULL) { |
346 |
for(k = 0; k < 6; ++k) { |
for(k = 0; k < 6; ++k) { |
347 |
arp_table[i].ethaddr.addr[k] = ethaddr->addr[k]; |
arp_table[i].ethaddr.addr[k] = ethaddr->addr[k]; |
348 |
} |
} |
349 |
/* time-stamp */ |
/* reset time-stamp */ |
350 |
arp_table[i].ctime = ctime; |
arp_table[i].ctime = 0; |
351 |
/* mark as stable */ |
/* mark as stable */ |
352 |
arp_table[i].state = ETHARP_STATE_STABLE; |
arp_table[i].state = ETHARP_STATE_STABLE; |
353 |
/* no queued packet */ |
/* no queued packet */ |
698 |
DEBUGF(ETHARP_DEBUG, ("etharp_query: created ARP table entry.\n")); |
DEBUGF(ETHARP_DEBUG, ("etharp_query: created ARP table entry.\n")); |
699 |
/* i is available, create ARP entry */ |
/* i is available, create ARP entry */ |
700 |
ip_addr_set(&arp_table[i].ipaddr, ipaddr); |
ip_addr_set(&arp_table[i].ipaddr, ipaddr); |
701 |
arp_table[i].ctime = ctime; |
arp_table[i].ctime = 0; |
702 |
arp_table[i].state = ETHARP_STATE_PENDING; |
arp_table[i].state = ETHARP_STATE_PENDING; |
703 |
#if ARP_QUEUEING |
#if ARP_QUEUEING |
704 |
arp_table[i].p = NULL; |
arp_table[i].p = NULL; |