00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "ns3/log.h"
00020 #include "ns3/uinteger.h"
00021 #include "drop-tail-queue.h"
00022
00023 NS_LOG_COMPONENT_DEFINE ("DropTailQueue");
00024
00025 namespace ns3 {
00026
00027 NS_OBJECT_ENSURE_REGISTERED (DropTailQueue);
00028
00029 TypeId DropTailQueue::GetTypeId (void)
00030 {
00031 static TypeId tid = TypeId ("ns3::DropTailQueue")
00032 .SetParent<Queue> ()
00033 .AddConstructor<DropTailQueue> ()
00034 .AddAttribute ("MaxPackets", "The maximum number of packets accepted by this DropTailQueue.",
00035 UintegerValue (100),
00036 MakeUintegerAccessor (&DropTailQueue::m_maxPackets),
00037 MakeUintegerChecker<uint32_t> ())
00038 ;
00039
00040 return tid;
00041 }
00042
00043 DropTailQueue::DropTailQueue () :
00044 Queue (),
00045 m_packets ()
00046 {
00047 NS_LOG_FUNCTION_NOARGS ();
00048 }
00049
00050 DropTailQueue::~DropTailQueue ()
00051 {
00052 NS_LOG_FUNCTION_NOARGS ();
00053 }
00054
00055 bool
00056 DropTailQueue::DoEnqueue (Ptr<Packet> p)
00057 {
00058 NS_LOG_FUNCTION (this << p);
00059
00060 if (m_packets.size () >= m_maxPackets)
00061 {
00062 NS_LOG_LOGIC ("Queue full -- droppping pkt");
00063 Drop (p);
00064 return false;
00065 }
00066
00067 m_packets.push(p);
00068 return true;
00069 }
00070
00071 Ptr<Packet>
00072 DropTailQueue::DoDequeue (void)
00073 {
00074 NS_LOG_FUNCTION (this);
00075
00076 if (m_packets.empty())
00077 {
00078 NS_LOG_LOGIC ("Queue empty");
00079 return false;
00080 }
00081
00082 Ptr<Packet> p = m_packets.front ();
00083 m_packets.pop ();
00084
00085 NS_LOG_LOGIC ("Popped " << p);
00086
00087 return p;
00088 }
00089
00090 Ptr<const Packet>
00091 DropTailQueue::DoPeek (void) const
00092 {
00093 NS_LOG_FUNCTION (this);
00094
00095 if (m_packets.empty())
00096 {
00097 NS_LOG_LOGIC ("Queue empty");
00098 return false;
00099 }
00100
00101 Ptr<Packet> p = m_packets.front ();
00102
00103 return p;
00104 }
00105
00106 }
00107
00108
00109 #ifdef RUN_SELF_TESTS
00110
00111 #include "ns3/test.h"
00112
00113 namespace ns3 {
00114
00115 class DropTailQueueTest: public Test {
00116 public:
00117 virtual bool RunTests (void);
00118 DropTailQueueTest ();
00119 };
00120
00121
00122 DropTailQueueTest::DropTailQueueTest ()
00123 : Test ("DropTailQueue") {}
00124
00125
00126 bool
00127 DropTailQueueTest::RunTests (void)
00128 {
00129 bool result = true;
00130
00131 Ptr<DropTailQueue> queue = CreateObject<DropTailQueue> ();
00132 NS_TEST_ASSERT (queue->SetAttributeFailSafe ("MaxPackets", UintegerValue (3)));
00133
00134 Ptr<Packet> p1, p2, p3, p4;
00135 p1 = Create<Packet> ();
00136 p2 = Create<Packet> ();
00137 p3 = Create<Packet> ();
00138 p4 = Create<Packet> ();
00139
00140 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 0);
00141 queue->Enqueue (p1);
00142 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 1);
00143 queue->Enqueue (p2);
00144 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 2);
00145 queue->Enqueue (p3);
00146 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 3);
00147 queue->Enqueue (p4);
00148 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 3);
00149
00150 Ptr<Packet> p;
00151
00152 p = queue->Dequeue ();
00153 NS_TEST_ASSERT (p != 0);
00154 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 2);
00155 NS_TEST_ASSERT_EQUAL (p->GetUid (), p1->GetUid ());
00156
00157 p = queue->Dequeue ();
00158 NS_TEST_ASSERT (p != 0);
00159 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 1);
00160 NS_TEST_ASSERT_EQUAL (p->GetUid (), p2->GetUid ());
00161
00162 p = queue->Dequeue ();
00163 NS_TEST_ASSERT (p != 0);
00164 NS_TEST_ASSERT_EQUAL (queue->GetNPackets (), 0);
00165 NS_TEST_ASSERT_EQUAL (p->GetUid (), p3->GetUid ());
00166
00167 p = queue->Dequeue ();
00168 NS_TEST_ASSERT (p == 0);
00169
00170 return result;
00171 }
00172
00173
00174 static DropTailQueueTest gDropTailQueueTest;
00175
00176 };
00177
00178 #endif
00179