コード例 #1
0
ファイル: gnrc_uhcpc.c プロジェクト: iot-lab/riot-upstream
static void set_interface_roles(void)
{
    kernel_pid_t ifs[GNRC_NETIF_NUMOF];
    size_t numof = gnrc_netif_get(ifs);

    for (size_t i = 0; i < numof && i < GNRC_NETIF_NUMOF; i++) {
        kernel_pid_t dev = ifs[i];
        int is_wired = gnrc_netapi_get(dev, NETOPT_IS_WIRED, 0, NULL, 0);
        if ((!gnrc_border_interface) && (is_wired == 1)) {
            ipv6_addr_t addr, defroute;
            gnrc_border_interface = dev;

            ipv6_addr_from_str(&addr, "fe80::2");
            gnrc_ipv6_netif_add_addr(dev, &addr, 64,
                                     GNRC_IPV6_NETIF_ADDR_FLAGS_UNICAST);

            ipv6_addr_from_str(&defroute, "::");
            ipv6_addr_from_str(&addr, "fe80::1");
            fib_add_entry(&gnrc_ipv6_fib_table, dev, defroute.u8, 16,
                    0x00, addr.u8, 16, 0,
                    (uint32_t)FIB_LIFETIME_NO_EXPIRE);
        }
        else if ((!gnrc_wireless_interface) && (is_wired != 1)) {
            gnrc_wireless_interface = dev;
        }

        if (gnrc_border_interface && gnrc_wireless_interface) {
            break;
        }
    }

    LOG_INFO("gnrc_uhcpc: Using %u as border interface and %u as wireless interface.\n", gnrc_border_interface, gnrc_wireless_interface);
}
コード例 #2
0
ファイル: gcoap_cli.c プロジェクト: kamejoko80/RIOT
static size_t _send(uint8_t *buf, size_t len, char *addr_str, char *port_str)
{
    ipv6_addr_t addr;
    size_t bytes_sent;
    sock_udp_ep_t remote;

    remote.family = AF_INET6;
    remote.netif  = SOCK_ADDR_ANY_NETIF;

    /* parse destination address */
    if (ipv6_addr_from_str(&addr, addr_str) == NULL) {
        puts("gcoap_cli: unable to parse destination address");
        return 0;
    }
    memcpy(&remote.addr.ipv6[0], &addr.u8[0], sizeof(addr.u8));

    /* parse port */
    remote.port = atoi(port_str);
    if (remote.port == 0) {
        puts("gcoap_cli: unable to parse destination port");
        return 0;
    }

    bytes_sent = gcoap_req_send2(buf, len, &remote, _resp_handler);
    if (bytes_sent > 0) {
        req_count++;
    }
    return bytes_sent;
}
コード例 #3
0
ファイル: ping.c プロジェクト: deepfryed/RIOT
int ping_cmd(int argc, char **argv)
{
    ipv6_addr_t dst;
    int payload_len, _num;

    if ((argc < 2) || (ipv6_addr_from_str(&dst, argv[1]) == NULL)) {
        usage(argv[0]);
        return 1;
    }
    if ((argc < 3) || ((_num = atoi(argv[2])) == 0)) {
        _num = 3;
    }
    if ((argc < 4) || ((payload_len = atoi(argv[3])) == 0)) {
        payload_len = 16;
    }
    atomic_store(&num, _num);
    atomic_store(&received, 0);
    seq = 0;
    if (recv_ntfy.callback == NULL) {
        uip_icmp6_echo_reply_callback_add(&recv_ntfy, handle_reply);
    }
    for (uint16_t i = 0; i < _num; i++) {
        _waiting = true;
        ping_send((uip_ipaddr_t *)&dst, payload_len);
        xtimer_usleep(1000000);
        if (_waiting) {
            puts("Timeout");
        }
    }

    return 0;
}
コード例 #4
0
ファイル: setup.c プロジェクト: fridalufa/smart-environment
ipv6_addr_t* add_address_to_interface(char* link_addr, kernel_pid_t iface_pid, uint8_t add_flags)
{

    // add a global IPv6 address for the root node
    uint8_t prefix_len, flags = 0;
    ipv6_addr_t* ifaddr;
    ipv6_addr_t addr_dec;

    if (ipv6_addr_from_str(&addr_dec, link_addr) == NULL) {
        puts("error: unable to parse IPv6 address.");
        return NULL;
    };

    prefix_len = ipv6_addr_split(link_addr, '/', 64);
    flags = GNRC_IPV6_NETIF_ADDR_FLAGS_NDP_AUTO | add_flags;

    if ((ifaddr = gnrc_ipv6_netif_add_addr(iface_pid, &addr_dec, prefix_len, flags)) == NULL) {
        printf("error: unable to add IPv6 address\n");
        return NULL;
    }

    // Address shall be valid infinitely
    gnrc_ipv6_netif_addr_get(ifaddr)->valid = UINT32_MAX;
    // Address shall be preferred infinitely
    gnrc_ipv6_netif_addr_get(ifaddr)->preferred = UINT32_MAX;

    return ifaddr;
}
コード例 #5
0
ファイル: udp.c プロジェクト: cgundogan/RIOT-APPS
int udp_send(int argc, char **argv)
{
    if (argc != 4) {
        puts("Usage: udp <ipv6-addr> <port> <payload>");
        return -1;
    }

    int res;
    ipv6_addr_t src = IPV6_ADDR_UNSPECIFIED, dst;
    if (ipv6_addr_from_str(&dst, argv[1]) == NULL) {
        puts("Error: unable to parse destination address");
        return 1;
    }

    if((res = conn_udp_sendto(argv[3], strlen(argv[3]), &src, sizeof(src), &dst, sizeof(dst),
                              AF_INET6, 1234, (uint16_t) (atoi(argv[2])))) < 0) {
        puts("could not send");
    }
    else {
        //printf("Success: send %u byte to %s\n", (unsigned) res, argv[1]);
        if (gnrc_rpl_instances[0].state && gnrc_rpl_instances[0].dodag.node_status != GNRC_RPL_ROOT_NODE) {
            if (acked) {
                time = xtimer_now64();
                acked = false;
            }
        }
    }
    return 0;
}
コード例 #6
0
ファイル: sc_ipv6_nc.c プロジェクト: robby14/RIOT
static int _ipv6_nc_add(kernel_pid_t iface, char *ipv6_addr_str,
                        char *l2_addr_str)
{
    ipv6_addr_t ipv6_addr;
    uint8_t l2_addr[MAX_L2_ADDR_LEN];
    size_t l2_addr_len;

    if (ipv6_addr_from_str(&ipv6_addr, ipv6_addr_str) == NULL) {
        puts("error: unable to parse IPv6 address.");
        return 1;
    }

    if ((l2_addr_len = ng_netif_addr_from_str(l2_addr, sizeof(l2_addr),
                       l2_addr_str)) == 0) {
        puts("error: unable to parse link-layer address.");
        return 1;
    }

    if (ng_ipv6_nc_add(iface, &ipv6_addr, l2_addr, l2_addr_len, 0) == NULL) {
        puts("error: unable to add address to neighbor cache.");
        return 1;
    }

    printf("success: added IPv6 address %s to neighbor cache\n", ipv6_addr_str);
    return 0;
}
コード例 #7
0
ファイル: udp.c プロジェクト: A-Paul/RIOT
static int udp_send(char *addr_str, char *port_str, char *data, unsigned int num,
                    unsigned int delay)
{
    sock_udp_ep_t dst = SOCK_IPV6_EP_ANY;
    uint8_t byte_data[SHELL_DEFAULT_BUFSIZE / 2];
    size_t data_len;

    /* parse destination address */
    if (ipv6_addr_from_str((ipv6_addr_t *)&dst.addr.ipv6, addr_str) == NULL) {
        puts("Error: unable to parse destination address");
        return 1;
    }
    /* parse port */
    dst.port = atoi(port_str);
    data_len = hex2ints(byte_data, data);
    for (unsigned int i = 0; i < num; i++) {
        sock_udp_t *sock = NULL;

        if (server_running) {
            sock = &server_sock;
        }
        if (sock_udp_send(sock, byte_data, data_len, &dst) < 0) {
            puts("could not send");
        }
        else {
            printf("Success: send %u byte over UDP to [%s]:%" PRIu16 "\n",
                   (unsigned)data_len, addr_str, dst.port);
        }
        xtimer_usleep(delay);
    }
    return 0;
}
コード例 #8
0
ファイル: udp.c プロジェクト: cgundogan/RIOT-APPS
void *_udp_server(void *args)
{
    uint16_t port = (uint16_t) atoi(args);
    ipv6_addr_t server_addr = IPV6_ADDR_UNSPECIFIED;
    msg_init_queue(server_msg_queue, SERVER_MSG_QUEUE_SIZE);

    if(conn_udp_create(&conn, &server_addr, sizeof(server_addr), AF_INET6, port) < 0) {
        return NULL;
    }

    server_running = true;
    printf("Success: started UDP server on port %" PRIu16 "\n", port);

    char *arg[4];
    char *cmd = "udp_send";
    char *port_str = "8888";

    arg[0] = cmd;
    arg[2] = port_str;
    char src_str[IPV6_ADDR_MAX_STR_LEN];

    while (1) {
        int res;
        ipv6_addr_t src;
        size_t src_len = sizeof(ipv6_addr_t);
        if ((res = conn_udp_recvfrom(&conn, server_buffer, sizeof(server_buffer),
                                     &src, &src_len, &port)) < 0) {
            puts("Error while receiving");
        }
        else if (res == 0) {
            puts("No data received");
        }
        else {
            server_buffer[res] = '\0';
            if (gnrc_rpl_instances[0].state && gnrc_rpl_instances[0].dodag.node_status == GNRC_RPL_ROOT_NODE) {
                printf("%s;%s\n", ipv6_addr_to_str(src_str, &src, sizeof(src_str)),
                                                   server_buffer);
                ipv6_addr_to_str(addr_str, &ipv6_addr_all_nodes_link_local, sizeof(addr_str));
                arg[1] = addr_str;
                arg[3] = src_str;
                udp_send(4, arg);
            }
            else {
                ipv6_addr_t payload;
                ipv6_addr_from_str(&payload, server_buffer);
                if ((gnrc_ipv6_netif_find_by_addr(NULL, &payload) != KERNEL_PID_UNDEF) && (!acked)) {
                    acked = true;
                    printf("diff: %llu\n", xtimer_now64() - time);
                }
            }
        }
    }

    return NULL;
}
コード例 #9
0
ファイル: sc_ipv6_nc.c プロジェクト: robby14/RIOT
static int _ipv6_nc_del(char *ipv6_addr_str)
{
    ipv6_addr_t ipv6_addr;

    if (ipv6_addr_from_str(&ipv6_addr, ipv6_addr_str) == NULL) {
        puts("error: unable to parse IPv6 address.");
        return 1;
    }

    ng_ipv6_nc_remove(KERNEL_PID_UNDEF, &ipv6_addr);
    printf("success: removed %s from neighbor cache\n", ipv6_addr_str);

    return 0;
}
コード例 #10
0
ファイル: main.c プロジェクト: fridalufa/smart-environment
int greet(int argc, char** argv)
{

    if (argc < 3) {
        printf("Usage: %s <server or multicast address> <name>\n", argv[0]);
        return 1;
    }

    ipv6_addr_t target;
    ipv6_addr_from_str(&target, argv[1]);

    coap_client_send(&target, COAP_METHOD_POST, COAP_TYPE_CON, "greet", argv[2], COAP_CONTENTTYPE_TEXT_PLAIN);

    coap_client_receive();

    return 0;
}
コード例 #11
0
SOL_API const struct sol_network_link_addr *
sol_network_addr_from_str(struct sol_network_link_addr *addr, const char *buf)
{
#if MODULE_GNRC_IPV6_NETIF
    SOL_NULL_CHECK(addr, NULL);
    SOL_NULL_CHECK(buf, NULL);

    if (addr->family != SOL_NETWORK_FAMILY_INET6)
        return NULL;

    if (!ipv6_addr_from_str((ipv6_addr_t *)&addr->addr, buf))
        return NULL;
    return addr;
#else
    return NULL;
#endif
}
コード例 #12
0
ファイル: main.c プロジェクト: fridalufa/smart-environment
int coap_client(int argc, char** argv)
{

    if (argc < 2) {
        printf("Usage: %s <server or multicast address>\n", argv[0]);
        return 1;
    }

    ipv6_addr_t target;
    ipv6_addr_from_str(&target, argv[1]);

    coap_client_send(&target, COAP_METHOD_GET, COAP_TYPE_NONCON, ".well-known/core", NULL, 0);

    coap_client_receive();

    return 0;
}
コード例 #13
0
ファイル: main.c プロジェクト: PeterKietzmann/Demos
int main(void)
{
#ifdef WITH_SHELL
    /* initialize message queue */
    msg_init_queue(_main_msg_q, Q_SZ);
#endif

    eui64_t iid;
    // uint16_t chan = 15;
    netopt_enable_t acks = NETOPT_DISABLE;
    kernel_pid_t ifs[GNRC_NETIF_NUMOF];

    gnrc_netif_get(ifs);
    gnrc_netapi_set(ifs[0], NETOPT_AUTOACK, 0, &acks, sizeof(acks));
    // gnrc_netapi_set(ifs[0], NETOPT_CHANNEL, 0, &chan, sizeof(chan));
    ipv6_addr_from_str(&dst_addr, "2001:affe:1234::1");
    // ipv6_addr_from_str(&dst_addr, "fd38:3734:ad48:0:211d:50ce:a189:7cc4");

    /* initialize senml payload */
    gnrc_netapi_get(ifs[0], NETOPT_IPV6_IID, 0, &iid, sizeof(eui64_t));

    initial_pos  = sprintf(&p_buf[initial_pos], "[{\"bn\":\"urn:dev:mac:");
    initial_pos += sprintf(&p_buf[initial_pos], "%02x%02x%02x%02x%02x%02x%02x%02x",
                           iid.uint8[0], iid.uint8[1], iid.uint8[2], iid.uint8[3],
                           iid.uint8[4], iid.uint8[5], iid.uint8[6], iid.uint8[7]);
    initial_pos += sprintf(&p_buf[initial_pos], "\"},");

    /* initialize sensors */
    hdc1000_init(&th_dev, HDC1000_I2C, HDC1000_ADDR);
    hdc1000_startmeasure(&th_dev);
    mpl3115a2_init(&p_dev, MPL3115A2_I2C, MPL3115A2_ADDR, MPL3115A2_OS_RATIO_DEFAULT);
    mpl3115a2_set_active(&p_dev);
    tcs37727_init(&light_dev, TCS37727_I2C, TCS37727_ADDR, TCS37727_ATIME_DEFAULT);
    tcs37727_set_rgbc_active(&light_dev);

#ifdef WITH_SHELL
    thread_create(beac_stack, sizeof(beac_stack), PRIO, THREAD_CREATE_STACKTEST, beaconing,
                  NULL, "beaconing");
    char line_buf[SHELL_DEFAULT_BUFSIZE];
    shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
#else
    beaconing(NULL);
#endif

    return 0;
}
コード例 #14
0
ファイル: main.c プロジェクト: PeterKietzmann/Demos
int main(void)
{
#ifdef WITH_SHELL
    /* initialize message queue */
    msg_init_queue(_main_msg_q, Q_SZ);
#endif

    eui64_t iid;
    // uint16_t chan = 15;
    netopt_enable_t acks = NETOPT_DISABLE;
    kernel_pid_t ifs[GNRC_NETIF_NUMOF];

    gnrc_netif_get(ifs);
    gnrc_netapi_set(ifs[0], NETOPT_AUTOACK, 0, &acks, sizeof(acks));
    ipv6_addr_from_str(&dst_addr, "2001:affe:1234::1");
    // gnrc_netapi_set(ifs[0], NETOPT_CHANNEL, 0, &chan, sizeof(chan));
    // ipv6_addr_from_str(&dst_addr, "fd38:3734:ad48:0:211d:50ce:a189:7cc4");

    /* initialize senml payload */
    gnrc_netapi_get(ifs[0], NETOPT_IPV6_IID, 0, &iid, sizeof(eui64_t));

    initial_pos  = sprintf(&p_buf[initial_pos], "[{\"bn\":\"urn:dev:mac:");
    initial_pos += sprintf(&p_buf[initial_pos], "%02x%02x%02x%02x%02x%02x%02x%02x",
                           iid.uint8[0], iid.uint8[1], iid.uint8[2], iid.uint8[3],
                           iid.uint8[4], iid.uint8[5], iid.uint8[6], iid.uint8[7]);
    initial_pos += sprintf(&p_buf[initial_pos], "\"},");

    thread_create(coap_stack, sizeof(coap_stack), PRIO - 1, THREAD_CREATE_STACKTEST, microcoap_server,
                  NULL, "coap");
#ifdef WITH_SHELL
    thread_create(beac_stack, sizeof(beac_stack), PRIO, THREAD_CREATE_STACKTEST, beaconing,
                  NULL, "beaconing");
    char line_buf[SHELL_DEFAULT_BUFSIZE];
    shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
#else
    beaconing(NULL);
#endif

    return 0;
}
コード例 #15
0
ファイル: sc_netif.c プロジェクト: Huyfly/RIOT
static int _netif_del(kernel_pid_t dev, char *addr_str)
{
#ifdef MODULE_GNRC_IPV6_NETIF
    ipv6_addr_t addr;

    if (ipv6_addr_from_str(&addr, addr_str) == NULL) {
        puts("error: unable to parse IPv6 address.");
        return 1;
    }

    gnrc_ipv6_netif_remove_addr(dev, &addr);

    printf("success: removed %s to interface %" PRIkernel_pid "\n", addr_str,
           dev);

    return 0;
#else
    (void)dev;
    (void)addr_str;
    puts("error: unable to delete IPv6 address.");
    return 1;
#endif
}
コード例 #16
0
ファイル: udp.c プロジェクト: aabadie/Tutorials
int udp_send(int argc, char **argv)
{
    if (argc != 4) {
        puts("Usage: udp <ipv6-addr> <port> <payload>");
        return -1;
    }

    int res;
    ipv6_addr_t src = IPV6_ADDR_UNSPECIFIED, dst;
    if (ipv6_addr_from_str(&dst, argv[1]) == NULL) {
        puts("Error: unable to parse destination address");
        return 1;
    }

    if((res = conn_udp_sendto(argv[3], strlen(argv[3]), &src, sizeof(src), &dst, sizeof(dst),
                              AF_INET6, 1234, (uint16_t) (atoi(argv[2])))) < 0) {
        puts("could not send");
    }
    else {
        printf("Success: send %u byte to %s\n", (unsigned) res, argv[1]);
    }
    return 0;
}
コード例 #17
0
ファイル: sc_gnrc_netif.c プロジェクト: A-Paul/RIOT
static int _netif_del(kernel_pid_t iface, char *addr_str)
{
#ifdef MODULE_GNRC_IPV6
    ipv6_addr_t addr;

    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_LEAVE, 0, &addr,
                            sizeof(addr)) < 0) {
            printf("error: unable to leave IPv6 multicast group\n");
            return 1;
        }
    }
    else {
        if (gnrc_netapi_set(iface, NETOPT_IPV6_ADDR_REMOVE, 0, &addr,
                            sizeof(addr)) < 0) {
            printf("error: unable to remove IPv6 address\n");
            return 1;
        }
    }

    printf("success: removed %s to interface %" PRIkernel_pid "\n", addr_str,
           iface);

    return 0;
