40#include "net/routing/rpl-classic/rpl.h"
53#define uip_is_addr_linklocal_rplnodes_mcast(addr) \
54 ((addr)->u8[0] == 0xff) && \
55 ((addr)->u8[1] == 0x02) && \
56 ((addr)->u16[1] == 0) && \
57 ((addr)->u16[2] == 0) && \
58 ((addr)->u16[3] == 0) && \
59 ((addr)->u16[4] == 0) && \
60 ((addr)->u16[5] == 0) && \
61 ((addr)->u16[6] == 0) && \
62 ((addr)->u8[14] == 0) && \
63 ((addr)->u8[15] == 0x1a))
67#define uip_create_linklocal_rplnodes_mcast(addr) \
68 uip_ip6addr((addr), 0xff02, 0, 0, 0, 0, 0, 0, 0x001a)
71#define RPL_CODE_DIS 0x00
72#define RPL_CODE_DIO 0x01
73#define RPL_CODE_DAO 0x02
74#define RPL_CODE_DAO_ACK 0x03
75#define RPL_CODE_SEC_DIS 0x80
76#define RPL_CODE_SEC_DIO 0x81
77#define RPL_CODE_SEC_DAO 0x82
78#define RPL_CODE_SEC_DAO_ACK 0x83
81#define RPL_OPTION_PAD1 0
82#define RPL_OPTION_PADN 1
83#define RPL_OPTION_DAG_METRIC_CONTAINER 2
84#define RPL_OPTION_ROUTE_INFO 3
85#define RPL_OPTION_DAG_CONF 4
86#define RPL_OPTION_TARGET 5
87#define RPL_OPTION_TRANSIT 6
88#define RPL_OPTION_SOLICITED_INFO 7
89#define RPL_OPTION_PREFIX_INFO 8
90#define RPL_OPTION_TARGET_DESC 9
92#define RPL_DAO_K_FLAG 0x80
93#define RPL_DAO_D_FLAG 0x40
95#define RPL_DAO_ACK_UNCONDITIONAL_ACCEPT 0
96#define RPL_DAO_ACK_ACCEPT 1
97#define RPL_DAO_ACK_UNABLE_TO_ACCEPT 128
98#define RPL_DAO_ACK_UNABLE_TO_ADD_ROUTE_AT_ROOT 255
100#define RPL_DAO_ACK_TIMEOUT -1
104#define RPL_HDR_OPT_LEN 4
105#define RPL_HOP_BY_HOP_LEN (RPL_HDR_OPT_LEN + 2 + 2)
108#define RPL_RH_TYPE_SRH 3
109#define RPL_HDR_OPT_DOWN 0x80
110#define RPL_HDR_OPT_DOWN_SHIFT 7
111#define RPL_HDR_OPT_RANK_ERR 0x40
112#define RPL_HDR_OPT_RANK_ERR_SHIFT 6
113#define RPL_HDR_OPT_FWD_ERR 0x20
114#define RPL_HDR_OPT_FWD_ERR_SHIFT 5
119#ifdef RPL_CONF_DAO_DELAY
120#define RPL_DAO_DELAY RPL_CONF_DAO_DELAY
122#define RPL_DAO_DELAY (CLOCK_SECOND * 4)
126#ifdef RPL_CONF_NOPATH_REMOVAL_DELAY
127#define RPL_NOPATH_REMOVAL_DELAY RPL_CONF_NOPATH_REMOVAL_DELAY
129#define RPL_NOPATH_REMOVAL_DELAY 60
132#ifdef RPL_CONF_DAO_MAX_RETRANSMISSIONS
133#define RPL_DAO_MAX_RETRANSMISSIONS RPL_CONF_DAO_MAX_RETRANSMISSIONS
135#define RPL_DAO_MAX_RETRANSMISSIONS 5
138#ifdef RPL_CONF_DAO_RETRANSMISSION_TIMEOUT
139#define RPL_DAO_RETRANSMISSION_TIMEOUT RPL_CONF_DAO_RETRANSMISSION_TIMEOUT
141#define RPL_DAO_RETRANSMISSION_TIMEOUT (5 * CLOCK_SECOND)
145#define RPL_ZERO_LIFETIME 0
148#define RPL_INFINITE_LIFETIME 0xFF
150#define RPL_ROUTE_INFINITE_LIFETIME 0xFFFFFFFF
152#define RPL_LIFETIME(instance, lifetime) \
153 (((lifetime) == RPL_INFINITE_LIFETIME) ? \
154 RPL_ROUTE_INFINITE_LIFETIME : \
155 (unsigned long)(instance)->lifetime_unit * (lifetime))
158#ifndef RPL_CONF_MIN_HOPRANKINC
169#if RPL_OF_OCP == RPL_OCP_MRHOF
170#define RPL_MIN_HOPRANKINC 128
172#define RPL_MIN_HOPRANKINC 256
175#define RPL_MIN_HOPRANKINC RPL_CONF_MIN_HOPRANKINC
178#ifndef RPL_CONF_MAX_RANKINC
179#define RPL_MAX_RANKINC (7 * RPL_MIN_HOPRANKINC)
181#define RPL_MAX_RANKINC RPL_CONF_MAX_RANKINC
184#define DAG_RANK(fixpt_rank, instance) \
185 ((fixpt_rank) / (instance)->min_hoprankinc)
191#define ROOT_RANK(instance) (instance)->min_hoprankinc
193#define RPL_INFINITE_RANK 0xffff
196#define RPL_INSTANCE_LOCAL_FLAG 0x80
197#define RPL_INSTANCE_D_FLAG 0x40
200#define RPL_ROUTE_FROM_INTERNAL 0
201#define RPL_ROUTE_FROM_UNICAST_DAO 1
202#define RPL_ROUTE_FROM_MULTICAST_DAO 2
203#define RPL_ROUTE_FROM_DIO 3
206#define RPL_DIS_SEND 1
210#define RPL_LOLLIPOP_MAX_VALUE 255
211#define RPL_LOLLIPOP_CIRCULAR_REGION 127
212#define RPL_LOLLIPOP_SEQUENCE_WINDOWS 16
213#define RPL_LOLLIPOP_INIT (RPL_LOLLIPOP_MAX_VALUE - RPL_LOLLIPOP_SEQUENCE_WINDOWS + 1)
215#define RPL_LOLLIPOP_INCREMENT(counter) \
217 if((counter) > RPL_LOLLIPOP_CIRCULAR_REGION) { \
218 (counter) = ((counter) + 1) & RPL_LOLLIPOP_MAX_VALUE; \
220 (counter) = ((counter) + 1) & RPL_LOLLIPOP_CIRCULAR_REGION; \
224#define RPL_LOLLIPOP_IS_INIT(counter) \
225 ((counter) > RPL_LOLLIPOP_CIRCULAR_REGION)
238 uint8_t dag_intdoubl;
241 uint8_t default_lifetime;
242 uint16_t lifetime_unit;
243 rpl_rank_t dag_max_rankinc;
244 rpl_rank_t dag_min_hoprankinc;
249typedef struct rpl_dio rpl_dio_t;
254 uint16_t mem_overflows;
255 uint16_t local_repairs;
256 uint16_t global_repairs;
257 uint16_t malformed_msgs;
259 uint16_t parent_switch;
260 uint16_t forward_errors;
261 uint16_t loop_errors;
262 uint16_t loop_warnings;
263 uint16_t root_repairs;
265typedef struct rpl_stats rpl_stats_t;
267extern rpl_stats_t rpl_stats;
271#if MAC_CONF_WITH_TSCH
273#ifndef RPL_CALLBACK_PARENT_SWITCH
274#define RPL_CALLBACK_PARENT_SWITCH tsch_rpl_callback_parent_switch
277#ifndef RPL_CALLBACK_NEW_DIO_INTERVAL
278#define RPL_CALLBACK_NEW_DIO_INTERVAL tsch_rpl_callback_new_dio_interval
287#define RPL_STAT(code) (code)
289#define RPL_STAT(code)
298void dis_output(uip_ipaddr_t *
addr);
300void dao_output(rpl_parent_t *, uint8_t lifetime);
301void dao_output_target(rpl_parent_t *, uip_ipaddr_t *, uint8_t lifetime);
302void dao_ack_output(
rpl_instance_t *, uip_ipaddr_t *, uint8_t, uint8_t);
303void rpl_icmp6_register_handlers(
void);
305 nbr_table_reason_t r,
void *data);
308void rpl_join_dag(uip_ipaddr_t *from, rpl_dio_t *dio);
309void rpl_join_instance(uip_ipaddr_t *from, rpl_dio_t *dio);
315rpl_dag_t *rpl_alloc_dag(uint8_t, uip_ipaddr_t *);
319void rpl_purge_dags(
void);
322rpl_parent_t *rpl_add_parent(
rpl_dag_t *, rpl_dio_t *dio, uip_ipaddr_t *);
323rpl_parent_t *rpl_find_parent(
rpl_dag_t *, uip_ipaddr_t *);
325void rpl_nullify_parent(rpl_parent_t *);
326void rpl_remove_parent(rpl_parent_t *);
328rpl_parent_t *rpl_select_parent(
rpl_dag_t *dag);
330void rpl_recalculate_ranks(
void);
334void rpl_remove_routes_by_nexthop(uip_ipaddr_t *nexthop,
rpl_dag_t *dag);
336 int prefix_len, uip_ipaddr_t *next_hop);
337void rpl_purge_routes(
void);
345void rpl_schedule_unicast_dio_immediately(
rpl_instance_t *instance);
351void rpl_reset_periodic_timer(
void);
354void rpl_poison_routes(
rpl_dag_t *, rpl_parent_t *);
Header file for the callback timer.
void rpl_schedule_probing(void)
Schedule probing with delay RPL_PROBING_DELAY_FUNC()
void rpl_schedule_probing_now(void)
Schedule probing within a few seconds.
uip_ds6_nbr_t * rpl_icmp6_update_nbr_table(uip_ipaddr_t *from, nbr_table_reason_t r, void *data)
Updates IPv6 neighbor cache on incoming link-local RPL ICMPv6 messages.
void rpl_process_dio(uip_ipaddr_t *, rpl_dio_t *)
Processes incoming DIO.
rpl_instance_t * rpl_get_default_instance(void)
Returns pointer to the default instance (for compatibility with legagy RPL code)
Linked list manipulation routines.
Logical representation of a DAG Metric Container.
API for RPL objective functions (OF)
The default nbr_table entry (when UIP_DS6_NBR_MULTI_IPV6_ADDRS is disabled), that implements nbr cach...
An entry in the routing table.
Header file for routing table manipulation.
Header file for IPv6-related data structures.
This header file contains configuration directives for uIPv6 multicast support.
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Header file for the uIP TCP/IP stack.