42 #include "net/rpl/rpl.h"
46 #include "sys/clock.h"
48 #include "net/ipv6/uip-ds6.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)
73 #define RPL_CODE_DIS 0x00
74 #define RPL_CODE_DIO 0x01
75 #define RPL_CODE_DAO 0x02
76 #define RPL_CODE_DAO_ACK 0x03
77 #define RPL_CODE_SEC_DIS 0x80
78 #define RPL_CODE_SEC_DIO 0x81
79 #define RPL_CODE_SEC_DAO 0x82
80 #define RPL_CODE_SEC_DAO_ACK 0x83
85 #define RPL_OPTION_PAD1 0
86 #define RPL_OPTION_PADN 1
87 #define RPL_OPTION_DAG_METRIC_CONTAINER 2
88 #define RPL_OPTION_ROUTE_INFO 3
89 #define RPL_OPTION_DAG_CONF 4
90 #define RPL_OPTION_TARGET 5
91 #define RPL_OPTION_TRANSIT 6
92 #define RPL_OPTION_SOLICITED_INFO 7
93 #define RPL_OPTION_PREFIX_INFO 8
94 #define RPL_OPTION_TARGET_DESC 9
97 #define RPL_DAO_K_FLAG 0x80
98 #define RPL_DAO_D_FLAG 0x40
101 #define RPL_HDR_OPT_LEN 4
102 #define RPL_HOP_BY_HOP_LEN (RPL_HDR_OPT_LEN + 2 + 2)
103 #define RPL_HDR_OPT_DOWN 0x80
104 #define RPL_HDR_OPT_DOWN_SHIFT 7
105 #define RPL_HDR_OPT_RANK_ERR 0x40
106 #define RPL_HDR_OPT_RANK_ERR_SHIFT 6
107 #define RPL_HDR_OPT_FWD_ERR 0x20
108 #define RPL_HDR_OPT_FWD_ERR_SHIFT 5
113 #ifdef RPL_CONF_DAO_LATENCY
114 #define RPL_DAO_LATENCY RPL_CONF_DAO_LATENCY
116 #define RPL_DAO_LATENCY (CLOCK_SECOND * 4)
120 #define RPL_ZERO_LIFETIME 0
122 #define RPL_LIFETIME(instance, lifetime) \
123 ((unsigned long)(instance)->lifetime_unit * (lifetime))
125 #ifndef RPL_CONF_MIN_HOPRANKINC
126 #define RPL_MIN_HOPRANKINC 256
128 #define RPL_MIN_HOPRANKINC RPL_CONF_MIN_HOPRANKINC
130 #define RPL_MAX_RANKINC (7 * RPL_MIN_HOPRANKINC)
132 #define DAG_RANK(fixpt_rank, instance) \
133 ((fixpt_rank) / (instance)->min_hoprankinc)
139 #define ROOT_RANK(instance) (instance)->min_hoprankinc
141 #define INFINITE_RANK 0xffff
147 #ifdef RPL_CONF_DIO_INTERVAL_MIN
148 #define RPL_DIO_INTERVAL_MIN RPL_CONF_DIO_INTERVAL_MIN
150 #define RPL_DIO_INTERVAL_MIN 12
154 #ifdef RPL_CONF_DIO_INTERVAL_DOUBLINGS
155 #define RPL_DIO_INTERVAL_DOUBLINGS RPL_CONF_DIO_INTERVAL_DOUBLINGS
157 #define RPL_DIO_INTERVAL_DOUBLINGS 8
161 #ifdef RPL_CONF_DIO_REDUNDANCY
162 #define RPL_DIO_REDUNDANCY RPL_CONF_DIO_REDUNDANCY
164 #define RPL_DIO_REDUNDANCY 10
168 #define DAO_EXPIRATION_TIMEOUT 60
170 #define RPL_INSTANCE_LOCAL_FLAG 0x80
171 #define RPL_INSTANCE_D_FLAG 0x40
174 #define RPL_ROUTE_FROM_INTERNAL 0
175 #define RPL_ROUTE_FROM_UNICAST_DAO 1
176 #define RPL_ROUTE_FROM_MULTICAST_DAO 2
177 #define RPL_ROUTE_FROM_DIO 3
180 #define RPL_MOP_NO_DOWNWARD_ROUTES 0
181 #define RPL_MOP_NON_STORING 1
182 #define RPL_MOP_STORING_NO_MULTICAST 2
183 #define RPL_MOP_STORING_MULTICAST 3
186 #define RPL_MOP_DEFAULT RPL_CONF_MOP
188 #if RPL_CONF_MULTICAST
189 #define RPL_MOP_DEFAULT RPL_MOP_STORING_MULTICAST
191 #define RPL_MOP_DEFAULT RPL_MOP_STORING_NO_MULTICAST
196 #if RPL_CONF_MULTICAST && (RPL_MOP_DEFAULT != RPL_MOP_STORING_MULTICAST)
197 #error "RPL Multicast requires RPL_MOP_DEFAULT==3. Check contiki-conf.h"
201 #ifdef RPL_CONF_MCAST_LIFETIME
202 #define RPL_MCAST_LIFETIME RPL_CONF_MCAST_LIFETIME
204 #define RPL_MCAST_LIFETIME 3
212 #define RPL_DAG_MC_ETX_DIVISOR 256
215 #define RPL_DIS_SEND 1
216 #ifdef RPL_DIS_INTERVAL_CONF
217 #define RPL_DIS_INTERVAL RPL_DIS_INTERVAL_CONF
219 #define RPL_DIS_INTERVAL 60
221 #define RPL_DIS_START_DELAY 5
225 #define RPL_LOLLIPOP_MAX_VALUE 255
226 #define RPL_LOLLIPOP_CIRCULAR_REGION 127
227 #define RPL_LOLLIPOP_SEQUENCE_WINDOWS 16
228 #define RPL_LOLLIPOP_INIT (RPL_LOLLIPOP_MAX_VALUE - RPL_LOLLIPOP_SEQUENCE_WINDOWS + 1)
229 #define RPL_LOLLIPOP_INCREMENT(counter) \
231 if((counter) > RPL_LOLLIPOP_CIRCULAR_REGION) { \
232 (counter) = ((counter) + 1) & RPL_LOLLIPOP_MAX_VALUE; \
234 (counter) = ((counter) + 1) & RPL_LOLLIPOP_CIRCULAR_REGION; \
238 #define RPL_LOLLIPOP_IS_INIT(counter) \
239 ((counter) > RPL_LOLLIPOP_CIRCULAR_REGION)
252 uint8_t dag_intdoubl;
255 uint8_t default_lifetime;
256 uint16_t lifetime_unit;
257 rpl_rank_t dag_max_rankinc;
258 rpl_rank_t dag_min_hoprankinc;
268 uint16_t mem_overflows;
269 uint16_t local_repairs;
270 uint16_t global_repairs;
271 uint16_t malformed_msgs;
273 uint16_t parent_switch;
275 typedef struct rpl_stats rpl_stats_t;
277 extern rpl_stats_t rpl_stats;
283 #define RPL_STAT(code) (code)
285 #define RPL_STAT(code)
294 void dis_output(uip_ipaddr_t *addr);
296 void dao_output(rpl_parent_t *, uint8_t lifetime);
297 void dao_output_target(rpl_parent_t *, uip_ipaddr_t *, uint8_t lifetime);
303 void rpl_join_dag(uip_ipaddr_t *from,
rpl_dio_t *dio);
304 void rpl_join_instance(uip_ipaddr_t *from,
rpl_dio_t *dio);
306 void rpl_process_dio(uip_ipaddr_t *,
rpl_dio_t *);
312 rpl_dag_t *rpl_alloc_dag(uint8_t, uip_ipaddr_t *);
321 rpl_parent_t *rpl_find_parent(
rpl_dag_t *, uip_ipaddr_t *);
322 rpl_parent_t *rpl_find_parent_any_dag(
rpl_instance_t *instance, uip_ipaddr_t *addr);
323 void rpl_nullify_parent(rpl_parent_t *);
324 void rpl_remove_parent(rpl_parent_t *);
326 rpl_parent_t *rpl_select_parent(
rpl_dag_t *dag);
328 void rpl_recalculate_ranks(
void);
334 void rpl_remove_routes_by_nexthop(uip_ipaddr_t *nexthop,
rpl_dag_t *dag);
336 int prefix_len, uip_ipaddr_t *next_hop);
337 void rpl_purge_routes(
void);
341 void rpl_lock_parent(rpl_parent_t *p);
352 void rpl_reset_periodic_timer(
void);
355 void rpl_poison_routes(
rpl_dag_t *, rpl_parent_t *);