diff --git a/sys/net/include/sixlowpan/ndp.h b/sys/net/include/sixlowpan/ndp.h index 9bf7b69561139b9b9a8059814500c4815004abb4..b941ae44b73414ac8a42aeb7dfed7e0501b25917 100644 --- a/sys/net/include/sixlowpan/ndp.h +++ b/sys/net/include/sixlowpan/ndp.h @@ -145,6 +145,17 @@ uint8_t ndp_neighbor_cache_add(int if_id, const ipv6_addr_t *ipaddr, const void *lladdr, uint8_t lladdr_len, uint8_t isrouter, ndp_nce_state_t state, ndp_nce_type_t type, uint16_t ltime); + +/** + * @brief Removes an address from the neighbor cache by IPv6 address. + * + * @param[in] ipaddr IPv6 address to remove, leave NULL if you only want + * to remove by Link-layer address. + * + * @return 1 on success, 0 otherwise. + */ +uint8_t ndp_neighbor_cache_remove(const ipv6_addr_t *ipaddr); + ndp_neighbor_cache_t *ndp_neighbor_cache_search(ipv6_addr_t *ipaddr); ndp_neighbor_cache_t *ndp_get_ll_address(ipv6_addr_t *ipaddr); int ndp_addr_is_on_link(ipv6_addr_t *dest_addr); diff --git a/sys/net/network_layer/sixlowpan/icmp.c b/sys/net/network_layer/sixlowpan/icmp.c index 1284774602291661352584e4fe5168aafc507a0d..a39b4a6bd3fe70f09c616b55fe1554c43471d8a8 100644 --- a/sys/net/network_layer/sixlowpan/icmp.c +++ b/sys/net/network_layer/sixlowpan/icmp.c @@ -145,7 +145,6 @@ uint8_t recvd_pref_len = 0; void def_rtr_lst_add(ipv6_addr_t *ipaddr, uint32_t rtr_ltime); void def_rtr_lst_rem(ndp_default_router_list_t *entry); -void nbr_cache_rem(ipv6_addr_t *addr); /** * @brief Set Source link-layer address option according to interface @@ -1127,7 +1126,7 @@ void recv_nbr_sol(void) /* update neighbor cache entry */ if (opt_aro_buf->reg_ltime == 0) { /* delete neighbor cache entry */ - nbr_cache_rem(&nbr_entry->addr); + ndp_neighbor_cache_remove(&nbr_entry->addr); } else { set_remaining_time(&(nbr_entry->ltime), (uint32_t)opt_aro_buf->reg_ltime); @@ -1587,18 +1586,22 @@ void nbr_cache_auto_rem(void) } } -void nbr_cache_rem(ipv6_addr_t *addr) +uint8_t ndp_neighbor_cache_remove(const ipv6_addr_t *ipaddr) { int i; + uint8_t removed = 0; for (i = 0; i < NBR_CACHE_SIZE; i++) { - if (memcmp(&(nbr_cache[i].addr.uint8[0]), &(addr->uint8[0]), 16) == 0) { + if (memcmp(&(nbr_cache[i].addr.uint8[0]), &(ipaddr->uint8[0]), 16) == 0) { memmove(&(nbr_cache[i]), &(nbr_cache[nbr_count]), sizeof(ndp_neighbor_cache_t)); memset(&(nbr_cache[nbr_count]), 0, sizeof(ndp_neighbor_cache_t)); nbr_count--; + removed = 1; } } + + return removed; } //------------------------------------------------------------------------------