NetSim Source Code Help
Loading...
Searching...
No Matches
DODAG.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2020 *
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
19{
20 PRPL_DIO_BASE diobase = dio_pdu->Base;
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;
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
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
74{
75 PRPL_NODE rpl = GET_RPL_NODE(d);
76
77 if (rpl->joined_dodag != NULL)
78 {
79 /* forget about previously learned DIO routes */
82 }
83
84 if (rpl->root_info->dodag_id != NULL)
85 { /* if we were previously a root */
87 rpl->root_info->dodag_id = NULL;
88 }
89
90 rpl->joined_dodag = rpl_dodag_create(dio_pdu);
91
93
95 {
97 memset(&pevent, 0, sizeof pevent);
99 pevent.nDeviceId = d;
100 pevent.nDeviceType = DEVICE_TYPE(d);
101 pevent.nEventType = TIMER_EVENT;
103 pevent.nSubEventType = RPL_SEND_DAO;
104 rpl->dao_send_eventid = fnpAddEvent(&pevent);
105 }
106
108
110}
111
113{
114 PRPL_DIO_BASE dBase = dio_pdu->Base;
115 PRPL_NODE rpl = GET_RPL_NODE(node);
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,
137 dodag->max_rank_inc,
138 dodag->min_hop_rank_inc);
139
141 if (rpl->joined_dodag->dao_supported)
142 {
143 NetSim_EVENTDETAILS pevent;
144 memset(&pevent, 0, sizeof pevent);
146 pevent.nDeviceId = node;
147 pevent.nDeviceType = DEVICE_TYPE(node);
148 pevent.nEventType = TIMER_EVENT;
150 pevent.nSubEventType = RPL_SEND_DAO;
151 rpl->dao_send_eventid = fnpAddEvent(&pevent);
152 }
153
154 rpl_trickle_reset(node);
155}
unsigned int NETSIM_ID
Definition: Animation.h:45
void update_dodag_config(NETSIM_ID node, PRPL_CTRL_MSG dio_pdu)
Definition: DODAG.c:112
void join_dodag_iteration(NETSIM_ID d, PRPL_CTRL_MSG dio_pdu)
Definition: DODAG.c:73
PRPL_DODAG rpl_dodag_create(PRPL_CTRL_MSG dio_pdu)
Definition: DODAG.c:18
void rpl_dodag_destroy(PRPL_DODAG dodag)
Definition: DODAG.c:53
NETSIM_IPAddress IP_COPY(NETSIM_IPAddress ip)
void IP_FREE(NETSIM_IPAddress ip)
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
void rpl_delete_all_route(NETSIM_ID d)
#define GET_RPL_NODE(d)
Definition: RPL.h:212
void * get_option_from_msg(PRPL_CTRL_MSG msg, RPL_OPTION_TYPE type)
Definition: RPL_Message.c:60
struct stru_rpl_dodag * PRPL_DODAG
void print_rpl_log(char *format,...)
#define INFINITE_RANK
Definition: RPL.h:81
#define RPL_IP_TO_STR(ip)
Definition: RPL.h:316
void rpl_trickle_reset(NETSIM_ID nDevId)
Definition: Trickle.c:23
void seq_num_mapping_cleanup()
@ RPLOPTION_DODAGConfiguration
Definition: RPL_Message.h:45
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
@ NW_PROTOCOL_RPL
Definition: Stack.h:200
@ TIMER_EVENT
Definition: Stack.h:114
int fnDeleteEvent(unsigned long long int nEventId)
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
EVENT_TYPE nEventType
Definition: Stack.h:747
NETSIM_ID nProtocolId
Definition: Stack.h:748
NETSIM_ID nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
netsimDEVICE_TYPE nDeviceType
Definition: Stack.h:749
NETSIM_IPAddress DODAGID
Definition: RPL_Message.h:143
UINT8 dio_interval_min
Definition: RPL.h:150
UINT8 dio_redundancy_constant
Definition: RPL.h:151
UINT16 rank
Definition: RPL.h:158
UINT16 lowest_rank
Definition: RPL.h:157
UINT16 min_hop_rank_inc
Definition: RPL.h:154
PRPL_NEIGHBOR pref_parent
Definition: RPL.h:164
UINT dodag_pref
Definition: RPL.h:144
PRPL_NEIGHBOR * sibling_list
Definition: RPL.h:162
bool dao_trigger
Definition: RPL.h:147
DODAGID dodag_id
Definition: RPL.h:143
UINT16 parent_count
Definition: RPL.h:161
PRPL_NEIGHBOR * parent_list
Definition: RPL.h:160
UINT8 seq_num
Definition: RPL.h:156
bool dao_supported
Definition: RPL.h:146
UINT8 dio_interval_doublings
Definition: RPL.h:149
UINT16 max_rank_inc
Definition: RPL.h:153
UINT16 sibling_count
Definition: RPL.h:163
bool grounded
Definition: RPL.h:145
PRPL_DODAG joined_dodag
Definition: RPL.h:178
PRPL_ROOT root_info
Definition: RPL.h:177
unsigned long long int dao_send_eventid
Definition: RPL.h:209
DODAGID dodag_id
Definition: RPL.h:124