40 #include "net/rpl/rpl.h"
44 #include "sys/clock.h"
52 #define uip_is_addr_linklocal_rplnodes_mcast(addr) \
53 ((addr)->u8[0] == 0xff) && \
54 ((addr)->u8[1] == 0x02) && \
55 ((addr)->u16[1] == 0) && \
56 ((addr)->u16[2] == 0) && \
57 ((addr)->u16[3] == 0) && \
58 ((addr)->u16[4] == 0) && \
59 ((addr)->u16[5] == 0) && \
60 ((addr)->u16[6] == 0) && \
61 ((addr)->u8[14] == 0) && \
62 ((addr)->u8[15] == 0x1a))
66 #define uip_create_linklocal_rplnodes_mcast(addr) \
67 uip_ip6addr((addr), 0xff02, 0, 0, 0, 0, 0, 0, 0x001a)
70 #define RPL_CODE_DIS 0x00
71 #define RPL_CODE_DIO 0x01
72 #define RPL_CODE_DAO 0x02
73 #define RPL_CODE_DAO_ACK 0x03
74 #define RPL_CODE_SEC_DIS 0x80
75 #define RPL_CODE_SEC_DIO 0x81
76 #define RPL_CODE_SEC_DAO 0x82
77 #define RPL_CODE_SEC_DAO_ACK 0x83
80 #define RPL_OPTION_PAD1 0
81 #define RPL_OPTION_PADN 1
82 #define RPL_OPTION_DAG_METRIC_CONTAINER 2
83 #define RPL_OPTION_ROUTE_INFO 3
84 #define RPL_OPTION_DAG_CONF 4
85 #define RPL_OPTION_TARGET 5
86 #define RPL_OPTION_TRANSIT 6
87 #define RPL_OPTION_SOLICITED_INFO 7
88 #define RPL_OPTION_PREFIX_INFO 8
89 #define RPL_OPTION_TARGET_DESC 9
91 #define RPL_DAO_K_FLAG 0x80
92 #define RPL_DAO_D_FLAG 0x40
95 #define RPL_HDR_OPT_LEN 4
96 #define RPL_HOP_BY_HOP_LEN (RPL_HDR_OPT_LEN + 2 + 2)
97 #define RPL_HDR_OPT_DOWN 0x80
98 #define RPL_HDR_OPT_DOWN_SHIFT 7
99 #define RPL_HDR_OPT_RANK_ERR 0x40
100 #define RPL_HDR_OPT_RANK_ERR_SHIFT 6
101 #define RPL_HDR_OPT_FWD_ERR 0x20
102 #define RPL_HDR_OPT_FWD_ERR_SHIFT 5
107 #ifdef RPL_CONF_DAO_LATENCY
108 #define RPL_DAO_LATENCY RPL_CONF_DAO_LATENCY
110 #define RPL_DAO_LATENCY (CLOCK_SECOND * 4)
114 #define RPL_ZERO_LIFETIME 0
116 #define RPL_LIFETIME(instance, lifetime) \
117 ((unsigned long)(instance)->lifetime_unit * (lifetime))
119 #ifndef RPL_CONF_MIN_HOPRANKINC
120 #define RPL_MIN_HOPRANKINC 256
122 #define RPL_MIN_HOPRANKINC RPL_CONF_MIN_HOPRANKINC
124 #define RPL_MAX_RANKINC (7 * RPL_MIN_HOPRANKINC)
126 #define DAG_RANK(fixpt_rank, instance) \
127 ((fixpt_rank) / (instance)->min_hoprankinc)
133 #define ROOT_RANK(instance) (instance)->min_hoprankinc
135 #define INFINITE_RANK 0xffff
139 #define DAO_EXPIRATION_TIMEOUT 60
141 #define RPL_INSTANCE_LOCAL_FLAG 0x80
142 #define RPL_INSTANCE_D_FLAG 0x40
145 #define RPL_ROUTE_FROM_INTERNAL 0
146 #define RPL_ROUTE_FROM_UNICAST_DAO 1
147 #define RPL_ROUTE_FROM_MULTICAST_DAO 2
148 #define RPL_ROUTE_FROM_DIO 3
151 #define RPL_MOP_NO_DOWNWARD_ROUTES 0
152 #define RPL_MOP_NON_STORING 1
153 #define RPL_MOP_STORING_NO_MULTICAST 2
154 #define RPL_MOP_STORING_MULTICAST 3
157 #define RPL_MOP_DEFAULT RPL_CONF_MOP
159 #if RPL_CONF_MULTICAST
160 #define RPL_MOP_DEFAULT RPL_MOP_STORING_MULTICAST
162 #define RPL_MOP_DEFAULT RPL_MOP_STORING_NO_MULTICAST
167 #if RPL_CONF_MULTICAST && (RPL_MOP_DEFAULT != RPL_MOP_STORING_MULTICAST)
168 #error "RPL Multicast requires RPL_MOP_DEFAULT==3. Check contiki-conf.h"
172 #ifdef RPL_CONF_MCAST_LIFETIME
173 #define RPL_MCAST_LIFETIME RPL_CONF_MCAST_LIFETIME
175 #define RPL_MCAST_LIFETIME 3
183 #define RPL_DAG_MC_ETX_DIVISOR 256
186 #define RPL_DIS_SEND 1
187 #ifdef RPL_DIS_INTERVAL_CONF
188 #define RPL_DIS_INTERVAL RPL_DIS_INTERVAL_CONF
190 #define RPL_DIS_INTERVAL 60
192 #define RPL_DIS_START_DELAY 5
196 #define RPL_LOLLIPOP_MAX_VALUE 255
197 #define RPL_LOLLIPOP_CIRCULAR_REGION 127
198 #define RPL_LOLLIPOP_SEQUENCE_WINDOWS 16
199 #define RPL_LOLLIPOP_INIT (RPL_LOLLIPOP_MAX_VALUE - RPL_LOLLIPOP_SEQUENCE_WINDOWS + 1)
200 #define RPL_LOLLIPOP_INCREMENT(counter) \
202 if((counter) > RPL_LOLLIPOP_CIRCULAR_REGION) { \
203 (counter) = ((counter) + 1) & RPL_LOLLIPOP_MAX_VALUE; \
205 (counter) = ((counter) + 1) & RPL_LOLLIPOP_CIRCULAR_REGION; \
209 #define RPL_LOLLIPOP_IS_INIT(counter) \
210 ((counter) > RPL_LOLLIPOP_CIRCULAR_REGION)
223 uint8_t dag_intdoubl;
226 uint8_t default_lifetime;
227 uint16_t lifetime_unit;
228 rpl_rank_t dag_max_rankinc;
229 rpl_rank_t dag_min_hoprankinc;
230 rpl_prefix_t destination_prefix;
231 rpl_prefix_t prefix_info;
232 struct rpl_metric_container mc;
234 typedef struct rpl_dio rpl_dio_t;
239 uint16_t mem_overflows;
240 uint16_t local_repairs;
241 uint16_t global_repairs;
242 uint16_t malformed_msgs;
244 uint16_t parent_switch;
246 typedef struct rpl_stats rpl_stats_t;
248 extern rpl_stats_t rpl_stats;
254 #define RPL_STAT(code) (code)
256 #define RPL_STAT(code)
260 extern rpl_instance_t instance_table[];
261 extern rpl_instance_t *default_instance;
264 void dis_output(uip_ipaddr_t *addr);
265 void dio_output(rpl_instance_t *, uip_ipaddr_t *uc_addr);
266 void dao_output(rpl_parent_t *, uint8_t lifetime);
267 void dao_output_target(rpl_parent_t *, uip_ipaddr_t *, uint8_t lifetime);
268 void dao_ack_output(rpl_instance_t *, uip_ipaddr_t *, uint8_t);
269 void rpl_icmp6_register_handlers(
void);
272 void rpl_join_dag(uip_ipaddr_t *from, rpl_dio_t *dio);
273 void rpl_join_instance(uip_ipaddr_t *from, rpl_dio_t *dio);
274 void rpl_local_repair(rpl_instance_t *instance);
275 void rpl_process_dio(uip_ipaddr_t *, rpl_dio_t *);
276 int rpl_process_parent_event(rpl_instance_t *, rpl_parent_t *);
279 rpl_dag_t *rpl_alloc_dag(uint8_t, uip_ipaddr_t *);
280 rpl_instance_t *rpl_alloc_instance(uint8_t);
281 void rpl_free_dag(rpl_dag_t *);
282 void rpl_free_instance(rpl_instance_t *);
285 rpl_parent_t *rpl_add_parent(rpl_dag_t *, rpl_dio_t *dio, uip_ipaddr_t *);
286 rpl_parent_t *rpl_find_parent(rpl_dag_t *, uip_ipaddr_t *);
287 rpl_parent_t *rpl_find_parent_any_dag(rpl_instance_t *instance, uip_ipaddr_t *addr);
288 void rpl_nullify_parent(rpl_parent_t *);
289 void rpl_remove_parent(rpl_parent_t *);
290 void rpl_move_parent(rpl_dag_t *dag_src, rpl_dag_t *dag_dst, rpl_parent_t *parent);
291 rpl_parent_t *rpl_select_parent(rpl_dag_t *dag);
292 rpl_dag_t *rpl_select_dag(rpl_instance_t *instance,rpl_parent_t *parent);
293 void rpl_recalculate_ranks(
void);
296 void rpl_remove_routes(rpl_dag_t *dag);
297 void rpl_remove_routes_by_nexthop(uip_ipaddr_t *nexthop, rpl_dag_t *dag);
299 int prefix_len, uip_ipaddr_t *next_hop);
300 void rpl_purge_routes(
void);
303 void rpl_lock_parent(rpl_parent_t *p);
306 rpl_of_t *rpl_find_of(rpl_ocp_t);
309 void rpl_schedule_dao(rpl_instance_t *);
310 void rpl_schedule_dao_immediately(rpl_instance_t *);
311 void rpl_cancel_dao(rpl_instance_t *instance);
313 void rpl_reset_dio_timer(rpl_instance_t *);
314 void rpl_reset_periodic_timer(
void);
317 void rpl_poison_routes(rpl_dag_t *, rpl_parent_t *);
Linked list manipulation routines.
An entry in the routing table.
This header file contains configuration directives for uIPv6 multicast support.
Header file for the uIP TCP/IP stack.
Network interface and stateless autoconfiguration (RFC 4862)
Header file for the callback timer