29#define DEBUG_RPL_PRINT_DAO_ROUTE_INFOMATION
34#include "RPL_Message.h"
37#pragma comment(lib,"NetworkStack.lib")
38#pragma comment(lib,"RPLlib.lib")
47#define DEFAULT_DIO_INTERVAL_DOUBLINGS 20
55#define DEFAULT_DIO_INTERVAL_MIN 3
61#define DEFAULT_DIO_REDUNDANCY_CONSTANT 10
66#define DEFAULT_MIN_HOP_RANK_INCREASE 256
67#define DEFAULT_DAO_DELAY 1
70#define RPL_NODE_TYPE_DEFAULT _strdup("ROUTER")
71#define RPL_INSTANCE_ID_DEFAULT 15
72#define RPL_DIOIntervalDoublings_DEFAULT DEFAULT_DIO_INTERVAL_DOUBLINGS
73#define RPL_DIOIntervalMin_DEFAULT DEFAULT_DIO_INTERVAL_MIN
74#define RPL_DIORedundancyConstant_DEFAULT DEFAULT_DIO_REDUNDANCY_CONSTANT
75#define RPL_MinHopRankIncrease_DEFAULT DEFAULT_MIN_HOP_RANK_INCREASE
76#define RPL_DODAGPreference_DEFAULT 0
77#define RPL_DAO_DELAY_DEFAULT DEFAULT_DAO_DELAY
78#define RPL_DIS_INITIAL_DELAY_DEFAULT 200
79#define RPL_DIS_INTERVAL_DEFAULT 100
81#define INFINITE_RANK 0xFFFF
82#define RPL_RANK_ROOT 1
83#define RPL_MINIMUM_RANK_INCREMENT 1
84#define RPL_MAXIMUM_RANK_INCREMENT 16
85#define RPL_DEFAULT_DAG_PREF 0
86#define RPL_DEFAULT_MOP 2
87#define RPL_DEFAULT_POISON_COUNT 4
88#define RPL_DEFAULT_DAO_REMOVE_TIMEOUT (2500*MILLISECOND)
90 typedef UINT16 RPL_RANK;
91 typedef NETSIM_IPAddress DODAGID;
94#define is_rpl_control_packet(packet) ((packet)->nControlDataType/100==NW_PROTOCOL_RPL)
95#define is_rpl_configured(d) (DEVICE_NWLAYER((d)) && DEVICE_NWLAYER((d))->nRoutingProtocolId==NW_PROTOCOL_RPL)
110 NETSIM_IPAddress dodag_id;
119 PRPL_CTRL_MSG lastDIOMSG;
120 }RPL_NEIGHBOR, *PRPL_NEIGHBOR;
125 DODAGID configured_dodag_id;
131 UINT8 dio_interval_doublings;
132 UINT8 dio_interval_min;
133 UINT8 dio_redundancy_constant;
136 UINT16 min_hop_rank_inc;
139 }RPL_ROOT,*PRPL_ROOT;
149 UINT8 dio_interval_doublings;
150 UINT8 dio_interval_min;
151 UINT8 dio_redundancy_constant;
154 UINT16 min_hop_rank_inc;
160 PRPL_NEIGHBOR* parent_list;
162 PRPL_NEIGHBOR* sibling_list;
163 UINT16 sibling_count;
164 PRPL_NEIGHBOR pref_parent;
165 } RPL_DODAG,*PRPL_DODAG;
171 RPLNODETYPE nodeType;
178 PRPL_DODAG joined_dodag;
193 unsigned long long int trickle_i_eventid;
194 unsigned long long int trickle_t_eventid;
195 double last_trickle_i_schedule_time;
196 double last_trickle_t_schedule_time;
199 PRPL_NEIGHBOR* neighbor_list;
200 UINT16 neighbor_count;
202 UINT8 poison_count_so_far;
204 double last_dio_send_time;
209 unsigned long long int dao_send_eventid;
211 } RPL_NODE,*PRPL_NODE;
212#define GET_RPL_NODE(d) ((PRPL_NODE)DEVICE_NWROUTINGVAR(d))
221 void print_rpl_log(
char* format, ...);
224 void rpl_node_init(NETSIM_ID d);
225 void start_as_root(NETSIM_ID d);
228 PRPL_ROOT get_global_root_info();
229 bool rpl_node_is_root(PRPL_NODE r);
230 bool rpl_node_is_joined(PRPL_NODE r);
231 bool rpl_node_is_poisoning(PRPL_NODE r);
232 bool rpl_node_is_isolated(PRPL_NODE rpl);
235 void rpl_trickle_reset(NETSIM_ID nDevId);
236 void rpl_trickle_handle_t_timeout();
237 void rpl_trickle_handle_i_timeout();
240 PRPL_DODAG rpl_dodag_create(PRPL_CTRL_MSG dio_pdu);
241 void rpl_dodag_destroy(PRPL_DODAG dodag);
242 void join_dodag_iteration(NETSIM_ID d, PRPL_CTRL_MSG dio_pdu);
243 void update_dodag_config(NETSIM_ID node, PRPL_CTRL_MSG dio_pdu);
246 void* get_option_from_msg(PRPL_CTRL_MSG msg, RPL_OPTION_TYPE type);
247 void** get_all_option_from_msg(PRPL_CTRL_MSG msg, RPL_OPTION_TYPE type, UINT* count);
248 NetSim_PACKET* create_current_dio_message(NETSIM_ID ndevId,
double time,
bool include_dodag_config);
249 void rpl_option_destroy(PRPL_OPTION option);
250 PRPL_OPTION rpl_option_copy(PRPL_OPTION option);
253 void rpl_process_ctrl_msg();
254 PRPL_CTRL_MSG rpl_dio_pdu_duplicate(PRPL_CTRL_MSG dio);
255 void rpl_node_send_msg(NETSIM_ID ndevid, NetSim_PACKET* packet);
258 PRPL_CTRL_MSG get_preferred_dodag_dio_pdu(NETSIM_ID d,
bool *same,
double time);
259 NetSim_PACKET* create_root_dio_message(NETSIM_ID ndevId,
double time,
bool include_dodag_config,
bool include_seq_num);
260 void rpl_process_dio_msg();
261 void rpl_dio_pdu_free(PRPL_CTRL_MSG dio);
262 void start_dio_poisoning(NETSIM_ID d);
263 void rpl_dio_msg_copy(
const NetSim_PACKET* destPacket,
const NetSim_PACKET* srcPacket);
264 void rpl_dio_msg_destroy(NetSim_PACKET* packet);
267 NetSim_PACKET* create_dao_message(NETSIM_ID ndevid,
double time, NETSIM_ID parent);
268 void create_and_add_rpl_target_option(NetSim_PACKET* dao_pdu, UINT8 prefix_len, NETSIM_IPAddress dest);
270 void rpl_process_dao_msg();
271 void rpl_dao_msg_destroy(NetSim_PACKET* packet);
272 void rpl_dao_msg_copy(
const NetSim_PACKET* destPacket,
const NetSim_PACKET* srcPacket);
273 void rpl_dao_route_timeout();
276 void rpl_process_dis_msg();
277 void rpl_dis_pdu_send();
278 NetSim_PACKET* create_dis_message(NETSIM_ID ndevid,
double time);
279 void rpl_dis_msg_destroy(NetSim_PACKET* packet);
280 void rpl_dis_msg_copy(
const NetSim_PACKET* destPacket,
const NetSim_PACKET* srcPacket);
284 void seq_num_mapping_cleanup();
290 void rpl_add_to_neighbor_list();
291 PRPL_NEIGHBOR rpl_find_neighbor(NETSIM_ID d, NETSIM_ID r);
292 void update_neighbor_dio_message(PRPL_NEIGHBOR neighbor, PRPL_CTRL_MSG dio_pdu);
293 void forget_neighbor_messages(PRPL_NODE rpl);
294 void free_all_neighbor(PRPL_NODE rpl);
297 void rpl_node_add_parent(NETSIM_ID d, PRPL_NEIGHBOR parent);
298 void rpl_node_remove_all_parents(NETSIM_ID d);
299 PRPL_NEIGHBOR rpl_node_find_parent(NETSIM_ID d, NETSIM_ID parent);
300#define rpl_node_has_parent(node, parent) (rpl_node_find_parent(node, parent) != NULL)
303 void rpl_node_add_sibling(NETSIM_ID d, PRPL_NEIGHBOR sibling);
304 PRPL_NEIGHBOR rpl_node_find_sibling(NETSIM_ID d, NETSIM_ID sibling);
305 void rpl_node_remove_all_siblings(NETSIM_ID d);
306#define rpl_node_has_sibling(node, sibling) (rpl_node_find_sibling(node, sibling) != NULL)
308 void choose_parents_and_siblings(NETSIM_ID d);
312 void rpl_delete_all_route(NETSIM_ID d);
313 void rpl_add_route_to_parent(NETSIM_ID d, NETSIM_ID parent);
316 #define RPL_IP_TO_STR(ip) ((ip)->str_ip)