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.