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::TracedCallback")
406 NS_ASSERT_MSG (ok,
"The queue disc configuration is not correct");
414 (*cl)->GetQueueDisc ()->Initialize ();
494 NS_LOG_DEBUG (
"Changing the mode of this queue disc is prohibited");
573 queue->TraceConnectWithoutContext (
"Enqueue",
575 queue->TraceConnectWithoutContext (
"Dequeue",
577 queue->TraceConnectWithoutContext (
"DropBeforeEnqueue",
580 queue->TraceConnectWithoutContext (
"DropAfterDequeue",
623 NS_ABORT_MSG_IF (qdClass->GetQueueDisc () == 0,
"Cannot add a class with no attached queue disc");
627 "A queue disc with WAKE_CHILD as wake mode can only be a root queue disc");
631 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"Enqueue",
633 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"Dequeue",
635 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"DropBeforeEnqueue",
638 qdClass->GetQueueDisc ()->TraceConnectWithoutContext (
"DropAfterDequeue",
666 ret = (*f)->Classify (item);
735 itb->second += item->GetSize ();
742 NS_LOG_DEBUG (
"Total packets/bytes dropped before enqueue: " 774 itb->second += item->GetSize ();
792 NS_LOG_DEBUG (
"Total packets/bytes dropped after dequeue: " 805 bool retval = item->Mark ();
829 itb->second += item->GetSize ();
1063 if (
m_devQueueIface->GetTxQueue (item->GetTxQueueIndex ())->IsStopped ())
1073 item->GetPacket ()->RemovePacketTag (priorityTag);
1075 m_device->Send (item->GetPacket (), item->GetAddress (), item->GetProtocol ());
uint32_t nTotalDequeuedPackets
Total dequeued packets.
Structure that keeps the queue disc statistics.
Ptr< const QueueDiscItem > Peek(void)
Get a copy of the next packet the queue discipline will extract.
Ptr< NetDevice > GetNetDevice(void) const
Get the NetDevice on which this queue discipline is installed.
TracedCallback< Time > m_sojourn
Sojourn time of the latest dequeued packet.
virtual void DoInitialize(void)
Initialize() implementation.
uint32_t GetNPackets(void) const
Get the number of packets stored by the queue disc.
uint32_t nTotalMarkedPackets
Total marked packets.
#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.
Class for representing queue sizes.
uint32_t nTotalDroppedPackets
Total dropped packets.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
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.
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
uint32_t GetValue() const
Get the underlying value.
virtual ~QueueDiscClass()
QueueSizeUnit
Enumeration of the operating modes of queues.
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...
QueueSize GetCurrentSize(void)
Get the current size of the queue disc in bytes, if operating in bytes mode, or packets, otherwise.
Ptr< QueueDisc > m_queueDisc
Queue disc attached to this class.
bool m_prohibitChangeMode
True if changing mode is prohibited.
virtual void DoDispose(void)
Dispose of the object.
void SetQueueDisc(Ptr< QueueDisc > qd)
Set the queue disc attached to this class.
Used by queue discs with unlimited size.
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.
uint32_t GetNBytes(void) const
Get the amount of bytes stored by the queue disc.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
virtual void DoDispose(void)
Destructor implementation.
QueueSize m_maxSize
max queue size
QueueDisc is an abstract base class providing the interface and implementing the operations common to...
TracedCallback< Ptr< const QueueDiscItem >, const char *> m_traceDropAfterDequeue
Traced callback: fired when a packet is dropped after dequeue.
Used by queue discs with single child queue disc.
uint64_t GetNMarkedBytes(std::string reason) const
Get the amount of bytes marked for the given reason.
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.
virtual uint32_t GetQuota(void) const
Get the maximum number of dequeue operations following a packet enqueue.
bool m_peeked
A packet was dequeued because Peek was called.
static constexpr const char * CHILD_QUEUE_DISC_DROP
Packet dropped by a child queue disc.
virtual Ptr< const QueueDiscItem > DoPeek(void)
Return a copy of the next packet the queue disc will extract.
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.
Ptr< InternalQueue > GetInternalQueue(std::size_t i) const
Get the i-th internal queue.
Hold an unsigned integer type.
TracedCallback< Ptr< const QueueDiscItem > > m_traceDequeue
Traced callback: fired when a packet is dequeued.
uint32_t GetNDroppedPackets(std::string reason) const
Get the number of packets dropped for the given reason.
Use number of packets for queue size.
Ptr< PacketFilter > GetPacketFilter(std::size_t i) const
Get the i-th packet filter.
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.
QueueDisc(QueueDiscSizePolicy policy=QueueDiscSizePolicy::SINGLE_INTERNAL_QUEUE)
Constructor.
void Run(void)
Modelled after the Linux function __qdisc_run (net/sched/sch_generic.c) Dequeues multiple packets...
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...
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.
Ptr< QueueDiscClass > GetQueueDiscClass(std::size_t i) const
Get the i-th queue disc class.
std::map< std::string, uint32_t > nMarkedPackets
Marked packets, for each reason.
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)
Extract from the queue disc the packet that has been dequeued by calling Peek, if any...
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<T>.
std::size_t GetNQueueDiscClasses(void) const
Get the number of queue disc classes.
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.
uint32_t GetNMarkedPackets(std::string reason) const
Get the number of packets marked for the given reason.
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.
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
uint64_t GetNDroppedBytes(std::string reason) const
Get the amount of bytes dropped for the given reason.
virtual bool CheckConfig(void)=0
Check whether the current configuration is correct.
TracedValue< uint32_t > m_nBytes
Number of bytes in the queue.
QueueSize GetMaxSize(void) const
Get the maximum size of the queue disc.
QueueSizeUnit GetUnit() const
Get the underlying unit.
void Requeue(Ptr< QueueDiscItem > item)
Modelled after the Linux function dev_requeue_skb (net/sched/sch_generic.c) Requeues a packet whose t...
QueueDiscSizePolicy
Enumeration of the available policies to handle the queue disc size.
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.
Used by queue discs with single internal queue.
void Print(std::ostream &os) const
Print the statistics.
#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.
Used by queue discs with multiple internal queues/child queue discs.
uint64_t nTotalDroppedBytesAfterDequeue
Total bytes dropped after dequeue.
QueueDiscSizePolicy m_sizePolicy
The queue disc size policy.
Ptr< NetDevice > m_device
The NetDevice on which this queue discipline is installed.
std::size_t GetNPacketFilters(void) const
Get the number of packet filters.
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.
bool SetMaxSize(QueueSize size)
Set the maximum size of the queue disc.
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.
WakeMode
Used to determine whether the queue disc itself or its children must be activated when a netdevice wa...
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.
Ptr< QueueDisc > GetQueueDisc(void) const
Get the queue disc attached to this class.
A base class which provides memory management and object aggregation.
virtual WakeMode GetWakeMode(void) const
When setting up the wake callbacks on the netdevice queues, it is necessary to determine which queue ...
Container for a set of ns3::Object pointers.
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...
Use number of bytes for queue size.
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)
static TypeId GetTypeId(void)
Get the type ID.
TracedCallback< Ptr< const QueueDiscItem > > m_traceRequeue
Traced callback: fired when a packet is requeued.
void SetNetDevice(Ptr< NetDevice > device)
Set the NetDevice on which this queue discipline is installed.
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.
std::size_t GetNInternalQueues(void) const
Get the number of internal queues.
std::map< std::string, uint32_t > nDroppedPacketsBeforeEnqueue
Packets dropped before enqueue, for each reason.