NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
MaintBuffer.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 "DSR.h"
16#include "List.h"
17/**
18Whenever a packet is to be sent to the target and the device has the next Hop IP,
19the packet is added to the MaintBuffer and retained there until and acknowledge is
20received or a timeout happens in which case the packets are retransmitted.
21*/
22int fn_NetSim_DSR_AddToMaintBuffer(NETSIM_ID nDeviceId,
23 NetSim_PACKET* pstruPacket,
24 double dTime)
25{
26 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(pstruPacket);
27 NetSim_EVENTDETAILS pevent;
28 //Get the Maint buffer
29 DSR_MAINT_BUFFER** maintBuffer = &(DSR_DEV_VAR(nDeviceId)->pstruMaintBuffer);
30 DSR_MAINT_BUFFER* buffer=*maintBuffer;
31 if(!*maintBuffer)
32 {
33 *maintBuffer = MAINTBUFFER_ALLOC();
34 (*maintBuffer)->dAckTime = dTime + MAINT_HOLD_OFF_TIME;
35 (*maintBuffer)->nextHop = packet->nReceiverId;
36 (*maintBuffer)->source = packet->nSourceId;
37 (*maintBuffer)->dest = get_first_dest_from_packet(packet);
38 (*maintBuffer)->packetList = packet;
39 memcpy(&pevent,pstruEventDetails,sizeof* pstruEventDetails);
40 pevent.dEventTime = (*maintBuffer)->dAckTime;
41 pevent.dPacketSize = 0;
42 pevent.nApplicationId = 0;
43 pevent.nEventType = TIMER_EVENT;
44 pevent.nPacketId = 0;
45 pevent.nProtocolId = NW_PROTOCOL_DSR;
46 pevent.nSegmentId =0;
47 pevent.nSubEventType = subevent_MAINT_TIMEOUT;
48 pevent.pPacket = NULL;
49 pevent.szOtherDetails = calloc(4,sizeof(NETSIM_ID));
50 *((NETSIM_ID*)pevent.szOtherDetails) = (*maintBuffer)->source;
51 *((NETSIM_ID*)(pevent.szOtherDetails) + 1) = (*maintBuffer)->dest;
52 *((NETSIM_ID*)(pevent.szOtherDetails) + 2) = (*maintBuffer)->nextHop;
53 fnpAddEvent(&pevent);
54 return 1;
55 }
56 while(buffer)
57 {
58 if(buffer->nextHop == packet->nReceiverId &&
59 buffer->dest == get_first_dest_from_packet(packet) &&
60 buffer->source == packet->nSourceId)
61 {
62 if(buffer->packetList)
63 {
64 NetSim_PACKET* packetList = buffer->packetList;
65 while(packetList->pstruNextPacket)
66 packetList = packetList->pstruNextPacket;
67 packetList->pstruNextPacket = packet;
68 }
69 else
70 {
71 buffer->dAckTime = dTime+MAINT_HOLD_OFF_TIME;
72 buffer->packetList = packet;
73 memcpy(&pevent,pstruEventDetails,sizeof* pstruEventDetails);
74 pevent.nInterfaceId = 1;
75 pevent.dEventTime = buffer->dAckTime;
76 pevent.dPacketSize = 0;
77 pevent.nApplicationId = 0;
78 pevent.nEventType = TIMER_EVENT;
79 pevent.nPacketId = 0;
80 pevent.nProtocolId = NW_PROTOCOL_DSR;
81 pevent.nSegmentId =0;
82 pevent.nSubEventType = subevent_MAINT_TIMEOUT;
83 pevent.pPacket = NULL;
84 pevent.szOtherDetails = calloc(4,sizeof(NETSIM_ID));
85 *((NETSIM_ID*)pevent.szOtherDetails) = buffer->source;
86 *((NETSIM_ID*)(pevent.szOtherDetails) + 1) = buffer->dest;
87 *((NETSIM_ID*)(pevent.szOtherDetails) + 2) = buffer->nextHop;
88 fnpAddEvent(&pevent);
89 }
90 return 2;
91 }
92 buffer=LIST_NEXT(buffer);
93 }
94 buffer = MAINTBUFFER_ALLOC();
95 buffer->dAckTime = dTime+MAINT_HOLD_OFF_TIME;
96 buffer->packetList = packet;
97 buffer->dest = get_first_dest_from_packet(packet);
98 buffer->nextHop = packet->nReceiverId;
99 buffer->source = packet->nSourceId;
100 memcpy(&pevent,pstruEventDetails,sizeof* pstruEventDetails);
101 pevent.dEventTime = buffer->dAckTime;
102 pevent.dPacketSize = 0;
103 pevent.nApplicationId = 0;
104 pevent.nEventType = TIMER_EVENT;
105 pevent.nPacketId = 0;
106 pevent.nProtocolId = NW_PROTOCOL_DSR;
107 pevent.nSegmentId =0;
108 pevent.nSubEventType = subevent_MAINT_TIMEOUT;
109 pevent.pPacket = NULL;
110 pevent.szOtherDetails = calloc(4,sizeof(NETSIM_ID));
111 *((NETSIM_ID*)pevent.szOtherDetails) = buffer->source;
112 *((NETSIM_ID*)(pevent.szOtherDetails) + 1) = buffer->dest;
113 *((NETSIM_ID*)(pevent.szOtherDetails) + 2) = buffer->nextHop;
114 fnpAddEvent(&pevent);
115 LIST_ADD_LAST(maintBuffer,buffer);
116 return 3;
117}
118/**
119This is called when DSR Maintenance Timeout happens. It retransmits the packets if acknowledgemnet
120is not received and the transmit count is less the DSR MaxMaintenance Retransmit limit.
121Else it empties the buffer.
122*/
123int fn_NetSim_DSR_MaintTimeout(NetSim_EVENTDETAILS* pstruEventDetails)
124{
125 DSR_MAINT_BUFFER* maintBuffer = DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruMaintBuffer;
126 NETSIM_ID source = *((NETSIM_ID*)pstruEventDetails->szOtherDetails);
127 NETSIM_ID dest = *((NETSIM_ID*)pstruEventDetails->szOtherDetails+1);
128 NETSIM_ID nextHop = *((NETSIM_ID*)pstruEventDetails->szOtherDetails+2);
129 free((NETSIM_ID*)pstruEventDetails->szOtherDetails);
130 pstruEventDetails->szOtherDetails = NULL;
131 while(maintBuffer)
132 {
133 if(maintBuffer->nextHop == nextHop &&
134 maintBuffer->source == source &&
135 maintBuffer->dest == dest)
136 {
137 if(maintBuffer->dAckTime <= pstruEventDetails->dEventTime)
138 {
139 if(maintBuffer->packetList)
140 {
141 if(maintBuffer->count<DSR_MaxMaintRexmt)
142 {
143 maintBuffer->count++;
144 DSR_RETRANSMIT_BUFFER(maintBuffer);
145 }
146 else
147 {
148 maintBuffer->count=0;
149 //Generate route error
150 if (maintBuffer->packetList->nSourceId != pstruEventDetails->nDeviceId)
151 DSR_GENERATE_RERR(maintBuffer);
152 DSR_DELETE_ENTRY_CACHE(&(DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRouteCache),
153 fn_NetSim_Stack_GetIPAddressAsId(pstruEventDetails->nDeviceId,1),
154 IP_COPY(fn_NetSim_Stack_GetIPAddressAsId(maintBuffer->nextHop, 1)));
155 DSR_EMPTY_MAINT_BUFFER(pstruEventDetails->nDeviceId,nextHop);
156 }
157 //update the metrics
158 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.routeBreak++;
159 }
160 else
161 {
162 //ignore the event. All packet is acked.
163 }
164 }
165 else
166 {
167 //ignore the event
168 }
169 break;
170 }
171 maintBuffer = LIST_NEXT(maintBuffer);
172 }
173 return 1;
174}
175/**
176This function retransmits the packets in the DSR Maintanence Buffer.
177*/
178int fn_NetSim_DSR_RetransmitBuffer(DSR_MAINT_BUFFER* maintBuffer,NetSim_EVENTDETAILS* pstruEventDetails)
179{
180 NetSim_EVENTDETAILS pevent;
181 memcpy(&pevent,pstruEventDetails,sizeof* pstruEventDetails);
182 while(maintBuffer->packetList)
183 {
184 NetSim_PACKET* packet = maintBuffer->packetList;
185 maintBuffer->packetList = maintBuffer->packetList->pstruNextPacket;
186 packet->pstruNextPacket = NULL;
187
188 pevent.dPacketSize = fnGetPacketSize(packet);
189 if(packet->pstruAppData)
190 {
191 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
192 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
193 }
194 else
195 {
196 pevent.nApplicationId = 0;
197 pevent.nSegmentId = 0;
198 }
199 packet->pstruNetworkData->szNextHopIp=NULL;
200 pevent.nEventType = NETWORK_OUT_EVENT;
201 pevent.nPacketId = packet->nPacketId;
202 pevent.nProtocolId = NW_PROTOCOL_DSR;
203 pevent.nSubEventType = 0;
204 pevent.pPacket = packet;
205 pevent.szOtherDetails = NULL;
206 fnpAddEvent(&pevent);
207 }
208 return 1;
209}
210/**
211This function Empties the DSR Maintenance Buffer.
212*/
213int fn_NetSim_DSR_EmptyMaintBuffer(NETSIM_ID nDeviceId,NETSIM_ID nextHop)
214{
215 DSR_MAINT_BUFFER* maintBuffer = DSR_DEV_VAR(nDeviceId)->pstruMaintBuffer;
216 while(maintBuffer)
217 {
218 if(maintBuffer->nextHop == nextHop)
219 {
220 while(maintBuffer->packetList)
221 {
222 NetSim_PACKET* packet = maintBuffer->packetList;
223 maintBuffer->packetList = maintBuffer->packetList->pstruNextPacket;
224 packet->pstruNextPacket = NULL;
225 fn_NetSim_Packet_FreePacket(packet);
226 }
227 }
228 maintBuffer = LIST_NEXT(maintBuffer);
229 }
230 return 0;
231}
NetSim_PACKET * packetList
packetList - list of packets sent to the destination
Definition DSR.h:630
NETSIM_ID nextHop
Next hop ID of a route.
Definition DSR.h:627