Merge pull request #1400 from pablocorbalan/nud-with-acks
Refresh nbr reachable state after received IPv6 unicast message
This commit is contained in:
commit
86dbd590db
|
@ -96,8 +96,12 @@ uip_ds6_nbr_add(const uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr,
|
||||||
uip_packetqueue_new(&nbr->packethandle);
|
uip_packetqueue_new(&nbr->packethandle);
|
||||||
#endif /* UIP_CONF_IPV6_QUEUE_PKT */
|
#endif /* UIP_CONF_IPV6_QUEUE_PKT */
|
||||||
#if UIP_ND6_SEND_NA
|
#if UIP_ND6_SEND_NA
|
||||||
/* timers are set separately, for now we put them in expired state */
|
if(nbr->state == NBR_REACHABLE) {
|
||||||
stimer_set(&nbr->reachable, 0);
|
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);
|
stimer_set(&nbr->sendns, 0);
|
||||||
nbr->nscount = 0;
|
nbr->nscount = 0;
|
||||||
#endif /* UIP_ND6_SEND_NA */
|
#endif /* UIP_ND6_SEND_NA */
|
||||||
|
@ -322,6 +326,20 @@ uip_ds6_neighbor_periodic(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#if UIP_ND6_SEND_NA
|
||||||
|
void
|
||||||
|
uip_ds6_nbr_refresh_reachable_state(const uip_ipaddr_t *ipaddr)
|
||||||
|
{
|
||||||
|
uip_ds6_nbr_t *nbr;
|
||||||
|
nbr = uip_ds6_nbr_lookup(ipaddr);
|
||||||
|
if(nbr != NULL) {
|
||||||
|
nbr->state = NBR_REACHABLE;
|
||||||
|
nbr->nscount = 0;
|
||||||
|
stimer_set(&nbr->reachable, UIP_ND6_REACHABLE_TIME / 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* UIP_ND6_SEND_NA */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
uip_ds6_nbr_t *
|
uip_ds6_nbr_t *
|
||||||
uip_ds6_get_least_lifetime_neighbor(void)
|
uip_ds6_get_least_lifetime_neighbor(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -98,6 +98,17 @@ void uip_ds6_link_neighbor_callback(int status, int numtx);
|
||||||
void uip_ds6_neighbor_periodic(void);
|
void uip_ds6_neighbor_periodic(void);
|
||||||
int uip_ds6_nbr_num(void);
|
int uip_ds6_nbr_num(void);
|
||||||
|
|
||||||
|
#if UIP_ND6_SEND_NA
|
||||||
|
/**
|
||||||
|
* \brief Refresh the reachable state of a neighbor. This function
|
||||||
|
* may be called when a node receives an IPv6 message that confirms the
|
||||||
|
* reachability of a neighbor.
|
||||||
|
* \param ipaddr pointer to the IPv6 address whose neighbor reachability state
|
||||||
|
* should be refreshed.
|
||||||
|
*/
|
||||||
|
void uip_ds6_nbr_refresh_reachable_state(const uip_ipaddr_t *ipaddr);
|
||||||
|
#endif /* UIP_ND6_SEND_NA */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief
|
* \brief
|
||||||
* This searches inside the neighbor table for the neighbor that is about to
|
* This searches inside the neighbor table for the neighbor that is about to
|
||||||
|
|
|
@ -522,14 +522,11 @@ na_input(void)
|
||||||
goto discard;
|
goto discard;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_solicited) {
|
/* Note: No need to refresh the state of the nbr here.
|
||||||
nbr->state = NBR_REACHABLE;
|
* It has already been refreshed upon receiving the unicast IPv6 ND packet.
|
||||||
nbr->nscount = 0;
|
* See: uip_ds6_nbr_refresh_reachable_state()
|
||||||
|
*/
|
||||||
/* reachable time is stored in ms */
|
if(!is_solicited) {
|
||||||
stimer_set(&(nbr->reachable), uip_ds6_if.reachable_time / 1000);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
nbr->state = NBR_STALE;
|
nbr->state = NBR_STALE;
|
||||||
}
|
}
|
||||||
nbr->isrouter = is_router;
|
nbr->isrouter = is_router;
|
||||||
|
@ -552,11 +549,10 @@ na_input(void)
|
||||||
goto discard;
|
goto discard;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(is_solicited) {
|
/* Note: No need to refresh the state of the nbr here.
|
||||||
nbr->state = NBR_REACHABLE;
|
* It has already been refreshed upon receiving the unicast IPv6 ND packet.
|
||||||
/* reachable time is stored in ms */
|
* See: uip_ds6_nbr_refresh_reachable_state()
|
||||||
stimer_set(&(nbr->reachable), uip_ds6_if.reachable_time / 1000);
|
*/
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(nbr->isrouter && !is_router) {
|
if(nbr->isrouter && !is_router) {
|
||||||
|
|
|
@ -85,6 +85,10 @@
|
||||||
#include "rpl/rpl-private.h"
|
#include "rpl/rpl-private.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if UIP_ND6_SEND_NA
|
||||||
|
#include "net/ipv6/uip-ds6-nbr.h"
|
||||||
|
#endif /* UIP_ND6_SEND_NA */
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -1151,6 +1155,13 @@ uip_process(uint8_t flag)
|
||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Refresh neighbor state after receiving a unicast message */
|
||||||
|
#if UIP_ND6_SEND_NA
|
||||||
|
if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) {
|
||||||
|
uip_ds6_nbr_refresh_reachable_state(&UIP_IP_BUF->srcipaddr);
|
||||||
|
}
|
||||||
|
#endif /* UIP_ND6_SEND_NA */
|
||||||
|
|
||||||
#if UIP_CONF_ROUTER
|
#if UIP_CONF_ROUTER
|
||||||
/*
|
/*
|
||||||
* Next header field processing. In IPv6, we can have extension headers,
|
* Next header field processing. In IPv6, we can have extension headers,
|
||||||
|
|
|
@ -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;
|
return nbr;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in a new issue