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:
parent
b561e84b7f
commit
168228ddc9
@ -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)) {
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user