NetSim Source Code Help
Loading...
Searching...
No Matches
MaintBuffer.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 "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*/
23 NetSim_PACKET* pstruPacket,
24 double dTime)
25{
26 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(pstruPacket);
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;
46 pevent.nSegmentId =0;
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;
81 pevent.nSegmentId =0;
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;
107 pevent.nSegmentId =0;
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*/
124{
125 DSR_MAINT_BUFFER* maintBuffer = DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruMaintBuffer;
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 DSR_GENERATE_RERR(maintBuffer);
152 }
153 //update the metrics
154 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.routeBreak++;
155 }
156 else
157 {
158 //ignore the event. All packet is acked.
159 }
160 }
161 else
162 {
163 //ignore the event
164 }
165 break;
166 }
167 maintBuffer = LIST_NEXT(maintBuffer);
168 }
169 return 1;
170}
171/**
172This function retransmits the packets in the DSR Maintanence Buffer.
173*/
175{
176 NetSim_EVENTDETAILS pevent;
177 memcpy(&pevent,pstruEventDetails,sizeof* pstruEventDetails);
178 while(maintBuffer->packetList)
179 {
180 NetSim_PACKET* packet = maintBuffer->packetList;
181 maintBuffer->packetList = maintBuffer->packetList->pstruNextPacket;
182 packet->pstruNextPacket = NULL;
183
184 pevent.dPacketSize = fnGetPacketSize(packet);
185 if(packet->pstruAppData)
186 {
188 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
189 }
190 else
191 {
192 pevent.nApplicationId = 0;
193 pevent.nSegmentId = 0;
194 }
195 packet->pstruNetworkData->szNextHopIp=NULL;
197 pevent.nPacketId = packet->nPacketId;
199 pevent.nSubEventType = 0;
200 pevent.pPacket = packet;
201 pevent.szOtherDetails = NULL;
202 fnpAddEvent(&pevent);
203 }
204 return 1;
205}
206/**
207This function Empties the DSR Maintenance Buffer.
208*/
210{
211 DSR_MAINT_BUFFER* maintBuffer = DSR_DEV_VAR(nDeviceId)->pstruMaintBuffer;
212 while(maintBuffer)
213 {
214 if(maintBuffer->nextHop == nextHop)
215 {
216 while(maintBuffer->packetList)
217 {
218 NetSim_PACKET* packet = maintBuffer->packetList;
219 maintBuffer->packetList = maintBuffer->packetList->pstruNextPacket;
220 packet->pstruNextPacket = NULL;
222 }
223 }
224 maintBuffer = LIST_NEXT(maintBuffer);
225 }
226 return 0;
227}
unsigned int NETSIM_ID
Definition: Animation.h:45
#define DSR_EMPTY_MAINT_BUFFER(nDeviceId, nextHop)
Definition: DSR.h:723
#define DSR_GENERATE_RERR(maintBuffer)
Definition: DSR.h:730
@ subevent_MAINT_TIMEOUT
Definition: DSR.h:80
#define MAINT_HOLD_OFF_TIME
Definition: DSR.h:51
#define DSR_DEV_VAR(dev)
Definition: DSR.h:772
#define MAINTBUFFER_ALLOC()
Definition: DSR.h:780
#define DSR_RETRANSMIT_BUFFER(maintBuffer)
Definition: DSR.h:722
#define DSR_MaxMaintRexmt
Definition: DSR.h:42
#define LIST_ADD_LAST(ls, mem)
Definition: List.h:30
#define LIST_NEXT(ls)
Definition: List.h:29
int fn_NetSim_DSR_MaintTimeout(NetSim_EVENTDETAILS *pstruEventDetails)
Definition: MaintBuffer.c:123
int fn_NetSim_DSR_EmptyMaintBuffer(NETSIM_ID nDeviceId, NETSIM_ID nextHop)
Definition: MaintBuffer.c:209
int fn_NetSim_DSR_RetransmitBuffer(DSR_MAINT_BUFFER *maintBuffer, NetSim_EVENTDETAILS *pstruEventDetails)
Definition: MaintBuffer.c:174
int fn_NetSim_DSR_AddToMaintBuffer(NETSIM_ID nDeviceId, NetSim_PACKET *pstruPacket, double dTime)
Definition: MaintBuffer.c:22
#define free(p)
Definition: Memory.h:31
#define calloc(c, s)
Definition: Memory.h:29
double fnGetPacketSize(NetSim_PACKET *pstruData)
NETSIM_ID get_first_dest_from_packet(NetSim_PACKET *packet)
@ NW_PROTOCOL_DSR
Definition: Stack.h:196
@ NETWORK_OUT_EVENT
Definition: Stack.h:108
@ TIMER_EVENT
Definition: Stack.h:114
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
#define fn_NetSim_Packet_CopyPacket(pstruPacket)
Definition: main.h:182
#define fn_NetSim_Packet_FreePacket(pstruPacket)
Definition: main.h:177
#define fnpAddEvent(pstruEvent)
Definition: main.h:191
NetSim_PACKET * packetList
packetList - list of packets sent to the destination
Definition: DSR.h:630
double dAckTime
Definition: DSR.h:625
NETSIM_ID source
Definition: DSR.h:628
NETSIM_ID dest
Definition: DSR.h:629
NETSIM_ID nextHop
Next hop ID of a route.
Definition: DSR.h:627
NETSIM_ID nApplicationId
Definition: Stack.h:752
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 nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
long long int nPacketId
Definition: Stack.h:755
NETSIM_ID nInterfaceId
Definition: Stack.h:751
NETSIM_IPAddress szNextHopIp
Definition: Packet.h:201
long long int nPacketId
Definition: Packet.h:256
struct stru_NetSim_Packet_AppLayer * pstruAppData
Definition: Packet.h:273
struct stru_NetSim_Packet_NetworkLayer * pstruNetworkData
Definition: Packet.h:275
NETSIM_ID nReceiverId
Definition: Packet.h:266
struct stru_NetSim_Packet * pstruNextPacket
Definition: Packet.h:278
NETSIM_ID nSourceId
Definition: Packet.h:263