NetSim Source Code Help
Loading...
Searching...
No Matches
RPL_Message.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_Message.h"
17
18//Function definition
23
25{
26 switch (code)
27 {
30 break;
33 break;
36 break;
39 break;
40 default:
41 fnNetSimError("Unknow rpl msg code %d in %s\n", code, __FUNCTION__);
42 return 0;
43 break;
44 }
45}
46
47static void set_option_in_msg(NetSim_PACKET* packet, RPL_OPTION_TYPE type, void* option)
48{
49 PRPL_CTRL_MSG msg = GET_PRPL_CTRL_MSG(packet);
50 if (msg->option_count)
51 msg->options = (PRPL_OPTION*)realloc(msg->options, (msg->option_count + 1) * sizeof* msg->options);
52 else
53 msg->options = (PRPL_OPTION*)calloc(1, sizeof* msg->options);
54 msg->options[msg->option_count] = (PRPL_OPTION)calloc(1, sizeof* msg->options[msg->option_count]);
55 msg->options[msg->option_count]->option = option;
56 msg->options[msg->option_count]->type = type;
57 msg->option_count++;
58}
59
61{
62 UINT i;
63 if (!msg)
64 return NULL;
65 for (i = 0; i < msg->option_count; i++)
66 {
67 if (msg->options[i]->type == type)
68 return msg->options[i]->option;
69 }
70 return NULL;
71}
72
74{
75 UINT i;
76 UINT c=0;
77 void** ret=NULL;
78 if (!msg)
79 {
80 *count = 0;
81 return NULL;
82 }
83 for (i = 0; i < msg->option_count; i++)
84 {
85 if (msg->options[i]->type == type)
86 {
87 ret = (void**)realloc(ret, (c + 1) * sizeof(void*));
88 ret[c] = msg->options[i]->option;
89 c++;
90 }
91 }
92 *count = c;
93 return ret;
94}
95
97{
98 switch (option->type)
99 {
102 break;
105 break;
106 default:
107 fnNetSimError("Unknown option %d in %s\n",
108 option->type, __FUNCTION__);
109 break;
110 }
111 free(option);
112}
113
115{
116 PRPL_OPTION ret = (PRPL_OPTION)calloc(1, sizeof* ret);
117 memcpy(ret, option, sizeof* ret);
118
119 switch (option->type)
120 {
123 break;
126 break;
127 default:
128 fnNetSimError("Unknown option %d in %s\n",
129 option->type, __FUNCTION__);
130 break;
131 }
132
133 return ret;
134}
135
137{
138 PRPL_CTRL_MSG msg = (PRPL_CTRL_MSG)calloc(1, sizeof* msg);
139 msg->Type = ICMP_TYPE_RPL;
140 msg->Code = code;
141 return msg;
142}
143
144static void rpl_get_packet_type_sz(char* str, RPL_CTRL_MSG_CODE code)
145{
146 switch (code)
147 {
149 strcpy(str, "Consistency_check");
150 break;
152 strcpy(str, "DAO");
153 break;
155 strcpy(str, "DAO-ACK");
156 break;
158 strcpy(str, "DIO");
159 break;
161 strcpy(str, "DIS");
162 break;
163 }
164}
165
167 double time,
168 NETSIM_ID src,
169 NETSIM_ID dest)
170{
173 packet->pstruNetworkData->dArrivalTime = time;
178 if (dest)
180 else
182 packet->pstruNetworkData->nTTL = MAX_TTL;
183 packet->dEventTime = time;
185 packet->nSourceId = src;
186 add_dest_to_packet(packet, dest);
187 packet->nTransmitterId = src;
188
190
192 return packet;
193}
194
195//DIO
197{
198 PRPL_DIO_BASE b = (PRPL_DIO_BASE)calloc(1, sizeof* b);
200 b->Rank = INFINITE_RANK;
201 b->MOP = RPL_DEFAULT_MOP;
202 return b;
203}
204
206{
208 o->Type = 0x04;
209 o->OptLength = 14;
210 return o;
211}
212
214{
215 free(opt);
216}
217
219{
221 memcpy(ret, opt, sizeof* ret);
222 return ret;
223}
224
225NetSim_PACKET* create_root_dio_message(NETSIM_ID ndevId, double time, bool include_dodag_config, bool include_seq_num)
226{
227 PRPL_NODE r = GET_RPL_NODE(ndevId);
228
230 PRPL_DIO_BASE diobase = create_dio_base();
231 SET_BASE_IN_MSG(packet, diobase);
232
233 if (r->root_info->dodag_id != NULL)
234 diobase->DODAGID = IP_COPY(r->root_info->dodag_id);
235 else
236 diobase->DODAGID = IP_COPY(DEVICE_NWADDRESS(ndevId,1));
237
238 diobase->Prf = r->root_info->dodag_pref;
239 diobase->Rank = RPL_RANK_ROOT;
240 diobase->G = r->root_info->grounded;
241
242 if (include_seq_num)
243 diobase->DTSN = seq_num_mapping_get(diobase->DODAGID)->seq_num;
244 else
245 diobase->DTSN = 0;
246 diobase->RPLInstanceID = r->RPLInstanceId;
247
248 if (include_dodag_config)
249 {
252
258 }
259
260 return packet;
261}
262
263static NetSim_PACKET* create_joined_dio_message(NETSIM_ID ndevId, double time, bool include_dodag_config)
264{
265 PRPL_NODE r = GET_RPL_NODE(ndevId);
266
268 PRPL_DIO_BASE diobase = create_dio_base();
269 SET_BASE_IN_MSG(packet, diobase);
270
271 diobase->DODAGID = r->joined_dodag->dodag_id;
272 diobase->Prf = r->joined_dodag->dodag_pref;
273 diobase->Rank = r->joined_dodag->rank;
274 diobase->G = r->joined_dodag->grounded;
275 diobase->DTSN = r->joined_dodag->seq_num;
276 diobase->RPLInstanceID = r->RPLInstanceId;
277
278 if (include_dodag_config)
279 {
282
288 }
289
290 return packet;
291}
292
293NetSim_PACKET* create_current_dio_message(NETSIM_ID ndevId, double time, bool include_dodag_config)
294{
295 PRPL_NODE r = GET_RPL_NODE(ndevId);
296 if (rpl_node_is_joined(r))
297 {
298 return create_joined_dio_message(ndevId, time, include_dodag_config);
299 }
300 else if (rpl_node_is_root(r))
301 {
302 return create_root_dio_message(ndevId, time, include_dodag_config, TRUE);
303 }
304 else if (rpl_node_is_poisoning(r))
305 {
306 return create_joined_dio_message(ndevId, time, include_dodag_config);
307 }
308 else
309 {
310 return NULL;
311 }
312}
313
315{
316 PRPL_CTRL_MSG new_dio = (PRPL_CTRL_MSG)calloc(1, sizeof* new_dio);
317 memcpy(new_dio, dio, sizeof* new_dio);
318
319 PRPL_DIO_BASE new_base = (PRPL_DIO_BASE)calloc(1, sizeof* new_base);
320 new_dio->Base = new_base;
321 memcpy(new_base, dio->Base, sizeof* new_base);
322
323 new_dio->options = (PRPL_OPTION*)calloc(dio->option_count, sizeof* new_dio->options);
324 UINT i;
325 for (i = 0; i < dio->option_count; i++)
326 {
327 new_dio->options[i] = (PRPL_OPTION)calloc(1, sizeof* new_dio->options[i]);
328 new_dio->options[i]->type = dio->options[i]->type;
329 switch (new_dio->options[i]->type)
330 {
332 new_dio->options[i]->option = calloc(1, sizeof(RPL_DODAG_CONFIG_OPTION));
333 memcpy(new_dio->options[i]->option, dio->options[i]->option, sizeof(RPL_DODAG_CONFIG_OPTION));
334 break;
335 default:
336 fnNetSimError("Unknown option %d in %s\n", new_dio->options[i]->type, __FUNCTION__);
337 break;
338 }
339 }
340 return new_dio;
341}
342
344{
345 if (!dio)
346 return;
347 IP_FREE(((PRPL_DIO_BASE)dio->Base)->DODAGID);
348 free((PRPL_DIO_BASE)dio->Base);
349 UINT i;
350 for (i = 0; i < dio->option_count; i++)
351 {
353 free(dio->options[i]);
354 }
355 free(dio->options);
356 free(dio);
357}
358
359//DAO
361{
362 PRPL_DAO_BASE b = (PRPL_DAO_BASE)calloc(1, sizeof* b);
364 b->D = false; //No local RPL Instance
365 b->K = true;
366 b->DAOSequence = ++rpl->DaoSequence;
367 return b;
368}
369
371{
372 PRPL_NODE rpl = GET_RPL_NODE(ndevid);
375 SET_BASE_IN_MSG(packet, dao);
376 return packet;
377}
378
380{
381 PRPL_TARGET_OPTION target = (PRPL_TARGET_OPTION)calloc(1, sizeof* target);
382 target->Type = RPLOPTION_RPLTARGET;
383 target->Option_Length = 18;
384 target->Prefix_Length = prefix_len;
385 target->Traget_Prefix = IP_COPY(dest);
386 set_option_in_msg(dao_pdu, RPLOPTION_RPLTARGET, target);
387}
388
390{
391 PRPL_TARGET_OPTION ret = (PRPL_TARGET_OPTION)calloc(1, sizeof* ret);
392 memcpy(ret, target, sizeof* ret);
393 return ret;
394}
395
397{
398 free(target);
399}
400
401//DIS
403{
404 PRPL_DIS_BASE b = (PRPL_DIS_BASE)calloc(1, sizeof* b);
405 return b;
406}
407
409{
410 PRPL_NODE rpl = GET_RPL_NODE(ndevid);
413 SET_BASE_IN_MSG(packet, dis);
414 return packet;
415}
416
417// Message Processing
419{
420 NetSim_EVENTDETAILS pevent;
421 memset(&pevent, 0, sizeof pevent);
423 pevent.dPacketSize = fnGetPacketSize(packet);
424 pevent.nDeviceId = ndevid;
425 pevent.nDeviceType = DEVICE_TYPE(ndevid);
427 pevent.nPacketId = packet->nPacketId;
429 pevent.pPacket = packet;
430 fnpAddEvent(&pevent);
431}
432
434{
436 {
439 break;
442 break;
445 break;
446 default:
447 fnNetSimError("Unknown rpl ctrl msg %d in %s",
449 __FUNCTION__);
450 break;
451 }
452}
unsigned int NETSIM_ID
Definition: Animation.h:45
#define MAX_TTL
Definition: Application.h:34
void rpl_process_dao_msg()
Definition: DAO.c:104
void rpl_process_dio_msg()
Definition: DIO.c:191
void rpl_process_dis_msg()
Definition: DIS.c:40
NETSIM_IPAddress IP_COPY(NETSIM_IPAddress ip)
NETSIM_IPAddress GET_BROADCAST_IP(int type)
void IP_FREE(NETSIM_IPAddress ip)
#define c
#define UINT
Definition: Linux.h:38
#define fnNetSimError(x,...)
Definition: Linux.h:56
#define TRUE
Definition: Linux.h:77
#define UINT8
Definition: Linux.h:31
#define realloc(p, s)
Definition: Memory.h:32
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
double fnGetPacketSize(NetSim_PACKET *pstruData)
@ PacketType_Control
Definition: Packet.h:66
void add_dest_to_packet(NetSim_PACKET *packet, NETSIM_ID dest)
#define GET_RPL_NODE(d)
Definition: RPL.h:212
bool rpl_node_is_joined(PRPL_NODE r)
#define RPL_RANK_ROOT
Definition: RPL.h:82
bool rpl_node_is_root(PRPL_NODE r)
#define INFINITE_RANK
Definition: RPL.h:81
bool rpl_node_is_poisoning(PRPL_NODE r)
#define RPL_DEFAULT_MOP
Definition: RPL.h:86
#define RPL_DEFAULT_DAG_PREF
Definition: RPL.h:85
seq_num_mapping_t * seq_num_mapping_get(NETSIM_IPAddress dodag_id)
static PRPL_DAO_BASE create_dao_base(PRPL_NODE rpl)
Definition: RPL_Message.c:360
static NetSim_PACKET * create_joined_dio_message(NETSIM_ID ndevId, double time, bool include_dodag_config)
Definition: RPL_Message.c:263
static void set_option_in_msg(NetSim_PACKET *packet, RPL_OPTION_TYPE type, void *option)
Definition: RPL_Message.c:47
static double get_rpl_packet_size_fixed(RPL_CTRL_MSG_CODE code)
Definition: RPL_Message.c:24
void * get_option_from_msg(PRPL_CTRL_MSG msg, RPL_OPTION_TYPE type)
Definition: RPL_Message.c:60
static PRPL_CTRL_MSG get_icmp_rpl_msg(RPL_CTRL_MSG_CODE code)
Definition: RPL_Message.c:136
NetSim_PACKET * create_dis_message(NETSIM_ID ndevid, double time)
Definition: RPL_Message.c:408
static void rpl_get_packet_type_sz(char *str, RPL_CTRL_MSG_CODE code)
Definition: RPL_Message.c:144
static void rpl_rpl_target_option_destroy(PRPL_TARGET_OPTION target)
Definition: RPL_Message.c:396
void rpl_dio_pdu_free(PRPL_CTRL_MSG dio)
Definition: RPL_Message.c:343
static void rpl_dodag_config_option_destroy(PRPL_DODAG_CONFIG_OPTION opt)
Definition: RPL_Message.c:213
void rpl_process_ctrl_msg()
Definition: RPL_Message.c:433
static NetSim_PACKET * create_rpl_ctrl_msg(RPL_CTRL_MSG_CODE code, double time, NETSIM_ID src, NETSIM_ID dest)
Definition: RPL_Message.c:166
NetSim_PACKET * create_current_dio_message(NETSIM_ID ndevId, double time, bool include_dodag_config)
Definition: RPL_Message.c:293
static PRPL_DODAG_CONFIG_OPTION rpl_dodag_config_option_copy(PRPL_DODAG_CONFIG_OPTION opt)
Definition: RPL_Message.c:218
static PRPL_DIO_BASE create_dio_base()
Definition: RPL_Message.c:196
NetSim_PACKET * create_root_dio_message(NETSIM_ID ndevId, double time, bool include_dodag_config, bool include_seq_num)
Definition: RPL_Message.c:225
void create_and_add_rpl_target_option(NetSim_PACKET *dao_pdu, UINT8 prefix_len, NETSIM_IPAddress dest)
Definition: RPL_Message.c:379
PRPL_OPTION rpl_option_copy(PRPL_OPTION option)
Definition: RPL_Message.c:114
void rpl_node_send_msg(NETSIM_ID ndevid, NetSim_PACKET *packet)
Definition: RPL_Message.c:418
void ** get_all_option_from_msg(PRPL_CTRL_MSG msg, RPL_OPTION_TYPE type, UINT *count)
Definition: RPL_Message.c:73
static PRPL_DIS_BASE create_dis_base(PRPL_NODE rpl)
Definition: RPL_Message.c:402
NetSim_PACKET * create_dao_message(NETSIM_ID ndevid, double time, NETSIM_ID parent)
Definition: RPL_Message.c:370
void rpl_option_destroy(PRPL_OPTION option)
Definition: RPL_Message.c:96
static PRPL_DODAG_CONFIG_OPTION create_dodag_config_option()
Definition: RPL_Message.c:205
PRPL_CTRL_MSG rpl_dio_pdu_duplicate(PRPL_CTRL_MSG dio)
Definition: RPL_Message.c:314
static PRPL_TARGET_OPTION rpl_rpl_target_option_copy(PRPL_TARGET_OPTION target)
Definition: RPL_Message.c:389
struct stru_rpl_option * PRPL_OPTION
RPL_CTRL_MSG_CODE
Definition: RPL_Message.h:23
@ Consistency_Check
Definition: RPL_Message.h:32
@ Destination_Advertisement_Object_Acknowledgment
Definition: RPL_Message.h:27
@ DODAG_Information_Object
Definition: RPL_Message.h:25
@ DODAG_Information_Solicitation
Definition: RPL_Message.h:24
@ Destination_Advertisement_Object
Definition: RPL_Message.h:26
@ RPLOPTION_DODAGConfiguration
Definition: RPL_Message.h:45
@ RPLOPTION_RPLTARGET
Definition: RPL_Message.h:46
#define RPL_CTRL_MSG_SIZE_FIXED
Definition: RPL_Message.h:86
struct stru_rpl_DIS_Base * PRPL_DIS_BASE
#define RPL_DAOACK_BASE_SIZE
Definition: RPL_Message.h:206
struct stru_rpl_target * PRPL_TARGET_OPTION
struct stru_rpl_dio_base * PRPL_DIO_BASE
#define GET_PRPL_CTRL_MSG(packet)
Definition: RPL_Message.h:83
#define RPL_DIS_BASE_SIZE
Definition: RPL_Message.h:105
#define ICMP_TYPE_RPL
Definition: RPL_Message.h:20
struct stru_rpl_ctrl_message * PRPL_CTRL_MSG
struct stru_rpl_dao_base * PRPL_DAO_BASE
#define GET_RPL_CTRL_PACKET_TYPE(code)
Definition: RPL_Message.h:35
struct stru_dodag_config_option * PRPL_DODAG_CONFIG_OPTION
#define RPL_DAO_BASE_SIZE
Definition: RPL_Message.h:176
#define SET_BASE_IN_MSG(packet, b)
Definition: RPL_Message.h:84
#define RPL_DIO_BASE_SIZE
Definition: RPL_Message.h:145
enum enum_rpl_option_type RPL_OPTION_TYPE
#define DEVICE_TYPE(DeviceId)
Definition: Stack.h:773
#define DEVICE_NWADDRESS(DeviceId, InterfaceId)
Definition: Stack.h:805
@ NW_PROTOCOL_RPL
Definition: Stack.h:200
@ NW_PROTOCOL_IPV6
Definition: Stack.h:190
@ NETWORK_OUT_EVENT
Definition: Stack.h:108
@ NETWORK_LAYER
Definition: Stack.h:96
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define fn_NetSim_Packet_CreatePacket(layer)
Definition: main.h:186
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
UINT8 seq_num
Definition: RPL.h:109
EVENT_TYPE nEventType
Definition: Stack.h:747
NETSIM_ID nProtocolId
Definition: Stack.h:748
struct stru_NetSim_Packet * pPacket
Definition: Stack.h:754
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
netsimDEVICE_TYPE nDeviceType
Definition: Stack.h:749
NETWORK_LAYER_PROTOCOL nRoutingProtocol
Definition: Packet.h:205
NETSIM_IPAddress szGatewayIP
Definition: Packet.h:200
NETSIM_IPAddress szDestIP
Definition: Packet.h:199
NETSIM_IPAddress szSourceIP
Definition: Packet.h:198
long long int nPacketId
Definition: Packet.h:256
char szPacketType[MAX_PACKET_TYPE_LEN]
Definition: Packet.h:271
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
double dEventTime
Definition: Packet.h:262
unsigned int nControlDataType
Definition: Packet.h:258
NETSIM_ID nTransmitterId
Definition: Packet.h:265
PACKET_TYPE nPacketType
Definition: Packet.h:257
NETSIM_ID nSourceId
Definition: Packet.h:263
PRPL_OPTION * options
Definition: RPL_Message.h:80
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 min_hop_rank_inc
Definition: RPL.h:154
UINT dodag_pref
Definition: RPL.h:144
DODAGID dodag_id
Definition: RPL.h:143
UINT8 seq_num
Definition: RPL.h:156
UINT8 dio_interval_doublings
Definition: RPL.h:149
UINT16 max_rank_inc
Definition: RPL.h:153
bool grounded
Definition: RPL.h:145
UINT8 DaoSequence
Definition: RPL.h:206
PRPL_DODAG joined_dodag
Definition: RPL.h:178
PRPL_ROOT root_info
Definition: RPL.h:177
UINT8 RPLInstanceId
Definition: RPL.h:170
RPL_OPTION_TYPE type
Definition: RPL_Message.h:51
UINT8 dio_interval_doublings
Definition: RPL.h:131
UINT8 dodag_pref
Definition: RPL.h:126
UINT16 max_rank_inc
Definition: RPL.h:135
UINT8 dio_interval_min
Definition: RPL.h:132
UINT8 dio_redundancy_constant
Definition: RPL.h:133
DODAGID dodag_id
Definition: RPL.h:124
UINT16 min_hop_rank_inc
Definition: RPL.h:136
bool grounded
Definition: RPL.h:127
NETSIM_IPAddress Traget_Prefix
Definition: RPL_Message.h:306