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_ipv6_nc_remove__success(void) { ipv6_addr_t addr = DEFAULT_TEST_IPV6_ADDR; test_ipv6_nc_add__success(); /* adds DEFAULT_TEST_IPV6_ADDR to DEFAULT_TEST_NETIF */ TEST_ASSERT_NOT_NULL(ng_ipv6_nc_get(DEFAULT_TEST_NETIF, &addr)); ng_ipv6_nc_remove(DEFAULT_TEST_NETIF, &addr); TEST_ASSERT_NULL(ng_ipv6_nc_get(DEFAULT_TEST_NETIF, &addr)); }
static void test_ipv6_nc_remove__no_entry_addr2(void) { ipv6_addr_t addr = IPV6_ADDR_UNSPECIFIED; ipv6_addr_t exp_addr = DEFAULT_TEST_IPV6_ADDR; test_ipv6_nc_add__success(); /* adds DEFAULT_TEST_IPV6_ADDR to DEFAULT_TEST_NETIF */ ng_ipv6_nc_remove(DEFAULT_TEST_NETIF, &addr); TEST_ASSERT_NOT_NULL(ng_ipv6_nc_get(DEFAULT_TEST_NETIF, &exp_addr)); TEST_ASSERT_NULL(ng_ipv6_nc_get(DEFAULT_TEST_NETIF, &addr)); }
static int _ipv6_nc_reset(void) { ng_ipv6_nc_t *tmp = NULL; for (ng_ipv6_nc_t *entry = ng_ipv6_nc_get_next(NULL); entry != NULL; tmp = entry, entry = ng_ipv6_nc_get_next(entry)) { if (tmp) { ng_ipv6_nc_remove(tmp->iface, &tmp->ipv6_addr); } } /* remove last entry */ if (tmp) { ng_ipv6_nc_remove(tmp->iface, &tmp->ipv6_addr); } printf("success: reset neighbor cache\n"); return 0; }
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; }
static void test_ipv6_nc_get_next__holey(void) { ipv6_addr_t addr1 = OTHER_TEST_IPV6_ADDR; ipv6_addr_t addr2 = THIRD_TEST_IPV6_ADDR; ng_ipv6_nc_t *entry = NULL, *exp_entry = NULL; /* adds DEFAULT_TEST_IPV6_ADDR and OTHER_TEST_IPV6_ADDR to DEFAULT_TEST_NETIF */ test_ipv6_nc_get_next__2_entries(); TEST_ASSERT_NOT_NULL(ng_ipv6_nc_add(DEFAULT_TEST_NETIF, &addr2, TEST_STRING8, sizeof(TEST_STRING8) - 2, 0)); TEST_ASSERT_NOT_NULL((exp_entry = ng_ipv6_nc_get(DEFAULT_TEST_NETIF, &addr2))); ng_ipv6_nc_remove(DEFAULT_TEST_NETIF, &addr1); TEST_ASSERT_NOT_NULL((entry = ng_ipv6_nc_get_next(NULL))); TEST_ASSERT_NOT_NULL((entry = ng_ipv6_nc_get_next(entry))); TEST_ASSERT(exp_entry == entry); TEST_ASSERT_NULL(ng_ipv6_nc_get_next(entry)); }
static void test_ipv6_nc_add__address_update_despite_free_entry(void) { ipv6_addr_t default_addr = DEFAULT_TEST_IPV6_ADDR; ipv6_addr_t other_addr = OTHER_TEST_IPV6_ADDR; ng_ipv6_nc_t *entry1, *entry2; TEST_ASSERT_NOT_NULL(ng_ipv6_nc_add(OTHER_TEST_NETIF, &other_addr, TEST_STRING4, sizeof(TEST_STRING4), 0)); TEST_ASSERT_NOT_NULL((entry1 = ng_ipv6_nc_add(DEFAULT_TEST_NETIF, &default_addr, TEST_STRING4, sizeof(TEST_STRING4), 0))); /* create space by removing first entry and see if duplicate is still detected & updated */ ng_ipv6_nc_remove(OTHER_TEST_NETIF, &other_addr); TEST_ASSERT_NOT_NULL((entry2 = ng_ipv6_nc_add(DEFAULT_TEST_NETIF, &default_addr, TEST_STRING4, sizeof(TEST_STRING4), 0))); TEST_ASSERT(entry1 == entry2); }