static int _netif_add(char *cmd_name, kernel_pid_t dev, int argc, char **argv) { #ifdef MODULE_GNRC_IPV6_NETIF enum { _UNICAST = 0, _MULTICAST, /* multicast value just to check if given addr is mc */ _ANYCAST } type = _UNICAST; char *addr_str = argv[0]; ipv6_addr_t addr; uint8_t prefix_len; if (argc > 1) { if (strcmp(argv[0], "anycast") == 0) { type = _ANYCAST; addr_str = argv[1]; } else if (strcmp(argv[0], "multicast") == 0) { type = _MULTICAST; addr_str = argv[1]; } else if (strcmp(argv[0], "unicast") == 0) { /* type already set to unicast */ addr_str = argv[1]; } else { _add_usage(cmd_name); return 1; } } prefix_len = _get_prefix_len(addr_str); if (ipv6_addr_from_str(&addr, addr_str) == NULL) { puts("error: unable to parse IPv6 address."); return 1; } if ((argc > 1) && (ipv6_addr_is_multicast(&addr)) && (type != _MULTICAST)) { puts("error: address was not a multicast address."); 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) { printf("error: unable to add IPv6 address\n"); return 1; } printf("success: added %s/%d to interface %" PRIkernel_pid "\n", addr_str, prefix_len, dev); return 0; #else (void)cmd_name; (void)dev; (void)argc; (void)argv; puts("error: unable to add IPv6 address."); return 1; #endif }
static int _netif_add(char *cmd_name, kernel_pid_t iface, int argc, char **argv) { #ifdef MODULE_GNRC_IPV6 enum { _UNICAST = 0, _ANYCAST } type = _UNICAST; char *addr_str = argv[0]; ipv6_addr_t addr; uint16_t flags = GNRC_NETIF_IPV6_ADDRS_FLAGS_STATE_VALID; uint8_t prefix_len; if (argc > 1) { if (strcmp(argv[0], "anycast") == 0) { type = _ANYCAST; addr_str = argv[1]; } else if (strcmp(argv[0], "unicast") == 0) { /* type already set to unicast */ addr_str = argv[1]; } else { _add_usage(cmd_name); return 1; } } prefix_len = _get_prefix_len(addr_str); if (ipv6_addr_from_str(&addr, addr_str) == NULL) { puts("error: unable to parse IPv6 address."); return 1; } if (ipv6_addr_is_multicast(&addr)) { if (gnrc_netapi_set(iface, NETOPT_IPV6_GROUP, 0, &addr, sizeof(addr)) < 0) { printf("error: unable to join IPv6 multicast group\n"); return 1; } } else { if (type == _ANYCAST) { flags |= GNRC_NETIF_IPV6_ADDRS_FLAGS_ANYCAST; } flags |= (prefix_len << 8U); if (gnrc_netapi_set(iface, NETOPT_IPV6_ADDR, flags, &addr, sizeof(addr)) < 0) { printf("error: unable to add IPv6 address\n"); return 1; } } printf("success: added %s/%d to interface %" PRIkernel_pid "\n", addr_str, prefix_len, iface); return 0; #else (void)cmd_name; (void)iface; (void)argc; (void)argv; puts("error: unable to add IPv6 address."); return 1; #endif }