A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
dsr-network-queue.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 Yufei Cheng
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: Yufei Cheng <yfcheng@ittc.ku.edu>
19  *
20  * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
21  * ResiliNets Research Group http://wiki.ittc.ku.edu/resilinets
22  * Information and Telecommunication Technology Center (ITTC)
23  * and Department of Electrical Engineering and Computer Science
24  * The University of Kansas Lawrence, KS USA.
25  *
26  * Work supported in part by NSF FIND (Future Internet Design) Program
27  * under grant CNS-0626918 (Postmodern Internet Architecture),
28  * NSF grant CNS-1050226 (Multilayer Network Resilience Analysis and Experimentation on GENI),
29  * US Department of Defense (DoD), and ITTC at The University of Kansas.
30  */
31 
32 #include "dsr-network-queue.h"
33 #include "ns3/test.h"
34 #include <map>
35 #include <algorithm>
36 #include <functional>
37 #include "ns3/log.h"
38 #include "ns3/ipv4-route.h"
39 #include "ns3/socket.h"
40 
41 NS_LOG_COMPONENT_DEFINE ("DsrNetworkQueue");
42 
43 namespace ns3 {
44 namespace dsr {
45 
46 NS_OBJECT_ENSURE_REGISTERED (DsrNetworkQueue)
47  ;
48 
49 TypeId
51 {
52  static TypeId tid = TypeId ("ns3::dsr::DsrNetworkQueue")
53  .SetParent<Object> ()
54  .AddConstructor<DsrNetworkQueue> ()
55  ;
56  return tid;
57 }
58 
59 DsrNetworkQueue::DsrNetworkQueue (uint32_t maxLen, Time maxDelay)
60  : m_size (0),
61  m_maxSize (maxLen),
62  m_maxDelay (maxDelay)
63 {
64  NS_LOG_FUNCTION (this);
65 }
66 
68 {
69  NS_LOG_FUNCTION (this);
70 }
71 
73 {
74  NS_LOG_FUNCTION (this);
75  Flush ();
76 }
77 
78 void
80 {
81  m_maxSize = maxSize;
82 }
83 
84 void
86 {
87  m_maxDelay = delay;
88 }
89 
90 uint32_t
92 {
93  return m_maxSize;
94 }
95 
96 Time
98 {
99  return m_maxDelay;
100 }
101 
102 bool
104 {
105  NS_LOG_FUNCTION (this << m_size << m_maxSize);
106  if (m_size >= m_maxSize)
107  {
108  return false;
109  }
110  Time now = Simulator::Now ();
111  entry.SetInsertedTimeStamp (now);
112  m_dsrNetworkQueue.push_back (entry);
113  m_size++;
114  NS_LOG_LOGIC ("The network queue size is " << m_size);
115  return true;
116 }
117 
118 bool
120 {
121  NS_LOG_FUNCTION (this);
122  Cleanup ();
123  std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin ();
124  if (i == m_dsrNetworkQueue.end ())
125  {
126  // no elements in array
127  NS_LOG_LOGIC ("No queued packet in the network queue");
128  return false;
129  }
130  entry = *i;
131  m_dsrNetworkQueue.erase (i);
132  m_size--;
133  return true;
134 }
135 
136 void
138 {
139  NS_LOG_FUNCTION (this);
140  if (m_dsrNetworkQueue.empty ())
141  {
142  return;
143  }
144 
145  Time now = Simulator::Now ();
146  uint32_t n = 0;
147  for (std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin (); i != m_dsrNetworkQueue.end (); )
148  {
149  if (i->GetInsertedTimeStamp () + m_maxDelay > now)
150  {
151  i++;
152  }
153  else
154  {
155  NS_LOG_LOGIC ("Outdated packet");
156  i = m_dsrNetworkQueue.erase (i);
157  n++;
158  }
159  }
160  m_size -= n;
161 }
162 
163 uint32_t
165 {
166  NS_LOG_FUNCTION (this);
167  return m_size;
168 }
169 
170 void
172 {
173  NS_LOG_FUNCTION (this);
174  m_dsrNetworkQueue.erase (m_dsrNetworkQueue.begin (), m_dsrNetworkQueue.end ());
175  m_size = 0;
176 }
177 
178 } // namespace dsr
179 } // namespace ns3
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:345
uint32_t GetSize()
Number of entries.
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
bool Enqueue(DsrNetworkQueueEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue...
uint32_t m_maxSize
Maximum queue size.
bool Dequeue(DsrNetworkQueueEntry &entry)
Return first found (the earliest) entry for given destination.
NS_LOG_COMPONENT_DEFINE("DsrNetworkQueue")
DSR Network Queue Entry.
uint32_t GetMaxNetworkSize(void) const
Return the maximum queue size.
#define NS_LOG_LOGIC(msg)
Definition: log.h:368
void SetMaxNetworkDelay(Time delay)
Set the maximum entry lifetime in the queue.
Time GetMaxNetworkDelay(void) const
Return the maximum entry lifetime for this queue.
static Time Now(void)
Return the "current simulation time".
Definition: simulator.cc:180
void Cleanup(void)
Clean the queue by removing entries that exceeded lifetime.
uint32_t m_size
Current queue size.
void SetInsertedTimeStamp(Time time)
void Flush(void)
Clear the queue.
std::vector< DsrNetworkQueueEntry > m_dsrNetworkQueue
Queue (vector) of entries.
Time m_maxDelay
Maximum entry lifetime.
static TypeId GetTypeId(void)
void SetMaxNetworkSize(uint32_t maxSize)
Set the maximum queue size.
a base class which provides memory management and object aggregation
Definition: object.h:63
a unique identifier for an interface.
Definition: type-id.h:49
TypeId SetParent(TypeId tid)
Definition: type-id.cc:611