40 #include "net/rpl/rpl.h"
44 #include "sys/clock.h"
54 #define uip_is_addr_linklocal_rplnodes_mcast(addr) \
55 ((addr)->u8[0] == 0xff) && \
56 ((addr)->u8[1] == 0x02) && \
57 ((addr)->u16[1] == 0) && \
58 ((addr)->u16[2] == 0) && \
59 ((addr)->u16[3] == 0) && \
60 ((addr)->u16[4] == 0) && \
61 ((addr)->u16[5] == 0) && \
62 ((addr)->u16[6] == 0) && \
63 ((addr)->u8[14] == 0) && \
64 ((addr)->u8[15] == 0x1a))
68 #define uip_create_linklocal_rplnodes_mcast(addr) \
69 uip_ip6addr((addr), 0xff02, 0, 0, 0, 0, 0, 0, 0x001a)
72 #define RPL_CODE_DIS 0x00
73 #define RPL_CODE_DIO 0x01
74 #define RPL_CODE_DAO 0x02
75 #define RPL_CODE_DAO_ACK 0x03
76 #define RPL_CODE_SEC_DIS 0x80
77 #define RPL_CODE_SEC_DIO 0x81
78 #define RPL_CODE_SEC_DAO 0x82
79 #define RPL_CODE_SEC_DAO_ACK 0x83
82 #define RPL_OPTION_PAD1 0
83 #define RPL_OPTION_PADN 1
84 #define RPL_OPTION_DAG_METRIC_CONTAINER 2
85 #define RPL_OPTION_ROUTE_INFO 3
86 #define RPL_OPTION_DAG_CONF 4
87 #define RPL_OPTION_TARGET 5
88 #define RPL_OPTION_TRANSIT 6
89 #define RPL_OPTION_SOLICITED_INFO 7
90 #define RPL_OPTION_PREFIX_INFO 8
91 #define RPL_OPTION_TARGET_DESC 9
93 #define RPL_DAO_K_FLAG 0x80
94 #define RPL_DAO_D_FLAG 0x40
96 #define RPL_DAO_ACK_UNCONDITIONAL_ACCEPT 0
97 #define RPL_DAO_ACK_ACCEPT 1
98 #define RPL_DAO_ACK_UNABLE_TO_ACCEPT 128
99 #define RPL_DAO_ACK_UNABLE_TO_ADD_ROUTE_AT_ROOT 255
101 #define RPL_DAO_ACK_TIMEOUT -1
105 #define RPL_HDR_OPT_LEN 4
106 #define RPL_HOP_BY_HOP_LEN (RPL_HDR_OPT_LEN + 2 + 2)
108 #define RPL_SRH_LEN 4
109 #define RPL_RH_TYPE_SRH 3
110 #define RPL_HDR_OPT_DOWN 0x80
111 #define RPL_HDR_OPT_DOWN_SHIFT 7
112 #define RPL_HDR_OPT_RANK_ERR 0x40
113 #define RPL_HDR_OPT_RANK_ERR_SHIFT 6
114 #define RPL_HDR_OPT_FWD_ERR 0x20
115 #define RPL_HDR_OPT_FWD_ERR_SHIFT 5
120 #ifdef RPL_CONF_DAO_DELAY
121 #define RPL_DAO_DELAY RPL_CONF_DAO_DELAY
123 #define RPL_DAO_DELAY (CLOCK_SECOND * 4)
127 #ifdef RPL_CONF_NOPATH_REMOVAL_DELAY
128 #define RPL_NOPATH_REMOVAL_DELAY RPL_CONF_NOPATH_REMOVAL_DELAY
130 #define RPL_NOPATH_REMOVAL_DELAY 60
133 #ifdef RPL_CONF_DAO_MAX_RETRANSMISSIONS
134 #define RPL_DAO_MAX_RETRANSMISSIONS RPL_CONF_DAO_MAX_RETRANSMISSIONS
136 #define RPL_DAO_MAX_RETRANSMISSIONS 5
139 #ifdef RPL_CONF_DAO_RETRANSMISSION_TIMEOUT
140 #define RPL_DAO_RETRANSMISSION_TIMEOUT RPL_CONF_DAO_RETRANSMISSION_TIMEOUT
142 #define RPL_DAO_RETRANSMISSION_TIMEOUT (5 * CLOCK_SECOND)
146 #define RPL_ZERO_LIFETIME 0
148 #define RPL_LIFETIME(instance, lifetime) \
149 ((unsigned long)(instance)->lifetime_unit * (lifetime))
151 #ifndef RPL_CONF_MIN_HOPRANKINC
160 #if RPL_OF_OCP == RPL_OCP_MRHOF
161 #define RPL_MIN_HOPRANKINC 128
163 #define RPL_MIN_HOPRANKINC 256
166 #define RPL_MIN_HOPRANKINC RPL_CONF_MIN_HOPRANKINC
169 #ifndef RPL_CONF_MAX_RANKINC
170 #define RPL_MAX_RANKINC (7 * RPL_MIN_HOPRANKINC)
172 #define RPL_MAX_RANKINC RPL_CONF_MAX_RANKINC
175 #define DAG_RANK(fixpt_rank, instance) \
176 ((fixpt_rank) / (instance)->min_hoprankinc)
182 #define ROOT_RANK(instance) (instance)->min_hoprankinc
184 #define INFINITE_RANK 0xffff
187 #define RPL_INSTANCE_LOCAL_FLAG 0x80
188 #define RPL_INSTANCE_D_FLAG 0x40
191 #define RPL_ROUTE_FROM_INTERNAL 0
192 #define RPL_ROUTE_FROM_UNICAST_DAO 1
193 #define RPL_ROUTE_FROM_MULTICAST_DAO 2
194 #define RPL_ROUTE_FROM_DIO 3
197 #define RPL_MOP_NO_DOWNWARD_ROUTES 0
198 #define RPL_MOP_NON_STORING 1
199 #define RPL_MOP_STORING_NO_MULTICAST 2
200 #define RPL_MOP_STORING_MULTICAST 3
204 #define RPL_MOP_DEFAULT RPL_CONF_MOP
206 #if RPL_CONF_MULTICAST
207 #define RPL_MOP_DEFAULT RPL_MOP_STORING_MULTICAST
209 #define RPL_MOP_DEFAULT RPL_MOP_STORING_NO_MULTICAST
216 #ifdef RPL_CONF_WITH_STORING
217 #define RPL_WITH_STORING RPL_CONF_WITH_STORING
220 #define RPL_WITH_STORING (RPL_MOP_DEFAULT != RPL_MOP_NON_STORING)
226 #ifdef RPL_CONF_WITH_NON_STORING
227 #define RPL_WITH_NON_STORING RPL_CONF_WITH_NON_STORING
230 #define RPL_WITH_NON_STORING (RPL_MOP_DEFAULT == RPL_MOP_NON_STORING)
233 #if RPL_WITH_STORING && (UIP_DS6_ROUTE_NB == 0)
234 #error "RPL with storing mode included but #routes == 0. Set UIP_CONF_MAX_ROUTES accordingly."
235 #if !RPL_WITH_NON_STORING && (RPL_NS_LINK_NUM > 0)
236 #error "You might also want to set RPL_NS_CONF_LINK_NUM to 0."
240 #if RPL_WITH_NON_STORING && (RPL_NS_LINK_NUM == 0)
241 #error "RPL with non-storing mode included but #links == 0. Set RPL_NS_CONF_LINK_NUM accordingly."
242 #if !RPL_WITH_STORING && (UIP_DS6_ROUTE_NB > 0)
243 #error "You might also want to set UIP_CONF_MAX_ROUTES to 0."
247 #define RPL_IS_STORING(instance) (RPL_WITH_STORING && ((instance) != NULL) && ((instance)->mop > RPL_MOP_NON_STORING))
248 #define RPL_IS_NON_STORING(instance) (RPL_WITH_NON_STORING && ((instance) != NULL) && ((instance)->mop == RPL_MOP_NON_STORING))
251 #if RPL_CONF_MULTICAST && (RPL_MOP_DEFAULT != RPL_MOP_STORING_MULTICAST)
252 #error "RPL Multicast requires RPL_MOP_DEFAULT==3. Check contiki-conf.h"
256 #ifdef RPL_CONF_MCAST_LIFETIME
257 #define RPL_MCAST_LIFETIME RPL_CONF_MCAST_LIFETIME
259 #define RPL_MCAST_LIFETIME 3
263 #define RPL_DIS_SEND 1
268 #define RPL_LOLLIPOP_MAX_VALUE 255
269 #define RPL_LOLLIPOP_CIRCULAR_REGION 127
270 #define RPL_LOLLIPOP_SEQUENCE_WINDOWS 16
271 #define RPL_LOLLIPOP_INIT (RPL_LOLLIPOP_MAX_VALUE - RPL_LOLLIPOP_SEQUENCE_WINDOWS + 1)
272 #define RPL_LOLLIPOP_INCREMENT(counter) \
274 if((counter) > RPL_LOLLIPOP_CIRCULAR_REGION) { \
275 (counter) = ((counter) + 1) & RPL_LOLLIPOP_MAX_VALUE; \
277 (counter) = ((counter) + 1) & RPL_LOLLIPOP_CIRCULAR_REGION; \
281 #define RPL_LOLLIPOP_IS_INIT(counter) \
282 ((counter) > RPL_LOLLIPOP_CIRCULAR_REGION)
295 uint8_t dag_intdoubl;
298 uint8_t default_lifetime;
299 uint16_t lifetime_unit;
300 rpl_rank_t dag_max_rankinc;
301 rpl_rank_t dag_min_hoprankinc;
302 rpl_prefix_t destination_prefix;
303 rpl_prefix_t prefix_info;
304 struct rpl_metric_container mc;
306 typedef struct rpl_dio rpl_dio_t;
311 uint16_t mem_overflows;
312 uint16_t local_repairs;
313 uint16_t global_repairs;
314 uint16_t malformed_msgs;
316 uint16_t parent_switch;
317 uint16_t forward_errors;
318 uint16_t loop_errors;
319 uint16_t loop_warnings;
320 uint16_t root_repairs;
322 typedef struct rpl_stats rpl_stats_t;
324 extern rpl_stats_t rpl_stats;
332 #define RPL_STAT(code) (code)
334 #define RPL_STAT(code)
338 extern rpl_instance_t instance_table[];
339 extern rpl_instance_t *default_instance;
342 void dis_output(uip_ipaddr_t *
addr);
343 void dio_output(rpl_instance_t *, uip_ipaddr_t *uc_addr);
344 void dao_output(rpl_parent_t *, uint8_t lifetime);
345 void dao_output_target(rpl_parent_t *, uip_ipaddr_t *, uint8_t lifetime);
346 void dao_ack_output(rpl_instance_t *, uip_ipaddr_t *, uint8_t, uint8_t);
347 void rpl_icmp6_register_handlers(
void);
348 uip_ds6_nbr_t *rpl_icmp6_update_nbr_table(uip_ipaddr_t *from,
349 nbr_table_reason_t r,
void *data);
352 void rpl_join_dag(uip_ipaddr_t *from, rpl_dio_t *dio);
353 void rpl_join_instance(uip_ipaddr_t *from, rpl_dio_t *dio);
354 void rpl_local_repair(rpl_instance_t *instance);
355 void rpl_process_dio(uip_ipaddr_t *, rpl_dio_t *);
356 int rpl_process_parent_event(rpl_instance_t *, rpl_parent_t *);
359 rpl_dag_t *rpl_alloc_dag(uint8_t, uip_ipaddr_t *);
360 rpl_instance_t *rpl_alloc_instance(uint8_t);
361 void rpl_free_dag(rpl_dag_t *);
362 void rpl_free_instance(rpl_instance_t *);
363 void rpl_purge_dags(
void);
366 rpl_parent_t *rpl_add_parent(rpl_dag_t *, rpl_dio_t *dio, uip_ipaddr_t *);
367 rpl_parent_t *rpl_find_parent(rpl_dag_t *, uip_ipaddr_t *);
368 rpl_parent_t *rpl_find_parent_any_dag(rpl_instance_t *instance, uip_ipaddr_t *
addr);
369 void rpl_nullify_parent(rpl_parent_t *);
370 void rpl_remove_parent(rpl_parent_t *);
371 void rpl_move_parent(rpl_dag_t *dag_src, rpl_dag_t *dag_dst, rpl_parent_t *parent);
372 rpl_parent_t *rpl_select_parent(rpl_dag_t *dag);
373 rpl_dag_t *rpl_select_dag(rpl_instance_t *instance,rpl_parent_t *parent);
374 void rpl_recalculate_ranks(
void);
377 void rpl_remove_routes(rpl_dag_t *dag);
378 void rpl_remove_routes_by_nexthop(uip_ipaddr_t *nexthop, rpl_dag_t *dag);
380 int prefix_len, uip_ipaddr_t *next_hop);
381 void rpl_purge_routes(
void);
384 rpl_of_t *rpl_find_of(rpl_ocp_t);
387 void rpl_schedule_dao(rpl_instance_t *);
388 void rpl_schedule_dao_immediately(rpl_instance_t *);
389 void rpl_schedule_unicast_dio_immediately(rpl_instance_t *instance);
390 void rpl_cancel_dao(rpl_instance_t *instance);
391 void rpl_schedule_probing(rpl_instance_t *instance);
393 void rpl_reset_dio_timer(rpl_instance_t *);
394 void rpl_reset_periodic_timer(
void);
397 void rpl_poison_routes(rpl_dag_t *, rpl_parent_t *);
400 rpl_instance_t *rpl_get_default_instance(
void);
static uip_ds6_addr_t * addr
Pointer to a router list entry.
Header file for IPv6-related data structures.
Header file for routing table manipulation.
An entry in the nbr cache.
This header file contains configuration directives for uIPv6 multicast support.
Header file for the callback timer
Linked list manipulation routines.
Header file for the uIP TCP/IP stack.
RPL non-storing mode specific functions.
An entry in the routing table.