51 #include "net/ipv6/uip-ds6-nbr.h"
53 #define DEBUG DEBUG_NONE
56 #ifdef UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED
57 #define NEIGHBOR_STATE_CHANGED(n) UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED(n)
60 #define NEIGHBOR_STATE_CHANGED(n)
63 #ifdef UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK
64 #define LINK_NEIGHBOR_CALLBACK(addr, status, numtx) UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK(addr, status, numtx)
65 void LINK_NEIGHBOR_CALLBACK(
const linkaddr_t *addr,
int status,
int numtx);
67 #define LINK_NEIGHBOR_CALLBACK(addr, status, numtx)
76 nbr_table_register(ds6_neighbors, (nbr_table_callback *)
uip_ds6_nbr_rm);
81 uint8_t isrouter, uint8_t state)
83 uip_ds6_nbr_t *nbr = nbr_table_add_lladdr(ds6_neighbors, (linkaddr_t*)lladdr);
86 nbr->isrouter = isrouter;
88 #if UIP_CONF_IPV6_QUEUE_PKT
89 uip_packetqueue_new(&nbr->packethandle);
95 PRINTF(
"Adding neighbor with ip addr ");
97 PRINTF(
" link addr ");
99 PRINTF(
" state %u\n", state);
100 NEIGHBOR_STATE_CHANGED(nbr);
103 PRINTF(
"uip_ds6_nbr_add drop ip addr ");
105 PRINTF(
" link addr (%p) ", lladdr);
107 PRINTF(
" state %u\n", state);
117 #if UIP_CONF_IPV6_QUEUE_PKT
118 uip_packetqueue_free(&nbr->packethandle);
120 NEIGHBOR_STATE_CHANGED(nbr);
121 nbr_table_remove(ds6_neighbors, nbr);
130 return (nbr !=
NULL) ? &nbr->ipaddr :
NULL;
137 return (
const uip_lladdr_t *)nbr_table_get_lladdr(ds6_neighbors, nbr);
147 for(nbr = nbr_table_head(ds6_neighbors);
149 nbr = nbr_table_next(ds6_neighbors, nbr)) {
161 if(uip_ipaddr_cmp(&nbr->ipaddr, ipaddr)) {
164 nbr = nbr_table_next(ds6_neighbors, nbr);
173 return nbr_table_get_from_lladdr(ds6_neighbors, (linkaddr_t*)lladdr);
181 return nbr ? &nbr->ipaddr :
NULL;
195 const linkaddr_t *dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
200 LINK_NEIGHBOR_CALLBACK(dest, status, numtx);
207 (nbr->state == NBR_STALE || nbr->state == NBR_DELAY ||
208 nbr->state == NBR_PROBE)) {
209 nbr->state = NBR_REACHABLE;
210 stimer_set(&nbr->reachable, UIP_ND6_REACHABLE_TIME / 1000);
211 PRINTF(
"uip-ds6-neighbor : received a link layer ACK : ");
213 PRINTF(
" is reachable.\n");
229 PRINTF(
"REACHABLE: moving to STALE (");
230 PRINT6ADDR(&nbr->ipaddr);
232 nbr->state = NBR_STALE;
237 if(nbr->nscount >= UIP_ND6_MAX_MULTICAST_SOLICIT) {
241 PRINTF(
"NBR_INCOMPLETE: NS %u\n", nbr->nscount);
243 stimer_set(&nbr->sendns, uip_ds6_if.retrans_timer / 1000);
248 nbr->state = NBR_PROBE;
250 PRINTF(
"DELAY: moving to PROBE\n");
255 if(nbr->nscount >= UIP_ND6_MAX_UNICAST_SOLICIT) {
257 PRINTF(
"PROBE END\n");
259 if (!locdefrt->isinfinite) {
266 PRINTF(
"PROBE: NS %u\n", nbr->nscount);
268 stimer_set(&nbr->sendns, uip_ds6_if.retrans_timer / 1000);
275 nbr = nbr_table_next(ds6_neighbors, nbr);
285 if(nbr_expiring !=
NULL) {
293 nbr = nbr_table_next(ds6_neighbors, nbr);