ipv6_nc: add iterators

dev/timer
Martine Lenders 8 years ago
parent 56f5a836a8
commit a767f66d72

@ -175,6 +175,24 @@ void ng_ipv6_nc_remove(kernel_pid_t iface, const ng_ipv6_addr_t *ipv6_addr);
*/
ng_ipv6_nc_t *ng_ipv6_nc_get(kernel_pid_t iface, const ng_ipv6_addr_t *ipv6_addr);
/**
* @brief Gets next entry in neighbor cache after @p prev.
*
* @param[in] prev Previous entry. NULL to start iteration.
*
* @return The next entry in neighbor cache.
*/
ng_ipv6_nc_t *ng_ipv6_nc_get_next(ng_ipv6_nc_t *prev);
/**
* @brief Gets next reachable router entry in neighbor cache after @p prev.
*
* @param[in] prev Previous router entry. NULL to start iteration.
*
* @return The next reachable router entry in neighbor cache.
*/
ng_ipv6_nc_t *ng_ipv6_nc_get_next_router(ng_ipv6_nc_t *prev);
/**
* @brief Searches for any neighbor cache entry fitting the @p ipv6_addr,
* where you currently can send a packet to (do not confuse with

@ -136,6 +136,50 @@ ng_ipv6_nc_t *ng_ipv6_nc_get(kernel_pid_t iface, const ng_ipv6_addr_t *ipv6_addr
return NULL;
}
ng_ipv6_nc_t *ng_ipv6_nc_get_next(ng_ipv6_nc_t *prev)
{
if (prev == NULL) {
prev = ncache;
}
else {
prev++; /* get next entry */
}
while (prev < (ncache + NG_IPV6_NC_SIZE)) { /* while not reached end */
if (!ng_ipv6_addr_is_unspecified(&(prev->ipv6_addr))) {
return prev;
}
prev++;
}
return NULL;
}
static inline bool _is_reachable(ng_ipv6_nc_t *entry)
{
switch ((entry->flags & NG_IPV6_NC_STATE_MASK) >> NG_IPV6_NC_STATE_POS) {
case NG_IPV6_NC_STATE_UNREACHABLE:
case NG_IPV6_NC_STATE_INCOMPLETE:
return false;
default:
return true;
}
}
ng_ipv6_nc_t *ng_ipv6_nc_get_next_router(ng_ipv6_nc_t *prev)
{
for (ng_ipv6_nc_t *router = ng_ipv6_nc_get_next(prev); router != NULL;
router = ng_ipv6_nc_get_next(router)) {
if (router->flags & NG_IPV6_NC_IS_ROUTER) {
return router;
}
}
return NULL;
}
ng_ipv6_nc_t *ng_ipv6_nc_get_reachable(kernel_pid_t iface,
const ng_ipv6_addr_t *ipv6_addr)
{
@ -148,17 +192,11 @@ ng_ipv6_nc_t *ng_ipv6_nc_get_reachable(kernel_pid_t iface,
return NULL;
}
switch ((entry->flags & NG_IPV6_NC_STATE_MASK) >> NG_IPV6_NC_STATE_POS) {
case NG_IPV6_NC_STATE_UNREACHABLE:
case NG_IPV6_NC_STATE_INCOMPLETE:
DEBUG("ipv6_nc: Entry %s is unreachable (flags = 0x%02x)\n",
ng_ipv6_addr_to_str(addr_str, ipv6_addr, sizeof(addr_str)),
entry->flags);
return NULL;
default:
return entry;
if (_is_reachable(entry)) {
return entry;
}
return NULL;
}
ng_ipv6_nc_t *ng_ipv6_nc_still_reachable(const ng_ipv6_addr_t *ipv6_addr)

Loading…
Cancel
Save