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 TypeId
50 {
51  static TypeId tid = TypeId ("ns3::dsr::DsrNetworkQueue")
52  .SetParent<Object> ()
53  .AddConstructor<DsrNetworkQueue> ()
54  ;
55  return tid;
56 }
57 
58 DsrNetworkQueue::DsrNetworkQueue (uint32_t maxLen, Time maxDelay)
59  : m_size (0),
60  m_maxSize (maxLen),
61  m_maxDelay (maxDelay)
62 {
63  NS_LOG_FUNCTION (this);
64 }
65 
67 {
68  NS_LOG_FUNCTION (this);
69 }
70 
72 {
73  NS_LOG_FUNCTION (this);
74  Flush ();
75 }
76 
77 void
79 {
80  m_maxSize = maxSize;
81 }
82 
83 void
85 {
86  m_maxDelay = delay;
87 }
88 
89 uint32_t
91 {
92  return m_maxSize;
93 }
94 
95 Time
97 {
98  return m_maxDelay;
99 }
100 
101 bool
103 {
104  Cleanup ();
105  for (std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin (); i != m_dsrNetworkQueue.end (); ++i)
106  {
107  if (i->GetNextHopAddress () == nextHop)
108  {
109  entry = *i;
110  i = m_dsrNetworkQueue.erase (i);
111  return true;
112  }
113  }
114  return false;
115 }
116 
117 bool
119 {
120  Cleanup ();
121  for (std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin (); i != m_dsrNetworkQueue.end (); ++i)
122  {
123  if (i->GetNextHopAddress () == nextHop)
124  {
125  return true;
126  }
127  }
128  return false;
129 }
130 
131 bool
133 {
134  NS_LOG_FUNCTION (this << m_size << m_maxSize);
135  if (m_size >= m_maxSize)
136  {
137  return false;
138  }
139  Time now = Simulator::Now ();
140  entry.SetInsertedTimeStamp (now);
141  m_dsrNetworkQueue.push_back (entry);
142  m_size++;
143  NS_LOG_LOGIC ("The network queue size is " << m_size);
144  return true;
145 }
146 
147 bool
149 {
150  NS_LOG_FUNCTION (this);
151  Cleanup ();
152  std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin ();
153  if (i == m_dsrNetworkQueue.end ())
154  {
155  // no elements in array
156  NS_LOG_LOGIC ("No queued packet in the network queue");
157  return false;
158  }
159  entry = *i;
160  m_dsrNetworkQueue.erase (i);
161  m_size--;
162  return true;
163 }
164 
165 void
167 {
168  NS_LOG_FUNCTION (this);
169  if (m_dsrNetworkQueue.empty ())
170  {
171  return;
172  }
173 
174  Time now = Simulator::Now ();
175  uint32_t n = 0;
176  for (std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin (); i != m_dsrNetworkQueue.end (); )
177  {
178  if (i->GetInsertedTimeStamp () + m_maxDelay > now)
179  {
180  i++;
181  }
182  else
183  {
184  NS_LOG_LOGIC ("Outdated packet");
185  i = m_dsrNetworkQueue.erase (i);
186  n++;
187  }
188  }
189  m_size -= n;
190 }
191 
192 uint32_t
194 {
195  NS_LOG_FUNCTION (this);
196  return m_size;
197 }
198 
199 void
201 {
202  NS_LOG_FUNCTION (this);
203  m_dsrNetworkQueue.erase (m_dsrNetworkQueue.begin (), m_dsrNetworkQueue.end ());
204  m_size = 0;
205 }
206 
207 } // namespace dsr
208 } // namespace ns3
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:79
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
uint32_t GetSize()
Number of entries.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
Definition: object-base.h:38
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
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.
DSR Network Queue Entry.
uint32_t GetMaxNetworkSize(void) const
Return the maximum queue size.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:233
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
bool FindPacketWithNexthop(Ipv4Address nextHop, DsrNetworkQueueEntry &entry)
void Cleanup(void)
Clean the queue by removing entries that exceeded lifetime.
uint32_t m_size
Current queue size.
void SetInsertedTimeStamp(Time time)
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:38
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:64
a unique identifier for an interface.
Definition: type-id.h:49
TypeId SetParent(TypeId tid)
Definition: type-id.cc:610
bool Find(Ipv4Address nextHop)