NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
DODAG.c
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* Author: Shashi Kant Suman *
12* *
13* ---------------------------------------------------------------------------------*/
14#include "main.h"
15#include "RPL.h"
16#include "RPL_enum.h"
17
18PRPL_DODAG rpl_dodag_create(PRPL_CTRL_MSG dio_pdu)
19{
20 PRPL_DIO_BASE diobase = dio_pdu->Base;
21 PRPL_DODAG_CONFIG_OPTION dodag_config_suboption = get_option_from_msg(dio_pdu, RPLOPTION_DODAGConfiguration);
22
23 if (!dodag_config_suboption)
24 fnNetSimError("%s function is called without dodag config suboption\n", __FUNCTION__);
25
26 PRPL_DODAG dodag = (PRPL_DODAG)calloc(1,sizeof* dodag);
27
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;
33
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;
39
40 dodag->seq_num = diobase->DTSN;
41 dodag->lowest_rank = INFINITE_RANK;
42 dodag->rank = INFINITE_RANK;
43
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;
49
50 return dodag;
51}
52
53void rpl_dodag_destroy(PRPL_DODAG dodag)
54{
55 if (dodag->dodag_id != NULL)
56 {
57 IP_FREE(dodag->dodag_id);
58 }
59
60 if (dodag->parent_list != NULL)
61 {
62 free(dodag->parent_list);
63 }
64
65 if (dodag->sibling_list != NULL)
66 {
67 free(dodag->sibling_list);
68 }
69
70 free(dodag);
71}
72
73void join_dodag_iteration(NETSIM_ID d, PRPL_CTRL_MSG dio_pdu)
74{
75 PRPL_NODE rpl = GET_RPL_NODE(d);
76
77 if (rpl->joined_dodag != NULL)
78 {
79 /* forget about previously learned DIO routes */
80 rpl_delete_all_route(d);
81 rpl_dodag_destroy(rpl->joined_dodag);
82 }
83
84 if (rpl->root_info->dodag_id != NULL)
85 { /* if we were previously a root */
86 IP_FREE(rpl->root_info->dodag_id);
87 rpl->root_info->dodag_id = NULL;
88 }
89
90 rpl->joined_dodag = rpl_dodag_create(dio_pdu);
91
92 fnDeleteEvent(rpl->dao_send_eventid);
93
94 if (rpl->joined_dodag->dao_supported)
95 {
96 NetSim_EVENTDETAILS pevent;
97 memset(&pevent, 0, sizeof pevent);
98 pevent.dEventTime = pstruEventDetails->dEventTime;
99 pevent.nDeviceId = d;
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);
105 }
106
107 seq_num_mapping_cleanup();
108
109 rpl_trickle_reset(d);
110}
111
112void update_dodag_config(NETSIM_ID node, PRPL_CTRL_MSG dio_pdu)
113{
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__);
119
120 if (!dodag_config_suboption)
121 fnNetSimError("dodag_config_suboption is not present in dio msg in %s\n", __FUNCTION__);
122
123 PRPL_DODAG dodag = rpl->joined_dodag;
124
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;
130
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)",
132 node,
133 RPL_IP_TO_STR(dodag->dodag_id),
134 dodag->dio_interval_min,
135 dodag->dio_interval_doublings,
136 dodag->dio_redundancy_constant,
137 dodag->max_rank_inc,
138 dodag->min_hop_rank_inc);
139
140 fnDeleteEvent(rpl->dao_send_eventid);
141 if (rpl->joined_dodag->dao_supported)
142 {
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);
152 }
153
154 rpl_trickle_reset(node);
155}