22int fn_NetSim_DSR_AddToMaintBuffer(NETSIM_ID nDeviceId,
23 NetSim_PACKET* pstruPacket,
26 NetSim_PACKET* packet = fn_NetSim_Packet_CopyPacket(pstruPacket);
27 NetSim_EVENTDETAILS pevent;
29 DSR_MAINT_BUFFER** maintBuffer = &(DSR_DEV_VAR(nDeviceId)->pstruMaintBuffer);
30 DSR_MAINT_BUFFER* buffer=*maintBuffer;
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;
45 pevent.nProtocolId = NW_PROTOCOL_DSR;
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;
58 if(buffer->nextHop == packet->nReceiverId &&
59 buffer->dest == get_first_dest_from_packet(packet) &&
60 buffer->source == packet->nSourceId)
62 if(buffer->packetList)
64 NetSim_PACKET* packetList = buffer->packetList;
65 while(packetList->pstruNextPacket)
66 packetList = packetList->pstruNextPacket;
67 packetList->pstruNextPacket = packet;
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;
80 pevent.nProtocolId = NW_PROTOCOL_DSR;
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;
92 buffer=LIST_NEXT(buffer);
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);
123int fn_NetSim_DSR_MaintTimeout(NetSim_EVENTDETAILS* pstruEventDetails)
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;
133 if(maintBuffer->
nextHop == nextHop &&
134 maintBuffer->source == source &&
135 maintBuffer->dest == dest)
137 if(maintBuffer->dAckTime <= pstruEventDetails->dEventTime)
141 if(maintBuffer->count<DSR_MaxMaintRexmt)
143 maintBuffer->count++;
144 DSR_RETRANSMIT_BUFFER(maintBuffer);
148 maintBuffer->count=0;
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);
158 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.routeBreak++;
171 maintBuffer = LIST_NEXT(maintBuffer);
178int fn_NetSim_DSR_RetransmitBuffer(DSR_MAINT_BUFFER* maintBuffer,NetSim_EVENTDETAILS* pstruEventDetails)
180 NetSim_EVENTDETAILS pevent;
181 memcpy(&pevent,pstruEventDetails,
sizeof* pstruEventDetails);
184 NetSim_PACKET* packet = maintBuffer->
packetList;
186 packet->pstruNextPacket = NULL;
188 pevent.dPacketSize = fnGetPacketSize(packet);
189 if(packet->pstruAppData)
191 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
192 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
196 pevent.nApplicationId = 0;
197 pevent.nSegmentId = 0;
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);
213int fn_NetSim_DSR_EmptyMaintBuffer(NETSIM_ID nDeviceId,NETSIM_ID nextHop)
215 DSR_MAINT_BUFFER* maintBuffer = DSR_DEV_VAR(nDeviceId)->pstruMaintBuffer;
218 if(maintBuffer->
nextHop == nextHop)
222 NetSim_PACKET* packet = maintBuffer->
packetList;
224 packet->pstruNextPacket = NULL;
225 fn_NetSim_Packet_FreePacket(packet);
228 maintBuffer = LIST_NEXT(maintBuffer);
NetSim_PACKET * packetList
packetList - list of packets sent to the destination
NETSIM_ID nextHop
Next hop ID of a route.