mirror of
https://git.savannah.nongnu.org/git/lwip.git
synced 2025-08-08 23:44:39 +08:00
etharp.c: Corrected DHCP_DOES_ARP_CHECK behaviour.
This commit is contained in:
parent
b429918b32
commit
928dd94ba6
@ -130,7 +130,7 @@ etharp_init(void)
|
|||||||
/**
|
/**
|
||||||
* Clears expired entries in the ARP table.
|
* Clears expired entries in the ARP table.
|
||||||
*
|
*
|
||||||
* This function should be called every ETHARP_TMR_INTERVAL microseconds (10 seconds),
|
* This function should be called every ETHARP_TMR_INTERVAL microseconds (5 seconds),
|
||||||
* in order to expire entries in the ARP table.
|
* in order to expire entries in the ARP table.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@ -201,8 +201,9 @@ etharp_tmr(void)
|
|||||||
*/
|
*/
|
||||||
static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags)
|
static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags)
|
||||||
{
|
{
|
||||||
s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE, empty = ARP_TABLE_SIZE, i;
|
s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
|
||||||
u8_t age_pending = 0, age_stable = 0;
|
s8_t empty = ARP_TABLE_SIZE;
|
||||||
|
u8_t i = 0, age_pending = 0, age_stable = 0;
|
||||||
#if ARP_QUEUEING
|
#if ARP_QUEUEING
|
||||||
/* oldest entry with packets on queue */
|
/* oldest entry with packets on queue */
|
||||||
s8_t old_queue = ARP_TABLE_SIZE;
|
s8_t old_queue = ARP_TABLE_SIZE;
|
||||||
@ -272,7 +273,7 @@ static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags)
|
|||||||
/* { we have no match } => try to create a new entry */
|
/* { we have no match } => try to create a new entry */
|
||||||
|
|
||||||
/* no empty entry found and not allowed to recycle? */
|
/* no empty entry found and not allowed to recycle? */
|
||||||
if ((i == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0))
|
if ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0))
|
||||||
{
|
{
|
||||||
return (s8_t)ERR_MEM;
|
return (s8_t)ERR_MEM;
|
||||||
}
|
}
|
||||||
@ -311,8 +312,10 @@ static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags)
|
|||||||
/* recycle oldest pending */
|
/* recycle oldest pending */
|
||||||
i = old_queue;
|
i = old_queue;
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: selecting oldest pending entry %d, freeing packet queue %p\n", i, (void *)(arp_table[i].p)));
|
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: selecting oldest pending entry %d, freeing packet queue %p\n", i, (void *)(arp_table[i].p)));
|
||||||
/* no empty or recyclable entries found */
|
pbuf_free(arp_table[i].p);
|
||||||
|
arp_table[i].p = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
/* no empty or recyclable entries found */
|
||||||
} else {
|
} else {
|
||||||
return (s8_t)ERR_MEM;
|
return (s8_t)ERR_MEM;
|
||||||
}
|
}
|
||||||
@ -323,17 +326,13 @@ static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags)
|
|||||||
|
|
||||||
/* recycle entry (no-op for an already empty entry) */
|
/* recycle entry (no-op for an already empty entry) */
|
||||||
arp_table[i].state = ETHARP_STATE_EMPTY;
|
arp_table[i].state = ETHARP_STATE_EMPTY;
|
||||||
|
|
||||||
/* IP address given? */
|
/* IP address given? */
|
||||||
if (ipaddr != NULL) {
|
if (ipaddr != NULL) {
|
||||||
/* set IP address */
|
/* set IP address */
|
||||||
ip_addr_set(&arp_table[i].ipaddr, ipaddr);
|
ip_addr_set(&arp_table[i].ipaddr, ipaddr);
|
||||||
}
|
}
|
||||||
arp_table[i].ctime = 0;
|
arp_table[i].ctime = 0;
|
||||||
#if ARP_QUEUEING
|
|
||||||
/* remove any queued packets */
|
|
||||||
if (arp_table[i].p != NULL) pbuf_free(arp_table[i].p);
|
|
||||||
arp_table[i].p = NULL;
|
|
||||||
#endif
|
|
||||||
return (err_t)i;
|
return (err_t)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -556,8 +555,9 @@ etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
|||||||
/* ARP reply. We already updated the ARP cache earlier. */
|
/* ARP reply. We already updated the ARP cache earlier. */
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n"));
|
LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n"));
|
||||||
#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
|
#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
|
||||||
/* DHCP wants to know about ARP replies to our wanna-have-address */
|
/* When unconfigured, DHCP wants to know about ARP replies from the
|
||||||
if (for_us) dhcp_arp_reply(netif, &sipaddr);
|
* address offered to us, as that means someone else uses it already! */
|
||||||
|
if (netif->ip_addr.addr == 0) dhcp_arp_reply(netif, &sipaddr);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user