1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
|
2 /* |
|
3 * Copyright (c) 2010 TELEMATICS LAB, DEE - Politecnico di Bari |
|
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: Giuseppe Piro <g.piro@poliba.it> |
|
19 */ |
|
20 |
|
21 #include "lte-mac-queue.h" |
|
22 #include "ns3/packet.h" |
|
23 #include "ns3/trace-source-accessor.h" |
|
24 #include "ns3/uinteger.h" |
|
25 #include "ns3/simulator.h" |
|
26 #include "ns3/log.h" |
|
27 |
|
28 NS_LOG_COMPONENT_DEFINE ("LteMacQueue"); |
|
29 |
|
30 namespace ns3 { |
|
31 |
|
32 NS_OBJECT_ENSURE_REGISTERED (LteMacQueue); |
|
33 |
|
34 LteMacQueue::QueueElement::QueueElement (void) |
|
35 : m_packet (Create<Packet> ()), |
|
36 m_timeStamp (Seconds (0)) |
|
37 { |
|
38 } |
|
39 |
|
40 |
|
41 LteMacQueue::QueueElement::QueueElement (Ptr<Packet> packet, Time timeStamp) |
|
42 : m_packet (packet), |
|
43 m_timeStamp (timeStamp) |
|
44 { |
|
45 } |
|
46 |
|
47 |
|
48 uint32_t |
|
49 LteMacQueue::QueueElement::GetSize (void) const |
|
50 { |
|
51 NS_LOG_FUNCTION (this); |
|
52 // XXX: ADD mac/RLC/CRC OVERHEADs ?!? |
|
53 uint32_t size = m_packet->GetSize (); |
|
54 return size; |
|
55 } |
|
56 |
|
57 |
|
58 TypeId |
|
59 LteMacQueue::GetTypeId (void) |
|
60 { |
|
61 static TypeId tid = TypeId ("ns3::LteMacQueue") |
|
62 .SetParent<Object> () |
|
63 .AddAttribute ( |
|
64 "MaxSize", |
|
65 "Maximum size", |
|
66 UintegerValue (1024), |
|
67 MakeUintegerAccessor (&LteMacQueue::GetMaxSize, |
|
68 &LteMacQueue::SetMaxSize), |
|
69 MakeUintegerChecker<uint32_t> ()) |
|
70 .AddTraceSource ("Enqueue", |
|
71 "Enqueue trace", |
|
72 MakeTraceSourceAccessor (&LteMacQueue::m_traceEnqueue)) |
|
73 .AddTraceSource ("Dequeue", |
|
74 "Dequeue trace", |
|
75 MakeTraceSourceAccessor (&LteMacQueue::m_traceDequeue)) |
|
76 .AddTraceSource ("Drop", |
|
77 "Drop trace", |
|
78 MakeTraceSourceAccessor (&LteMacQueue::m_traceDrop)) |
|
79 ; |
|
80 return tid; |
|
81 } |
|
82 |
|
83 |
|
84 LteMacQueue::LteMacQueue (void) |
|
85 : m_maxSize (0), |
|
86 m_bytes (0), |
|
87 m_nrDataPackets (0) |
|
88 { |
|
89 } |
|
90 |
|
91 |
|
92 LteMacQueue::LteMacQueue (uint32_t maxSize) |
|
93 : m_maxSize (maxSize), |
|
94 m_bytes (0), |
|
95 m_nrDataPackets (0) |
|
96 { |
|
97 } |
|
98 |
|
99 |
|
100 LteMacQueue::~LteMacQueue (void) |
|
101 { |
|
102 m_queue.clear (); |
|
103 } |
|
104 |
|
105 |
|
106 void |
|
107 LteMacQueue::SetMaxSize (uint32_t maxSize) |
|
108 { |
|
109 NS_LOG_FUNCTION (this); |
|
110 m_maxSize = maxSize; |
|
111 } |
|
112 |
|
113 |
|
114 uint32_t |
|
115 LteMacQueue::GetMaxSize (void) const |
|
116 { |
|
117 NS_LOG_FUNCTION (this); |
|
118 return m_maxSize; |
|
119 } |
|
120 |
|
121 |
|
122 bool |
|
123 LteMacQueue::Enqueue (Ptr<Packet> packet) |
|
124 { |
|
125 NS_LOG_FUNCTION (this << "queue size: " << m_queue.size ()); |
|
126 NS_LOG_FUNCTION (this << "packet size: " << packet->GetSize ()); |
|
127 if (m_queue.size () == m_maxSize) |
|
128 { |
|
129 m_traceDrop (packet); |
|
130 return false; |
|
131 } |
|
132 |
|
133 m_traceEnqueue (packet); |
|
134 QueueElement element (packet, Simulator::Now ()); |
|
135 m_queue.push_back (element); |
|
136 |
|
137 m_nrDataPackets++; |
|
138 m_bytes += element.GetSize (); |
|
139 |
|
140 NS_LOG_FUNCTION (this << "queue size: " << m_queue.size ()); |
|
141 return true; |
|
142 } |
|
143 |
|
144 |
|
145 Ptr<Packet> |
|
146 LteMacQueue::Dequeue (void) |
|
147 { |
|
148 NS_LOG_FUNCTION (this); |
|
149 if (!IsEmpty ()) |
|
150 { |
|
151 QueueElement element = Front (); |
|
152 Pop (); |
|
153 |
|
154 m_nrDataPackets--; |
|
155 |
|
156 Ptr<Packet> packet = element.m_packet; |
|
157 |
|
158 return packet; |
|
159 } |
|
160 |
|
161 return 0; |
|
162 } |
|
163 |
|
164 |
|
165 Ptr<Packet> |
|
166 LteMacQueue::Dequeue (uint32_t availableByte) |
|
167 { |
|
168 NS_LOG_FUNCTION (this << availableByte); |
|
169 /* |
|
170 This functiopn can be called when the UM of AM RLC mode are abilited. |
|
171 */ |
|
172 return 0; |
|
173 } |
|
174 |
|
175 |
|
176 Ptr<Packet> |
|
177 LteMacQueue::Peek (void) const |
|
178 { |
|
179 NS_LOG_FUNCTION (this); |
|
180 if (!IsEmpty ()) |
|
181 { |
|
182 QueueElement element = m_queue.front (); |
|
183 Ptr<Packet> packet = element.m_packet->Copy (); |
|
184 |
|
185 return packet; |
|
186 } |
|
187 |
|
188 return 0; |
|
189 } |
|
190 |
|
191 |
|
192 uint32_t |
|
193 LteMacQueue::GetSize (void) const |
|
194 { |
|
195 NS_LOG_FUNCTION (this); |
|
196 return m_queue.size (); |
|
197 } |
|
198 |
|
199 uint32_t |
|
200 LteMacQueue::GetNBytes (void) const |
|
201 { |
|
202 NS_LOG_FUNCTION (this); |
|
203 return m_bytes; |
|
204 } |
|
205 |
|
206 uint32_t |
|
207 LteMacQueue::GetQueueLengthWithMACOverhead (void) |
|
208 { |
|
209 NS_LOG_FUNCTION (this); |
|
210 uint32_t queueSize = GetNBytes (); |
|
211 // Add MAC/RLC/CRC Overhead |
|
212 queueSize += GetSize () * 0; // XXX |
|
213 |
|
214 return queueSize; |
|
215 } |
|
216 |
|
217 LteMacQueue::QueueElement |
|
218 LteMacQueue::Front (void) const |
|
219 { |
|
220 NS_LOG_FUNCTION (this); |
|
221 QueueElement element = m_queue.front (); |
|
222 return element; |
|
223 } |
|
224 |
|
225 void |
|
226 LteMacQueue::Pop (void) |
|
227 { |
|
228 NS_LOG_FUNCTION (this); |
|
229 m_queue.pop_front (); |
|
230 } |
|
231 |
|
232 bool |
|
233 LteMacQueue::IsEmpty (void) const |
|
234 { |
|
235 NS_LOG_FUNCTION (this); |
|
236 return m_queue.empty (); |
|
237 } |
|
238 |
|
239 |
|
240 const LteMacQueue::PacketQueue & |
|
241 LteMacQueue::GetPacketQueue (void) const |
|
242 { |
|
243 NS_LOG_FUNCTION (this); |
|
244 return m_queue; |
|
245 } |
|
246 |
|
247 |
|
248 } // namespace ns3 |
|