Merge pull request #4705 from cgundogan/pr/ndp/pio_fix
ndp/internal: fix pio flags for rtr adv
This commit is contained in:
commit
ae8e0957cb
@ -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))
|
#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,
|
static bool _pio_from_iface_addr(gnrc_pktsnip_t **res, gnrc_ipv6_netif_t *iface,
|
||||||
gnrc_pktsnip_t *next)
|
gnrc_ipv6_netif_addr_t *addr, gnrc_pktsnip_t *next)
|
||||||
{
|
{
|
||||||
assert(((uint8_t) addr->prefix_len) <= 128U);
|
assert(((uint8_t) addr->prefix_len) <= 128U);
|
||||||
|
|
||||||
if (!ipv6_addr_is_unspecified(&addr->addr) &&
|
if (!ipv6_addr_is_unspecified(&addr->addr) &&
|
||||||
!ipv6_addr_is_link_local(&addr->addr) &&
|
!ipv6_addr_is_link_local(&addr->addr) &&
|
||||||
!gnrc_ipv6_netif_addr_is_non_unicast(&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,
|
DEBUG(" - PIO for %s/%" PRIu8 "\n", ipv6_addr_to_str(addr_str, &addr->addr,
|
||||||
sizeof(addr_str)),
|
sizeof(addr_str)),
|
||||||
addr->prefix_len);
|
addr->prefix_len);
|
||||||
*res = gnrc_ndp_opt_pi_build(addr->prefix_len, (addr->flags &
|
|
||||||
(GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_AUTO |
|
#ifdef MODULE_GNRC_SIXLOWPAN_ND
|
||||||
GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK)),
|
if (!(iface->flags & GNRC_IPV6_NETIF_FLAGS_SIXLOWPAN)) {
|
||||||
addr->valid, addr->preferred, &addr->addr, next);
|
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 true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -396,7 +404,7 @@ static bool _add_pios(gnrc_pktsnip_t **res, gnrc_ipv6_netif_t *ipv6_iface, gnrc_
|
|||||||
continue;
|
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) {
|
if (*res != NULL) {
|
||||||
pkt = *res;
|
pkt = *res;
|
||||||
}
|
}
|
||||||
@ -462,7 +470,7 @@ void gnrc_ndp_internal_send_rtr_adv(kernel_pid_t iface, ipv6_addr_t *src, ipv6_a
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_pio_from_iface_addr(&hdr, prf->prefix, pkt)) {
|
if (_pio_from_iface_addr(&hdr, ipv6_iface, prf->prefix, pkt)) {
|
||||||
if (hdr != NULL) {
|
if (hdr != NULL) {
|
||||||
pkt = hdr;
|
pkt = hdr;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -709,7 +709,7 @@ static int _netif_add(char *cmd_name, kernel_pid_t dev, int argc, char **argv)
|
|||||||
} type = _UNICAST;
|
} type = _UNICAST;
|
||||||
char *addr_str = argv[0];
|
char *addr_str = argv[0];
|
||||||
ipv6_addr_t addr;
|
ipv6_addr_t addr;
|
||||||
uint8_t prefix_len;
|
uint8_t prefix_len, flags = 0;
|
||||||
|
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
if (strcmp(argv[0], "anycast") == 0) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gnrc_ipv6_netif_add_addr(dev, &addr, prefix_len, (type == _ANYCAST) ?
|
flags = GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_AUTO;
|
||||||
GNRC_IPV6_NETIF_ADDR_FLAGS_NON_UNICAST :
|
if (type == _ANYCAST) {
|
||||||
GNRC_IPV6_NETIF_ADDR_FLAGS_UNICAST) == NULL) {
|
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");
|
printf("error: unable to add IPv6 address\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user