mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-07-04 20:08:57 +00:00
Fixed ARP input processing: only add a new entry if a request was directed as us (RFC 826, Packet Reception), otherwise only update existing entries; internalized some functions
This commit is contained in:
parent
c5dfa4099d
commit
4c9fe60693
|
@ -131,6 +131,11 @@ HISTORY
|
||||||
|
|
||||||
++ Bugfixes:
|
++ Bugfixes:
|
||||||
|
|
||||||
|
2010-02-14: Simon Goldschmidt
|
||||||
|
* etharp.c/.h: Fixed ARP input processing: only add a new entry if a
|
||||||
|
request was directed as us (RFC 826, Packet Reception), otherwise
|
||||||
|
only update existing entries; internalized some functions
|
||||||
|
|
||||||
2010-02-14: Simon Goldschmidt
|
2010-02-14: Simon Goldschmidt
|
||||||
* netif.h, etharp.c, tcpip.c: Fixed bug #28183 (ARP and TCP/IP cannot be
|
* netif.h, etharp.c, tcpip.c: Fixed bug #28183 (ARP and TCP/IP cannot be
|
||||||
disabled on netif used for PPPoE) by adding a new netif flag
|
disabled on netif used for PPPoE) by adding a new netif flag
|
||||||
|
|
|
@ -163,9 +163,6 @@ struct etharp_q_entry {
|
||||||
void etharp_tmr(void);
|
void etharp_tmr(void);
|
||||||
s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
|
s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
|
||||||
struct eth_addr **eth_ret, ip_addr_t **ip_ret);
|
struct eth_addr **eth_ret, ip_addr_t **ip_ret);
|
||||||
void etharp_ip_input(struct netif *netif, struct pbuf *p);
|
|
||||||
void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr,
|
|
||||||
struct pbuf *p);
|
|
||||||
err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr);
|
err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr);
|
||||||
err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q);
|
err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q);
|
||||||
err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr);
|
err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr);
|
||||||
|
|
|
@ -344,10 +344,10 @@ find_entry(ip_addr_t *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? */
|
/* don't create new entry, only search? */
|
||||||
if (((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0))
|
if (((flags & ETHARP_FIND_ONLY) != 0) ||
|
||||||
/* or don't create new entry, only search? */
|
/* or no empty entry found and not allowed to recycle? */
|
||||||
|| ((flags & ETHARP_FIND_ONLY) != 0)) {
|
((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0))) {
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: no empty entry found and not allowed to recycle\n"));
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: no empty entry found and not allowed to recycle\n"));
|
||||||
return (s8_t)ERR_MEM;
|
return (s8_t)ERR_MEM;
|
||||||
}
|
}
|
||||||
|
@ -565,6 +565,7 @@ etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ETHARP_TRUST_IP_MAC
|
||||||
/**
|
/**
|
||||||
* Updates the ARP table using the given IP packet.
|
* Updates the ARP table using the given IP packet.
|
||||||
*
|
*
|
||||||
|
@ -580,7 +581,7 @@ etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr,
|
||||||
*
|
*
|
||||||
* @see pbuf_free()
|
* @see pbuf_free()
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
etharp_ip_input(struct netif *netif, struct pbuf *p)
|
etharp_ip_input(struct netif *netif, struct pbuf *p)
|
||||||
{
|
{
|
||||||
struct eth_hdr *ethhdr;
|
struct eth_hdr *ethhdr;
|
||||||
|
@ -604,12 +605,12 @@ etharp_ip_input(struct netif *netif, struct pbuf *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n"));
|
LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n"));
|
||||||
/* update ARP table */
|
/* update the source IP address in the cache, if present */
|
||||||
/* @todo We could use ETHARP_TRY_HARD if we think we are going to talk
|
/* @todo We could use ETHARP_TRY_HARD if we think we are going to talk
|
||||||
* back soon (for example, if the destination IP address is ours. */
|
* back soon (for example, if the destination IP address is ours. */
|
||||||
update_arp_entry(netif, &(iphdr->src), &(ethhdr->src), 0);
|
update_arp_entry(netif, &(iphdr->src), &(ethhdr->src), ETHARP_FIND_ONLY);
|
||||||
}
|
}
|
||||||
|
#endif /* ETHARP_TRUST_IP_MAC */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Responds to ARP requests to us. Upon ARP replies to us, add entry to cache
|
* Responds to ARP requests to us. Upon ARP replies to us, add entry to cache
|
||||||
|
@ -626,7 +627,7 @@ etharp_ip_input(struct netif *netif, struct pbuf *p)
|
||||||
*
|
*
|
||||||
* @see pbuf_free()
|
* @see pbuf_free()
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
||||||
{
|
{
|
||||||
struct etharp_hdr *hdr;
|
struct etharp_hdr *hdr;
|
||||||
|
@ -704,7 +705,7 @@ etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
|
||||||
/* ARP message not directed to us? */
|
/* ARP message not directed to us? */
|
||||||
} else {
|
} else {
|
||||||
/* update the source IP address in the cache, if present */
|
/* update the source IP address in the cache, if present */
|
||||||
update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), 0);
|
update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), ETHARP_FIND_ONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now act on the message itself */
|
/* now act on the message itself */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user