18PRPL_DODAG rpl_dodag_create(PRPL_CTRL_MSG dio_pdu)
20 PRPL_DIO_BASE diobase = dio_pdu->Base;
21 PRPL_DODAG_CONFIG_OPTION dodag_config_suboption = get_option_from_msg(dio_pdu, RPLOPTION_DODAGConfiguration);
23 if (!dodag_config_suboption)
24 fnNetSimError(
"%s function is called without dodag config suboption\n", __FUNCTION__);
26 PRPL_DODAG dodag = (PRPL_DODAG)calloc(1,
sizeof* dodag);
28 dodag->dodag_id = IP_COPY(diobase->DODAGID);
29 dodag->dodag_pref = diobase->Prf;
30 dodag->grounded = diobase->G;
31 dodag->dao_supported =
true;
32 dodag->dao_trigger =
true;
34 dodag->dio_interval_doublings = dodag_config_suboption->DIOIntDoubl;
35 dodag->dio_interval_min = dodag_config_suboption->DIOIntMin;
36 dodag->dio_redundancy_constant = dodag_config_suboption->DIORedun;
37 dodag->max_rank_inc = dodag_config_suboption->MaxRankIncrease;
38 dodag->min_hop_rank_inc = dodag_config_suboption->MinHopRankIncrease;
40 dodag->seq_num = diobase->DTSN;
41 dodag->lowest_rank = INFINITE_RANK;
42 dodag->rank = INFINITE_RANK;
44 dodag->parent_list = NULL;
45 dodag->parent_count = 0;
46 dodag->sibling_list = NULL;
47 dodag->sibling_count = 0;
48 dodag->pref_parent = NULL;
53void rpl_dodag_destroy(PRPL_DODAG dodag)
55 if (dodag->dodag_id != NULL)
57 IP_FREE(dodag->dodag_id);
60 if (dodag->parent_list != NULL)
62 free(dodag->parent_list);
65 if (dodag->sibling_list != NULL)
67 free(dodag->sibling_list);
73void join_dodag_iteration(NETSIM_ID d, PRPL_CTRL_MSG dio_pdu)
75 PRPL_NODE rpl = GET_RPL_NODE(d);
77 if (rpl->joined_dodag != NULL)
80 rpl_delete_all_route(d);
81 rpl_dodag_destroy(rpl->joined_dodag);
84 if (rpl->root_info->dodag_id != NULL)
86 IP_FREE(rpl->root_info->dodag_id);
87 rpl->root_info->dodag_id = NULL;
90 rpl->joined_dodag = rpl_dodag_create(dio_pdu);
92 fnDeleteEvent(rpl->dao_send_eventid);
94 if (rpl->joined_dodag->dao_supported)
96 NetSim_EVENTDETAILS pevent;
97 memset(&pevent, 0,
sizeof pevent);
98 pevent.dEventTime = pstruEventDetails->dEventTime;
100 pevent.nDeviceType = DEVICE_TYPE(d);
101 pevent.nEventType = TIMER_EVENT;
102 pevent.nProtocolId = NW_PROTOCOL_RPL;
103 pevent.nSubEventType = RPL_SEND_DAO;
104 rpl->dao_send_eventid = fnpAddEvent(&pevent);
107 seq_num_mapping_cleanup();
109 rpl_trickle_reset(d);
112void update_dodag_config(NETSIM_ID node, PRPL_CTRL_MSG dio_pdu)
114 PRPL_DIO_BASE dBase = dio_pdu->Base;
115 PRPL_NODE rpl = GET_RPL_NODE(node);
116 PRPL_DODAG_CONFIG_OPTION dodag_config_suboption = get_option_from_msg(dio_pdu, RPLOPTION_DODAGConfiguration);
117 if (!rpl->joined_dodag)
118 fnNetSimError(
"joined_dodag is null for %d in %s\n", node, __FUNCTION__);
120 if (!dodag_config_suboption)
121 fnNetSimError(
"dodag_config_suboption is not present in dio msg in %s\n", __FUNCTION__);
123 PRPL_DODAG dodag = rpl->joined_dodag;
125 dodag->dio_interval_doublings = dodag_config_suboption->DIOIntDoubl;
126 dodag->dio_interval_min = dodag_config_suboption->DIOIntMin;
127 dodag->dio_redundancy_constant = dodag_config_suboption->DIORedun;
128 dodag->max_rank_inc = dodag_config_suboption->MaxRankIncrease;
129 dodag->min_hop_rank_inc = dodag_config_suboption->MinHopRankIncrease;
131 print_rpl_log(
"node '%d': in dodag_id = '%s', updated dodag config (i_min = %d, i_doublings = %d, c_treshold = %d, max_rank_inc = %d, min_hop_rank_inc = %d)",
133 RPL_IP_TO_STR(dodag->dodag_id),
134 dodag->dio_interval_min,
135 dodag->dio_interval_doublings,
136 dodag->dio_redundancy_constant,
138 dodag->min_hop_rank_inc);
140 fnDeleteEvent(rpl->dao_send_eventid);
141 if (rpl->joined_dodag->dao_supported)
143 NetSim_EVENTDETAILS pevent;
144 memset(&pevent, 0,
sizeof pevent);
145 pevent.dEventTime = pstruEventDetails->dEventTime;
146 pevent.nDeviceId = node;
147 pevent.nDeviceType = DEVICE_TYPE(node);
148 pevent.nEventType = TIMER_EVENT;
149 pevent.nProtocolId = NW_PROTOCOL_RPL;
150 pevent.nSubEventType = RPL_SEND_DAO;
151 rpl->dao_send_eventid = fnpAddEvent(&pevent);
154 rpl_trickle_reset(node);