From 69903e4cb807b0f12783d617a4333a730c65ff53 Mon Sep 17 00:00:00 2001 From: Martin Lenders Date: Wed, 26 Mar 2014 15:06:57 +0100 Subject: [PATCH] Make neighbor cache remove function public --- sys/net/include/sixlowpan/ndp.h | 11 +++++++++++ sys/net/network_layer/sixlowpan/icmp.c | 11 +++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/sys/net/include/sixlowpan/ndp.h b/sys/net/include/sixlowpan/ndp.h index 9bf7b69561..b941ae44b7 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 9fd22b9618..12cb468bb1 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 @@ -1130,7 +1129,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); @@ -1590,18 +1589,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; } //------------------------------------------------------------------------------