From d91caf1cd329d1611688a07ce555a29eaac31c72 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Mon, 8 Mar 2010 18:24:23 +0000 Subject: [PATCH] ip_input: better check for old link-local-address (explicitly check for autoip->llipaddr instead of letting all link-local-addresses through) --- src/core/ipv4/ip.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/core/ipv4/ip.c b/src/core/ipv4/ip.c index e92c5431..b9e3091a 100644 --- a/src/core/ipv4/ip.c +++ b/src/core/ipv4/ip.c @@ -52,6 +52,7 @@ #include "lwip/tcp_impl.h" #include "lwip/snmp.h" #include "lwip/dhcp.h" +#include "lwip/autoip.h" #include "lwip/stats.h" #include "arch/perf.h" @@ -296,18 +297,23 @@ ip_input(struct pbuf *p, struct netif *inp) /* unicast to this interface address? */ if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr)) || /* or broadcast on this interface network address? */ - ip_addr_isbroadcast(&(iphdr->dest), netif) -#if LWIP_AUTOIP - /* connections to link-local addresses must persist after changing - the netif's address (RFC3927 ch. 1.9) */ - || ip_addr_islinklocal(&(iphdr->dest)) -#endif /* LWIP_AUTOIP */ - ) { + ip_addr_isbroadcast(&(iphdr->dest), netif)) { LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n", netif->name[0], netif->name[1])); /* break out of for loop */ break; } +#if LWIP_AUTOIP + /* connections to link-local addresses must persist after changing + the netif's address (RFC3927 ch. 1.9) */ + if ((netif->autoip != NULL) && + ip_addr_cmp(&(iphdr->dest), &(netif->autoip->llipaddr))) { + LWIP_DEBUGF(IP_DEBUG, ("ip_input: LLA packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + /* break out of for loop */ + break; + } +#endif /* LWIP_AUTOIP */ } if (first) { first = 0;