23 #include "ns3/simulator.h"
24 #include "ns3/packet.h"
25 #include "ns3/uinteger.h"
28 #include "wifi-mac-queue.h"
29 #include "qos-blocked-destinations.h"
33 NS_OBJECT_ENSURE_REGISTERED (WifiMacQueue);
35 WifiMacQueue::Item::Item (Ptr<const Packet> packet,
36 const WifiMacHeader &hdr,
44 WifiMacQueue::Item::Item (Ptr<const Packet> packet,
45 const WifiMacHeader &hdr,
46 Time tstamp, uint16_t channel)
55 WifiMacQueue::GetTypeId (
void)
57 static TypeId tid = TypeId (
"ns3::WifiMacQueue")
59 .AddConstructor<WifiMacQueue> ()
60 .AddAttribute (
"MaxPacketNumber",
"If a packet arrives when there are already this number of packets, it is dropped.",
62 MakeUintegerAccessor (&WifiMacQueue::m_maxSize),
63 MakeUintegerChecker<uint32_t> ())
64 .AddAttribute (
"MaxDelay",
"If a packet stays longer than this delay in the queue, it is dropped.",
66 MakeTimeAccessor (&WifiMacQueue::m_maxDelay),
72 WifiMacQueue::WifiMacQueue ()
77 WifiMacQueue::~WifiMacQueue ()
83 WifiMacQueue::SetMaxSize (uint32_t maxSize)
89 WifiMacQueue::SetMaxDelay (Time delay)
95 WifiMacQueue::GetMaxSize (
void)
const
101 WifiMacQueue::GetMaxDelay (
void)
const
107 WifiMacQueue::Enqueue (Ptr<const Packet> packet,
const WifiMacHeader &hdr)
110 if (m_size == m_maxSize)
115 PacketChannelPacketTag cpt;
116 packet->PeekPacketTag(cpt);
117 m_queue.push_back (Item (packet, hdr, now, cpt.GetChannel()));
122 WifiMacQueue::Cleanup (
void)
124 if (m_queue.empty ())
131 for (PacketQueueI i = m_queue.begin (); i != m_queue.end ();)
133 if (i->tstamp + m_maxDelay > now)
139 i = m_queue.erase (i);
147 WifiMacQueue::Dequeue (WifiMacHeader *hdr)
150 if (!m_queue.empty ())
152 Item i = m_queue.front ();
153 m_queue.pop_front ();
162 WifiMacQueue::DequeueForChannel (WifiMacHeader *hdr, uint16_t toChannel)
165 Ptr<const Packet> packet = 0;
167 if (!m_queue.empty ())
170 for (it = m_queue.begin (); it != m_queue.end (); ++it)
174 if (it->channel == toChannel ||
175 (it->channel == 0 && toChannel == 1))
188 WifiMacQueue::Peek (WifiMacHeader *hdr)
191 if (!m_queue.empty ())
193 Item i = m_queue.front ();
206 if (!m_queue.empty ())
210 for (it = m_queue.begin (); it != m_queue.end (); ++it)
212 if (it->hdr.IsQosData ())
214 if (GetAddressForPacket (type, it) == dest
215 && it->hdr.GetQosTid () == tid)
234 if (!m_queue.empty ())
238 for (it = m_queue.begin (); it != m_queue.end (); ++it)
240 if (it->hdr.IsQosData ())
242 if (GetAddressForPacket (type, it) == dest
243 && it->hdr.GetQosTid () == tid)
255 WifiMacQueue::IsEmpty (
void)
258 return m_queue.empty ();
261 WifiMacQueue::IsEmpty (uint16_t toChannel)
264 if (!m_queue.empty())
268 for (it = m_queue.begin (); it != m_queue.end (); ++it)
270 if (it->channel == toChannel)
279 if (it->channel == 0 && toChannel == 1)
293 WifiMacQueue::GetSize (
void)
299 WifiMacQueue::Flush (
void)
301 m_queue.erase (m_queue.begin (), m_queue.end ());
306 WifiMacQueue::GetAddressForPacket (
enum WifiMacHeader::AddressType type, PacketQueueI it)
308 if (type == WifiMacHeader::ADDR1)
310 return it->hdr.GetAddr1 ();
312 if (type == WifiMacHeader::ADDR2)
314 return it->hdr.GetAddr2 ();
316 if (type == WifiMacHeader::ADDR3)
318 return it->hdr.GetAddr3 ();
326 PacketQueueI it = m_queue.begin ();
327 for (; it != m_queue.end (); it++)
329 if (it->packet == packet)
343 if (m_size == m_maxSize)
348 m_queue.push_front (Item (packet, hdr, now));
357 uint32_t nPackets = 0;
358 if (!m_queue.empty ())
362 for (it = m_queue.begin (); it != m_queue.end (); it++)
364 if (GetAddressForPacket (type, it) == addr)
366 if (it->hdr.IsQosData () && it->hdr.GetQosTid () == tid)
382 for (PacketQueueI it = m_queue.begin (); it != m_queue.end (); it++)
384 if (!it->hdr.IsQosData ()
385 || !blockedPackets->IsBlocked (it->hdr.GetAddr1 (), it->hdr.GetQosTid ()))
388 timestamp = it->tstamp;
403 for (PacketQueueI it = m_queue.begin (); it != m_queue.end (); it++)
405 if (!it->hdr.IsQosData ()
406 || !blockedPackets->IsBlocked (it->hdr.GetAddr1 (), it->hdr.GetQosTid ()))
409 timestamp = it->tstamp;
#define NS_ASSERT(condition)
Ptr< const Packet > PeekByTidAndAddress(WifiMacHeader *hdr, uint8_t tid, WifiMacHeader::AddressType type, Mac48Address addr)
uint32_t GetNPacketsByTidAndAddress(uint8_t tid, WifiMacHeader::AddressType type, Mac48Address addr)
bool Remove(Ptr< const Packet > packet)
Ptr< const Packet > DequeueFirstAvailable(WifiMacHeader *hdr, Time &tStamp, const QosBlockedDestinations *blockedPackets)
Ptr< const Packet > DequeueByTidAndAddress(WifiMacHeader *hdr, uint8_t tid, WifiMacHeader::AddressType type, Mac48Address addr)
make Callback use a separate empty type
Ptr< const Packet > PeekFirstAvailable(WifiMacHeader *hdr, Time &tStamp, const QosBlockedDestinations *blockedPackets)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.