diff --git a/sys/net/gnrc/network_layer/ipv6/nib/_nib-6ln.h b/sys/net/gnrc/network_layer/ipv6/nib/_nib-6ln.h index 489450ba8b..dca4eee612 100644 --- a/sys/net/gnrc/network_layer/ipv6/nib/_nib-6ln.h +++ b/sys/net/gnrc/network_layer/ipv6/nib/_nib-6ln.h @@ -34,7 +34,6 @@ extern "C" { #endif -#if IS_ACTIVE(CONFIG_GNRC_IPV6_NIB_6LN) || defined(DOXYGEN) /** * @brief Additional (local) status to ARO status values for tentative * addresses @@ -57,6 +56,7 @@ extern "C" { */ #define _ADDR_REG_STATUS_UNAVAIL (255) +#if IS_ACTIVE(CONFIG_GNRC_IPV6_NIB_6LN) || defined(DOXYGEN) /** * @brief Resolves address statically from destination address using reverse * translation of the IID diff --git a/sys/net/gnrc/network_layer/ipv6/nib/_nib-arsm.c b/sys/net/gnrc/network_layer/ipv6/nib/_nib-arsm.c index 3687e394d0..e3848c8c13 100644 --- a/sys/net/gnrc/network_layer/ipv6/nib/_nib-arsm.c +++ b/sys/net/gnrc/network_layer/ipv6/nib/_nib-arsm.c @@ -233,7 +233,19 @@ void _handle_snd_ns(_nib_onl_entry_t *nbr) } /* intentionally falls through */ case GNRC_IPV6_NIB_NC_INFO_NUD_STATE_UNREACHABLE: - _probe_nbr(nbr, false); + if (!IS_ACTIVE(CONFIG_GNRC_IPV6_NIB_6LR) || + /* if neighbor is a 6LoWPAN node (i.e. address registartion + * state is non-garbage-collectible), only probe if it is a + * router (where the solicited-nodes multicast address MUST + * be set; only MAY otherwise). + * See: + * - https://tools.ietf.org/html/rfc6775#section-5.2 + * - https://tools.ietf.org/html/rfc6775#section-6.5.5 + */ + (_get_ar_state(nbr) == GNRC_IPV6_NIB_NC_INFO_AR_STATE_GC) || + (nbr->info & GNRC_IPV6_NIB_NC_INFO_IS_ROUTER)) { + _probe_nbr(nbr, false); + } break; default: break;