From 14efa3185bc5b19287fbd4adc00c7449d19c7636 Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Tue, 1 Sep 2020 10:15:02 +0200 Subject: [PATCH 1/2] gnrc_ipv6_nib: don't add dst from PL to NC without ARSM --- sys/net/gnrc/network_layer/ipv6/nib/nib.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/net/gnrc/network_layer/ipv6/nib/nib.c b/sys/net/gnrc/network_layer/ipv6/nib/nib.c index 73cfd24f11..549bd1521b 100644 --- a/sys/net/gnrc/network_layer/ipv6/nib/nib.c +++ b/sys/net/gnrc/network_layer/ipv6/nib/nib.c @@ -237,7 +237,10 @@ int gnrc_ipv6_nib_get_next_hop_l2addr(const ipv6_addr_t *dst, "search neighbor cache\n", ipv6_addr_to_str(addr_str, dst, sizeof(addr_str))); - if (res == 0) { + if ((res == 0) && + /* If ARSM is not active only use link-local as next hop */ + (IS_ACTIVE(CONFIG_GNRC_IPV6_NIB_ARSM) || + ipv6_addr_is_link_local(dst))) { DEBUG("nib: prefix list entry => taking dst as next hop\n"); memcpy(&route.next_hop, dst, sizeof(route.next_hop)); } From 3b7bab11087d457a724fa4487a91a45e06c88f39 Mon Sep 17 00:00:00 2001 From: "Martine S. Lenders" Date: Tue, 1 Sep 2020 10:15:46 +0200 Subject: [PATCH 2/2] gnrc_ipv6_nib_nc: error on non-link-local address without ARSM --- sys/include/net/gnrc/ipv6/nib/nc.h | 5 ++++- sys/net/gnrc/network_layer/ipv6/nib/nib_nc.c | 3 +++ sys/shell/commands/sc_gnrc_ipv6_nib.c | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/sys/include/net/gnrc/ipv6/nib/nc.h b/sys/include/net/gnrc/ipv6/nib/nc.h index 8f570085f5..fb28d29704 100644 --- a/sys/include/net/gnrc/ipv6/nib/nc.h +++ b/sys/include/net/gnrc/ipv6/nib/nc.h @@ -222,10 +222,13 @@ static inline unsigned gnrc_ipv6_nib_nc_get_ar_state(const gnrc_ipv6_nib_nc_t *e * If an entry pointing to the same IPv6 address as @p ipv6 exists already it * will be overwritten and marked as unmanaged. * - * If @ref CONFIG_GNRC_IPV6_NIB_ARSM != 0 @p l2addr and @p l2addr_len won't be set. + * If @ref CONFIG_GNRC_IPV6_NIB_ARSM == 0 @p l2addr and @p l2addr_len won't be + * set and @p ipv6 must be a link-local address. * * @return 0 on success. * @return -ENOMEM, if no space is left in neighbor cache. + * @return -EINVAL, if @p ipv6 is invalid (i.e. + * @ref CONFIG_GNRC_IPV6_NIB_ARSM == 0 and @p ipv6 is not link-local). */ int gnrc_ipv6_nib_nc_set(const ipv6_addr_t *ipv6, unsigned iface, const uint8_t *l2addr, size_t l2addr_len); diff --git a/sys/net/gnrc/network_layer/ipv6/nib/nib_nc.c b/sys/net/gnrc/network_layer/ipv6/nib/nib_nc.c index 30e143ad55..977b54a3af 100644 --- a/sys/net/gnrc/network_layer/ipv6/nib/nib_nc.c +++ b/sys/net/gnrc/network_layer/ipv6/nib/nib_nc.c @@ -46,6 +46,9 @@ int gnrc_ipv6_nib_nc_set(const ipv6_addr_t *ipv6, unsigned iface, #else (void)l2addr; (void)l2addr_len; + if (!ipv6_addr_is_link_local(ipv6)) { + return -EINVAL; + } #endif node->info &= ~(GNRC_IPV6_NIB_NC_INFO_AR_STATE_MASK | GNRC_IPV6_NIB_NC_INFO_NUD_STATE_MASK); diff --git a/sys/shell/commands/sc_gnrc_ipv6_nib.c b/sys/shell/commands/sc_gnrc_ipv6_nib.c index bbdfb36024..e37053d7a5 100644 --- a/sys/shell/commands/sc_gnrc_ipv6_nib.c +++ b/sys/shell/commands/sc_gnrc_ipv6_nib.c @@ -136,7 +136,10 @@ static int _nib_neigh(int argc, char **argv) _usage_nib_neigh(argv); return 1; } - gnrc_ipv6_nib_nc_set(&ipv6_addr, iface, l2addr, l2addr_len); + if (gnrc_ipv6_nib_nc_set(&ipv6_addr, iface, l2addr, l2addr_len) < 0) { + printf("Unable to add %s%%%u to neighbor cache\n", + argv[4], iface); + } } else if ((argc > 3) && (strcmp(argv[2], "del") == 0)) { ipv6_addr_t ipv6_addr;