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