26 #include "ns3/uinteger.h" 27 #include "ns3/pointer.h" 28 #include "ns3/string.h" 29 #include "ns3/double.h" 31 #include "ns3/simulator.h" 32 #include "ns3/node-container.h" 33 #include "ns3/traffic-control-layer.h" 34 #include "ns3/traffic-control-helper.h" 35 #include "ns3/simple-net-device-helper.h" 36 #include "ns3/data-rate.h" 37 #include "ns3/net-device-queue-interface.h" 38 #include "ns3/queue.h" 39 #include "ns3/config.h" 58 virtual void AddHeader (
void);
59 virtual bool Mark(
void);
113 virtual void DoRun (
void);
147 :
TestCase (
"Test the operation of the flow control mechanism"),
148 m_type (tt), m_deviceQueueLength(deviceQueueLength), m_totalTxPackets(totalTxPackets)
160 for (uint16_t i = 0; i < nPackets; i++)
162 tc->
Send (
n->GetDevice (0), Create<QueueDiscTestItem> (Create<Packet> (1000)));
179 NS_ASSERT_MSG (ndqi,
"A device queue interface has not been aggregated to the device");
198 n.Get (0)->AggregateObject (CreateObject<TrafficControlLayer> ());
199 n.Get (1)->AggregateObject (CreateObject<TrafficControlLayer> ());
206 simple.
SetQueue (
"ns3::DropTailQueue",
"MaxSize",
212 txDev = simple.
Install (
n.Get (0), DynamicCast<SimpleChannel> (rxDevC.
Get (0)->GetChannel ())).
Get (0);
241 uint32_t checkTimeMs = 0;
242 uint32_t deviceQueuePackets = 0;
243 uint32_t qdiscPackets = 0;
245 uint32_t txPackets = 0;
248 checkTimeMs = 8 * (txPackets - 1) + 1;
253 Simulator::Schedule (
256 "The device queue must be stopped after " + std::to_string (checkTimeMs) +
"ms");
263 "The device queue must not be stopped after " +
264 std::to_string (checkTimeMs) +
"ms");
267 Simulator::Schedule (
269 this, txDev, deviceQueuePackets,
270 "There must be " + std::to_string (
m_deviceQueueLength) +
" packets in the device after " +
271 std::to_string (checkTimeMs) +
"ms");
273 Simulator::Schedule (
275 this, txDev, qdiscPackets,
276 "There must be " + std::to_string (qdiscPackets) +
277 " packets in the queue disc after " + std::to_string (checkTimeMs) +
"ms");
292 this, txDev, 3,
"There must be 3 packets in the device queue after 1ms");
294 this, txDev,
true,
"The device queue must be stopped after 1ms");
296 this, txDev, 6,
"There must be 6 packets in the queue disc after 1ms");
300 this, txDev, 3,
"There must be 3 packets in the device queue after 9ms");
302 this, txDev,
true,
"The device queue must be stopped after 9ms");
304 this, txDev, 5,
"There must be 5 packets in the queue disc after 9ms");
308 this, txDev, 3,
"There must be 3 packets in the device queue after 17ms");
310 this, txDev,
true,
"The device queue must be stopped after 17ms");
312 this, txDev, 4,
"There must be 4 packets in the queue disc after 17ms");
316 this, txDev, 3,
"There must be 3 packets in the device queue after 25ms");
318 this, txDev,
true,
"The device queue must be stopped after 25ms");
320 this, txDev, 3,
"There must be 3 packets in the queue disc after 25ms");
324 this, txDev, 3,
"There must be 3 packets in the device queue after 33ms");
326 this, txDev,
true,
"The device queue must be stopped after 33ms");
328 this, txDev, 2,
"There must be 2 packets in the queue disc after 33ms");
332 this, txDev, 3,
"There must be 3 packets in the device queue after 41ms");
334 this, txDev,
true,
"The device queue must be stopped after 41ms");
336 this, txDev, 1,
"There must be 1 packet in the queue disc after 41ms");
340 this, txDev, 3,
"There must be 3 packets in the device queue after 49ms");
342 this, txDev,
true,
"The device queue must be stopped after 49ms");
344 this, txDev, 0,
"The queue disc must be empty after 49ms");
348 this, txDev, 2,
"There must be 2 packets in the device queue after 57ms");
350 this, txDev,
false,
"The device queue must not be stopped after 57ms");
352 this, txDev, 0,
"The queue disc must be empty after 57ms");
356 this, txDev, 0,
"The device queue must be empty after 81ms");
358 this, txDev,
false,
"The device queue must not be stopped after 81ms");
360 this, txDev, 0,
"The queue disc must be empty after 81ms");
364 Simulator::Destroy ();
QueueSizeUnit m_type
the test type
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Simulation virtual time values and global simulation resolution.
QueueDiscContainer Install(NetDeviceContainer c)
Hold variables of type string.
Introspection did not find any typical Config paths.
QueueSizeUnit
Enumeration of the operating modes of queues.
virtual Ptr< Node > GetNode(void) const =0
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
QueueDiscItem is the abstract base class for items that are stored in a queue disc.
bool GetAttributeFailSafe(std::string name, AttributeValue &value) const
Get the value of an attribute without raising erros.
Class for representing data rates.
void CheckDeviceQueueStopped(Ptr< NetDevice > dev, bool value, const std::string msg)
Check if the device queue is in the expected status (stopped or not)
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Use number of packets for queue size.
holds a vector of ns3::NetDevice pointers
void SetDeviceAttribute(std::string n1, const AttributeValue &v1)
Build a set of QueueDisc objects.
Network device transmission queue interface.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
uint32_t m_deviceQueueLength
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Hold objects of type Ptr<T>.
virtual void AddHeader(void)
Add the header to the packet.
void CheckPacketsInQueueDisc(Ptr< NetDevice > dev, uint16_t nPackets, const std::string msg)
Check if the queue disc stores the expected number of packets.
void CheckPacketsInDeviceQueue(Ptr< NetDevice > dev, uint16_t nPackets, const std::string msg)
Check if the device queue stores the expected number of packets.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
void SetQueue(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue())
Each net device must have a queue to pass packets through.
virtual void Send(Ptr< NetDevice > device, Ptr< QueueDiscItem > item)
Called from upper layer to queue a packet for the transmission.
virtual bool Mark(void)
Marks the packet as a substitute for dropping it, such as for Explicit Congestion Notification...
uint32_t m_totalTxPackets
virtual ~TcFlowControlTestCase()
AttributeValue implementation for DataRate.
virtual ~QueueDiscTestItem()
Time Seconds(double value)
Construct a Time in the indicated unit.
TcFlowControlTestSuite g_tcFlowControlTestSuite
the test suite
virtual void DoRun(void)
Implementation to actually run this TestCase.
Traffic Control Flow Control Test Case.
Ptr< NetDeviceQueue > GetTxQueue(std::size_t i) const
Get the i-th transmission queue of the device.
build a set of SimpleNetDevice objects
Traffic Control Flow Control Test Suite.
This test suite implements a Unit Test.
virtual bool SetMtu(const uint16_t mtu)=0
void SendPackets(Ptr< Node > n, uint16_t nPackets)
Instruct a node to send a specified number of packets.
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
Use number of bytes for queue size.
virtual Ptr< QueueDisc > GetRootQueueDiscOnDevice(Ptr< NetDevice > device) const
This method can be used to get the root queue disc installed on a device.
TcFlowControlTestCase(QueueSizeUnit tt, uint32_t deviceQueueLength, uint32_t totalTxPackets)
Constructor.