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