NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
AODV.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 "AODV.h"
16#include "List.h"
17#include "NetSim_utility.h"
18
19int fn_NetSim_AODV_Init_F();
20char* fn_NetSim_AODV_Trace_F(NETSIM_ID);
21int fn_NetSim_AODV_FreePacket_F();
22int fn_NetSim_AODV_CopyPacket_F();
23int fn_NetSim_AODV_Metrics_F(PMETRICSWRITER metricsWriter);
24int fn_NetSim_AODV_Configure_F();
25char* fn_NetSim_AODV_ConfigPacketTrace_F();
26int fn_NetSim_AODV_Finish_F();
27char* fn_NetSim_AODV_WritePacketTrace_F();
28
29
30
31
32
33/**
34AODV Init function initializes the AODV parameters.
35*/
36_declspec(dllexport) int fn_NetSim_AODV_Init()
37{
38 return fn_NetSim_AODV_Init_F();
39}
40/**
41~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42This is the AODV Run function which gets called by the IP layer for routing the data
43by the DSR Network Routing Protocol. It includes the events NETWORK_OUT_EVENT,
44NETWORK_IN_EVENT and TIMER_EVENT.
45
46NETWORK_OUT_EVENT -
47It process the Data Packets which arrive at the NetworkOut layer to route the packet.
48NETWORK_IN_EVENT -
49It processes Data Packets, Route Request Packets, Route Reply Packets, Route Error
50Packets, Ack Packet
51TIMER_EVENT -
52It Process the AODV Route Request timeout and the AODV Maintenance Buffer timeout.
53~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54*/
55_declspec(dllexport) int fn_NetSim_AODV_Run()
56{
57 set_aodv_curr();
58 NETSIM_ID in = aodv_get_curr_if();
59 if (!isAodvConfigured(pstruEventDetails->nDeviceId, in))
60 return -1;
61
62 switch(pstruEventDetails->nEventType)
63 {
64 case NETWORK_OUT_EVENT:
65 {
66 if(pstruEventDetails->pPacket->nPacketType != PacketType_Control ||
67 pstruEventDetails->pPacket->nControlDataType/100 != NW_PROTOCOL_AODV)
68 {
69 NETSIM_IPAddress n1,n2;
70 NETSIM_IPAddress dest = pstruEventDetails->pPacket->pstruNetworkData->szDestIP;
71 NETSIM_IPAddress ip = aodv_get_curr_ip();
72 if(ip->type != dest->type)
73 return 0;
74 n1=IP_NETWORK_ADDRESS(ip,
75 DEVICE_INTERFACE(pstruEventDetails->nDeviceId,in)->szSubnetMask,
76 DEVICE_INTERFACE(pstruEventDetails->nDeviceId,in)->prefix_len);
77 n2=IP_NETWORK_ADDRESS(dest,
78 DEVICE_INTERFACE(pstruEventDetails->nDeviceId,in)->szSubnetMask,
79 DEVICE_INTERFACE(pstruEventDetails->nDeviceId,in)->prefix_len);
80
81 if(!IP_COMPARE(n1,n2))
82 AODV_PACKET_PROCESSING();
83 else
84 return 0; //Other network packet
85 }
86 else
87 {
88 //No processing required
89 pstruEventDetails->pPacket->pstruNetworkData->szNextHopIp=aodv_get_dev_ip(pstruEventDetails->pPacket->nReceiverId);
90 }
91 if (pstruEventDetails->pPacket)
92 {
93 if (pstruEventDetails->pPacket->pstruNetworkData->nTTL > 1)
94 {
95 pstruEventDetails->nInterfaceId = in;
96 if (!pstruEventDetails->pPacket->nReceiverId)
97 AODV_DEV_VAR(pstruEventDetails->nDeviceId)->dLastBroadcastTime = pstruEventDetails->dEventTime;
98 }
99 else
100 {
101 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
102 pstruEventDetails->pPacket = NULL;
103 pstruEventDetails->nInterfaceId = 0;
104 }
105 }
106 else
107 pstruEventDetails->nInterfaceId = 0;
108 }
109 break;
110 case NETWORK_IN_EVENT:
111 switch(pstruEventDetails->pPacket->nControlDataType)
112 {
113 case AODVctrlPacket_RREQ:
114 AODV_PROCESS_RREQ();
115 pstruEventDetails->pPacket=NULL;
116 break;
117 case AODVctrlPacket_RREP:
118 AODV_PROCESS_RREP();
119 pstruEventDetails->pPacket=NULL;
120 break;
121 case AODVctrlPacket_RERR:
122 AODV_PROCESS_RERR();
123 pstruEventDetails->pPacket=NULL;
124 break;
125 default:
126 {
127 NetSim_PACKET* packet = pstruEventDetails->pPacket;
128 if (isDestFoundinPacket(packet, pstruEventDetails->nDeviceId))
129 {
130 //Update the life time
131 sprintf(comment, "Received Data/Non-AODV control as Destination");
132 AODV_UPDATE_ROUTE_TABLE(packet->pstruNetworkData->szSourceIP,
133 pstruEventDetails->dEventTime + AODV_ACTIVE_ROUTE_TIMEOUT);
134 }
135 else
136 {
137 packet->pstruNetworkData->szNextHopIp = NULL;
138 packet->DropNotification = NULL;
139 sprintf(comment, "Received Data/Non-AODV control as Relay");
140 //Update the life time of dest
141 AODV_UPDATE_ROUTE_TABLE(packet->pstruNetworkData->szDestIP,
142 pstruEventDetails->dEventTime + AODV_ACTIVE_ROUTE_TIMEOUT);
143 //Update the life time of source
144 AODV_UPDATE_ROUTE_TABLE(packet->pstruNetworkData->szSourceIP,
145 pstruEventDetails->dEventTime + AODV_ACTIVE_ROUTE_TIMEOUT);
146 }
147 }
148 break;
149 }
150 break;
151 case TIMER_EVENT:
152 switch(pstruEventDetails->nSubEventType)
153 {
154 case AODVsubevent_RREQ_TIMEOUT:
155 AODV_RETRY_RREQ();
156 break;
157 case AODVsubevent_TRANSMIT_HELLO:
158 AODV_TRANSMIT_HELLO();
159 break;
160 case AODVsubevent_ACTIVE_ROUTE_TIMEOUT:
161 AODV_ACTIVE_ROUTE_TIMEOUT_EVENT();
162 break;
163 default:
164 fnNetSimError("Unknown subevent for AODV");
165 break;
166 }
167 break;
168 default:
169 fnNetSimError("Unknown event type for AODV");
170 break;
171 }
172 return 1;
173}
174/**
175This function is called by NetworkStack.dll, while writing the evnt trace
176to get the sub event as a string.
177*/
178_declspec(dllexport) char* fn_NetSim_AODV_Trace(NETSIM_ID id)
179{
180 return fn_NetSim_AODV_Trace_F(id);
181}
182/**
183This function is called by NetworkStack.dll, to free the AODV protocol parameters.
184*/
185_declspec(dllexport) int fn_NetSim_AODV_FreePacket(NetSim_PACKET* packet)
186{
187 return fn_NetSim_AODV_FreePacket_F(packet);
188}
189/**
190This function is called by NetworkStack.dll, to copy the AODV protocol parameters
191from source packet to destination.
192*/
193_declspec(dllexport) int fn_NetSim_AODV_CopyPacket(const NetSim_PACKET* destPacket,const NetSim_PACKET* srcPacket)
194{
195 return fn_NetSim_AODV_CopyPacket_F(destPacket,srcPacket);
196}
197/**
198This function call WLAN Metrics function in lib file to write the Metrics in Metrics.txt
199*/
200_declspec(dllexport) int fn_NetSim_AODV_Metrics(PMETRICSWRITER metricsWriter)
201{
202 return fn_NetSim_AODV_Metrics_F(metricsWriter);
203}
204/**
205This function is called by NetworkStack.dll, while configuring the device
206NETWORK layer for AODV protocol.
207*/
208_declspec(dllexport) int fn_NetSim_AODV_Configure(void** var)
209{
210 return fn_NetSim_AODV_Configure_F(var);
211}
212/**
213This function will return the string to write packet trace heading.
214*/
215_declspec(dllexport) char* fn_NetSim_AODV_ConfigPacketTrace()
216{
217 return fn_NetSim_AODV_ConfigPacketTrace_F();
218}
219/**
220This function is called by NetworkStack.dll, once simulation end to free the
221allocated memory for the network.
222*/
223_declspec(dllexport) int fn_NetSim_AODV_Finish()
224{
225 return fn_NetSim_AODV_Finish_F();
226}
227/**
228This function will return the string to write packet trace.
229*/
230_declspec(dllexport) char* fn_NetSim_AODV_WritePacketTrace()
231{
232 return fn_NetSim_AODV_WritePacketTrace_F();
233}
234
235bool get_protocol_log_status(char* logname)
236{
237 FILE* fp;
238 char str[BUFSIZ];
239 char data[BUFSIZ];
240
241 sprintf(str, "%s/%s", pszIOPath, "ProtocolLogsConfig.txt");
242 fp = fopen(str, "r");
243 if (!fp)
244 return false;
245
246 sprintf(str, "%s=true", logname);
247
248 while (fgets(data, BUFSIZ, fp))
249 {
250 lskip(data);
251 if (!_strnicmp(data, str, strlen(str)))
252 {
253 fclose(fp);
254 return true;
255 }
256 }
257 fclose(fp);
258
259 return false;
260}