40#ifndef UIP_DS6_ROUTE_H
41#define UIP_DS6_ROUTE_H
44#include "net/nbr-table.h"
48#ifdef UIP_CONF_MAX_ROUTES
50#define UIP_MAX_ROUTES UIP_CONF_MAX_ROUTES
54#if ROUTING_CONF_RPL_LITE
55#define UIP_MAX_ROUTES 0
56#elif ROUTING_CONF_RPL_CLASSIC
58#include "net/routing/rpl-classic/rpl-conf.h"
60#define UIP_MAX_ROUTES NETSTACK_MAX_ROUTE_ENTRIES
62#define UIP_MAX_ROUTES 0
66#define UIP_MAX_ROUTES NETSTACK_MAX_ROUTE_ENTRIES
71NBR_TABLE_DECLARE(nbr_routes);
73void uip_ds6_route_init(
void);
75#ifndef UIP_CONF_UIP_DS6_NOTIFICATIONS
76#define UIP_DS6_NOTIFICATIONS (UIP_MAX_ROUTES != 0)
78#define UIP_DS6_NOTIFICATIONS UIP_CONF_UIP_DS6_NOTIFICATIONS
81#if UIP_DS6_NOTIFICATIONS
86#define UIP_DS6_NOTIFICATION_DEFRT_ADD 0
87#define UIP_DS6_NOTIFICATION_DEFRT_RM 1
88#define UIP_DS6_NOTIFICATION_ROUTE_ADD 2
89#define UIP_DS6_NOTIFICATION_ROUTE_RM 3
91typedef void (* uip_ds6_notification_callback)(
int event,
92 const uip_ipaddr_t *route,
93 const uip_ipaddr_t *nexthop,
95struct uip_ds6_notification {
96 struct uip_ds6_notification *next;
97 uip_ds6_notification_callback callback;
100void uip_ds6_notification_add(
struct uip_ds6_notification *n,
101 uip_ds6_notification_callback c);
103void uip_ds6_notification_rm(
struct uip_ds6_notification *n);
109#define UIP_DS6_ROUTE_NB UIP_MAX_ROUTES
111#define UIP_DS6_ROUTE_NB 4
116#ifndef UIP_DS6_ROUTE_STATE_TYPE
117#define UIP_DS6_ROUTE_STATE_TYPE rpl_route_entry_t
119#define RPL_ROUTE_ENTRY_NOPATH_RECEIVED 0x01
120#define RPL_ROUTE_ENTRY_DAO_PENDING 0x02
121#define RPL_ROUTE_ENTRY_DAO_NACK 0x04
123#define RPL_ROUTE_IS_NOPATH_RECEIVED(route) \
124 (((route)->state.state_flags & RPL_ROUTE_ENTRY_NOPATH_RECEIVED) != 0)
125#define RPL_ROUTE_SET_NOPATH_RECEIVED(route) do { \
126 (route)->state.state_flags |= RPL_ROUTE_ENTRY_NOPATH_RECEIVED; \
128#define RPL_ROUTE_CLEAR_NOPATH_RECEIVED(route) do { \
129 (route)->state.state_flags &= ~RPL_ROUTE_ENTRY_NOPATH_RECEIVED; \
132#define RPL_ROUTE_IS_DAO_PENDING(route) \
133 ((route->state.state_flags & RPL_ROUTE_ENTRY_DAO_PENDING) != 0)
134#define RPL_ROUTE_SET_DAO_PENDING(route) do { \
135 (route)->state.state_flags |= RPL_ROUTE_ENTRY_DAO_PENDING; \
137#define RPL_ROUTE_CLEAR_DAO_PENDING(route) do { \
138 (route)->state.state_flags &= ~RPL_ROUTE_ENTRY_DAO_PENDING; \
141#define RPL_ROUTE_IS_DAO_NACKED(route) \
142 ((route->state.state_flags & RPL_ROUTE_ENTRY_DAO_NACK) != 0)
143#define RPL_ROUTE_SET_DAO_NACKED(route) do { \
144 (route)->state.state_flags |= RPL_ROUTE_ENTRY_DAO_NACK; \
146#define RPL_ROUTE_CLEAR_DAO_NACKED(route) do { \
147 (route)->state.state_flags &= ~RPL_ROUTE_ENTRY_DAO_NACK; \
150#define RPL_ROUTE_CLEAR_DAO(route) do { \
151 (route)->state.state_flags &= ~(RPL_ROUTE_ENTRY_DAO_NACK|RPL_ROUTE_ENTRY_DAO_PENDING); \
155typedef struct rpl_route_entry {
158 uint8_t dao_seqno_out;
159 uint8_t dao_seqno_in;
167 LIST_STRUCT(route_list);
180#ifdef UIP_DS6_ROUTE_STATE_TYPE
205 unsigned long interval);
208const uip_ipaddr_t *uip_ds6_defrt_choose(
void);
210void uip_ds6_defrt_periodic(
void);
218 const uip_ipaddr_t *next_hop);
220void uip_ds6_route_rm_by_nexthop(
const uip_ipaddr_t *nexthop);
223int uip_ds6_route_num_routes(
void);
226int uip_ds6_route_is_nexthop(
const uip_ipaddr_t *
ipaddr);
227int uip_ds6_route_count_nexthop_neighbors(
void);
struct uip_ds6_route uip_ds6_route_t
An entry in the routing table.
struct uip_ds6_defrt uip_ds6_defrt_t
An entry in the default router list.
#define UIP_DS6_ROUTE_STATE_TYPE
define some additional RPL related route state and neighbor callback for RPL - if not a DS6_ROUTE_STA...
Linked list manipulation routines.
Second timer library header file.
An entry in the default router list.
A neighbor route list entry, used on the uip_ds6_route->neighbor_routes->route_list list.
The neighbor routes hold a list of routing table entries that are attached to a specific neihbor.
An entry in the routing table.
static uip_ipaddr_t ipaddr
Pointer to prefix information option in uip_buf.
static uip_ds6_defrt_t * defrt
Pointer to an interface address.
Header file for the uIP TCP/IP stack.