54 #define DEBUG DEBUG_NONE
57 #ifdef UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED
58 #define NEIGHBOR_STATE_CHANGED(n) UIP_CONF_DS6_NEIGHBOR_STATE_CHANGED(n)
61 #define NEIGHBOR_STATE_CHANGED(n)
64 #ifdef UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK
65 #define LINK_NEIGHBOR_CALLBACK(addr, status, numtx) UIP_CONF_DS6_LINK_NEIGHBOR_CALLBACK(addr, status, numtx)
66 void LINK_NEIGHBOR_CALLBACK(
const linkaddr_t *addr,
int status,
int numtx);
68 #define LINK_NEIGHBOR_CALLBACK(addr, status, numtx)
75 uip_ds6_neighbors_init(
void)
77 nbr_table_register(ds6_neighbors, (nbr_table_callback *)uip_ds6_nbr_rm);
82 uint8_t isrouter, uint8_t state)
84 uip_ds6_nbr_t *nbr = nbr_table_add_lladdr(ds6_neighbors, (linkaddr_t*)lladdr);
87 nbr->isrouter = isrouter;
89 #if UIP_CONF_IPV6_QUEUE_PKT
90 uip_packetqueue_new(&nbr->packethandle);
96 PRINTF(
"Adding neighbor with ip addr ");
98 PRINTF(
" link addr ");
100 PRINTF(
" state %u\n", state);
101 NEIGHBOR_STATE_CHANGED(nbr);
104 PRINTF(
"uip_ds6_nbr_add drop ip addr ");
106 PRINTF(
" link addr (%p) ", lladdr);
108 PRINTF(
" state %u\n", state);
118 #if UIP_CONF_IPV6_QUEUE_PKT
119 uip_packetqueue_free(&nbr->packethandle);
121 NEIGHBOR_STATE_CHANGED(nbr);
122 nbr_table_remove(ds6_neighbors, nbr);
131 return (nbr !=
NULL) ? &nbr->ipaddr :
NULL;
138 return (
const uip_lladdr_t *)nbr_table_get_lladdr(ds6_neighbors, nbr);
142 uip_ds6_nbr_num(
void)
148 for(nbr = nbr_table_head(ds6_neighbors);
150 nbr = nbr_table_next(ds6_neighbors, nbr)) {
157 uip_ds6_nbr_lookup(
const uip_ipaddr_t *ipaddr)
162 if(uip_ipaddr_cmp(&nbr->ipaddr, ipaddr)) {
165 nbr = nbr_table_next(ds6_neighbors, nbr);
174 return nbr_table_get_from_lladdr(ds6_neighbors, (linkaddr_t*)lladdr);
179 uip_ds6_nbr_ipaddr_from_lladdr(
const uip_lladdr_t *lladdr)
182 return nbr ? &nbr->ipaddr :
NULL;
187 uip_ds6_nbr_lladdr_from_ipaddr(
const uip_ipaddr_t *ipaddr)
190 return nbr ? uip_ds6_nbr_get_ll(nbr) :
NULL;
194 uip_ds6_link_neighbor_callback(
int status,
int numtx)
196 const linkaddr_t *dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
201 LINK_NEIGHBOR_CALLBACK(dest, status, numtx);
208 (nbr->state == NBR_STALE || nbr->state == NBR_DELAY ||
209 nbr->state == NBR_PROBE)) {
210 nbr->state = NBR_REACHABLE;
211 stimer_set(&nbr->reachable, UIP_ND6_REACHABLE_TIME / 1000);
212 PRINTF(
"uip-ds6-neighbor : received a link layer ACK : ");
214 PRINTF(
" is reachable.\n");
222 uip_ds6_neighbor_periodic(
void)
230 PRINTF(
"REACHABLE: moving to STALE (");
231 PRINT6ADDR(&nbr->ipaddr);
233 nbr->state = NBR_STALE;
238 if(nbr->nscount >= UIP_ND6_MAX_MULTICAST_SOLICIT) {
242 PRINTF(
"NBR_INCOMPLETE: NS %u\n", nbr->nscount);
244 stimer_set(&nbr->sendns, uip_ds6_if.retrans_timer / 1000);
249 nbr->state = NBR_PROBE;
251 PRINTF(
"DELAY: moving to PROBE\n");
256 if(nbr->nscount >= UIP_ND6_MAX_UNICAST_SOLICIT) {
258 PRINTF(
"PROBE END\n");
259 if((locdefrt = uip_ds6_defrt_lookup(&nbr->ipaddr)) !=
NULL) {
260 if (!locdefrt->isinfinite) {
261 uip_ds6_defrt_rm(locdefrt);
267 PRINTF(
"PROBE: NS %u\n", nbr->nscount);
269 stimer_set(&nbr->sendns, uip_ds6_if.retrans_timer / 1000);
276 nbr = nbr_table_next(ds6_neighbors, nbr);
286 if(nbr_expiring !=
NULL) {
294 nbr = nbr_table_next(ds6_neighbors, nbr);
Linked list manipulation routines.
uip_len
The length of the packet in the uip_buf buffer.
int stimer_expired(struct stimer *t)
Check if a timer has expired.
const linkaddr_t linkaddr_null
The null Rime address.
Header file for the Rime buffer (packetbuf) management
#define NULL
The null pointer.
#define NBR_INCOMPLETE
Possible states for the nbr cache entries.
void stimer_set(struct stimer *t, unsigned long interval)
Set a timer.
#define uip_ipaddr_copy(dest, src)
Copy an IP address from one place to another.
The MAC layer transmission was OK.
int linkaddr_cmp(const linkaddr_t *addr1, const linkaddr_t *addr2)
Compare two Rime addresses.
IPv6 Neighbor cache (link-layer/IPv6 address mapping)
uip_ds6_nbr_t * uip_ds6_get_least_lifetime_neighbor(void)
This searches inside the neighbor table for the neighbor that is about to expire the next...
A set of debugging macros.
An entry in the default router list.
uip_ds6_nbr_t * uip_ds6_nbr_add(const uip_ipaddr_t *ipaddr, const uip_lladdr_t *lladdr, uint8_t isrouter, uint8_t state)
Neighbor Cache basic routines.
void uip_nd6_ns_output(uip_ipaddr_t *src, uip_ipaddr_t *dest, uip_ipaddr_t *tgt)
Send a neighbor solicitation, send a Neighbor Advertisement.
Header file for the Rime address representation
unsigned long stimer_remaining(struct stimer *t)
The time until the timer expires.
An entry in the nbr cache.