A Discrete-Event Network Simulator
API
net-device-queue-interface.h
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2017 Universita' degli Studi di Napoli Federico II
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Stefano Avallone <stefano.avallone@.unina.it>
19 */
20#ifndef NET_DEVICE_QUEUE_INTERFACE_H
21#define NET_DEVICE_QUEUE_INTERFACE_H
22
23#include <vector>
24#include <functional>
25#include "ns3/callback.h"
26#include "ns3/object.h"
27#include "ns3/ptr.h"
28#include "ns3/log.h"
29#include "ns3/net-device.h"
30#include "ns3/object-factory.h"
31
32namespace ns3 {
33
34class QueueLimits;
35class NetDeviceQueueInterface;
36class QueueItem;
37
38
56class NetDeviceQueue : public Object
57{
58public:
63 static TypeId GetTypeId (void);
64
66 virtual ~NetDeviceQueue();
67
72 virtual void Start (void);
73
78 virtual void Stop (void);
79
85 virtual void Wake (void);
86
94 virtual bool IsStopped (void) const;
95
106
109
120 virtual void SetWakeCallback (WakeCallback cb);
121
126 virtual void NotifyQueuedBytes (uint32_t bytes);
127
132 virtual void NotifyTransmittedBytes (uint32_t bytes);
133
137 void ResetQueueLimits ();
138
144
150
162 template <typename QueueType>
163 void PacketEnqueued (QueueType* queue, Ptr<const typename QueueType::ItemType> item);
164
177 template <typename QueueType>
178 void PacketDequeued (QueueType* queue, Ptr<const typename QueueType::ItemType> item);
179
192 template <typename QueueType>
193 void PacketDiscarded (QueueType* queue, Ptr<const typename QueueType::ItemType> item);
194
203 template <typename QueueType>
205
206private:
212
214};
215
216
231{
232public:
237 static TypeId GetTypeId (void);
238
243 virtual ~NetDeviceQueueInterface ();
244
253 Ptr<NetDeviceQueue> GetTxQueue (std::size_t i) const;
254
259 std::size_t GetNTxQueues (void) const;
260
269 void SetTxQueuesType (TypeId type);
270
279 void SetNTxQueues (std::size_t numTxQueues);
280
282 typedef std::function<std::size_t (Ptr<QueueItem>)> SelectQueueCallback;
283
292
301
302protected:
306 virtual void DoDispose (void);
310 virtual void NotifyNewAggregate (void);
311
312private:
314 std::vector< Ptr<NetDeviceQueue> > m_txQueuesVector;
316};
317
318
323template <typename QueueType>
324void
326{
327 NS_ASSERT (queue != 0);
328
329 queue->TraceConnectWithoutContext ("Enqueue",
330 MakeCallback (&NetDeviceQueue::PacketEnqueued<QueueType>, this)
331 .Bind (PeekPointer (queue)));
332 queue->TraceConnectWithoutContext ("Dequeue",
333 MakeCallback (&NetDeviceQueue::PacketDequeued<QueueType>, this)
334 .Bind (PeekPointer (queue)));
335 queue->TraceConnectWithoutContext ("DropBeforeEnqueue",
336 MakeCallback (&NetDeviceQueue::PacketDiscarded<QueueType>, this)
337 .Bind (PeekPointer (queue)));
338}
339
340template <typename QueueType>
341void
343{
344 NS_LOG_FUNCTION (this << queue << item);
345
346 // Inform BQL
347 NotifyQueuedBytes (item->GetSize ());
348
349 NS_ASSERT_MSG (m_device, "Aggregated NetDevice not set");
350 // After enqueuing a packet, we need to check whether the queue is able to
351 // store another packet. If not, we stop the queue
352
353 if (queue->WouldOverflow (1, m_device->GetMtu ()))
354 {
355 NS_LOG_DEBUG ("The device queue is being stopped (" << queue->GetCurrentSize ()
356 << " inside)");
357 Stop ();
358 }
359}
360
361template <typename QueueType>
362void
364{
365 NS_LOG_FUNCTION (this << queue << item);
366
367 // Inform BQL
368 NotifyTransmittedBytes (item->GetSize ());
369
370 NS_ASSERT_MSG (m_device, "Aggregated NetDevice not set");
371 // After dequeuing a packet, if there is room for another packet we
372 // call Wake () that ensures that the queue is not stopped and restarts
373 // the queue disc if the queue was stopped
374
375 if (!queue->WouldOverflow (1, m_device->GetMtu ()))
376 {
377 Wake ();
378 }
379}
380
381template <typename QueueType>
382void
384{
385 NS_LOG_FUNCTION (this << queue << item);
386
387 // This method is called when a packet is discarded before being enqueued in the
388 // device queue, likely because the queue is full. This should not happen if the
389 // device correctly stops the queue. Anyway, stop the tx queue, so that the upper
390 // layers do not send packets until there is room in the queue again.
391
392 NS_LOG_ERROR ("BUG! No room in the device queue for the received packet! ("
393 << queue->GetCurrentSize () << " inside)");
394
395 Stop ();
396}
397
398} // namespace ns3
399
400#endif /* NET_DEVICE_QUEUE_INTERFACE_H */
virtual uint16_t GetMtu(void) const =0
Network device transmission queue.
bool m_stoppedByQueueLimits
True if the queue has been stopped by a queue limits object.
void ConnectQueueTraces(Ptr< QueueType > queue)
Connect the traced callbacks of a queue to the methods providing support for flow control and dynamic...
void NotifyAggregatedObject(Ptr< NetDeviceQueueInterface > ndqi)
Notify this NetDeviceQueue that the NetDeviceQueueInterface was aggregated to an object.
void PacketDiscarded(QueueType *queue, Ptr< const typename QueueType::ItemType > item)
Perform the actions required by flow control and dynamic queue limits when a packet is dropped before...
Ptr< QueueLimits > GetQueueLimits()
Get queue limits to this queue.
Ptr< QueueLimits > m_queueLimits
Queue limits object.
void SetQueueLimits(Ptr< QueueLimits > ql)
Set queue limits to this queue.
NS_LOG_TEMPLATE_DECLARE
redefinition of the log component
void PacketDequeued(QueueType *queue, Ptr< const typename QueueType::ItemType > item)
Perform the actions required by flow control and dynamic queue limits when a packet is dequeued (or d...
void ResetQueueLimits()
Reset queue limits state.
virtual bool IsStopped(void) const
Get the status of the device transmission queue.
virtual void Wake(void)
Called by the device to wake the queue disc associated with this device transmission queue.
virtual void NotifyTransmittedBytes(uint32_t bytes)
Called by the netdevice to report the number of bytes it is going to transmit.
virtual void NotifyQueuedBytes(uint32_t bytes)
Called by the netdevice to report the number of bytes queued to the device queue.
virtual void Stop(void)
Called by the device to stop this device transmission queue.
Ptr< NetDevice > m_device
the netdevice aggregated to the NetDeviceQueueInterface
virtual void Start(void)
Called by the device to start this device transmission queue.
WakeCallback m_wakeCallback
Wake callback.
bool m_stoppedByDevice
True if the queue has been stopped by the device.
static TypeId GetTypeId(void)
Get the type ID.
Callback< void > WakeCallback
Callback invoked by netdevices to wake upper layers.
virtual void SetWakeCallback(WakeCallback cb)
Set the wake callback.
void PacketEnqueued(QueueType *queue, Ptr< const typename QueueType::ItemType > item)
Perform the actions required by flow control and dynamic queue limits when a packet is enqueued in th...
Network device transmission queue interface.
std::function< std::size_t(Ptr< QueueItem >)> SelectQueueCallback
Callback invoked to determine the tx queue selected for a given packet.
SelectQueueCallback m_selectQueueCallback
Select queue callback.
std::vector< Ptr< NetDeviceQueue > > m_txQueuesVector
Device transmission queues.
Ptr< NetDeviceQueue > GetTxQueue(std::size_t i) const
Get the i-th transmission queue of the device.
ObjectFactory m_txQueues
Device transmission queues TypeId.
virtual void DoDispose(void)
Dispose of the object.
void SetSelectQueueCallback(SelectQueueCallback cb)
Set the select queue callback.
static TypeId GetTypeId(void)
Get the type ID.
SelectQueueCallback GetSelectQueueCallback(void) const
Get the select queue callback.
std::size_t GetNTxQueues(void) const
Get the number of device transmission queues.
void SetTxQueuesType(TypeId type)
Set the type of device transmission queues to create.
void SetNTxQueues(std::size_t numTxQueues)
Set the number of device transmission queues to create.
virtual void NotifyNewAggregate(void)
Notify that an object was aggregated.
Instantiate subclasses of ns3::Object.
A base class which provides memory management and object aggregation.
Definition: object.h:88
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
a unique identifier for an interface.
Definition: type-id.h:59
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:257
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
U * PeekPointer(const Ptr< U > &p)
Definition: ptr.h:415
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648