mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-02 12:52:10 +00:00
etharp_tmr function had a bug (pending entries were pending for too long)
This commit is contained in:
parent
88b1cebe1d
commit
4848de3a8e
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user