1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-18 12:52:44 +01:00

gnrc_ipv6_nib: do not try to re-register to an unreachable router

This commit is contained in:
Martine Lenders 2017-11-20 15:44:10 +01:00
parent b561e84b7f
commit 168228ddc9
No known key found for this signature in database
GPG Key ID: 8E97A9FE55F25D62
4 changed files with 29 additions and 18 deletions

View File

@ -206,8 +206,10 @@ void _handle_rereg_address(const ipv6_addr_t *addr)
{ {
gnrc_netif_t *netif = gnrc_netif_get_by_ipv6_addr(addr); gnrc_netif_t *netif = gnrc_netif_get_by_ipv6_addr(addr);
_nib_dr_entry_t *router = _nib_drl_get_dr(); _nib_dr_entry_t *router = _nib_drl_get_dr();
const bool router_reachable = (router != NULL) &&
_is_reachable(router->next_hop);
if ((netif != NULL) && (router != NULL)) { if (router_reachable && (netif != NULL)) {
assert((unsigned)netif->pid == _nib_onl_get_if(router->next_hop)); assert((unsigned)netif->pid == _nib_onl_get_if(router->next_hop));
DEBUG("nib: Re-registering %s", DEBUG("nib: Re-registering %s",
ipv6_addr_to_str(addr_str, addr, sizeof(addr_str))); ipv6_addr_to_str(addr_str, addr, sizeof(addr_str)));
@ -224,9 +226,10 @@ void _handle_rereg_address(const ipv6_addr_t *addr)
if (netif != NULL) { if (netif != NULL) {
int idx = gnrc_netif_ipv6_addr_idx(netif, addr); int idx = gnrc_netif_ipv6_addr_idx(netif, addr);
if (_is_valid(netif, idx) || (_is_tentative(netif, idx) && if (router_reachable &&
(_is_valid(netif, idx) || (_is_tentative(netif, idx) &&
(gnrc_netif_ipv6_addr_dad_trans(netif, idx) < (gnrc_netif_ipv6_addr_dad_trans(netif, idx) <
SIXLOWPAN_ND_REG_TRANSMIT_NUMOF))) { SIXLOWPAN_ND_REG_TRANSMIT_NUMOF)))) {
uint32_t retrans_time; uint32_t retrans_time;
if (_is_valid(netif, idx)) { if (_is_valid(netif, idx)) {

View File

@ -495,6 +495,17 @@ void _set_nud_state(gnrc_netif_t *netif, _nib_onl_entry_t *nce,
#endif /* GNRC_IPV6_NIB_CONF_ROUTER */ #endif /* GNRC_IPV6_NIB_CONF_ROUTER */
} }
bool _is_reachable(_nib_onl_entry_t *entry)
{
switch (_get_nud_state(entry)) {
case GNRC_IPV6_NIB_NC_INFO_NUD_STATE_UNREACHABLE:
case GNRC_IPV6_NIB_NC_INFO_NUD_STATE_INCOMPLETE:
return false;
default:
return true;
}
}
/* internal functions */ /* internal functions */
static inline uint32_t _exp_backoff_retrans_timer(uint8_t ns_sent, static inline uint32_t _exp_backoff_retrans_timer(uint8_t ns_sent,
uint32_t retrans_timer) uint32_t retrans_timer)
@ -547,7 +558,6 @@ static inline bool _rflag_set(const ndp_nbr_adv_t *nbr_adv)
return (nbr_adv->type == ICMPV6_NBR_ADV) && return (nbr_adv->type == ICMPV6_NBR_ADV) &&
(nbr_adv->flags & NDP_NBR_ADV_FLAGS_R); (nbr_adv->flags & NDP_NBR_ADV_FLAGS_R);
} }
#endif /* GNRC_IPV6_NIB_CONF_ARSM */ #endif /* GNRC_IPV6_NIB_CONF_ARSM */
/** @} */ /** @} */

View File

@ -178,6 +178,17 @@ static inline uint16_t _get_nud_state(_nib_onl_entry_t *nbr)
void _set_nud_state(gnrc_netif_t *netif, _nib_onl_entry_t *nbr, void _set_nud_state(gnrc_netif_t *netif, _nib_onl_entry_t *nbr,
uint16_t state); uint16_t state);
/**
* @brief Checks if a node is in a reachable state
*
* A node is reachable if it is not in NUD state UNREACHABLE or INCOMPLETE
*
* @param[in] entry A node.
*
* @return true, if @p entry is in a reachable state.
* @return false, if @p entry is not in a reachable state.
*/
bool _is_reachable(_nib_onl_entry_t *entry);
#else /* GNRC_IPV6_NIB_CONF_ARSM || defined(DOXYGEN) */ #else /* GNRC_IPV6_NIB_CONF_ARSM || defined(DOXYGEN) */
#define _handle_snd_ns(ctx) (void)ctx #define _handle_snd_ns(ctx) (void)ctx
#define _handle_state_timeout(ctx) (void)ctx #define _handle_state_timeout(ctx) (void)ctx
@ -191,6 +202,7 @@ void _set_nud_state(gnrc_netif_t *netif, _nib_onl_entry_t *nbr,
#define _get_nud_state(nbr) (GNRC_IPV6_NIB_NC_INFO_NUD_STATE_UNMANAGED) #define _get_nud_state(nbr) (GNRC_IPV6_NIB_NC_INFO_NUD_STATE_UNMANAGED)
#define _set_nud_state(netif, nce, state) (void)netif; (void)nbr; (void)state #define _set_nud_state(netif, nce, state) (void)netif; (void)nbr; (void)state
#define _is_reachable(entry) (true)
#endif /* GNRC_IPV6_NIB_CONF_ARSM || defined(DOXYGEN) */ #endif /* GNRC_IPV6_NIB_CONF_ARSM || defined(DOXYGEN) */
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -983,20 +983,6 @@ static void _handle_nbr_adv(gnrc_netif_t *netif, const ipv6_hdr_t *ipv6,
} }
} }
#if GNRC_IPV6_NIB_CONF_ARSM
static inline bool _is_reachable(_nib_onl_entry_t *entry)
{
(void)entry; /* _get_nud_state() might just resolved to UNMANAGED as macro */
switch (_get_nud_state(entry)) {
case GNRC_IPV6_NIB_NC_INFO_NUD_STATE_UNREACHABLE:
case GNRC_IPV6_NIB_NC_INFO_NUD_STATE_INCOMPLETE:
return false;
default:
return true;
}
}
#endif /* GNRC_IPV6_NIB_CONF_ARSM */
#if GNRC_IPV6_NIB_CONF_QUEUE_PKT #if GNRC_IPV6_NIB_CONF_QUEUE_PKT
static gnrc_pktqueue_t *_alloc_queue_entry(gnrc_pktsnip_t *pkt) static gnrc_pktqueue_t *_alloc_queue_entry(gnrc_pktsnip_t *pkt)
{ {