40 #include "net/routing/rpl-classic/rpl.h" 44 #include "sys/clock.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) 107 #define RPL_SRH_LEN 4 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) ? RPL_ROUTE_INFINITE_LIFETIME : (unsigned long)(instance)->lifetime_unit * (lifetime)) 156 #ifndef RPL_CONF_MIN_HOPRANKINC 165 #if RPL_OF_OCP == RPL_OCP_MRHOF 166 #define RPL_MIN_HOPRANKINC 128 168 #define RPL_MIN_HOPRANKINC 256 171 #define RPL_MIN_HOPRANKINC RPL_CONF_MIN_HOPRANKINC 174 #ifndef RPL_CONF_MAX_RANKINC 175 #define RPL_MAX_RANKINC (7 * RPL_MIN_HOPRANKINC) 177 #define RPL_MAX_RANKINC RPL_CONF_MAX_RANKINC 180 #define DAG_RANK(fixpt_rank, instance) \ 181 ((fixpt_rank) / (instance)->min_hoprankinc) 187 #define ROOT_RANK(instance) (instance)->min_hoprankinc 189 #define RPL_INFINITE_RANK 0xffff 192 #define RPL_INSTANCE_LOCAL_FLAG 0x80 193 #define RPL_INSTANCE_D_FLAG 0x40 196 #define RPL_ROUTE_FROM_INTERNAL 0 197 #define RPL_ROUTE_FROM_UNICAST_DAO 1 198 #define RPL_ROUTE_FROM_MULTICAST_DAO 2 199 #define RPL_ROUTE_FROM_DIO 3 202 #define RPL_DIS_SEND 1 207 #define RPL_LOLLIPOP_MAX_VALUE 255 208 #define RPL_LOLLIPOP_CIRCULAR_REGION 127 209 #define RPL_LOLLIPOP_SEQUENCE_WINDOWS 16 210 #define RPL_LOLLIPOP_INIT (RPL_LOLLIPOP_MAX_VALUE - RPL_LOLLIPOP_SEQUENCE_WINDOWS + 1) 211 #define RPL_LOLLIPOP_INCREMENT(counter) \ 213 if((counter) > RPL_LOLLIPOP_CIRCULAR_REGION) { \ 214 (counter) = ((counter) + 1) & RPL_LOLLIPOP_MAX_VALUE; \ 216 (counter) = ((counter) + 1) & RPL_LOLLIPOP_CIRCULAR_REGION; \ 220 #define RPL_LOLLIPOP_IS_INIT(counter) \ 221 ((counter) > RPL_LOLLIPOP_CIRCULAR_REGION) 234 uint8_t dag_intdoubl;
237 uint8_t default_lifetime;
238 uint16_t lifetime_unit;
239 rpl_rank_t dag_max_rankinc;
240 rpl_rank_t dag_min_hoprankinc;
245 typedef struct rpl_dio rpl_dio_t;
250 uint16_t mem_overflows;
251 uint16_t local_repairs;
252 uint16_t global_repairs;
253 uint16_t malformed_msgs;
255 uint16_t parent_switch;
256 uint16_t forward_errors;
257 uint16_t loop_errors;
258 uint16_t loop_warnings;
259 uint16_t root_repairs;
261 typedef struct rpl_stats rpl_stats_t;
263 extern rpl_stats_t rpl_stats;
267 #if MAC_CONF_WITH_TSCH 269 #ifndef RPL_CALLBACK_PARENT_SWITCH 270 #define RPL_CALLBACK_PARENT_SWITCH tsch_rpl_callback_parent_switch 273 #ifndef RPL_CALLBACK_NEW_DIO_INTERVAL 274 #define RPL_CALLBACK_NEW_DIO_INTERVAL tsch_rpl_callback_new_dio_interval 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);
298 void dao_ack_output(
rpl_instance_t *, uip_ipaddr_t *, uint8_t, uint8_t);
299 void rpl_icmp6_register_handlers(
void);
301 nbr_table_reason_t r,
void *data);
304 void rpl_join_dag(uip_ipaddr_t *from, rpl_dio_t *dio);
305 void rpl_join_instance(uip_ipaddr_t *from, rpl_dio_t *dio);
311 rpl_dag_t *rpl_alloc_dag(uint8_t, uip_ipaddr_t *);
315 void rpl_purge_dags(
void);
318 rpl_parent_t *rpl_add_parent(
rpl_dag_t *, rpl_dio_t *dio, uip_ipaddr_t *);
319 rpl_parent_t *rpl_find_parent(
rpl_dag_t *, uip_ipaddr_t *);
321 void rpl_nullify_parent(rpl_parent_t *);
322 void rpl_remove_parent(rpl_parent_t *);
324 rpl_parent_t *rpl_select_parent(
rpl_dag_t *dag);
326 void rpl_recalculate_ranks(
void);
330 void rpl_remove_routes_by_nexthop(uip_ipaddr_t *nexthop,
rpl_dag_t *dag);
332 int prefix_len, uip_ipaddr_t *next_hop);
333 void rpl_purge_routes(
void);
341 void rpl_schedule_unicast_dio_immediately(
rpl_instance_t *instance);
347 void rpl_reset_periodic_timer(
void);
350 void rpl_poison_routes(
rpl_dag_t *, rpl_parent_t *);
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
void rpl_schedule_probing_now(void)
Schedule probing within a few seconds.
Header file for IPv6-related data structures.
API for RPL objective functions (OF)
An entry in the routing table.
This header file contains configuration directives for uIPv6 multicast support.
Header file for the callback timer
Linked list manipulation routines.
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.
Logical representation of a DAG Metric Container.
Header file for the uIP TCP/IP stack.
Header file for routing table manipulation.
void rpl_process_dio(uip_ipaddr_t *, rpl_dio_t *)
Processes incoming DIO.
void rpl_local_repair(const char *str)
Triggers a RPL local repair.
rpl_instance_t * rpl_get_default_instance(void)
Returns pointer to the default instance (for compatibility with legagy RPL code)
The default nbr_table entry (when UIP_DS6_NBR_MULTI_IPV6_ADDRS is disabled), that implements nbr cach...
void rpl_schedule_probing(void)
Schedule probing with delay RPL_PROBING_DELAY_FUNC()