new methods to look in the packet queue
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2005 INRIA
|
||||
* Copyright (c) 2005, 2009 INRIA
|
||||
* Copyright (c) 2009 MIRKO BANCHI
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -16,8 +17,8 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
* Author: Mirko Banchi <mk.banchi@gmail.com>
|
||||
*/
|
||||
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/packet.h"
|
||||
#include "ns3/uinteger.h"
|
||||
@@ -30,7 +31,6 @@ namespace ns3 {
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED (WifiMacQueue);
|
||||
|
||||
|
||||
WifiMacQueue::Item::Item (Ptr<const Packet> packet,
|
||||
WifiMacHeader const &hdr,
|
||||
Time tstamp)
|
||||
@@ -69,16 +69,19 @@ WifiMacQueue::SetMaxSize (uint32_t maxSize)
|
||||
{
|
||||
m_maxSize = maxSize;
|
||||
}
|
||||
void
|
||||
|
||||
void
|
||||
WifiMacQueue::SetMaxDelay (Time delay)
|
||||
{
|
||||
m_maxDelay = delay;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
WifiMacQueue::GetMaxSize (void) const
|
||||
{
|
||||
return m_maxSize;
|
||||
}
|
||||
|
||||
Time
|
||||
WifiMacQueue::GetMaxDelay (void) const
|
||||
{
|
||||
@@ -97,6 +100,7 @@ WifiMacQueue::Enqueue (Ptr<const Packet> packet, WifiMacHeader const &hdr)
|
||||
m_queue.push_back (Item (packet, hdr, now));
|
||||
m_size++;
|
||||
}
|
||||
|
||||
void
|
||||
WifiMacQueue::Cleanup (void)
|
||||
{
|
||||
@@ -136,6 +140,72 @@ WifiMacQueue::Dequeue (WifiMacHeader *hdr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
Ptr<const Packet>
|
||||
WifiMacQueue::Peek (WifiMacHeader *hdr)
|
||||
{
|
||||
Cleanup ();
|
||||
if (!m_queue.empty ())
|
||||
{
|
||||
Item i = m_queue.front ();
|
||||
*hdr = i.hdr;
|
||||
return i.packet;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Ptr<const Packet>
|
||||
WifiMacQueue::DequeueByTidAndAddress (WifiMacHeader *hdr, uint8_t tid,
|
||||
WifiMacHeader::AddressType index, Mac48Address dest)
|
||||
{
|
||||
Cleanup ();
|
||||
Ptr<const Packet> packet = 0;
|
||||
if (!m_queue.empty ())
|
||||
{
|
||||
PacketQueueI it;
|
||||
NS_ASSERT (index <= 4);
|
||||
for (it = m_queue.begin (); it != m_queue.end (); ++it)
|
||||
{
|
||||
if (it->hdr.IsQosData ())
|
||||
{
|
||||
if (GetAddressForPacket (index, it) == dest &&
|
||||
it->hdr.GetQosTid () == tid)
|
||||
{
|
||||
packet = it->packet;
|
||||
*hdr = it->hdr;
|
||||
m_queue.erase (it);
|
||||
m_size--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
|
||||
Ptr<const Packet>
|
||||
WifiMacQueue::PeekByTidAndAddress (WifiMacHeader *hdr, uint8_t tid,
|
||||
WifiMacHeader::AddressType index, Mac48Address dest)
|
||||
{
|
||||
Cleanup ();
|
||||
if (!m_queue.empty ())
|
||||
{
|
||||
PacketQueueI it;
|
||||
NS_ASSERT (index <= 4);
|
||||
for (it = m_queue.begin (); it != m_queue.end (); ++it)
|
||||
{
|
||||
if (it->hdr.IsQosData ())
|
||||
{
|
||||
if (GetAddressForPacket (index, it) == dest &&
|
||||
it->hdr.GetQosTid () == tid)
|
||||
{
|
||||
*hdr = it->hdr;
|
||||
return it->packet;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
WifiMacQueue::IsEmpty (void)
|
||||
@@ -144,7 +214,6 @@ WifiMacQueue::IsEmpty (void)
|
||||
return m_queue.empty ();
|
||||
}
|
||||
|
||||
|
||||
uint32_t
|
||||
WifiMacQueue::GetSize (void)
|
||||
{
|
||||
@@ -158,4 +227,37 @@ WifiMacQueue::Flush (void)
|
||||
m_size = 0;
|
||||
}
|
||||
|
||||
Mac48Address
|
||||
WifiMacQueue::GetAddressForPacket (uint8_t index, PacketQueueI it)
|
||||
{
|
||||
if (index == WifiMacHeader::ADDR1)
|
||||
{
|
||||
return it->hdr.GetAddr1 ();
|
||||
}
|
||||
if (index == WifiMacHeader::ADDR2)
|
||||
{
|
||||
return it->hdr.GetAddr2 ();
|
||||
}
|
||||
if (index == WifiMacHeader::ADDR3)
|
||||
{
|
||||
return it->hdr.GetAddr3 ();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool
|
||||
WifiMacQueue::Remove (Ptr<const Packet> packet)
|
||||
{
|
||||
PacketQueueI it = m_queue.begin ();
|
||||
for (; it != m_queue.end (); it++)
|
||||
{
|
||||
if (it->packet == packet)
|
||||
{
|
||||
m_queue.erase (it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2005 INRIA
|
||||
* Copyright (c) 2005, 2009 INRIA
|
||||
* Copyright (c) 2009 MIRKO BANCHI
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
@@ -16,11 +17,12 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
* Author: Mirko Banchi <mk.banchi@gmail.com>
|
||||
*/
|
||||
#ifndef WIFI_MAC_QUEUE_H
|
||||
#define WIFI_MAC_QUEUE_H
|
||||
|
||||
#include <deque>
|
||||
#include <list>
|
||||
#include <utility>
|
||||
#include "ns3/packet.h"
|
||||
#include "ns3/nstime.h"
|
||||
@@ -60,25 +62,60 @@ public:
|
||||
|
||||
void Enqueue (Ptr<const Packet> packet, WifiMacHeader const &hdr);
|
||||
Ptr<const Packet> Dequeue (WifiMacHeader *hdr);
|
||||
|
||||
Ptr<const Packet> Peek (WifiMacHeader *hdr);
|
||||
/**
|
||||
* Searchs and returns, if is present in this queue, first packet having
|
||||
* address indicated by <i>index</i> equals to <i>addr</i>, and tid
|
||||
* equals to <i>tid</i>. This method removes the packet from this queue.
|
||||
* Is typically used by ns3::EdcaTxopN in order to perform correct MSDU
|
||||
* aggregation (A-MSDU).
|
||||
*/
|
||||
Ptr<const Packet> DequeueByTidAndAddress (WifiMacHeader *hdr,
|
||||
uint8_t tid,
|
||||
WifiMacHeader::AddressType index,
|
||||
Mac48Address addr);
|
||||
/**
|
||||
* Searchs and returns, if is present in this queue, first packet having
|
||||
* address indicated by <i>index</i> equals to <i>addr</i>, and tid
|
||||
* equals to <i>tid</i>. This method doesn't remove the packet from this queue.
|
||||
* Is typically used by ns3::EdcaTxopN in order to perform correct MSDU
|
||||
* aggregation (A-MSDU).
|
||||
*/
|
||||
Ptr<const Packet> PeekByTidAndAddress (WifiMacHeader *hdr,
|
||||
uint8_t tid,
|
||||
WifiMacHeader::AddressType index,
|
||||
Mac48Address addr);
|
||||
/**
|
||||
* If exists, removes <i>packet</i> from queue and returns true. Otherwise it
|
||||
* takes no effects and return false. Deletion of the packet is
|
||||
* performed in linear time (O(n)).
|
||||
*/
|
||||
bool Remove (Ptr<const Packet> packet);
|
||||
|
||||
void Flush (void);
|
||||
|
||||
bool IsEmpty (void);
|
||||
uint32_t GetSize (void);
|
||||
|
||||
private:
|
||||
struct Item;
|
||||
|
||||
typedef std::list<struct Item> PacketQueue;
|
||||
typedef std::list<struct Item>::reverse_iterator PacketQueueRI;
|
||||
typedef std::list<struct Item>::iterator PacketQueueI;
|
||||
|
||||
void Cleanup (void);
|
||||
Mac48Address GetAddressForPacket (uint8_t index, PacketQueueI);
|
||||
|
||||
struct Item {
|
||||
Item (Ptr<const Packet> packet,
|
||||
WifiMacHeader const&hdr,
|
||||
WifiMacHeader const &hdr,
|
||||
Time tstamp);
|
||||
Ptr<const Packet> packet;
|
||||
WifiMacHeader hdr;
|
||||
Time tstamp;
|
||||
};
|
||||
typedef std::deque<struct Item> PacketQueue;
|
||||
typedef std::deque<struct Item>::reverse_iterator PacketQueueRI;
|
||||
typedef std::deque<struct Item>::iterator PacketQueueI;
|
||||
|
||||
PacketQueue m_queue;
|
||||
WifiMacParameters *m_parameters;
|
||||
uint32_t m_size;
|
||||
@@ -88,5 +125,4 @@ private:
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
|
||||
#endif /* WIFI_MAC_QUEUE_H */
|
||||
|
||||
Reference in New Issue
Block a user