static void set_chan(uint16_t channel) { kernel_pid_t netifs[NG_NETIF_NUMOF]; ng_netif_get(netifs); ng_netapi_set(netifs[0], NETCONF_OPT_CHANNEL, 0, (void *)&channel, 2); }
void ng_ndp_retrans_nbr_sol(ng_ipv6_nc_t *nc_entry) { if ((ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_INCOMPLETE) || (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_PROBE)) { if (nc_entry->probes_remaining > 1) { ng_ipv6_addr_t dst; DEBUG("ndp: Retransmit neighbor solicitation for %s\n", ng_ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str))); /* retransmit neighbor solicatation */ if (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_INCOMPLETE) { ng_ipv6_addr_set_solicited_nodes(&dst, &nc_entry->ipv6_addr); } else { dst.u64[0] = nc_entry->ipv6_addr.u64[0]; dst.u64[1] = nc_entry->ipv6_addr.u64[1]; } nc_entry->probes_remaining--; if (nc_entry->iface == KERNEL_PID_UNDEF) { timex_t t = { 0, NG_NDP_RETRANS_TIMER }; kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); for (size_t i = 0; i < ifnum; i++) { _send_nbr_sol(ifs[i], &nc_entry->ipv6_addr, &dst); } vtimer_remove(&nc_entry->nbr_sol_timer); vtimer_set_msg(&nc_entry->nbr_sol_timer, t, ng_ipv6_pid, NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); } else { ng_ipv6_netif_t *ipv6_iface = ng_ipv6_netif_get(nc_entry->iface); _send_nbr_sol(nc_entry->iface, &nc_entry->ipv6_addr, &dst); mutex_lock(&ipv6_iface->mutex); vtimer_remove(&nc_entry->nbr_sol_timer); vtimer_set_msg(&nc_entry->nbr_sol_timer, ipv6_iface->retrans_timer, ng_ipv6_pid, NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); mutex_unlock(&ipv6_iface->mutex); } } else if (nc_entry->probes_remaining <= 1) { DEBUG("ndp: Remove nc entry %s for interface %" PRIkernel_pid "\n", ng_ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str)), nc_entry->iface); #ifdef MODULE_FIB fib_remove_entry((uint8_t *) & (nc_entry->ipv6_addr), sizeof(ng_ipv6_addr_t)); #endif ng_ipv6_nc_remove(nc_entry->iface, &nc_entry->ipv6_addr); } } }
static void test_ng_netif_add__KERNEL_PID_UNDEF(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; TEST_ASSERT_EQUAL_INT(0, ng_netif_add(KERNEL_PID_UNDEF)); size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(0, size); }
static void test_ng_netif_add__success(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; TEST_ASSERT_EQUAL_INT(0, ng_netif_add(TEST_UINT8)); size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(1, size); TEST_ASSERT_EQUAL_INT(TEST_UINT8, ifs[0]); }
static void test_ng_netif_get__full(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; for (int i = 0; i < NG_NETIF_NUMOF; i++) { TEST_ASSERT_EQUAL_INT(0, ng_netif_add(TEST_UINT8 + i)); } size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(NG_NETIF_NUMOF, size); }
static void test_ng_netif_remove__success(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; test_ng_netif_add__success(); ng_netif_remove(TEST_UINT8); size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(0, size); }
static void test_ng_netif_remove__KERNEL_PID_UNDEF(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; test_ng_netif_add__success(); ng_netif_remove(KERNEL_PID_UNDEF); size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(1, size); TEST_ASSERT_EQUAL_INT(TEST_UINT8, ifs[0]); }
static void test_ng_netif_add__duplicate_entry(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; for (int i = 0; i < NG_NETIF_NUMOF + 4; i++) { TEST_ASSERT_EQUAL_INT(0, ng_netif_add(TEST_UINT8)); } size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(1, size); TEST_ASSERT_EQUAL_INT(TEST_UINT8, ifs[0]); }
static bool _is_iface(kernel_pid_t dev) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t numof = ng_netif_get(ifs); for (size_t i = 0; i < numof; i++) { if (ifs[i] == dev) { return true; } } return false; }
static void test_netif_add__success_with_ipv6(void) { kernel_pid_t *pids; size_t pid_num; ng_ipv6_netif_t *entry; ng_ipv6_addr_t exp_addr = NG_IPV6_ADDR_ALL_NODES_LINK_LOCAL; ng_netif_add(DEFAULT_TEST_NETIF); TEST_ASSERT_NOT_NULL((pids = ng_netif_get(&pid_num))); TEST_ASSERT_EQUAL_INT(1, pid_num); TEST_ASSERT_EQUAL_INT(DEFAULT_TEST_NETIF, pids[0]); TEST_ASSERT_NOT_NULL((entry = ng_ipv6_netif_get(DEFAULT_TEST_NETIF))); TEST_ASSERT_EQUAL_INT(DEFAULT_TEST_NETIF, entry->pid); TEST_ASSERT_EQUAL_STRING((char *)exp_addr.u8, (char *)entry->addrs[0].addr.u8); }
void ng_ipv6_netif_init_by_dev(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); for (size_t i = 0; i < ifnum; i++) { ng_ipv6_addr_t addr; eui64_t iid; ng_ipv6_netif_t *ipv6_if = ng_ipv6_netif_get(ifs[i]); if (ipv6_if == NULL) { continue; } mutex_lock(&ipv6_if->mutex); #ifdef MODULE_NG_SIXLOWPAN ng_nettype_t if_type = NG_NETTYPE_UNDEF; if ((ng_netapi_get(ifs[i], NETCONF_OPT_PROTO, 0, &if_type, sizeof(if_type)) != -ENOTSUP) && (if_type == NG_NETTYPE_SIXLOWPAN)) { uint16_t src_len = 8; DEBUG("Set 6LoWPAN flag\n"); ipv6_ifs[i].flags |= NG_IPV6_NETIF_FLAGS_SIXLOWPAN; /* use EUI-64 (8-byte address) for IID generation and for sending * packets */ ng_netapi_set(ifs[i], NETCONF_OPT_SRC_LEN, 0, &src_len, sizeof(src_len)); /* don't care for result */ } #endif if ((ng_netapi_get(ifs[i], NETCONF_OPT_IPV6_IID, 0, &iid, sizeof(eui64_t)) < 0)) { mutex_unlock(&ipv6_if->mutex); continue; } ng_ipv6_addr_set_aiid(&addr, iid.uint8); ng_ipv6_addr_set_link_local_prefix(&addr); _add_addr_to_entry(ipv6_if, &addr, 64, 0); mutex_unlock(&ipv6_if->mutex); } }
static bool _is_iface(kernel_pid_t iface) { #ifdef MODULE_NG_NETIF kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t numof = ng_netif_get(ifs); for (size_t i = 0; i < numof && i < NG_NETIF_NUMOF; i++) { if (ifs[i] == iface) { return true; } } return false; #else return (thread_get(iface) != NULL); #endif }
int _ipv6_nc_manage(int argc, char **argv) { if ((argc == 1) || (strcmp("list", argv[1]) == 0)) { return _ipv6_nc_list(); } if (argc > 1) { if ((argc == 4) && (strcmp("add", argv[1]) == 0)) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); if (ifnum > 1) { puts("error: multiple interfaces exist."); return 1; } return _ipv6_nc_add(ifs[0], argv[2], argv[3]); } else if ((argc > 4) && (strcmp("add", argv[1]) == 0)) { kernel_pid_t iface = (kernel_pid_t)atoi(argv[2]); if (!_is_iface(iface)) { puts("error: invalid interface given."); return 1; } return _ipv6_nc_add(iface, argv[3], argv[4]); } if (strcmp("del", argv[1]) == 0) { return _ipv6_nc_del(argv[2]); } if (strcmp("reset", argv[1]) == 0) { return _ipv6_nc_reset(); } } printf("usage: %s [list]\n" " or: %s add [<iface pid>] <ipv6_addr> <l2_addr>\n" " * <iface pid> is optional if only one interface exists.\n" " or: %s del <ipv6_addr>\n" " or: %s reset\n", argv[0], argv[0], argv[0], argv[0]); return 1; }
/* takes one out of the middle of the netif list and checks if all interfaces * are gotten regardless */ static void test_ng_netif_get__success_3_minus_one(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size; int count = 0; for (int i = 0; i < 3; i++) { TEST_ASSERT_EQUAL_INT(0, ng_netif_add(TEST_UINT8 + i)); } ng_netif_remove(TEST_UINT8 + 1); size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(2, size); for (size_t i = 0; i < size; i++) { if ((ifs[i] == TEST_UINT8) || ifs[i] == (TEST_UINT8 + 2)) { count++; } } TEST_ASSERT_EQUAL_INT(size, count); }
kernel_pid_t ng_ndp_next_hop_l2addr(uint8_t *l2addr, uint8_t *l2addr_len, kernel_pid_t iface, ng_ipv6_addr_t *dst, ng_pktsnip_t *pkt) { ng_ipv6_addr_t *next_hop_ip = NULL, *prefix = NULL; #ifdef MODULE_NG_IPV6_EXT_RH next_hop_ip = ng_ipv6_ext_rh_next_hop(hdr); #endif #ifdef MODULE_FIB size_t next_hop_size = sizeof(ng_ipv6_addr_t); uint32_t next_hop_flags = 0; ng_ipv6_addr_t next_hop_actual; /* FIB copies address into this variable */ if ((next_hop_ip == NULL) && (fib_get_next_hop(&iface, next_hop_actual.u8, &next_hop_size, &next_hop_flags, (uint8_t *)dst, sizeof(ng_ipv6_addr_t), 0) >= 0) && (next_hop_size == sizeof(ng_ipv6_addr_t))) { next_hop_ip = &next_hop_actual; } #endif if (next_hop_ip == NULL) { /* no route to host */ if (iface == KERNEL_PID_UNDEF) { /* ng_ipv6_netif_t doubles as prefix list */ iface = ng_ipv6_netif_find_by_prefix(&prefix, dst); } else { /* ng_ipv6_netif_t doubles as prefix list */ prefix = ng_ipv6_netif_match_prefix(iface, dst); } if ((prefix != NULL) && /* prefix is on-link */ (ng_ipv6_netif_addr_get(prefix)->flags & NG_IPV6_NETIF_ADDR_FLAGS_NDP_ON_LINK)) { next_hop_ip = dst; #ifdef MODULE_FIB /* We don't care if FIB is full, this is just for efficiency * for later sends */ fib_add_entry(iface, (uint8_t *)dst, sizeof(ng_ipv6_addr_t), 0, (uint8_t *)next_hop_ip, sizeof(ng_ipv6_addr_t), 0, FIB_LIFETIME_NO_EXPIRE); #endif } } if (next_hop_ip == NULL) { next_hop_ip = _default_router(); #ifdef MODULE_FIB /* We don't care if FIB is full, this is just for efficiency for later * sends */ fib_add_entry(iface, (uint8_t *)dst, sizeof(ng_ipv6_addr_t), 0, (uint8_t *)next_hop_ip, sizeof(ng_ipv6_addr_t), 0, FIB_LIFETIME_NO_EXPIRE); #endif } if (next_hop_ip != NULL) { ng_ipv6_nc_t *nc_entry = ng_ipv6_nc_get(iface, next_hop_ip); if ((nc_entry != NULL) && ng_ipv6_nc_is_reachable(nc_entry)) { DEBUG("ndp: found reachable neighbor (%s => ", ng_ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str))); DEBUG("%s)\n", ng_netif_addr_to_str(addr_str, sizeof(addr_str), nc_entry->l2_addr, nc_entry->l2_addr_len)); if (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_STALE) { _set_state(nc_entry, NG_IPV6_NC_STATE_DELAY); } memcpy(l2addr, nc_entry->l2_addr, nc_entry->l2_addr_len); *l2addr_len = nc_entry->l2_addr_len; /* TODO: unreachability check */ return nc_entry->iface; } else if (nc_entry == NULL) { ng_pktqueue_t *pkt_node; ng_ipv6_addr_t dst_sol; nc_entry = ng_ipv6_nc_add(iface, next_hop_ip, NULL, 0, NG_IPV6_NC_STATE_INCOMPLETE << NG_IPV6_NC_STATE_POS); if (nc_entry == NULL) { DEBUG("ndp: could not create neighbor cache entry\n"); return KERNEL_PID_UNDEF; } pkt_node = _alloc_pkt_node(pkt); if (pkt_node == NULL) { DEBUG("ndp: could not add packet to packet queue\n"); } else { /* prevent packet from being released by IPv6 */ ng_pktbuf_hold(pkt_node->pkt, 1); ng_pktqueue_add(&nc_entry->pkts, pkt_node); } /* address resolution */ ng_ipv6_addr_set_solicited_nodes(&dst_sol, next_hop_ip); if (iface == KERNEL_PID_UNDEF) { timex_t t = { 0, NG_NDP_RETRANS_TIMER }; kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); for (size_t i = 0; i < ifnum; i++) { _send_nbr_sol(ifs[i], next_hop_ip, &dst_sol); } vtimer_remove(&nc_entry->nbr_sol_timer); vtimer_set_msg(&nc_entry->nbr_sol_timer, t, ng_ipv6_pid, NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); } else { ng_ipv6_netif_t *ipv6_iface = ng_ipv6_netif_get(iface); _send_nbr_sol(iface, next_hop_ip, &dst_sol); mutex_lock(&ipv6_iface->mutex); vtimer_remove(&nc_entry->nbr_sol_timer); vtimer_set_msg(&nc_entry->nbr_sol_timer, ipv6_iface->retrans_timer, ng_ipv6_pid, NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); mutex_unlock(&ipv6_iface->mutex); } } } return KERNEL_PID_UNDEF; }
static void _send_multicast(kernel_pid_t iface, ng_pktsnip_t *pkt, ng_pktsnip_t *ipv6, ng_pktsnip_t *payload, bool prep_hdr) { ng_pktsnip_t *netif; kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = 0; if (iface == KERNEL_PID_UNDEF) { /* get list of interfaces */ ifnum = ng_netif_get(ifs); /* throw away packet if no one is interested */ if (ifnum == 0) { DEBUG("ipv6: no interfaces registered, dropping packet\n"); ng_pktbuf_release(pkt); return; } } #if NG_NETIF_NUMOF > 1 /* netif header not present: send over all interfaces */ if (iface == KERNEL_PID_UNDEF) { /* send packet to link layer */ ng_pktbuf_hold(pkt, ifnum - 1); for (size_t i = 0; i < ifnum; i++) { if (prep_hdr) { /* need to get second write access (duplication) to fill IPv6 * header interface-local */ ipv6 = ng_pktbuf_start_write(ipv6); if (ipv6 == NULL) { DEBUG("ipv6: unable to get write access to IPv6 header, " "for interface %" PRIkernel_pid "\n", ifs[i]); ng_pktbuf_release(pkt); return; } if (_fill_ipv6_hdr(ifs[i], ipv6, payload) < 0) { /* error on filling up header */ ng_pktbuf_release(pkt); return; } } /* allocate interface header */ netif = ng_netif_hdr_build(NULL, 0, NULL, 0); if (netif == NULL) { DEBUG("ipv6: error on interface header allocation, " "dropping packet\n"); ng_pktbuf_release(pkt); return; } LL_PREPEND(pkt, netif); _send_multicast_over_iface(ifs[i], pkt, netif); } } else { /* iface != KERNEL_PID_UNDEF implies that netif header is present */ if (prep_hdr) { if (_fill_ipv6_hdr(iface, ipv6, payload) < 0) { /* error on filling up header */ ng_pktbuf_release(pkt); return; } } netif = pkt; _send_multicast_over_iface(iface, pkt, netif); } #else /* NG_NETIF_NUMOF */ (void)ifnum; /* not used in this build branch */ if (iface == KERNEL_PID_UNDEF) { iface = ifs[0]; /* allocate interface header */ netif = ng_netif_hdr_build(NULL, 0, NULL, 0); if (netif == NULL) { DEBUG("ipv6: error on interface header allocation, " "dropping packet\n"); ng_pktbuf_release(pkt); return; } LL_PREPEND(pkt, netif); } else { netif = pkt; } if (prep_hdr) { if (_fill_ipv6_hdr(iface, ipv6, payload) < 0) { /* error on filling up header */ ng_pktbuf_release(pkt); return; } } _send_multicast_over_iface(iface, pkt, netif); #endif /* NG_NETIF_NUMOF */ }
static void test_ng_netif_get__empty(void) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t size = ng_netif_get(ifs); TEST_ASSERT_EQUAL_INT(0, size); }
int _netif_config(int argc, char **argv) { if (argc < 2) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t numof = ng_netif_get(ifs); for (size_t i = 0; i < numof; i++) { _netif_list(ifs[i]); } return 0; } else if (_is_number(argv[1])) { kernel_pid_t dev = (kernel_pid_t)atoi(argv[1]); if (_is_iface(dev)) { if (argc < 3) { _netif_list(dev); return 0; } else if (strcmp(argv[2], "set") == 0) { if (argc < 5) { _set_usage(argv[0]); return 1; } return _netif_set(argv[0], dev, argv[3], argv[4]); } else if (strcmp(argv[2], "add") == 0) { if (argc < 4) { _add_usage(argv[0]); return 1; } return _netif_add(argv[0], (kernel_pid_t)dev, argc - 3, argv + 3); } else if (strcmp(argv[2], "del") == 0) { if (argc < 4) { _del_usage(argv[0]); return 1; } return _netif_del((kernel_pid_t)dev, argv[3]); } else { return _netif_flag(argv[0], dev, argv[2]); } } else { puts("error: invalid interface given"); return 1; } } printf("usage: %s [<if_id>]\n", argv[0]); _set_usage(argv[0]); _flag_usage(argv[0]); _add_usage(argv[0]); _del_usage(argv[0]); return 1; }
int _fib_route_handler(int argc, char **argv) { /* e.g. fibroute right now dont care about the adress/protocol family */ if (argc == 1) { fib_print_routes(); return 0; } /* e.g. firoute [add|del] */ if (argc == 2) { if ((strcmp("add", argv[1]) == 0)) { _fib_usage(2); } else if ((strcmp("del", argv[1]) == 0)) { _fib_usage(3); } else { puts("\nunrecognized parameter1.\nPlease enter fibroute [add|del] for more information."); } return 1; } if (argc > 2 && !((strcmp("add", argv[1]) == 0) || (strcmp("del", argv[1]) == 0))) { puts("\nunrecognized parameter2.\nPlease enter fibroute [add|del] for more information."); return 1; } /* e.g. fibroute del <destination> */ if (argc == 3) { if (inet_pton(AF_INET6, argv[2], tmp_ipv6_dst)) { fib_remove_entry(tmp_ipv6_dst, IN6ADDRSZ); } else if (inet_pton(AF_INET, argv[2], tmp_ipv4_dst)) { fib_remove_entry(tmp_ipv4_dst, INADDRSZ); } else { fib_remove_entry((uint8_t *)argv[2], (strlen(argv[2]))); } return 0; } #ifdef MODULE_NG_NETIF /* e.g. fibroute add <destination> via <next hop> */ if ((argc == 5) && (strcmp("add", argv[1]) == 0) && (strcmp("via", argv[3]) == 0)) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); if (ifnum == 1) { _fib_add(argv[2], argv[4], ifs[0], FIB_LIFETIME_NO_EXPIRE); } else { _fib_usage(1); return 1; } return 0; } /* e.g. fibroute add <destination> via <next hop> lifetime <lifetime> */ if ((argc == 7) && (strcmp("add", argv[1]) == 0) && (strcmp("via", argv[3]) == 0) && (strcmp("lifetime", argv[5]) == 0)) { kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); if (ifnum == 1) { _fib_add(argv[2], argv[4], ifs[0], (uint32_t)atoi(argv[6])); } else { _fib_usage(1); return 1; } return 0; } #endif /* e.g. fibroute add <destination> via <next hop> dev <device> */ if (argc == 7) { if ((strcmp("add", argv[1]) == 0) && (strcmp("via", argv[3]) == 0) && (strcmp("dev", argv[5]) == 0)) { _fib_add(argv[2], argv[4], (kernel_pid_t)atoi(argv[6]), FIB_LIFETIME_NO_EXPIRE); } else { _fib_usage(1); return 1; } return 0; } /* e.g. fibroute add <destination> via <next hop> dev <device> lifetime <lifetime> */ if (argc == 9) { if ((strcmp("add", argv[1]) == 0) && (strcmp("via", argv[3]) == 0) && (strcmp("dev", argv[5]) == 0) && (strcmp("lifetime", argv[7]) == 0)) { _fib_add(argv[2], argv[4], (kernel_pid_t )atoi(argv[6]), (uint32_t)atoi(argv[8])); } else { _fib_usage(2); return 1; } return 0; } puts("\nunrecognized parameters.\nPlease enter fibroute [add|del] for more information."); return 1; }
void ng_ndp_retrans_nbr_sol(ng_ipv6_nc_t *nc_entry) { if ((nc_entry->probes_remaining > 1) && ((ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_INCOMPLETE) || (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_PROBE))) { ng_ipv6_addr_t dst; DEBUG("ndp: Retransmit neighbor solicitation for %s\n", ng_ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str))); /* retransmit neighbor solicatation */ if (ng_ipv6_nc_get_state(nc_entry) == NG_IPV6_NC_STATE_INCOMPLETE) { ng_ipv6_addr_set_solicited_nodes(&dst, &nc_entry->ipv6_addr); } else { dst.u64[0] = nc_entry->ipv6_addr.u64[0]; dst.u64[1] = nc_entry->ipv6_addr.u64[1]; } nc_entry->probes_remaining--; if (nc_entry->iface == KERNEL_PID_UNDEF) { timex_t t = { 0, NG_NDP_RETRANS_TIMER }; kernel_pid_t ifs[NG_NETIF_NUMOF]; size_t ifnum = ng_netif_get(ifs); for (size_t i = 0; i < ifnum; i++) { _send_nbr_sol(ifs[i], &nc_entry->ipv6_addr, &dst); } vtimer_remove(&nc_entry->nbr_sol_timer); vtimer_set_msg(&nc_entry->nbr_sol_timer, t, ng_ipv6_pid, NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); } else { ng_ipv6_netif_t *ipv6_iface = ng_ipv6_netif_get(nc_entry->iface); _send_nbr_sol(nc_entry->iface, &nc_entry->ipv6_addr, &dst); mutex_lock(&ipv6_iface->mutex); vtimer_remove(&nc_entry->nbr_sol_timer); vtimer_set_msg(&nc_entry->nbr_sol_timer, ipv6_iface->retrans_timer, ng_ipv6_pid, NG_NDP_MSG_NBR_SOL_RETRANS, nc_entry); mutex_unlock(&ipv6_iface->mutex); } } else if (nc_entry->probes_remaining <= 1) { ng_pktqueue_node_t *queue_node; /* No need to call ng_ipv6_nc_remove() we know already were the * entry is */ DEBUG("ndp: Remove nc entry %s for interface %" PRIkernel_pid "\n", ng_ipv6_addr_to_str(addr_str, &nc_entry->ipv6_addr, sizeof(addr_str)), nc_entry->iface); while ((queue_node = ng_pktqueue_remove_head(&nc_entry->pkts))) { ng_pktbuf_release(queue_node->data); queue_node->data = NULL; } ng_ipv6_addr_set_unspecified(&(nc_entry->ipv6_addr)); nc_entry->iface = KERNEL_PID_UNDEF; nc_entry->flags = 0; nc_entry->probes_remaining = 0; } }