21 #include "ns3/abort.h"
22 #include "ns3/uinteger.h"
23 #include "ns3/pointer.h"
24 #include "ns3/object-vector.h"
25 #include "ns3/packet.h"
26 #include "ns3/socket.h"
27 #include "ns3/unused.h"
28 #include "ns3/simulator.h"
30 #include <ns3/drop-tail-queue.h>
31 #include "ns3/net-device-queue-interface.h"
47 .SetGroupName (
"TrafficControl")
49 .AddAttribute (
"QueueDisc",
"The queue disc attached to the class",
52 MakePointerChecker<QueueDisc> ())
91 : nTotalReceivedPackets (0),
92 nTotalReceivedBytes (0),
93 nTotalSentPackets (0),
95 nTotalEnqueuedPackets (0),
96 nTotalEnqueuedBytes (0),
97 nTotalDequeuedPackets (0),
98 nTotalDequeuedBytes (0),
99 nTotalDroppedPackets (0),
100 nTotalDroppedPacketsBeforeEnqueue (0),
101 nTotalDroppedPacketsAfterDequeue (0),
102 nTotalDroppedBytes (0),
103 nTotalDroppedBytesBeforeEnqueue (0),
104 nTotalDroppedBytesAfterDequeue (0),
105 nTotalRequeuedPackets (0),
106 nTotalRequeuedBytes (0),
107 nTotalMarkedPackets (0),
108 nTotalMarkedBytes (0)
116 auto it = nDroppedPacketsBeforeEnqueue.find (reason);
118 if (it != nDroppedPacketsBeforeEnqueue.end ())
123 it = nDroppedPacketsAfterDequeue.find (reason);
125 if (it != nDroppedPacketsAfterDequeue.end ())
137 auto it = nDroppedBytesBeforeEnqueue.find (reason);
139 if (it != nDroppedBytesBeforeEnqueue.end ())
144 it = nDroppedBytesAfterDequeue.find (reason);
146 if (it != nDroppedBytesAfterDequeue.end ())
157 auto it = nMarkedPackets.find (reason);
159 if (it != nMarkedPackets.end ())
170 auto it = nMarkedBytes.find (reason);
172 if (it != nMarkedBytes.end ())
183 std::map<std::string, uint32_t>::const_iterator itp;
184 std::map<std::string, uint64_t>::const_iterator itb;
186 os << std::endl <<
"Packets/Bytes received: "
187 << nTotalReceivedPackets <<
" / "
188 << nTotalReceivedBytes
189 << std::endl <<
"Packets/Bytes enqueued: "
190 << nTotalEnqueuedPackets <<
" / "
191 << nTotalEnqueuedBytes
192 << std::endl <<
"Packets/Bytes dequeued: "
193 << nTotalDequeuedPackets <<
" / "
194 << nTotalDequeuedBytes
195 << std::endl <<
"Packets/Bytes requeued: "
196 << nTotalRequeuedPackets <<
" / "
197 << nTotalRequeuedBytes
198 << std::endl <<
"Packets/Bytes dropped: "
199 << nTotalDroppedPackets <<
" / "
200 << nTotalDroppedBytes
201 << std::endl <<
"Packets/Bytes dropped before enqueue: "
202 << nTotalDroppedPacketsBeforeEnqueue <<
" / "
203 << nTotalDroppedBytesBeforeEnqueue;
205 itp = nDroppedPacketsBeforeEnqueue.begin ();
206 itb = nDroppedBytesBeforeEnqueue.begin ();
208 while (itp != nDroppedPacketsBeforeEnqueue.end () &&
209 itb != nDroppedBytesBeforeEnqueue.end ())
211 NS_ASSERT (itp->first.compare (itb->first) == 0);
212 os << std::endl <<
" " << itp->first <<
": "
213 << itp->second <<
" / " << itb->second;
218 os << std::endl <<
"Packets/Bytes dropped after dequeue: "
219 << nTotalDroppedPacketsAfterDequeue <<
" / "
220 << nTotalDroppedBytesAfterDequeue;
222 itp = nDroppedPacketsAfterDequeue.begin ();
223 itb = nDroppedBytesAfterDequeue.begin ();
225 while (itp != nDroppedPacketsAfterDequeue.end () &&
226 itb != nDroppedBytesAfterDequeue.end ())
228 NS_ASSERT (itp->first.compare (itb->first) == 0);
229 os << std::endl <<
" " << itp->first <<
": "
230 << itp->second <<
" / " << itb->second;
235 os << std::endl <<
"Packets/Bytes sent: "
236 << nTotalSentPackets <<
" / "
238 << std::endl <<
"Packets/Bytes marked: "
239 << nTotalMarkedPackets <<
" / "
240 << nTotalMarkedBytes;
242 itp = nMarkedPackets.begin ();
243 itb = nMarkedBytes.begin ();
245 while (itp != nMarkedPackets.end () &&
246 itb != nMarkedBytes.end ())
248 NS_ASSERT (itp->first.compare (itb->first) == 0);
249 os << std::endl <<
" " << itp->first <<
": "
250 << itp->second <<
" / " << itb->second;
270 .SetGroupName (
"TrafficControl")
271 .AddAttribute (
"Quota",
"The maximum number of packets dequeued in a qdisc run",
275 MakeUintegerChecker<uint32_t> ())
276 .AddAttribute (
"InternalQueueList",
"The list of internal queues.",
279 MakeObjectVectorChecker<InternalQueue> ())
280 .AddAttribute (
"PacketFilterList",
"The list of packet filters.",
283 MakeObjectVectorChecker<PacketFilter> ())
284 .AddAttribute (
"QueueDiscClassList",
"The list of queue disc classes.",
287 MakeObjectVectorChecker<QueueDiscClass> ())
288 .AddTraceSource (
"Enqueue",
"Enqueue a packet in the queue disc",
290 "ns3::QueueDiscItem::TracedCallback")
291 .AddTraceSource (
"Dequeue",
"Dequeue a packet from the queue disc",
293 "ns3::QueueDiscItem::TracedCallback")
294 .AddTraceSource (
"Requeue",
"Requeue a packet in the queue disc",
296 "ns3::QueueDiscItem::TracedCallback")
297 .AddTraceSource (
"Drop",
"Drop a packet stored in the queue disc",
299 "ns3::QueueDiscItem::TracedCallback")
300 .AddTraceSource (
"DropBeforeEnqueue",
"Drop a packet before enqueue",
302 "ns3::QueueDiscItem::TracedCallback")
303 .AddTraceSource (
"DropAfterDequeue",
"Drop a packet after dequeue",
305 "ns3::QueueDiscItem::TracedCallback")
306 .AddTraceSource (
"Mark",
"Mark a packet stored in the queue disc",
308 "ns3::QueueDiscItem::TracedCallback")
309 .AddTraceSource (
"PacketsInQueue",
310 "Number of packets currently stored in the queue disc",
312 "ns3::TracedValueCallback::Uint32")
313 .AddTraceSource (
"BytesInQueue",
314 "Number of bytes currently stored in the queue disc",
316 "ns3::TracedValueCallback::Uint32")
317 .AddTraceSource (
"SojournTime",
318 "Sojourn time of the last packet dequeued from the queue disc",
320 "ns3::Time::TracedValueCallback")
396 NS_ASSERT_MSG (ok,
"The queue disc configuration is not correct");
404 (*cl)->GetQueueDisc ()->Initialize ();
478 queue->TraceConnectWithoutContext (
"Enqueue",
480 queue->TraceConnectWithoutContext (
"Dequeue",
482 queue->TraceConnectWithoutContext (
"DropBeforeEnqueue",
485 queue->TraceConnectWithoutContext (
"DropAfterDequeue",
528 NS_ABORT_MSG_IF (qdClass->GetQueueDisc () == 0,
"Cannot add a class with no attached queue disc");
532 "A queue disc with WAKE_CHILD as wake mode can only be a root queue disc");
536 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"Enqueue",
538 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"Dequeue",
540 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"DropBeforeEnqueue",
543 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"DropAfterDequeue",
571 ret = (*f)->Classify (item);
632 itb->second += item->GetSize ();
639 NS_LOG_DEBUG (
"Total packets/bytes dropped before enqueue: "
671 itb->second += item->GetSize ();
678 NS_LOG_DEBUG (
"Total packets/bytes dropped after dequeue: "
691 bool retval = item->Mark ();
715 itb->second += item->GetSize ();
902 if (
m_devQueueIface->GetTxQueue (item->GetTxQueueIndex ())->IsStopped ())
912 item->GetPacket ()->RemovePacketTag (priorityTag);
914 m_device->Send (item->GetPacket (), item->GetAddress (), item->GetProtocol ());
uint32_t nTotalDequeuedPackets
Total dequeued packets.
Structure that keeps the queue disc statistics.
TracedValue< Time > m_sojourn
Sojourn time of the latest dequeued packet.
virtual void DoInitialize(void)
Initialize() implementation.
uint32_t nTotalMarkedPackets
Total marked packets.
uint32_t GetNQueueDiscClasses(void) const
Get the number of queue disc classes.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Ptr< QueueDiscItem > m_requeued
The last packet that failed to be transmitted.
std::map< std::string, uint32_t > nDroppedPacketsAfterDequeue
Packets dropped after dequeue, for each reason.
uint32_t nTotalDroppedPackets
Total dropped packets.
void AddQueueDiscClass(Ptr< QueueDiscClass > qdClass)
Add a queue disc class to the tail of the list of classes.
void DropBeforeEnqueue(Ptr< const QueueDiscItem > item, const char *reason)
Perform the actions required when the queue disc is notified of a packet dropped before enqueue...
static const int PF_NO_MATCH
Standard value used by packet filters to indicate that no match was possible.
bool Enqueue(Ptr< QueueDiscItem > item)
Pass a packet to store to the queue discipline.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
virtual ~QueueDiscClass()
uint32_t GetNBytes(void) const
Get the amount of bytes stored by the queue disc.
uint32_t nTotalRequeuedPackets
Total requeued packets.
bool Mark(Ptr< QueueDiscItem > item, const char *reason)
Marks the given packet and, if successful, updates the counters associated with the given reason...
Ptr< QueueDisc > m_queueDisc
Queue disc attached to this class.
virtual void DoDispose(void)
Dispose of the object.
void SetQueueDisc(Ptr< QueueDisc > qd)
Set the queue disc attached to this class.
Ptr< const AttributeAccessor > MakeObjectVectorAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector.
ChildQueueDiscDropFunctor m_childQueueDiscDbeFunctor
Function object called when a child queue disc dropped a packet before enqueue.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint32_t nTotalSentPackets
Total sent packets – this value is not kept up to date, call GetStats first.
virtual Ptr< QueueDiscItem > DoDequeue(void)=0
This function actually extracts a packet from the queue disc.
TracedCallback< Ptr< const QueueDiscItem >, const char * > m_traceMark
Traced callback: fired when a packet is marked.
#define NS_UNUSED(x)
Mark a local variable as unused.
virtual void DoDispose(void)
Destructor implementation.
WakeMode
Used to determine whether the queue disc itself or its children must be activated when a netdevice wa...
TracedCallback< Ptr< const QueueDiscItem >, const char * > m_traceDropAfterDequeue
Traced callback: fired when a packet is dropped after dequeue.
uint32_t nTotalMarkedBytes
Total marked bytes.
uint32_t nTotalDroppedPacketsBeforeEnqueue
Total packets dropped before enqueue.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Ptr< InternalQueue > GetInternalQueue(uint32_t i) const
Get the i-th internal queue.
uint64_t GetNDroppedBytes(std::string reason) const
Get the amount of bytes dropped for the given reason.
static constexpr const char * CHILD_QUEUE_DISC_DROP
Packet dropped by a child queue disc.
uint32_t GetNInternalQueues(void) const
Get the number of internal queues.
void AddInternalQueue(Ptr< InternalQueue > queue)
Add an internal queue to the tail of the list of queues.
uint64_t nTotalEnqueuedBytes
Total enqueued bytes.
void PacketEnqueued(Ptr< const QueueDiscItem > item)
Perform the actions required when the queue disc is notified of a packet enqueue. ...
std::string m_childQueueDiscDropMsg
Reason why a packet was dropped by a child queue disc.
void DoInitialize(void)
Check whether the configuration is correct and initialize parameters.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Ptr< NetDeviceQueueInterface > m_devQueueIface
NetDevice queue interface.
InternalQueueDropFunctor m_internalQueueDbeFunctor
Function object called when an internal queue dropped a packet before enqueue.
Hold an unsigned integer type.
TracedCallback< Ptr< const QueueDiscItem > > m_traceDequeue
Traced callback: fired when a packet is dequeued.
indicates whether the socket has a priority set.
uint64_t nTotalSentBytes
Total sent bytes – this value is not kept up to date, call GetStats first.
void Run(void)
Modelled after the Linux function __qdisc_run (net/sched/sch_generic.c) Dequeues multiple packets...
Ptr< PacketFilter > GetPacketFilter(uint32_t i) const
Get the i-th packet filter.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
virtual bool DoEnqueue(Ptr< QueueDiscItem > item)=0
This function actually enqueues a packet into the queue disc.
const Stats & GetStats(void)
Retrieve all the collected statistics.
std::map< std::string, uint64_t > nDroppedBytesAfterDequeue
Bytes dropped after dequeue, for each reason.
bool Transmit(Ptr< QueueDiscItem > item)
Modelled after the Linux function sch_direct_xmit (net/sched/sch_generic.c) Sends a packet to the dev...
Ptr< QueueDisc > GetQueueDisc(void) const
Get the queue disc attached to this class.
uint64_t nTotalDroppedBytesBeforeEnqueue
Total bytes dropped before enqueue.
int32_t Classify(Ptr< QueueDiscItem > item)
Classify a packet by calling the packet filters, one at a time, until either a filter able to classif...
Network device transmission queue interface.
virtual void DoDispose(void)
Dispose of the object.
uint32_t GetNPacketFilters(void) const
Get the number of packet filters.
uint32_t GetNDroppedPackets(std::string reason) const
Get the number of packets dropped for the given reason.
std::map< std::string, uint32_t > nMarkedPackets
Marked packets, for each reason.
virtual WakeMode GetWakeMode(void) const
When setting up the wake callbacks on the netdevice queues, it is necessary to determine which queue ...
InternalQueueDropFunctor m_internalQueueDadFunctor
Function object called when an internal queue dropped a packet after dequeue.
QueueDiscClass is the base class for classes that are included in a queue disc.
static const uint32_t DEFAULT_QUOTA
Default quota (as in /proc/sys/net/core/dev_weight)
Ptr< QueueDiscItem > Dequeue(void)
Request the queue discipline to extract a packet.
uint64_t nTotalRequeuedBytes
Total requeued bytes.
std::ostream & operator<<(std::ostream &os, const Angles &a)
print a struct Angles to output
double f(double x, void *params)
uint32_t nTotalDroppedPacketsAfterDequeue
Total packets dropped after dequeue.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Hold objects of type Ptr.
uint32_t nTotalReceivedPackets
Total received packets.
TracedCallback< Ptr< const QueueDiscItem >, const char * > m_traceDropBeforeEnqueue
Traced callback: fired when a packet is dropped before enqueue.
uint32_t m_quota
Maximum number of packets dequeued in a qdisc run.
uint64_t GetNMarkedBytes(std::string reason) const
Get the amount of bytes marked for the given reason.
void Print(std::ostream &os) const
Print the statistics.
std::vector< Ptr< InternalQueue > > m_queues
Internal queues.
bool RunBegin(void)
Modelled after the Linux function qdisc_run_begin (include/net/sch_generic.h).
TracedCallback< Ptr< const QueueDiscItem > > m_traceEnqueue
Traced callback: fired when a packet is enqueued.
bool m_running
The queue disc is performing multiple dequeue operations.
uint64_t nTotalReceivedBytes
Total received bytes.
static Time Now(void)
Return the current simulation virtual time.
virtual uint32_t GetQuota(void) const
Get the maximum number of dequeue operations following a packet enqueue.
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
virtual bool CheckConfig(void)=0
Check whether the current configuration is correct.
TracedValue< uint32_t > m_nBytes
Number of bytes in the queue.
void Requeue(Ptr< QueueDiscItem > item)
Modelled after the Linux function dev_requeue_skb (net/sched/sch_generic.c) Requeues a packet whose t...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
TracedValue< uint32_t > m_nPackets
Number of packets in the queue.
void PacketDequeued(Ptr< const QueueDiscItem > item)
Perform the actions required when the queue disc is notified of a packet dequeue. ...
std::vector< Ptr< PacketFilter > > m_filters
Packet filters.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
uint64_t nTotalDequeuedBytes
Total dequeued bytes.
std::map< std::string, uint64_t > nDroppedBytesBeforeEnqueue
Bytes dropped before enqueue, for each reason.
uint64_t nTotalDroppedBytesAfterDequeue
Total bytes dropped after dequeue.
Ptr< NetDevice > m_device
The NetDevice on which this queue discipline is installed.
virtual void SetQuota(const uint32_t quota)
Set the maximum number of dequeue operations following a packet enqueue.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
ChildQueueDiscDropFunctor m_childQueueDiscDadFunctor
Function object called when a child queue disc dropped a packet after dequeue.
uint32_t nTotalEnqueuedPackets
Total enqueued packets.
void AddPacketFilter(Ptr< PacketFilter > filter)
Add a packet filter to the tail of the list of filters used to classify packets.
void DropAfterDequeue(Ptr< const QueueDiscItem > item, const char *reason)
Perform the actions required when the queue disc is notified of a packet dropped after dequeue...
Stats m_stats
The collected statistics.
uint64_t nTotalDroppedBytes
Total dropped bytes.
std::map< std::string, uint64_t > nMarkedBytes
Marked bytes, for each reason.
TracedCallback< Ptr< const QueueDiscItem > > m_traceDrop
Traced callback: fired when a packet is dropped.
virtual void InitializeParams(void)=0
Initialize parameters (if any) before the first packet is enqueued.
#define NS_OBJECT_TEMPLATE_CLASS_DEFINE(type, param)
Explicitly instantiate a template class and register the resulting instance with the TypeId system...
static TypeId GetTypeId(void)
Get the type ID.
uint32_t GetNMarkedPackets(std::string reason) const
Get the number of packets marked for the given reason.
A base class which provides memory management and object aggregation.
Container for a set of ns3::Object pointers.
virtual Ptr< const QueueDiscItem > DoPeek(void) const =0
This function returns a copy of the next packet the queue disc will extract.
bool Restart(void)
Modelled after the Linux function qdisc_restart (net/sched/sch_generic.c) Dequeue a packet (by callin...
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Ptr< QueueDiscItem > DequeuePacket(void)
Modelled after the Linux function dequeue_skb (net/sched/sch_generic.c)
Ptr< NetDevice > GetNetDevice(void) const
Get the NetDevice on which this queue discipline is installed.
static TypeId GetTypeId(void)
Get the type ID.
TracedCallback< Ptr< const QueueDiscItem > > m_traceRequeue
Traced callback: fired when a packet is requeued.
Ptr< const QueueDiscItem > Peek(void) const
Get a copy of the next packet the queue discipline will extract, without actually extracting the pack...
void SetNetDevice(Ptr< NetDevice > device)
Set the NetDevice on which this queue discipline is installed.
Ptr< QueueDiscClass > GetQueueDiscClass(uint32_t i) const
Get the i-th queue disc class.
static constexpr const char * INTERNAL_QUEUE_DROP
Packet dropped by an internal queue.
void RunEnd(void)
Modelled after the Linux function qdisc_run_end (include/net/sch_generic.h).
std::vector< Ptr< QueueDiscClass > > m_classes
Classes.
uint32_t GetNPackets(void) const
Get the number of packets stored by the queue disc.
std::map< std::string, uint32_t > nDroppedPacketsBeforeEnqueue
Packets dropped before enqueue, for each reason.