#else
    (void)iface;
    (void)addr_str;
    puts("error: unable to delete IPv6 address.");
    return 1;
#endif
}
コード例 #18
0
ファイル: sc_netif.c プロジェクト: Huyfly/RIOT
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
}
コード例 #19
0
ファイル: tftp_client.c プロジェクト: AdamRLukaitis/RIOT
static int _tftp_client_cmd(int argc, char * *argv)
{
    ipv6_addr_t ip;
    const char *file_name = argv[2];
    tftp_mode_t mode = TTM_OCTET;
    bool use_options = true;

    ipv6_addr_from_str(&ip, _tftp_default_host);

    if (argc >= 3 && argc <= 6) {
        /* decode the action */
        if (strcmp(argv[1], "get") == 0) {
            _tftp_action = TFTP_READ;
        }
        else if (strcmp(argv[1], "put") == 0) {
            _tftp_action = TFTP_WRITE;
        }
        else {
            return -1;
        }

        /* get the transfer mode */
        if (argc >= 4) {
            if (strcmp(argv[3], "octet") == 0) {
                mode = TTM_OCTET;
            }
            else if (strcmp(argv[3], "ascii") == 0) {
                mode = TTM_ASCII;
            }
            else if (strcmp(argv[3], "mail") == 0) {
                mode = TTM_MAIL;
            }
            else {
                puts("tftp: couldn't parse the TFTP transfer mode");
                return -1;
            }
        }

        /* decode if we must use the TFTP option extension or not */
        if (argc >= 5) {
            if (strcmp(argv[4], "0") == 0) {
                use_options = false;
            }
            else if (strcmp(argv[4], "1") == 0) {
                use_options = true;
            }
            else {
                puts("tftp: invalid options choose 0 or 1");
                return -1;
            }
        }

        /* decode the address */
        if (argc >= 6) {
            if (!ipv6_addr_from_str(&ip, argv[5])) {
                puts("tftp: invalid IP address");
                return -1;
            }
        }
    }
    else {
        return -1;
    }

    if (_tftp_action == TFTP_READ) {
        puts("tftp: starting read request");

        gnrc_tftp_client_read(&ip, file_name, mode, _tftp_client_data_cb,
                              _tftp_client_start_cb, _tftp_client_stop_cb, use_options);
    }
    else if (_tftp_action == TFTP_WRITE) {
        puts("tftp: starting write request");

        gnrc_tftp_client_write(&ip, file_name, mode, _tftp_client_data_cb,
                               sizeof(_tftp_client_hello), _tftp_client_stop_cb, use_options);
    }

    return 0;
}
コード例 #20
0
ファイル: sc_gnrc_netif.c プロジェクト: A-Paul/RIOT
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
}