3#include "NetSim_Plot.h"
4#pragma comment(lib,"Metrics.lib")
5#include "AdvancedPlots.h"
6#pragma comment(lib,"AdvancedPlots.lib")
8enum enum_Buffer_Manipulation_Type
13#define fnGetList(pstruPacketlist,Priority) (pstruPacketlist+Priority/(Priority_High-Priority_Medium))
16enum enum_BUFFER fn_NetSim_DropTail(NetSim_BUFFER*, NetSim_PACKET*);
17enum enum_BUFFER fn_NetSim_RED(NetSim_BUFFER*, NetSim_PACKET*);
18enum enum_BUFFER fn_NetSim_WRED(NetSim_BUFFER*, NetSim_PACKET*);
21NetSim_PACKET* fn_NetSim_Priority(NetSim_BUFFER*, NetSim_PACKET*,
int,
int);
22NetSim_PACKET* fn_NetSim_FIFO(NetSim_BUFFER*, NetSim_PACKET*,
int,
int);
23NetSim_PACKET* fn_NetSim_RoundRobin(NetSim_BUFFER*, NetSim_PACKET*,
int,
int);
24NetSim_PACKET* fn_NetSim_WFQ(NetSim_BUFFER*, NetSim_PACKET*,
int,
int);
25NetSim_PACKET* fn_NetSim_EDF(NetSim_BUFFER*, NetSim_PACKET*,
int,
int);
28UINT64 fn_NetSim_GetPosition_MaximumNumber(UINT64* nCount);
29bool fn_NetSim_GetBufferStatus(NetSim_BUFFER*);
30enum enum_BUFFER fn_NetSim_CheckBuffer(NetSim_BUFFER*, NetSim_PACKET*);
31static void fn_NetSim_DropPackets(NetSim_BUFFER*, NetSim_PACKET*);
34_declspec(dllexport)
bool fn_NetSim_GetBufferStatus(NetSim_BUFFER* pstruBuffer)
36 switch (pstruBuffer->nSchedulingType)
39 case SCHEDULING_PRIORITY:
42 return pstruBuffer->pstruPacketlist ? true :
false;
44 case SCHEDULING_ROUNDROBIN:
47 if (!pstruBuffer->pstruPacketlist)
return false;
49 PACKET_PRIORITY currPriority = Priority_High;
53 NetSim_PACKET* pstruTempList = fnGetList(pstruBuffer->pstruPacketlist, currPriority);
54 if (pstruTempList->pstruNextPacket != NULL)
56 currPriority -= Priority_High - Priority_Medium;
57 }
while (currPriority > 0);
69enum enum_Buffer fn_NetSim_Queuing(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
71 QUEUINGTECHNIQUE Queuing_Technique;
73 Queuing_Technique = pstruBuffer->queuingTechnique;
74 switch (Queuing_Technique)
76 case QUEUING_DROPTAIL:
77 queuing_result = fn_NetSim_DropTail(pstruBuffer, pstruData);
80 queuing_result = fn_NetSim_RED(pstruBuffer, pstruData);
83 queuing_result = fn_NetSim_WRED(pstruBuffer, pstruData);
86 queuing_result = fn_NetSim_DropTail(pstruBuffer, pstruData);
90 if (queuing_result == Buffer_Underflow)
91 return Buffer_Underflow;
93 return Buffer_Overflow;
97_declspec(dllexport)
int fn_NetSim_Packet_AddPacketToBuffer(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
101 SCHEDULING_TYPE Scheduling_Technique;
103 nBufferFlag = fn_NetSim_Queuing(pstruBuffer, pstruData);
105 if (nBufferFlag == Buffer_Underflow)
107 NETSIM_ID d = pstruEventDetails->nDeviceId;
108 NETSIM_ID in = pstruEventDetails->nInterfaceId;
110 if (pstruBuffer->nSchedulingType != SCHEDULING_NONE)
114 if (pstruBuffer->dMaxBufferSize > pow(10, 6))
115 fnNetSim_buffer_log_write(
"%lf,%d,%s,%d,Interface_%d (%s),%lf,%s,%s,%s", pstruEventDetails->dEventTime/MILLISECOND, DEVICE_CONFIGID(d), DEVICE_NAME(d),
116 DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE(d, in)->szInterfaceName, pstruBuffer->dCurrentBufferSize,
"inf",
"N/A",
"ENQUEUE");
118 fnNetSim_buffer_log_write(
"%lf,%d,%s,%d,Interface_%d (%s),%lf,%lf,%s,%s", pstruEventDetails->dEventTime/MILLISECOND, DEVICE_CONFIGID(d), DEVICE_NAME(d),
119 DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE(d, in)->szInterfaceName, pstruBuffer->dCurrentBufferSize, pstruBuffer->dMaxBufferSize,
"N/A",
"ENQUEUE");
122 pstruBuffer->nQueuedPacket++;
123 Scheduling_Technique = pstruBuffer->nSchedulingType;
124 switch (Scheduling_Technique)
126 case SCHEDULING_PRIORITY:
127 fn_NetSim_Priority(pstruBuffer, pstruData, nType, 1);
129 case SCHEDULING_FIFO:
130 fn_NetSim_FIFO(pstruBuffer, pstruData, nType, 1);
132 case SCHEDULING_ROUNDROBIN:
133 fn_NetSim_RoundRobin(pstruBuffer, pstruData, nType, 1);
136 fn_NetSim_WFQ(pstruBuffer, pstruData, nType, 1);
139 fn_NetSim_EDF(pstruBuffer, pstruData, nType, 1);
142 fn_NetSim_FIFO(pstruBuffer, pstruData, nType, 1);
146 else if (nBufferFlag == Buffer_Overflow)
149 NETSIM_ID d = pstruEventDetails->nDeviceId;
150 NETSIM_ID in = pstruEventDetails->nInterfaceId;
151 if (pstruBuffer->nSchedulingType != SCHEDULING_NONE)
155 if (pstruBuffer->dMaxBufferSize > pow(10, 6))
156 fnNetSim_buffer_log_write(
"%lf,%d,%s,%d,Interface_%d (%s),%lf,%s,%s,%s", pstruEventDetails->dEventTime/MILLISECOND, DEVICE_CONFIGID(d), DEVICE_NAME(d),
157 DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE(d, in)->szInterfaceName, pstruBuffer->dCurrentBufferSize,
"inf",
"N/A",
"DROP");
159 fnNetSim_buffer_log_write(
"%lf,%d,%s,%d,Interface_%d (%s),%lf,%lf,%s,%s", pstruEventDetails->dEventTime/MILLISECOND, DEVICE_CONFIGID(d), DEVICE_NAME(d),
160 DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE(d, in)->szInterfaceName, pstruBuffer->dCurrentBufferSize, pstruBuffer->dMaxBufferSize,
"N/A",
"DROP");
164 pstruBuffer->nDroppedPacket++;
165 pstruData->nPacketStatus = PacketStatus_Buffer_Dropped;
166 pstruData->nReceiverId = pstruEventDetails->nDeviceId;
167 fn_NetSim_WritePacketTrace(pstruData);
168 fn_NetSim_Packet_FreePacket(pstruData);
179_declspec(dllexport) NetSim_PACKET* fn_NetSim_GetPacketFromBuffer(NetSim_BUFFER* pstruBuffer,
int nFlag)
183 int nScheduling_Technique;
184 NetSim_PACKET* pstruData = NULL;
185 if (fn_NetSim_GetBufferStatus(pstruBuffer))
188 pstruBuffer->nDequeuedPacket++;
189 nScheduling_Technique = pstruBuffer->nSchedulingType;
190 switch (nScheduling_Technique)
192 case SCHEDULING_PRIORITY:
193 pstruData = fn_NetSim_Priority(pstruBuffer, pstruData, nType, nFlag);
195 case SCHEDULING_FIFO:
196 pstruData = fn_NetSim_FIFO(pstruBuffer, pstruData, nType, nFlag);
198 case SCHEDULING_ROUNDROBIN:
199 pstruData = fn_NetSim_RoundRobin(pstruBuffer, pstruData, nType, nFlag);
202 pstruData = fn_NetSim_WFQ(pstruBuffer, pstruData, nType, nFlag);
205 pstruData = fn_NetSim_EDF(pstruBuffer, pstruData, nType, nFlag);
208 pstruData = fn_NetSim_FIFO(pstruBuffer, pstruData, nType, nFlag);
213 if (pstruData == NULL)
217 pstruBuffer->dMaxBufferSize)
219 double d_NN_DataSize;
220 if (pstruData->pstruNetworkData)
221 d_NN_DataSize = pstruData->pstruNetworkData->dPacketSize;
223 d_NN_DataSize = pstruData->pstruMacData->dPacketSize;
224 pstruBuffer->dCurrentBufferSize -= (double)((
int)d_NN_DataSize);
225 if (pstruBuffer->dCurrentBufferSize < 0)
228 pstruBuffer->dCurrentBufferSize = 0;
229 fnNetSimError(
"Assert failure in scheduling. Buffer size is negative.\n");
233 if (pstruBuffer->queuingTechnique == QUEUING_RED && pstruBuffer->dCurrentBufferSize == 0)
235 ptrQUEUING_RED_VAR queuing_var = pstruBuffer->queuingParam;
236 queuing_var->q_time = pstruEventDetails->dEventTime;
239 if (pstruBuffer->queuingTechnique == QUEUING_WRED && pstruBuffer->dCurrentBufferSize == 0)
241 ptrQUEUING_WRED_VAR queuing_var = pstruBuffer->queuingParam;
242 queuing_var->q_time = pstruEventDetails->dEventTime;
245 NETSIM_ID d = pstruEventDetails->nDeviceId;
246 NETSIM_ID in = pstruEventDetails->nInterfaceId;
248 if (pstruBuffer->nSchedulingType != SCHEDULING_NONE)
252 if (pstruBuffer->dMaxBufferSize > pow(10, 6))
253 fnNetSim_buffer_log_write(
"%lf,%d,%s,%d,Interface_%d (%s),%lf,%s,%s,%s", pstruEventDetails->dEventTime/MILLISECOND, DEVICE_CONFIGID(d), DEVICE_NAME(d),
254 DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE(d, in)->szInterfaceName, pstruBuffer->dCurrentBufferSize,
"inf",
"N/A",
"DEQUEUE");
256 fnNetSim_buffer_log_write(
"%lf,%d,%s,%d,Interface_%d (%s),%lf,%lf,%s,%s", pstruEventDetails->dEventTime/MILLISECOND, DEVICE_CONFIGID(d), DEVICE_NAME(d),
257 DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE_CONFIGID(d, in), DEVICE_INTERFACE(d, in)->szInterfaceName, pstruBuffer->dCurrentBufferSize, pstruBuffer->dMaxBufferSize,
"N/A",
"DEQUEUE");
266UINT64 fn_NetSim_GetPosition_MaximumNumber(UINT64* nCount)
268 unsigned long long int nMax;
272 for (nLoop = 1; nLoop < 4; nLoop++)
274 if (nCount[nLoop] >= nMax)
276 nMax = nCount[nLoop];
285static void fn_NetSim_DropPackets(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
287 pstruBuffer->nDroppedPacket++;
288 pstruData->nPacketStatus = PacketStatus_Buffer_Dropped;
289 pstruData->nReceiverId = pstruData->nTransmitterId;
290 fn_NetSim_WritePacketTrace(pstruData);
291 fn_NetSim_Packet_FreePacket(pstruData);
299enum enum_BUFFER fn_NetSim_CheckBuffer(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
301 double d_NN_DataSize = 0;
302 double ldMaximumBufferSize;
303 double ldCurrentBufferSize;
304 NetSim_PACKET* p = pstruData;
308 if (pstruData->pstruNetworkData)
309 d_NN_DataSize += pstruData->pstruNetworkData->dPacketSize;
311 d_NN_DataSize += pstruData->pstruMacData->dPacketSize;
312 p = p->pstruNextPacket;
314 if (!pstruBuffer->dMaxBufferSize)
315 pstruBuffer->dMaxBufferSize = (double)0xFFFFFFFFFFFFFFFF;
316 ldMaximumBufferSize = pstruBuffer->dMaxBufferSize * 1024 * 1024;
317 ldCurrentBufferSize = pstruBuffer->dCurrentBufferSize + d_NN_DataSize;
318 if (ldCurrentBufferSize <= ldMaximumBufferSize)
321 pstruBuffer->dCurrentBufferSize = (double)((
int)ldCurrentBufferSize);
322 return Buffer_Underflow;
326 return Buffer_Overflow;
330enum enum_BUFFER fn_NetSim_DropTail(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
332 enum enum_BUFFER checkBuffer = fn_NetSim_CheckBuffer(pstruBuffer, pstruData);
333 if (checkBuffer == Buffer_Underflow)
334 return Buffer_Underflow;
336 return Buffer_Overflow;
340static void add_current_size_buffer(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
342 double d_NN_DataSize = 0;
343 double ldCurrentBufferSize;
344 NetSim_PACKET* p = pstruData;
348 if (pstruData->pstruNetworkData)
349 d_NN_DataSize += pstruData->pstruNetworkData->dPacketSize;
351 d_NN_DataSize += pstruData->pstruMacData->dPacketSize;
352 p = p->pstruNextPacket;
354 ldCurrentBufferSize = pstruBuffer->dCurrentBufferSize + d_NN_DataSize;
355 pstruBuffer->dCurrentBufferSize = (double)((
int)ldCurrentBufferSize);
359static void reduce_current_size_buffer(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
361 double d_NN_DataSize;
362 if (pstruData->pstruNetworkData)
363 d_NN_DataSize = pstruData->pstruNetworkData->dPacketSize;
365 d_NN_DataSize = pstruData->pstruMacData->dPacketSize;
366 pstruBuffer->dCurrentBufferSize -= (double)((
int)d_NN_DataSize);
367 if (pstruBuffer->dCurrentBufferSize < 0)
370 pstruBuffer->dCurrentBufferSize = 0;
371 fnNetSimError(
"Scheduling--- Buffer size negative. how?????\n");
376static enum enum_BUFFER red_algorithm(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
378 ptrQUEUING_RED_VAR queuing_var = pstruBuffer->queuingParam;
382 if (queuing_var->min_th <= queuing_var->avg_queue_size &&
383 queuing_var->avg_queue_size < queuing_var->max_th)
385 queuing_var->count++;
386 pb = queuing_var->max_p * (queuing_var->avg_queue_size - queuing_var->min_th) /
387 (queuing_var->max_th - queuing_var->min_th);
388 if (queuing_var->count > 0 && queuing_var->count > queuing_var->random_value / pb)
390 queuing_var->count = 0;
391 queuing_var->random_value = NETSIM_RAND_01();
393 return Buffer_Overflow;
395 return Buffer_Underflow;
397 else if (queuing_var->max_th <= queuing_var->avg_queue_size)
399 queuing_var->count = -1;
401 return Buffer_Overflow;
405 queuing_var->count = -1;
406 return Buffer_Underflow;
411enum enum_BUFFER fn_NetSim_RED(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
413 enum enum_BUFFER checkBuffer = fn_NetSim_CheckBuffer(pstruBuffer, pstruData);
414 if (checkBuffer == Buffer_Underflow)
416 reduce_current_size_buffer(pstruBuffer, pstruData);
417 ptrQUEUING_RED_VAR queuing_var = pstruBuffer->queuingParam;
418 double curr_buff_size_in_MB = pstruBuffer->dCurrentBufferSize / 1048576;
420 if (curr_buff_size_in_MB == 0)
422 queuing_var->avg_queue_size = pow((1 - queuing_var->wq), (pstruEventDetails->dEventTime - queuing_var->q_time))
423 * queuing_var->avg_queue_size;
427 queuing_var->avg_queue_size = queuing_var->avg_queue_size +
428 queuing_var->wq * (curr_buff_size_in_MB - queuing_var->avg_queue_size);
431 checkBuffer = red_algorithm(pstruBuffer, pstruData);
432 if (checkBuffer == Buffer_Underflow)
433 add_current_size_buffer(pstruBuffer, pstruData);
438 return Buffer_Overflow;
442static enum enum_BUFFER wred_algorithm(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData,
443 double max_th,
double min_th,
double max_p,
int* count,
double* random)
445 ptrQUEUING_WRED_VAR queuing_var = pstruBuffer->queuingParam;
449 if (min_th <= queuing_var->avg_queue_size &&
450 queuing_var->avg_queue_size < max_th)
453 pb = max_p * (queuing_var->avg_queue_size - min_th) /
455 if (*count > 0 && *count > * random / pb)
458 *random = NETSIM_RAND_01();
460 return Buffer_Overflow;
462 return Buffer_Underflow;
464 else if (max_th <= queuing_var->avg_queue_size)
467 return Buffer_Overflow;
472 return Buffer_Underflow;
477enum enum_BUFFER fn_NetSim_WRED(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData)
479 enum enum_BUFFER checkBuffer = fn_NetSim_CheckBuffer(pstruBuffer, pstruData);
480 if (checkBuffer == Buffer_Underflow)
482 reduce_current_size_buffer(pstruBuffer, pstruData);
483 ptrQUEUING_WRED_VAR queuing_var = pstruBuffer->queuingParam;
490 double curr_buff_size_in_MB = pstruBuffer->dCurrentBufferSize / 1048576;
491 int priority = pstruData->nPacketPriority;
493 if (curr_buff_size_in_MB == 0)
495 queuing_var->avg_queue_size = pow((1 - queuing_var->wq), (pstruEventDetails->dEventTime - queuing_var->q_time))
496 * queuing_var->avg_queue_size;
500 queuing_var->avg_queue_size = queuing_var->avg_queue_size +
501 queuing_var->wq * (curr_buff_size_in_MB - queuing_var->avg_queue_size);
504 index = (priority / 2) - 1;
509 checkBuffer = Buffer_Underflow;
513 curr_max_th = *(queuing_var->max_th + index);
514 curr_min_th = *(queuing_var->min_th + index);
515 curr_max_p = *(queuing_var->max_p + index);
516 curr_count = (queuing_var->count + index);
517 curr_random = (queuing_var->random_value + index);
519 checkBuffer = wred_algorithm(pstruBuffer, pstruData, curr_max_th, curr_min_th, curr_max_p, curr_count, curr_random);
522 if (checkBuffer == Buffer_Underflow)
523 add_current_size_buffer(pstruBuffer, pstruData);
528 return Buffer_Overflow;
535NetSim_PACKET* fn_NetSim_Priority(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData,
int nType,
int nFlag)
540 if (pstruBuffer->pstruPacketlist)
542 NetSim_PACKET* pstruTmpBufferPacketList;
543 NetSim_PACKET* pstruPrevPacketList;
545 pstruTmpBufferPacketList = pstruBuffer->pstruPacketlist;
546 pstruPrevPacketList = pstruBuffer->pstruPacketlist;
547 if (pstruTmpBufferPacketList->nPacketPriority < pstruData->nPacketPriority)
549 pstruData->pstruNextPacket = pstruTmpBufferPacketList;
550 pstruBuffer->pstruPacketlist = pstruData;
553 while (pstruTmpBufferPacketList)
555 if (pstruTmpBufferPacketList->nPacketPriority < pstruData->nPacketPriority)
557 pstruData->pstruNextPacket = pstruTmpBufferPacketList;
558 pstruPrevPacketList->pstruNextPacket = pstruData;
561 else if (!pstruTmpBufferPacketList->pstruNextPacket)
563 pstruTmpBufferPacketList->pstruNextPacket = pstruData;
568 pstruPrevPacketList = pstruTmpBufferPacketList;
569 pstruTmpBufferPacketList = pstruTmpBufferPacketList->pstruNextPacket;
575 pstruBuffer->pstruPacketlist = pstruData;
579 NetSim_PACKET* pstruPacket;
580 pstruPacket = pstruBuffer->pstruPacketlist;
583 pstruBuffer->pstruPacketlist = pstruPacket->pstruNextPacket;
584 pstruPacket->pstruNextPacket = NULL;
590 printf(
"\nInvalid Selection in Buffer\n");
600NetSim_PACKET* fn_NetSim_FIFO(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData,
int nType,
int nFlag)
602 NetSim_PACKET* p = pstruData;
603 while (p && p->pstruNextPacket)
604 p = p->pstruNextPacket;
608 if (pstruBuffer->pstruPacketlist)
610 pstruBuffer->last->pstruNextPacket = pstruData;
611 pstruBuffer->last = p;
615 pstruBuffer->pstruPacketlist = pstruData;
616 pstruBuffer->last = p;
621 NetSim_PACKET* pstruPacket;
622 pstruPacket = pstruBuffer->pstruPacketlist;
625 pstruBuffer->pstruPacketlist = pstruPacket->pstruNextPacket;
626 if (pstruBuffer->pstruPacketlist == NULL)
627 pstruBuffer->last = NULL;
628 pstruPacket->pstruNextPacket = NULL;
634 printf(
"\nInvalid selection in Buffer\n");
643NetSim_PACKET* fn_NetSim_RoundRobin(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData,
int nType,
int nFlag)
649 NetSim_PACKET* pstruTmpBufferPacketList;
650 NetSim_PACKET* pstruTempTraversePacketList;
652 if (pstruBuffer->pstruPacketlist == NULL)
654 pstruBuffer->pstruPacketlist = fnpAllocateMemory(5,
sizeof * pstruData);
656 pstruTmpBufferPacketList = pstruBuffer->pstruPacketlist;
657 if (pstruData->nPacketPriority)
659 pstruTempTraversePacketList = fnGetList(pstruTmpBufferPacketList, pstruData->nPacketPriority);
661 while (pstruTempTraversePacketList->pstruNextPacket != NULL)
662 pstruTempTraversePacketList = pstruTempTraversePacketList->pstruNextPacket;
663 pstruTempTraversePacketList->pstruNextPacket = pstruData;
667 pstruTempTraversePacketList = fnGetList(pstruTmpBufferPacketList, Priority_Low);
668 while (pstruTempTraversePacketList->pstruNextPacket != NULL)
669 pstruTempTraversePacketList = pstruTempTraversePacketList->pstruNextPacket;
670 pstruTempTraversePacketList->pstruNextPacket = pstruData;
676 NetSim_PACKET* pstruTemp;
677 NetSim_PACKET* pstruTempList;
679 PACKET_PRIORITY nPacketPriority;
680 if (pstruBuffer->pstruPacketlist)
682 nPacketPriority = pstruBuffer->pstruPacketlist->nPacketPriority;
689 pstruBuffer->pstruPacketlist->nPacketPriority -= Priority_High - Priority_Medium;
690 if (pstruBuffer->pstruPacketlist->nPacketPriority <= 0)
691 pstruBuffer->pstruPacketlist->nPacketPriority = Priority_High;
693 pstruTempList = fnGetList(pstruBuffer->pstruPacketlist, pstruBuffer->pstruPacketlist->nPacketPriority);
694 if (pstruTempList->pstruNextPacket != NULL)
696 pstruTemp = pstruTempList->pstruNextPacket;
699 pstruTempList->pstruNextPacket = pstruTemp->pstruNextPacket;
700 pstruTemp->pstruNextPacket = NULL;
703 pstruBuffer->pstruPacketlist->nPacketPriority = nPacketPriority;
714 printf(
"\nInvalid Selection in Buffer\n");
724NetSim_PACKET* fn_NetSim_WFQ(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData,
int nType,
int nFlag)
730 NetSim_PACKET* pstruTmpBufferPacketList;
731 NetSim_PACKET* pstruTempTraversePacketList;
733 if (pstruBuffer->pstruPacketlist == NULL)
735 pstruBuffer->pstruPacketlist = fnpAllocateMemory(5,
sizeof * pstruData);
737 pstruTmpBufferPacketList = pstruBuffer->pstruPacketlist;
738 if (pstruData->nPacketPriority)
740 pstruTempTraversePacketList = fnGetList(pstruTmpBufferPacketList, pstruData->nPacketPriority);
742 pstruTempTraversePacketList->nPacketId++;
744 while (pstruTempTraversePacketList->pstruNextPacket != NULL)
745 pstruTempTraversePacketList = pstruTempTraversePacketList->pstruNextPacket;
746 pstruTempTraversePacketList->pstruNextPacket = pstruData;
750 pstruTempTraversePacketList = fnGetList(pstruTmpBufferPacketList, Priority_Low);
752 pstruTempTraversePacketList->nPacketId++;
754 while (pstruTempTraversePacketList->pstruNextPacket != NULL)
755 pstruTempTraversePacketList = pstruTempTraversePacketList->pstruNextPacket;
756 pstruTempTraversePacketList->pstruNextPacket = pstruData;
763 UINT64 nCount[4], nPosition;
764 NetSim_PACKET* pstruTempList;
765 NetSim_PACKET* pstruTemp;
766 NetSim_PACKET* pstruHighPriorityList;
767 NetSim_PACKET* pstruMediumPriorityList;
768 NetSim_PACKET* pstruNormalPriorityList;
769 NetSim_PACKET* pstruLowPriorityList;
771 pstruLowPriorityList = fnGetList(pstruBuffer->pstruPacketlist, Priority_Low);
772 nCount[0] = pstruLowPriorityList->nPacketId * 1;
774 pstruNormalPriorityList = fnGetList(pstruBuffer->pstruPacketlist, Priority_Normal);
775 nCount[1] = pstruNormalPriorityList->nPacketId * 2;
777 pstruMediumPriorityList = fnGetList(pstruBuffer->pstruPacketlist, Priority_Medium);
778 nCount[2] = pstruMediumPriorityList->nPacketId * 3;
780 pstruHighPriorityList = fnGetList(pstruBuffer->pstruPacketlist, Priority_High);
781 nCount[3] = pstruHighPriorityList->nPacketId * 4;
783 nPosition = fn_NetSim_GetPosition_MaximumNumber(nCount);
785 pstruTempList = pstruBuffer->pstruPacketlist + nPosition;
787 if (pstruTempList && pstruTempList->pstruNextPacket)
789 pstruTempList->nPacketId--;
790 pstruTemp = pstruTempList->pstruNextPacket;
793 pstruTempList->pstruNextPacket = pstruTemp->pstruNextPacket;
794 pstruTemp->pstruNextPacket = NULL;
797 pstruTempList->nPacketId++;
804 printf(
"\nInvalid Selection in Buffer\n");
811static void edf_algorithm_drop_expired_packets(NetSim_BUFFER* pstruBuffer)
813 ptrSCHEDULING_EDF_VAR scheduling_var = pstruBuffer->schedulingParam;
815 NetSim_PACKET* pstruPacket_prev;
816 NetSim_PACKET* pstruPacket_itr;
817 NetSim_PACKET* pstruPacket_drop;
819 double curr_max_latency;
820 double curr_deadline;
822 pstruPacket_itr = pstruBuffer->pstruPacketlist;
823 pstruPacket_prev = pstruBuffer->pstruPacketlist;
825 while (pstruPacket_itr)
827 index = pstruPacket_itr->nQOS - 1;
830 curr_max_latency = *(scheduling_var->max_latency + index) * 1000;
831 curr_deadline = curr_max_latency - (pstruEventDetails->dEventTime -
832 pstruPacket_itr->dEventTime);
833 if (curr_deadline < 0)
836 pstruPacket_drop = pstruPacket_itr;
837 if (pstruBuffer->pstruPacketlist == pstruPacket_itr)
839 pstruPacket_itr = pstruPacket_itr->pstruNextPacket;
840 pstruPacket_prev = pstruPacket_itr;
841 pstruBuffer->pstruPacketlist = pstruPacket_itr;
842 if (pstruPacket_itr == NULL)
843 pstruBuffer->last = NULL;
847 pstruPacket_itr = pstruPacket_itr->pstruNextPacket;
848 pstruPacket_prev->pstruNextPacket = pstruPacket_itr;
849 if (pstruPacket_itr == NULL)
850 pstruBuffer->last = pstruPacket_prev;
852 fn_NetSim_DropPackets(pstruBuffer, pstruPacket_drop);
856 pstruPacket_prev = pstruPacket_itr;
857 pstruPacket_itr = pstruPacket_itr->pstruNextPacket;
862static NetSim_PACKET* edf_algorithm_get_earliest_deadline_packet(NetSim_BUFFER* pstruBuffer)
864 ptrSCHEDULING_EDF_VAR scheduling_var = pstruBuffer->schedulingParam;
866 NetSim_PACKET* pstruPacket_itr;
867 NetSim_PACKET* pstruPacket = NULL;
869 double curr_max_latency;
870 double curr_deadline;
871 double earliest_deadline = (double)0xFFFFFFFFFFFFFFFF;
873 pstruPacket_itr = pstruBuffer->pstruPacketlist;
874 while (pstruPacket_itr)
876 index = pstruPacket_itr->nQOS - 1;
878 return pstruPacket_itr;
880 curr_max_latency = *(scheduling_var->max_latency + index) * 1000;
881 curr_deadline = curr_max_latency - (pstruEventDetails->dEventTime -
882 pstruPacket_itr->dEventTime);
883 if (curr_deadline < earliest_deadline)
885 pstruPacket = pstruPacket_itr;
886 earliest_deadline = curr_deadline;
888 pstruPacket_itr = pstruPacket_itr->pstruNextPacket;
897NetSim_PACKET* fn_NetSim_EDF(NetSim_BUFFER* pstruBuffer, NetSim_PACKET* pstruData,
898 int nType,
int nFlag)
900 ptrSCHEDULING_EDF_VAR scheduling_var = pstruBuffer->schedulingParam;
901 NetSim_PACKET* p = pstruData;
902 while (p && p->pstruNextPacket)
903 p = p->pstruNextPacket;
908 if (pstruBuffer->pstruPacketlist)
910 pstruBuffer->last->pstruNextPacket = pstruData;
911 pstruBuffer->last = p;
915 pstruBuffer->pstruPacketlist = pstruData;
916 pstruBuffer->last = p;
921 NetSim_PACKET* pstruPacket;
922 edf_algorithm_drop_expired_packets(pstruBuffer);
923 pstruPacket = edf_algorithm_get_earliest_deadline_packet(pstruBuffer);
925 if (nFlag && pstruPacket != NULL)
927 NetSim_PACKET* pstruPacket_itr = pstruBuffer->pstruPacketlist;
929 if (pstruPacket_itr == pstruPacket)
931 pstruBuffer->pstruPacketlist = pstruPacket->pstruNextPacket;
932 if (pstruBuffer->pstruPacketlist == NULL)
933 pstruBuffer->last = NULL;
937 while (pstruPacket_itr->pstruNextPacket != pstruPacket)
938 pstruPacket_itr = pstruPacket_itr->pstruNextPacket;
939 pstruPacket_itr->pstruNextPacket = pstruPacket->pstruNextPacket;
940 if (pstruPacket_itr->pstruNextPacket == NULL)
941 pstruBuffer->last = pstruPacket_itr;
943 pstruPacket->pstruNextPacket = NULL;
949 printf(
"\nInvalid selection in Buffer\n");