From 6e81f722adfb22d25f7a351e66b3ae16d971c41a Mon Sep 17 00:00:00 2001 From: Ivan Delamer Date: Fri, 4 May 2012 18:11:47 -0600 Subject: [PATCH] In ip6_input(), accept solicited node packets that match the receiving netif addresses, when multicast is disabled. Change-Id: I3f59258ee605a820f0a525b696b1dede0d53948f --- src/core/ipv6/ip6.c | 15 ++++++++++++--- src/include/ipv6/lwip/ip6_addr.h | 4 ++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/core/ipv6/ip6.c b/src/core/ipv6/ip6.c index fcae57c6..3d8e3d1b 100644 --- a/src/core/ipv6/ip6.c +++ b/src/core/ipv6/ip6.c @@ -405,15 +405,24 @@ ip6_input(struct pbuf *p, struct netif *inp) ip6_addr_isallnodes_linklocal(ip6_current_dest_addr())) { netif = inp; } -#if LWIP_IPV6_MLD +#if 0 else if (mld6_lookfor_group(inp, ip6_current_dest_addr())) { netif = inp; } #else /* LWIP_IPV6_MLD */ else if (ip6_addr_issolicitednode(ip6_current_dest_addr())) { - /* Accept all solicited node packets when MLD is not enabled + /* Filter solicited node packets when MLD is not enabled * (for Neighbor discovery). */ - netif = inp; + netif = NULL; + for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) && + ip6_addr_cmp_solicitednode(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) { + netif = inp; + LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: solicited node packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + break; + } + } } #endif /* LWIP_IPV6_MLD */ else { diff --git a/src/include/ipv6/lwip/ip6_addr.h b/src/include/ipv6/lwip/ip6_addr.h index 68e93e06..89b5b811 100644 --- a/src/include/ipv6/lwip/ip6_addr.h +++ b/src/include/ipv6/lwip/ip6_addr.h @@ -234,6 +234,10 @@ Little-endian version, stored in network order (no htonl). */ (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \ (ip6addr)->addr[3] = htonl(0xff000000UL | (htonl(if_id) & 0x00ffffffUL));}while(0) +#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ + ((ip6addr)->addr[1] == 0) && \ + ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ + ((ip6addr)->addr[3] == htonl(0xff000000UL | (htonl((sn_addr)->addr[3]) & 0x00ffffffUL)))) /* IPv6 address states. */ #define IP6_ADDR_INVALID 0x00 -- 2.39.2