etharp_tmr function had a bug (pending entries were pending for too long)

This commit is contained in:
goldsimon 2007-06-24 12:46:13 +00:00
parent 88b1cebe1d
commit 4848de3a8e

View File

@ -61,14 +61,16 @@
#endif /* LWIP_AUTOIP */ #endif /* LWIP_AUTOIP */
/** the time an ARP entry stays valid after its last update, /** the time an ARP entry stays valid after its last update,
* (240 * 5) seconds = 20 minutes. * for ARP_TMR_INTERVAL = 5000, this is
* (240 * 5) seconds = 20 minutes.
*/ */
#define ARP_MAXAGE 240 #define ARP_MAXAGE 240
/** the time an ARP entry stays pending after first request, /** the time an ARP entry stays pending after first request,
* (2 * 5) seconds = 10 seconds. * for ARP_TMR_INTERVAL = 5000, this is
* (2 * 5) seconds = 10 seconds.
* *
* @internal Keep this number at least 2, otherwise it might * @internal Keep this number at least 2, otherwise it might
* run out instantly if the timeout occurs directly after a request. * run out instantly if the timeout occurs directly after a request.
*/ */
#define ARP_MAXPENDING 2 #define ARP_MAXPENDING 2
@ -122,6 +124,8 @@ etharp_init(void)
u8_t i; u8_t i;
/* clear ARP entries */ /* clear ARP entries */
for (i = 0; i < ARP_TABLE_SIZE; ++i) { for (i = 0; i < ARP_TABLE_SIZE; ++i) {
/* use memset to be safe (intialize all future variables to 0) */
memset(&arp_table[i], 0, sizeof(struct etharp_entry));
arp_table[i].state = ETHARP_STATE_EMPTY; arp_table[i].state = ETHARP_STATE_EMPTY;
#if ARP_QUEUEING #if ARP_QUEUEING
arp_table[i].q = NULL; arp_table[i].q = NULL;
@ -168,9 +172,10 @@ etharp_tmr(void)
/* remove expired entries from the ARP table */ /* remove expired entries from the ARP table */
for (i = 0; i < ARP_TABLE_SIZE; ++i) { for (i = 0; i < ARP_TABLE_SIZE; ++i) {
arp_table[i].ctime++; arp_table[i].ctime++;
if (((arp_table[i].state == ETHARP_STATE_STABLE) || if (((arp_table[i].state == ETHARP_STATE_STABLE) &&
(arp_table[i].state == ETHARP_STATE_PENDING)) && (arp_table[i].ctime >= ARP_MAXAGE)) ||
(arp_table[i].ctime >= ARP_MAXAGE)) { ((arp_table[i].state == ETHARP_STATE_PENDING) &&
(arp_table[i].ctime >= ARP_MAXPENDING))) {
/* pending or stable entry has become old! */ /* pending or stable entry has become old! */
LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n", LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n",
arp_table[i].state == ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i)); arp_table[i].state == ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i));
@ -560,8 +565,9 @@ etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
LWIP_ERROR("netif != NULL", (netif != NULL), return;); LWIP_ERROR("netif != NULL", (netif != NULL), return;);
/* drop short ARP packets */ /* drop short ARP packets: we have to check for p->len instead of p->tot_len here
if (p->tot_len < sizeof(struct etharp_hdr)) { since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */
if (p->len < sizeof(struct etharp_hdr)) {
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | 1, ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len, (s16_t)sizeof(struct etharp_hdr))); LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | 1, ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len, (s16_t)sizeof(struct etharp_hdr)));
pbuf_free(p); pbuf_free(p);
return; return;