fixed bug #34682 Limit ARP request flood for unresolved entry

This commit is contained in:
Simon Goldschmidt 2014-02-22 21:23:06 +01:00
parent fc158ad5c0
commit 05a967564a
3 changed files with 21 additions and 14 deletions

View File

@ -96,6 +96,9 @@ HISTORY
++ Bugfixes:
2014-02-22: Simon Goldschmidt (patch by Amir Shalem)
* etharp.h/.c: fixed bug #34682 Limit ARP request flood for unresolved entry
2014-02-20: Simon Goldschmidt
* tcp_out.c: fixed bug #39683 Assertion "seg->tcphdr not aligned" failed with
MEM_ALIGNMENT = 8

View File

@ -137,8 +137,8 @@ PACK_STRUCT_END
#define SIZEOF_ETHARP_PACKET_TX SIZEOF_ETHARP_PACKET
#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */
/** 5 seconds period */
#define ARP_TMR_INTERVAL 5000
/** 1 seconds period */
#define ARP_TMR_INTERVAL 1000
#define ETHTYPE_ARP 0x0806U
#define ETHTYPE_IP 0x0800U

View File

@ -74,22 +74,22 @@ const struct eth_addr ethzero = {{0,0,0,0,0,0}};
#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */
/** the time an ARP entry stays valid after its last update,
* for ARP_TMR_INTERVAL = 5000, this is
* (240 * 5) seconds = 20 minutes.
* for ARP_TMR_INTERVAL = 1000, this is
* (60 * 20) seconds = 20 minutes.
*/
#define ARP_MAXAGE 240
#define ARP_MAXAGE (60*20)
/** Re-request a used ARP entry 1 minute before it would expire to prevent
* breaking a steadily used connection because the ARP entry timed out. */
#define ARP_AGE_REREQUEST_USED (ARP_MAXAGE - 12)
#define ARP_AGE_REREQUEST_USED (ARP_MAXAGE - 60)
/** the time an ARP entry stays pending after first request,
* for ARP_TMR_INTERVAL = 5000, this is
* (2 * 5) seconds = 10 seconds.
* for ARP_TMR_INTERVAL = 1000, this is
* 10 seconds.
*
* @internal Keep this number at least 2, otherwise it might
* run out instantly if the timeout occurs directly after a request.
*/
#define ARP_MAXPENDING 2
#define ARP_MAXPENDING 5
#define HWTYPE_ETHERNET 1
@ -232,12 +232,12 @@ etharp_tmr(void)
re-send an ARP request. */
arp_table[i].state = ETHARP_STATE_STABLE;
}
#if ARP_QUEUEING
/* still pending entry? (not expired) */
if (arp_table[i].state == ETHARP_STATE_PENDING) {
else if (arp_table[i].state == ETHARP_STATE_PENDING) {
/* resend an ARP query here? */
if (etharp_request(arp_table[i].netif, &arp_table[i].ipaddr) != ERR_OK) {
}
}
#endif /* ARP_QUEUEING */
}
}
}
@ -1041,6 +1041,7 @@ etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
{
struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
err_t result = ERR_MEM;
int is_new_entry = 0;
s8_t i; /* ARP entry index */
/* non-unicast address? */
@ -1066,7 +1067,10 @@ etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
/* mark a fresh entry as pending (we just sent a request) */
if (arp_table[i].state == ETHARP_STATE_EMPTY) {
is_new_entry = 1;
arp_table[i].state = ETHARP_STATE_PENDING;
/* record network interface for re-sending arp request in etharp_tmr */
arp_table[i].netif = netif;
}
/* { i is either a STABLE or (new or existing) PENDING entry } */
@ -1074,8 +1078,8 @@ etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q)
((arp_table[i].state == ETHARP_STATE_PENDING) ||
(arp_table[i].state >= ETHARP_STATE_STABLE)));
/* do we have a pending entry? or an implicit query request? */
if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) {
/* do we have a new entry? or an implicit query request? */
if (is_new_entry || (q == NULL)) {
/* try to resolve it; send out ARP request */
result = etharp_request(netif, ipaddr);
if (result != ERR_OK) {