22#include "ns3/codel-queue-disc.h"
23#include "ns3/double.h"
25#include "ns3/packet.h"
26#include "ns3/simulator.h"
27#include "ns3/string.h"
29#include "ns3/uinteger.h"
34#define REC_INV_SQRT_BITS_ns3 (8 * sizeof(uint16_t))
37#define REC_INV_SQRT_SHIFT_ns3 (32 - REC_INV_SQRT_BITS_ns3)
43 uint32_t invsqrt2 = ((uint64_t)invsqrt * invsqrt) >> 32;
44 uint64_t val = (3LL << 32) - ((uint64_t)count * invsqrt2);
47 val = (val * invsqrt) >> (32 - 2 + 1);
54 return (
uint32_t)(((uint64_t)val * ep_ro) >> 32);
92 m_ecnCapablePacket(ecnCapable)
130 void DoRun()
override;
137 :
TestCase(
"Basic enqueue and dequeue operations, and attribute setting")
154 "Verify that we can actually set the attribute MinBytes");
157 "Verify that we can actually set the attribute Interval");
160 "Verify that we can actually set the attribute Target");
173 "Verify that we can actually set the attribute MaxSize");
191 "There should be no packets in queue");
192 queue->Enqueue(Create<CodelQueueDiscTestItem>(p1, dest,
false));
195 "There should be one packet in queue");
196 queue->Enqueue(Create<CodelQueueDiscTestItem>(p2, dest,
false));
199 "There should be two packets in queue");
200 queue->Enqueue(Create<CodelQueueDiscTestItem>(p3, dest,
false));
203 "There should be three packets in queue");
204 queue->Enqueue(Create<CodelQueueDiscTestItem>(p4, dest,
false));
207 "There should be four packets in queue");
208 queue->Enqueue(Create<CodelQueueDiscTestItem>(p5, dest,
false));
211 "There should be five packets in queue");
212 queue->Enqueue(Create<CodelQueueDiscTestItem>(p6, dest,
false));
215 "There should be six packets in queue");
219 "There should be no packets being dropped due to full queue");
223 item = queue->Dequeue();
227 "There should be five packets in queue");
230 item = queue->Dequeue();
234 "There should be four packets in queue");
237 "Was this the second packet ?");
239 item = queue->Dequeue();
243 "There should be three packets in queue");
246 item = queue->Dequeue();
250 "There should be two packets in queue");
253 "Was this the fourth packet ?");
255 item = queue->Dequeue();
259 "There should be one packet in queue");
262 item = queue->Dequeue();
266 "There should be zero packet in queue");
269 item = queue->Dequeue();
273 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP),
275 "There should be no packet drops according to CoDel algorithm");
293 void DoRun()
override;
307 :
TestCase(
"Basic overflow behavior")
340 "Verify that we can actually set the attribute MaxSize");
343 "Verify that we can actually set the attribute MinBytes");
348 queue->Enqueue(Create<CodelQueueDiscTestItem>(p1, dest,
false));
349 queue->Enqueue(Create<CodelQueueDiscTestItem>(p2, dest,
false));
350 queue->Enqueue(Create<CodelQueueDiscTestItem>(p3, dest,
false));
354 "There should be 500 packets in queue");
357 "There should be three packets being dropped due to full queue");
366 queue->Enqueue(Create<CodelQueueDiscTestItem>(Create<Packet>(size), dest,
false));
380 void DoRun()
override;
384 :
TestCase(
"NewtonStep arithmetic unit test")
396 for (uint16_t recInvSqrt = 0xff; recInvSqrt > 0; recInvSqrt /= 2)
398 for (
uint32_t count = 1; count < 0xff; count *= 2)
400 result = queue->NewtonStep(recInvSqrt, count);
404 "ns-3 NewtonStep() fails to match Linux equivalent");
419 void DoRun()
override;
431 :
TestCase(
"ControlLaw arithmetic unit test")
456 for (uint16_t recInvSqrt = 0xff; recInvSqrt > 0; recInvSqrt /= 2)
458 codelTimeVal = queue->Time2CoDel(timeVal);
459 uint32_t ns3Result = queue->ControlLaw(codelTimeVal, interval, recInvSqrt);
463 "Linux result for ControlLaw should equal ns-3 result");
483 void DoRun()
override;
540 "Verify that we can actually set the attribute MaxSize");
547 "There should be 20 packets in queue.");
551 Time waitUntilFirstDequeue = 2 * queue->GetTarget();
552 Simulator::Schedule(waitUntilFirstDequeue,
559 Time waitUntilSecondDequeue = waitUntilFirstDequeue + 2 * queue->GetInterval();
560 Simulator::Schedule(waitUntilSecondDequeue,
568 Simulator::Schedule(waitUntilSecondDequeue,
576 Simulator::Schedule(waitUntilSecondDequeue * 2,
583 Simulator::Destroy();
592 queue->Enqueue(Create<CodelQueueDiscTestItem>(Create<Packet>(size), dest,
false));
600 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
601 uint32_t initialQSize = queue->GetCurrentSize().GetValue();
602 uint32_t initialDropNext = queue->GetDropNext();
606 if (initialDropCount > 0 && currentTime.
GetMicroSeconds() >= initialDropNext)
608 queue->TraceConnectWithoutContext(
613 if (initialQSize != 0)
616 if (initialDropCount == 0 && currentTime > queue->GetTarget())
618 if (currentTime < queue->GetInterval())
621 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
624 "We are not in dropping state."
625 "Sojourn time has just gone above target from below."
626 "Hence, there should be no packet drops");
628 initialQSize - modeSize,
629 "There should be 1 packet dequeued.");
631 else if (currentTime >= queue->GetInterval())
634 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
636 initialQSize - 2 * modeSize,
637 "Sojourn time has been above target for at least interval."
638 "We enter the dropping state, perform initial packet drop, "
639 "and dequeue the next."
640 "So there should be 2 more packets dequeued.");
644 else if (initialDropCount > 0)
649 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
651 initialQSize - modeSize,
652 "We are in dropping state."
653 "Sojourn is still above target."
654 "However, it's not time for next drop."
655 "So there should be only 1 more packet dequeued");
660 "There should still be only 1 packet drop from the last dequeue");
665 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
668 "We are in dropping state."
669 "It's time for next drop."
670 "The number of packets dequeued equals to the number of "
671 "times m_dropNext is updated plus initial dequeue");
674 "The number of drops equals to the number of times "
675 "m_dropNext is updated plus 1 from last dequeue");
696 void DoRun()
override;
766 "Verify that we can actually set the attribute MaxSize");
769 "Verify that we can actually set the attribute UseEcn");
777 "There should be 20 packets in queue.");
781 Time waitUntilFirstDequeue = 2 * queue->GetTarget();
782 Simulator::Schedule(waitUntilFirstDequeue,
790 Time waitUntilSecondDequeue = waitUntilFirstDequeue + 2 * queue->GetInterval();
791 Simulator::Schedule(waitUntilSecondDequeue,
799 Simulator::Destroy();
802 queue = CreateObject<CoDelQueueDisc>();
806 "Verify that we can actually set the attribute MaxSize");
809 "Verify that we can actually set the attribute UseEcn");
817 "There should be 20 packets in queue.");
821 Simulator::Schedule(waitUntilFirstDequeue,
829 Simulator::Schedule(waitUntilSecondDequeue,
838 Simulator::Schedule(waitUntilSecondDequeue,
847 Simulator::Schedule(waitUntilSecondDequeue * 2,
855 Simulator::Destroy();
858 queue = CreateObject<CoDelQueueDisc>();
862 "Verify that we can actually set the attribute MaxSize");
865 "Verify that we can actually set the attribute UseEcn");
868 "Verify that we can actually set the attribute CeThreshold");
878 "There should be 20 packets in queue.");
882 Simulator::Schedule(waitUntilFirstDequeue,
890 Simulator::Schedule(waitUntilSecondDequeue,
899 Simulator::Schedule(waitUntilSecondDequeue,
908 Simulator::Schedule(waitUntilSecondDequeue * 2,
916 Simulator::Destroy();
920 queue = CreateObject<CoDelQueueDisc>();
924 "Verify that we can actually set the attribute MaxSize");
927 "Verify that we can actually set the attribute UseEcn");
930 "Verify that we can actually set the attribute CeThreshold");
938 "There should be 20 packets in queue.");
959 Simulator::Schedule(waitUntilFirstDequeue,
968 Simulator::Schedule(waitUntilSecondDequeue,
976 Simulator::Destroy();
988 queue->Enqueue(Create<CodelQueueDiscTestItem>(Create<Packet>(size), dest, ecnCapable));
996 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
998 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
999 uint32_t initialQSize = queue->GetCurrentSize().GetValue();
1000 uint32_t initialDropNext = queue->GetDropNext();
1003 uint32_t currentTargetMarkCount = 0;
1004 uint32_t currentCeThreshMarkCount = 0;
1006 if (initialTargetMarkCount > 0 && currentTime.
GetMicroSeconds() >= initialDropNext &&
1009 queue->TraceConnectWithoutContext(
1014 if (initialQSize != 0)
1020 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1021 if (currentDropCount == 1)
1026 else if (testCase == 2)
1028 if (initialTargetMarkCount == 0 && currentTime > queue->GetTarget())
1030 if (currentTime < queue->GetInterval())
1033 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1034 currentTargetMarkCount =
1035 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1036 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1037 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1039 initialQSize - modeSize,
1040 "There should be 1 packet dequeued.");
1043 "There should not be any packet drops");
1045 currentTargetMarkCount,
1047 "We are not in dropping state."
1048 "Sojourn time has just gone above target from below."
1049 "Hence, there should be no target exceeded marked packets");
1051 currentCeThreshMarkCount,
1053 "Marking due to CE threshold is disabled"
1054 "Hence, there should not be any CE threshold exceeded marked packet");
1056 else if (currentTime >= queue->GetInterval())
1059 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1060 currentTargetMarkCount =
1061 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1063 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1064 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1066 queue->GetCurrentSize().GetValue(),
1067 initialQSize - modeSize,
1068 "Sojourn time has been above target for at least interval."
1069 "We enter the dropping state and perform initial packet marking"
1070 "So there should be only 1 more packet dequeued.");
1073 "There should not be any packet drops");
1076 "There should be 1 target exceeded marked packet");
1078 currentCeThreshMarkCount,
1080 "There should not be any CE threshold exceeded marked packet");
1083 else if (initialTargetMarkCount > 0)
1088 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1089 currentTargetMarkCount =
1090 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1091 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1092 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1094 initialQSize - modeSize,
1095 "We are in dropping state."
1096 "Sojourn is still above target."
1097 "However, it's not time for next target exceeded mark."
1098 "So there should be only 1 more packet dequeued");
1101 "There should not be any packet drops");
1104 "There should still be only 1 target exceeded marked "
1105 "packet from the last dequeue");
1107 currentCeThreshMarkCount,
1109 "There should not be any CE threshold exceeded marked packet");
1114 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1115 currentTargetMarkCount =
1116 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1117 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1118 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1120 initialQSize - modeSize,
1121 "We are in dropping state."
1122 "It's time for packet to be marked"
1123 "So there should be only 1 more packet dequeued");
1126 "There should not be any packet drops");
1129 "There should 2 target exceeded marked packet");
1133 "Number of packets in the queue before drop should be equal"
1134 "to number of packets in the queue before first mark as the behavior "
1135 "untill packet N should be the same.");
1137 currentCeThreshMarkCount,
1139 "There should not be any CE threshold exceeded marked packet");
1143 else if (testCase == 3)
1145 if (initialTargetMarkCount == 0 && currentTime > queue->GetTarget())
1147 if (currentTime < queue->GetInterval())
1150 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1151 currentTargetMarkCount =
1152 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1153 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1154 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1156 initialQSize - modeSize,
1157 "There should be 1 packet dequeued.");
1160 "There should not be any packet drops");
1162 currentTargetMarkCount,
1164 "We are not in dropping state."
1165 "Sojourn time has just gone above target from below."
1166 "Hence, there should be no target exceeded marked packets");
1168 currentCeThreshMarkCount,
1170 "Sojourn time has gone above CE threshold."
1171 "Hence, there should be 1 CE threshold exceeded marked packet");
1173 else if (currentTime >= queue->GetInterval())
1176 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1177 currentTargetMarkCount =
1178 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1179 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1180 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1182 queue->GetCurrentSize().GetValue(),
1183 initialQSize - modeSize,
1184 "Sojourn time has been above target for at least interval."
1185 "We enter the dropping state and perform initial packet marking"
1186 "So there should be only 1 more packet dequeued.");
1189 "There should not be any packet drops");
1192 "There should be 1 target exceeded marked packet");
1195 "There should be 1 CE threshold exceeded marked packets");
1198 else if (initialTargetMarkCount > 0)
1203 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1204 currentTargetMarkCount =
1205 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1206 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1207 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1209 initialQSize - modeSize,
1210 "We are in dropping state."
1211 "Sojourn is still above target."
1212 "However, it's not time for next target exceeded mark."
1213 "So there should be only 1 more packet dequeued");
1216 "There should not be any packet drops");
1219 "There should still be only 1 target exceeded marked "
1220 "packet from the last dequeue");
1223 "There should be 2 CE threshold exceeded marked packets");
1228 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1229 currentTargetMarkCount =
1230 queue->GetStats().GetNMarkedPackets(CoDelQueueDisc::TARGET_EXCEEDED_MARK);
1231 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1232 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1234 queue->GetCurrentSize().GetValue(),
1236 "We are in dropping state."
1237 "It's time for packet to be dropped as packets are not ecnCapable"
1238 "The number of packets dequeued equals to the number of times m_dropNext "
1239 "is updated plus initial dequeue");
1243 "The number of drops equals to the number of times m_dropNext is updated");
1245 currentTargetMarkCount,
1247 "There should still be only 1 target exceeded marked packet");
1250 "There should still be 2 CE threshold exceeded marked "
1251 "packet as packets are not ecnCapable");
1255 else if (testCase == 4)
1257 if (currentTime < queue->GetTarget())
1259 if (initialCeThreshMarkCount == 0 && currentTime <
MilliSeconds(2))
1262 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1263 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1264 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1266 initialQSize - modeSize,
1267 "There should be 1 packet dequeued.");
1270 "There should not be any packet drops");
1272 currentCeThreshMarkCount,
1274 "Sojourn time has not gone above CE threshold."
1275 "Hence, there should not be any CE threshold exceeded marked packet");
1280 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1281 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1282 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1284 initialQSize - modeSize,
1285 "There should be only 1 more packet dequeued.");
1288 "There should not be any packet drops");
1291 "Sojourn time has gone above CE threshold."
1292 "There should be 1 CE threshold exceeded marked packet");
1295 else if (initialCeThreshMarkCount > 0 && currentTime < queue->GetInterval())
1297 if (initialCeThreshMarkCount < 2)
1300 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1301 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1302 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1304 initialQSize - modeSize,
1305 "There should be only 1 more packet dequeued.");
1308 "There should not be any packet drops");
1311 "There should be 2 CE threshold exceeded marked packets");
1316 queue->GetStats().GetNDroppedPackets(CoDelQueueDisc::TARGET_EXCEEDED_DROP);
1317 currentCeThreshMarkCount = queue->GetStats().GetNMarkedPackets(
1318 CoDelQueueDisc::CE_THRESHOLD_EXCEEDED_MARK);
1320 initialQSize - modeSize,
1321 "There should be only 1 more packet dequeued.");
1324 "There should not be any packet drops");
1327 "There should be 3 CE threshold exceeded marked packet");
Test 5: enqueue/dequeue with drops according to CoDel algorithm.
uint32_t m_dropNextCount
count the number of times m_dropNext is recalculated
CoDelQueueDiscBasicDrop(QueueSizeUnit mode)
Constructor.
void Dequeue(Ptr< CoDelQueueDisc > queue, uint32_t modeSize)
Dequeue function.
void Enqueue(Ptr< CoDelQueueDisc > queue, uint32_t size, uint32_t nPkt)
Enqueue function.
void DoRun() override
Implementation to actually run this TestCase.
void DropNextTracer(uint32_t oldVal, uint32_t newVal)
Drop next tracer function.
Test 1: simple enqueue/dequeue with no drops.
CoDelQueueDiscBasicEnqueueDequeue(QueueSizeUnit mode)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
Test 6: enqueue/dequeue with marks according to CoDel algorithm.
uint32_t nPacketsBeforeFirstMark
Number of packets in the queue before first mark.
void Enqueue(Ptr< CoDelQueueDisc > queue, uint32_t size, uint32_t nPkt, bool ecnCapable)
Enqueue function.
uint32_t m_dropNextCount
count the number of times m_dropNext is recalculated
void DropNextTracer(uint32_t oldVal, uint32_t newVal)
Drop next tracer function.
uint32_t nPacketsBeforeFirstDrop
Number of packets in the queue before first drop.
void Dequeue(Ptr< CoDelQueueDisc > queue, uint32_t modeSize, uint32_t testCase)
Dequeue function.
void DoRun() override
Implementation to actually run this TestCase.
CoDelQueueDiscBasicMark(QueueSizeUnit mode)
Constructor.
Test 2: enqueue with drops due to queue overflow.
CoDelQueueDiscBasicOverflow(QueueSizeUnit mode)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
void Enqueue(Ptr< CoDelQueueDisc > queue, uint32_t size, uint32_t nPkt)
Enqueue function.
Test 4: ControlLaw unit test - test against explicit port of Linux implementation.
void DoRun() override
Implementation to actually run this TestCase.
CoDelQueueDiscControlLawTest()
uint32_t _codel_control_law(uint32_t t, uint32_t interval, uint32_t recInvSqrt)
Codel control law function.
Test 3: NewtonStep unit test - test against explicit port of Linux implementation.
void DoRun() override
Implementation to actually run this TestCase.
CoDelQueueDiscNewtonStepTest()
CoDel Queue Disc Test Suite.
CoDelQueueDiscTestSuite()
Codel Queue Disc Test Item.
void AddHeader() override
Add the header to the packet.
~CodelQueueDiscTestItem() override
bool Mark() override
Marks the packet as a substitute for dropping it, such as for Explicit Congestion Notification.
bool m_ecnCapablePacket
ECN capable packet?
CodelQueueDiscTestItem & operator=(const CodelQueueDiscTestItem &)=delete
CodelQueueDiscTestItem(const CodelQueueDiscTestItem &)=delete
CodelQueueDiscTestItem()=delete
a polymophic address class
AttributeValue implementation for Boolean.
uint64_t GetUid() const
Returns the packet's Uid.
QueueDiscItem is the abstract base class for items that are stored in a queue disc.
Class for representing queue sizes.
AttributeValue implementation for QueueSize.
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
@ UNIT
This test suite implements a Unit Test.
Simulation virtual time values and global simulation resolution.
int64_t GetMicroSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
Hold an unsigned integer type.
#define REC_INV_SQRT_SHIFT_ns3
static uint16_t _codel_Newton_step(uint16_t rec_inv_sqrt, uint32_t count)
static uint32_t _reciprocal_scale(uint32_t val, uint32_t ep_ro)
QueueSizeUnit
Enumeration of the operating modes of queues.
@ BYTES
Use number of bytes for queue size.
@ PACKETS
Use number of packets for queue size.
Time Now()
create an ns3::Time instance which contains the current simulation time.
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not.
CoDelQueueDiscTestSuite g_coDelQueueTestSuite
the test suite
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
uint32_t pktSize
packet size used for the simulation (in bytes)