NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
ZRP.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 "ZRP.h"
16#include "ZRP_Enum.h"
17#include "NetSim_utility.h"
18
19static bool isCalledOnce = false;
20
21/**
22ZRP Init function initializes the ZRP parameters.
23*/
24_declspec (dllexport) int fn_NetSim_ZRP_Init()
25{
26 if (!isCalledOnce)
27 {
28 init_MPR_log();
29 isCalledOnce = true;
30 }
31
32 return fn_NetSim_ZRP_Init_F();
33}
34
35/**
36 This function is called by NetworkStack.dll, whenever the event gets triggered
37 inside the NetworkStack.dll for the ZRP protocol
38*/
39_declspec (dllexport) int fn_NetSim_ZRP_Run()
40{
41 switch(pstruEventDetails->nEventType)
42 {
43 case NETWORK_OUT_EVENT:
44 {
45 NetSim_PACKET* packet = pstruEventDetails->pPacket;
46 if(packet->nControlDataType/100 == NW_PROTOCOL_OLSR ||
47 DEVICE_NWLAYER(pstruEventDetails->nDeviceId)->nRoutingProtocolId == NW_PROTOCOL_OLSR || isBroadcastPacket(packet))
48 return 0; //IP layer will route the packet
49
50 //Call ierp to route packet
51 fn_NetSim_IERP_RoutePacket();
52 }
53 break;
54 case NETWORK_IN_EVENT:
55 {
56 NetSim_PACKET* packet = pstruEventDetails->pPacket;
57 if(packet->nControlDataType/100 == NW_PROTOCOL_ZRP ||
58 packet->nControlDataType/100 == NW_PROTOCOL_OLSR)
59 {
60 switch(packet->nControlDataType)
61 {
62 case OLSR_CONTROL_PACKET(HELLO_MESSAGE):
63 fn_NetSim_NDP_ReceiveHello();
64 break;
65 case OLSR_CONTROL_PACKET(TC_MESSAGE):
66 fn_NetSim_OLSR_PacketProcessing();
67 break;
68 case IERP_ROUTE_REPLY_WITH_BRP_HEADER:
69 case IERP_ROUTE_REQUEST_WITH_BRP_HEADER:
70 fn_NetSim_BRP_ProcessPacket();
71 break;
72 case IERP_ROUTE_REPLY:
73 fn_NetSim_IERP_ProcessRouteReply();
74 break;
75 default:
76 fnNetSimError("Unknown control packet %d for ZRP protocol",packet->nControlDataType);
77 break;
78 }
79 }
80 }
81 break;
82 case TIMER_EVENT:
83 {
84 switch(pstruEventDetails->nSubEventType)
85 {
86 case NDP_ScheduleHelloTransmission:
87 {
88 double time=pstruEventDetails->dEventTime;
89 NETSIM_ID nodeId=pstruEventDetails->nDeviceId;
90 fn_NetSim_NDP_TransmitHello();
91 fn_NetSim_NDP_ScheduleHelloTransmission(nodeId,time);
92 }
93 break;
94 case OLSR_ScheduleTCTransmission:
95 fn_NetSim_OLSR_TransmitTCMessage();
96 fn_NetSim_OLSR_ScheduleTCTransmission(pstruEventDetails->nDeviceId,pstruEventDetails->dEventTime);
97 break;
98 case OLSR_LINK_TUPLE_Expire:
99 fn_NetSim_OLSR_LinkTupleExpire();
100 break;
101 default:
102 fnNetSimError("Unknown subevent %d fro ZRP protocol",pstruEventDetails->nSubEventType);
103 break;
104 }
105 }
106 break;
107 default:
108 fnNetSimError("Unknow event %d for ZRP protocol",pstruEventDetails->nEventType);
109 break;
110 }
111 return 0;
112}
113
114/**
115 This function is called by NetworkStack.dll, once simulation end to free the
116 allocated memory for the network.
117*/
118_declspec(dllexport) int fn_NetSim_ZRP_Finish()
119{
120 close_MPR_log();
121 return fn_NetSim_ZRP_Finish_F();
122}
123
124/**
125 This function is called by NetworkStack.dll, while writing the evnt trace
126 to get the sub event as a string.
127*/
128_declspec (dllexport) char* fn_NetSim_ZRP_Trace(NETSIM_ID nSubEvent)
129{
130 return fn_NetSim_ZRP_Trace_F(nSubEvent);
131}
132
133/**
134 This function is called by NetworkStack.dll, while configuring the device
135 for ZRP protocol.
136*/
137_declspec(dllexport) int fn_NetSim_ZRP_Configure(void** var)
138{
139 return fn_NetSim_ZRP_Configure_F(var);
140}
141
142/**
143 This function is called by NetworkStack.dll, to free the ZRP protocol data.
144*/
145_declspec(dllexport) int fn_NetSim_ZRP_FreePacket(NetSim_PACKET* pstruPacket)
146{
147 return fn_NetSim_ZRP_FreePacket_F(pstruPacket);
148}
149
150/**
151 This function is called by NetworkStack.dll, to copy the ZRP protocol
152 details from source packet to destination.
153*/
154_declspec(dllexport) int fn_NetSim_ZRP_CopyPacket(NetSim_PACKET* pstruDestPacket,NetSim_PACKET* pstruSrcPacket)
155{
156 return fn_NetSim_ZRP_CopyPacket_F(pstruDestPacket,pstruSrcPacket);
157}
158
159/**
160This function write the Metrics
161*/
162_declspec(dllexport) int fn_NetSim_ZRP_Metrics()
163{
164 return 0;
165}
166
167/**
168This function will return the string to write packet trace heading.
169*/
170_declspec(dllexport) char* fn_NetSim_ZRP_ConfigPacketTrace()
171{
172 return "";
173}
174
175/**
176 This function will return the string to write packet trace.
177*/
178_declspec(dllexport) char* fn_NetSim_ZRP_WritePacketTrace()
179{
180 return "";
181}
182
183int addToZoneList(NODE_ZRP* zrp,NETSIM_IPAddress ip)
184{
185 ZRP_ZONE* zone=ZRP_ZONE_ALLOC();
186 zone->zoneNodeIP=IP_COPY(ip);
187 LIST_ADD_LAST((void**)&zrp->zone,zone);
188 return 0;
189}
190
191bool checkDestInZone(NetSim_PACKET* packet)
192{
193 NETSIM_IPAddress dest=packet->pstruNetworkData->szDestIP;
194 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
195 ZRP_ZONE* zone=zrp->zone;
196 while(zone)
197 {
198 if(!IP_COMPARE(zone->zoneNodeIP,dest))
199 return true;
200 zone=(ZRP_ZONE*)LIST_NEXT(zone);
201 }
202 return false;
203}
204
205static void init_MPR_log()
206{
207 if (get_protocol_log_status("OLSRNeighborandMPRLog"))
208 {
209 sprintf(MPR_Log_filename, "%s\\%s", pszIOLogPath, "OLSR_Neighbor_MPR_log.csv");
210 fpRMlog = fopen(MPR_Log_filename, "w");
211 if (!fpRMlog)
212 {
213 fnSystemError("Unable to open %s file", MPR_Log_filename);
214 perror(MPR_Log_filename);
215 }
216 else
217 {
218 fprintf(fpRMlog, "%s,%s,%s,%s,%s,%s",
219 "Time(ms)", "Device Name", "Device ID", "MPR Nodes", "One hop neighbors", "Two hop neighbors");
220 fprintf(fpRMlog, "\n");
221 if (nDbgFlag) fflush(fpRMlog);
222 }
223 }
224}
225
226static void close_MPR_log()
227{
228 if (fpRMlog)
229 fclose(fpRMlog);
230}
231
232bool get_protocol_log_status(char* logname)
233{
234 FILE* fp;
235 char str[BUFSIZ];
236 char data[BUFSIZ];
237
238 sprintf(str, "%s/%s", pszIOPath, "ProtocolLogsConfig.txt");
239 fp = fopen(str, "r");
240 if (!fp)
241 return false;
242
243 sprintf(str, "%s=true", logname);
244
245 while (fgets(data, BUFSIZ, fp))
246 {
247 lskip(data);
248 if (!_strnicmp(data, str, strlen(str)))
249 {
250 fclose(fp);
251 return true;
252 }
253 }
254 fclose(fp);
255
256 return false;
257}