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 <algorithm>
35 #include <functional>
36 #include <map>
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  NS_LOG_FUNCTION (this << m_size << m_maxSize);
105  if (m_size >= m_maxSize)
106  {
107  return false;
108  }
109  Time now = Simulator::Now ();
110  entry.SetInsertedTimeStamp (now);
111  m_dsrNetworkQueue.push_back (entry);
112  m_size++;
113  NS_LOG_DEBUG ("The network queue size for now " << m_size);
114  return true;
115 }
116 
117 bool
119 {
120  NS_LOG_FUNCTION (this);
121  Cleanup ();
122  std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin ();
123  if (i == m_dsrNetworkQueue.end ())
124  {
125  // no elements in array
126  NS_LOG_DEBUG ("Does not find the queued packet in the network queue");
127  return false;
128  }
129  entry = *i;
130  m_dsrNetworkQueue.erase (i);
131  m_size--;
132  return true;
133 }
134 
135 void
137 {
138  NS_LOG_FUNCTION (this);
139  if (m_dsrNetworkQueue.empty ())
140  {
141  return;
142  }
143 
144  Time now = Simulator::Now ();
145  uint32_t n = 0;
146  for (std::vector<DsrNetworkQueueEntry>::iterator i = m_dsrNetworkQueue.begin (); i != m_dsrNetworkQueue.end (); )
147  {
148  if (i->GetInsertedTimeStamp () + m_maxDelay > now)
149  {
150  i++;
151  }
152  else
153  {
154  i = m_dsrNetworkQueue.erase (i);
155  n++;
156  }
157  }
158  m_size -= n;
159 }
160 
161 uint32_t
163 {
164  NS_LOG_FUNCTION (this);
165  return m_size;
166 }
167 
168 void
170 {
171  NS_LOG_FUNCTION (this);
172  m_dsrNetworkQueue.erase (m_dsrNetworkQueue.begin (), m_dsrNetworkQueue.end ());
173  m_size = 0;
174 }
175 
176 } // namespace dsr
177 } // namespace ns3