diff --git a/core/net/ipv6/uip-ds6-nbr.c b/core/net/ipv6/uip-ds6-nbr.c index 36585d23c..e51786372 100644 --- a/core/net/ipv6/uip-ds6-nbr.c +++ b/core/net/ipv6/uip-ds6-nbr.c @@ -96,8 +96,12 @@ uip_ds6_nbr_add(const uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr, uip_packetqueue_new(&nbr->packethandle); #endif /* UIP_CONF_IPV6_QUEUE_PKT */ #if UIP_ND6_SEND_NA - /* timers are set separately, for now we put them in expired state */ - stimer_set(&nbr->reachable, 0); + if(nbr->state == NBR_REACHABLE) { + stimer_set(&nbr->reachable, UIP_ND6_REACHABLE_TIME / 1000); + } else { + /* We set the timer in expired state */ + stimer_set(&nbr->reachable, 0); + } stimer_set(&nbr->sendns, 0); nbr->nscount = 0; #endif /* UIP_ND6_SEND_NA */ diff --git a/core/net/ipv6/uip-nd6.c b/core/net/ipv6/uip-nd6.c index 218507228..f8e804c45 100644 --- a/core/net/ipv6/uip-nd6.c +++ b/core/net/ipv6/uip-nd6.c @@ -522,14 +522,11 @@ na_input(void) goto discard; } - if(is_solicited) { - nbr->state = NBR_REACHABLE; - nbr->nscount = 0; - - /* reachable time is stored in ms */ - stimer_set(&(nbr->reachable), uip_ds6_if.reachable_time / 1000); - - } else { + /* Note: No need to refresh the state of the nbr here. + * It has already been refreshed upon receiving the unicast IPv6 ND packet. + * See: uip_ds6_nbr_refresh_reachable_state() + */ + if(!is_solicited) { nbr->state = NBR_STALE; } nbr->isrouter = is_router; @@ -552,11 +549,10 @@ na_input(void) goto discard; } } - if(is_solicited) { - nbr->state = NBR_REACHABLE; - /* reachable time is stored in ms */ - stimer_set(&(nbr->reachable), uip_ds6_if.reachable_time / 1000); - } + /* Note: No need to refresh the state of the nbr here. + * It has already been refreshed upon receiving the unicast IPv6 ND packet. + * See: uip_ds6_nbr_refresh_reachable_state() + */ } } if(nbr->isrouter && !is_router) { diff --git a/core/net/rpl/rpl-icmp6.c b/core/net/rpl/rpl-icmp6.c index 9ffc61dea..9b4566cc4 100644 --- a/core/net/rpl/rpl-icmp6.c +++ b/core/net/rpl/rpl-icmp6.c @@ -201,14 +201,6 @@ rpl_icmp6_update_nbr_table(uip_ipaddr_t *from, nbr_table_reason_t reason, void * } } - if(nbr != NULL) { -#if UIP_ND6_SEND_NA - /* set reachable timer if we added or found the nbr entry - and update - neighbor entry to reachable to avoid sending NS/NA, etc. */ - stimer_set(&nbr->reachable, UIP_ND6_REACHABLE_TIME / 1000); - nbr->state = NBR_REACHABLE; -#endif /* UIP_ND6_SEND_NA */ - } return nbr; } /*---------------------------------------------------------------------------*/