From d58e1385b2d20a6072799cd2e35832080f241574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cenk=20G=C3=BCndo=C4=9Fan?= <cnkgndgn@gmail.com> Date: Wed, 27 Jan 2016 18:45:34 +0100 Subject: [PATCH] ndp/internal: fix pio flags for rtr adv --- .../ndp/internal/gnrc_ndp_internal.c | 24 ++++++++++++------- sys/shell/commands/sc_netif.c | 14 +++++++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/sys/net/gnrc/network_layer/ndp/internal/gnrc_ndp_internal.c b/sys/net/gnrc/network_layer/ndp/internal/gnrc_ndp_internal.c index 569d759a53..771fe8a84a 100644 --- a/sys/net/gnrc/network_layer/ndp/internal/gnrc_ndp_internal.c +++ b/sys/net/gnrc/network_layer/ndp/internal/gnrc_ndp_internal.c @@ -349,21 +349,29 @@ void gnrc_ndp_internal_send_rtr_sol(kernel_pid_t iface, ipv6_addr_t *dst) } #if (defined(MODULE_GNRC_NDP_ROUTER) || defined(MODULE_GNRC_SIXLOWPAN_ND_ROUTER)) -static bool _pio_from_iface_addr(gnrc_pktsnip_t **res, gnrc_ipv6_netif_addr_t *addr, - gnrc_pktsnip_t *next) +static bool _pio_from_iface_addr(gnrc_pktsnip_t **res, gnrc_ipv6_netif_t *iface, + gnrc_ipv6_netif_addr_t *addr, gnrc_pktsnip_t *next) { assert(((uint8_t) addr->prefix_len) <= 128U); if (!ipv6_addr_is_unspecified(&addr->addr) && !ipv6_addr_is_link_local(&addr->addr) && !gnrc_ipv6_netif_addr_is_non_unicast(&addr->addr)) { + uint8_t flags = 0; DEBUG(" - PIO for %s/%" PRIu8 "\n", ipv6_addr_to_str(addr_str, &addr->addr, sizeof(addr_str)), addr->prefix_len); - *res = gnrc_ndp_opt_pi_build(addr->prefix_len, (addr->flags & - (GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_AUTO | - GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK)), - addr->valid, addr->preferred, &addr->addr, next); + +#ifdef MODULE_GNRC_SIXLOWPAN_ND + if (!(iface->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN)) { + flags = GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK; + } +#else + (void) iface; +#endif + + *res = gnrc_ndp_opt_pi_build(addr->prefix_len, addr->flags | flags, addr->valid, + addr->preferred, &addr->addr, next); return true; } return false; @@ -396,7 +404,7 @@ static bool _add_pios(gnrc_pktsnip_t **res, gnrc_ipv6_netif_t *ipv6_iface, gnrc_ continue; } - if (_pio_from_iface_addr(res, &ipv6_iface->addrs[i], pkt)) { + if (_pio_from_iface_addr(res, ipv6_iface, &ipv6_iface->addrs[i], pkt)) { if (*res != NULL) { pkt = *res; } @@ -462,7 +470,7 @@ void gnrc_ndp_internal_send_rtr_adv(kernel_pid_t iface, ipv6_addr_t *src, ipv6_a continue; } - if (_pio_from_iface_addr(&hdr, prf->prefix, pkt)) { + if (_pio_from_iface_addr(&hdr, ipv6_iface, prf->prefix, pkt)) { if (hdr != NULL) { pkt = hdr; } diff --git a/sys/shell/commands/sc_netif.c b/sys/shell/commands/sc_netif.c index 01cb020215..2347ed575e 100644 --- a/sys/shell/commands/sc_netif.c +++ b/sys/shell/commands/sc_netif.c @@ -709,7 +709,7 @@ static int _netif_add(char *cmd_name, kernel_pid_t dev, int argc, char **argv) } type = _UNICAST; char *addr_str = argv[0]; ipv6_addr_t addr; - uint8_t prefix_len; + uint8_t prefix_len, flags = 0; if (argc > 1) { if (strcmp(argv[0], "anycast") == 0) { @@ -742,9 +742,15 @@ static int _netif_add(char *cmd_name, kernel_pid_t dev, int argc, char **argv) return 1; } - if (gnrc_ipv6_netif_add_addr(dev, &addr, prefix_len, (type == _ANYCAST) ? - GNRC_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST : - GNRC_IPV6_NETIF_ADDR_FLAGS_UNICAST) == NULL) { + flags = GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_AUTO; + if (type == _ANYCAST) { + flags |= GNRC_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST; + } + else { + flags |= GNRC_IPV6_NETIF_ADDR_FLAGS_UNICAST; + } + + if (gnrc_ipv6_netif_add_addr(dev, &addr, prefix_len, flags) == NULL) { printf("error: unable to add IPv6 address\n"); return 1; } -- GitLab