author | Nicola Baldo <nbaldo@cttc.es> |
Mon, 03 Dec 2012 17:46:35 +0100 | |
changeset 9451 | 116fd6ad4640 |
parent 9414 | 7b0db3dbf19b |
child 9470 | 2f0bc0c5c7fe |
permissions | -rw-r--r-- |
8361 | 1 |
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 |
/* |
|
9406 | 3 |
* Copyright (c) 2011,2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC) |
8361 | 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: Manuel Requena <manuel.requena@cttc.es> |
|
9406 | 19 |
* Nicola Baldo <nbaldo@cttc.es> |
8361 | 20 |
*/ |
21 |
||
22 |
#include "ns3/simulator.h" |
|
23 |
#include "ns3/log.h" |
|
24 |
||
9406 | 25 |
#include "ns3/lte-rlc-tm.h" |
8375
201d78643209
Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents:
8361
diff
changeset
|
26 |
#include "ns3/lte-rlc-tag.h" |
8361 | 27 |
|
9406 | 28 |
NS_LOG_COMPONENT_DEFINE ("LteRlcTm"); |
8361 | 29 |
|
30 |
namespace ns3 { |
|
31 |
||
9406 | 32 |
NS_OBJECT_ENSURE_REGISTERED (LteRlcTm); |
8361 | 33 |
|
9406 | 34 |
LteRlcTm::LteRlcTm () |
35 |
: m_maxTxBufferSize (0), |
|
36 |
m_txBufferSize (0) |
|
8361 | 37 |
{ |
38 |
NS_LOG_FUNCTION (this); |
|
39 |
||
9406 | 40 |
Simulator::ScheduleNow (&LteRlcTm::Start, this); |
8361 | 41 |
} |
42 |
||
9406 | 43 |
LteRlcTm::~LteRlcTm () |
8361 | 44 |
{ |
45 |
} |
|
46 |
||
47 |
TypeId |
|
9406 | 48 |
LteRlcTm::GetTypeId (void) |
8361 | 49 |
{ |
9406 | 50 |
static TypeId tid = TypeId ("ns3::LteRlcTm") |
8361 | 51 |
.SetParent<LteRlc> () |
9406 | 52 |
.AddConstructor<LteRlcTm> () |
8745
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
53 |
.AddAttribute ("MaxTxBufferSize", |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
54 |
"Maximum Size of the Transmission Buffer (in Bytes)", |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
55 |
UintegerValue (2 * 1024 * 1024), |
9406 | 56 |
MakeUintegerAccessor (&LteRlcTm::m_maxTxBufferSize), |
8745
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
57 |
MakeUintegerChecker<uint32_t> ()) |
8361 | 58 |
; |
59 |
return tid; |
|
60 |
} |
|
61 |
||
9451
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
62 |
void |
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
63 |
LteRlcTm::DoDispose () |
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
64 |
{ |
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
65 |
NS_LOG_FUNCTION (this); |
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
66 |
m_rbsTimer.Cancel (); |
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
67 |
} |
116fd6ad4640
cancel pending events upon RLC disposal
Nicola Baldo <nbaldo@cttc.es>
parents:
9414
diff
changeset
|
68 |
|
8361 | 69 |
|
70 |
/** |
|
71 |
* RLC SAP |
|
72 |
*/ |
|
73 |
||
74 |
void |
|
9406 | 75 |
LteRlcTm::DoTransmitPdcpPdu (Ptr<Packet> p) |
8361 | 76 |
{ |
8708
108d9d416b4c
Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents:
8666
diff
changeset
|
77 |
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ()); |
8361 | 78 |
|
8745
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
79 |
if (m_txBufferSize + p->GetSize () <= m_maxTxBufferSize) |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
80 |
{ |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
81 |
/** Store arrival time */ |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
82 |
RlcTag timeTag (Simulator::Now ()); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
83 |
p->AddPacketTag (timeTag); |
8375
201d78643209
Add support for ReportBufferStatus parameters: txQueueSize and txQueueHolDelay
Manuel Requena <manuel.requena@cttc.es>
parents:
8361
diff
changeset
|
84 |
|
8745
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
85 |
NS_LOG_LOGIC ("Tx Buffer: New packet added"); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
86 |
m_txBuffer.push_back (p); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
87 |
m_txBufferSize += p->GetSize (); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
88 |
NS_LOG_LOGIC ("NumOfBuffers = " << m_txBuffer.size() ); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
89 |
NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
90 |
} |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
91 |
else |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
92 |
{ |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
93 |
// Discard full RLC SDU |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
94 |
NS_LOG_LOGIC ("TxBuffer is full. RLC SDU discarded"); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
95 |
NS_LOG_LOGIC ("MaxTxBufferSize = " << m_maxTxBufferSize); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
96 |
NS_LOG_LOGIC ("txBufferSize = " << m_txBufferSize); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
97 |
NS_LOG_LOGIC ("packet size = " << p->GetSize ()); |
b94de33b24d3
Add maximum size to the RLC Transmission Buffer
Manuel Requena <manuel.requena@cttc.es>
parents:
8726
diff
changeset
|
98 |
} |
8361 | 99 |
|
100 |
/** Report Buffer Status */ |
|
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
101 |
DoReportBufferStatus (); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
102 |
m_rbsTimer.Cancel (); |
8361 | 103 |
} |
104 |
||
105 |
||
106 |
/** |
|
107 |
* MAC SAP |
|
108 |
*/ |
|
109 |
||
110 |
void |
|
9414 | 111 |
LteRlcTm::DoNotifyTxOpportunity (uint32_t bytes, uint8_t layer, uint8_t harqId) |
8361 | 112 |
{ |
9414 | 113 |
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << bytes << (uint32_t) layer << (uint32_t) harqId); |
8361 | 114 |
|
9406 | 115 |
// 5.1.1.1 Transmit operations |
116 |
// 5.1.1.1.1 General |
|
117 |
// When submitting a new TMD PDU to lower layer, the transmitting TM RLC entity shall: |
|
118 |
// - submit a RLC SDU without any modification to lower layer. |
|
8361 | 119 |
|
120 |
||
121 |
if ( m_txBuffer.size () == 0 ) |
|
122 |
{ |
|
123 |
NS_LOG_LOGIC ("No data pending"); |
|
124 |
return; |
|
125 |
} |
|
126 |
||
9406 | 127 |
Ptr<Packet> packet = (*(m_txBuffer.begin ()))->Copy (); |
8361 | 128 |
|
9406 | 129 |
if (bytes < packet->GetSize ()) |
130 |
{ |
|
131 |
// Stingy MAC: Header fix part is 2 bytes, we need more bytes for the data |
|
132 |
NS_LOG_WARN ("TX opportunity too small = " << bytes << " (PDU size: " << packet->GetSize () << ")"); |
|
133 |
return; |
|
8361 | 134 |
} |
135 |
||
9406 | 136 |
m_txBufferSize -= (*(m_txBuffer.begin()))->GetSize (); |
137 |
m_txBuffer.erase (m_txBuffer.begin ()); |
|
138 |
||
8422 | 139 |
// Sender timestamp |
140 |
RlcTag rlcTag (Simulator::Now ()); |
|
141 |
packet->AddByteTag (rlcTag); |
|
142 |
m_txPdu (m_rnti, m_lcid, packet->GetSize ()); |
|
143 |
||
8361 | 144 |
// Send RLC PDU to MAC layer |
145 |
LteMacSapProvider::TransmitPduParameters params; |
|
146 |
params.pdu = packet; |
|
147 |
params.rnti = m_rnti; |
|
148 |
params.lcid = m_lcid; |
|
8714
398bbcbb3f42
Add MIMO model, test and documentation
Marco Miozzo <marco.miozzo@cttc.es>
parents:
8586
diff
changeset
|
149 |
params.layer = layer; |
9351
6e074e67a1ad
HARQ first draft version: RR works, PF todo, LteMiErrorModel on-going
mmiozzo
parents:
8745
diff
changeset
|
150 |
params.harqProcessId = harqId; |
8361 | 151 |
|
152 |
m_macSapProvider->TransmitPdu (params); |
|
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
153 |
|
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
154 |
if (! m_txBuffer.empty ()) |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
155 |
{ |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
156 |
m_rbsTimer.Cancel (); |
9406 | 157 |
m_rbsTimer = Simulator::Schedule (MilliSeconds (10), &LteRlcTm::ExpireRbsTimer, this); |
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
158 |
} |
8361 | 159 |
} |
160 |
||
161 |
void |
|
9406 | 162 |
LteRlcTm::DoNotifyHarqDeliveryFailure () |
8361 | 163 |
{ |
164 |
NS_LOG_FUNCTION (this); |
|
165 |
} |
|
166 |
||
167 |
void |
|
9406 | 168 |
LteRlcTm::DoReceivePdu (Ptr<Packet> p) |
8361 | 169 |
{ |
8708
108d9d416b4c
Add instance info for RlcUm
Manuel Requena <manuel.requena@cttc.es>
parents:
8666
diff
changeset
|
170 |
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize ()); |
8361 | 171 |
|
8422 | 172 |
// Receiver timestamp |
173 |
RlcTag rlcTag; |
|
174 |
Time delay; |
|
175 |
if (p->FindFirstMatchingByteTag (rlcTag)) |
|
176 |
{ |
|
177 |
delay = Simulator::Now() - rlcTag.GetSenderTimestamp (); |
|
178 |
} |
|
8666 | 179 |
m_rxPdu (m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds ()); |
8422 | 180 |
|
9406 | 181 |
// 5.1.1.2 Receive operations |
182 |
// 5.1.1.2.1 General |
|
183 |
// When receiving a new TMD PDU from lower layer, the receiving TM RLC entity shall: |
|
184 |
// - deliver the TMD PDU without any modification to upper layer. |
|
8361 | 185 |
|
9406 | 186 |
m_rlcSapUser->ReceivePdcpPdu (p); |
8361 | 187 |
} |
188 |
||
189 |
||
190 |
void |
|
9406 | 191 |
LteRlcTm::Start () |
8361 | 192 |
{ |
193 |
NS_LOG_FUNCTION (this); |
|
194 |
||
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
195 |
DoReportBufferStatus (); |
8361 | 196 |
} |
197 |
||
198 |
||
199 |
void |
|
9406 | 200 |
LteRlcTm::DoReportBufferStatus (void) |
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
201 |
{ |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
202 |
Time holDelay (0); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
203 |
uint32_t queueSize = 0; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
204 |
|
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
205 |
if (! m_txBuffer.empty ()) |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
206 |
{ |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
207 |
RlcTag holTimeTag; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
208 |
m_txBuffer.front ()->PeekPacketTag (holTimeTag); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
209 |
holDelay = Simulator::Now () - holTimeTag.GetSenderTimestamp (); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
210 |
|
9406 | 211 |
queueSize = m_txBufferSize; // just data in tx queue (no header overhead for RLC TM) |
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
212 |
} |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
213 |
|
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
214 |
LteMacSapProvider::ReportBufferStatusParameters r; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
215 |
r.rnti = m_rnti; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
216 |
r.lcid = m_lcid; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
217 |
r.txQueueSize = queueSize; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
218 |
r.txQueueHolDelay = holDelay.GetMilliSeconds () ; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
219 |
r.retxQueueSize = 0; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
220 |
r.retxQueueHolDelay = 0; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
221 |
r.statusPduSize = 0; |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
222 |
|
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
223 |
NS_LOG_LOGIC ("Send ReportBufferStatus = " << r.txQueueSize << ", " << r.txQueueHolDelay ); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
224 |
m_macSapProvider->ReportBufferStatus (r); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
225 |
} |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
226 |
|
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
227 |
void |
9406 | 228 |
LteRlcTm::ExpireRbsTimer (void) |
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
229 |
{ |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
230 |
NS_LOG_LOGIC ("RBS Timer expires"); |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
231 |
|
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
232 |
if (! m_txBuffer.empty ()) |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
233 |
{ |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
234 |
DoReportBufferStatus (); |
9406 | 235 |
m_rbsTimer = Simulator::Schedule (MilliSeconds (10), &LteRlcTm::ExpireRbsTimer, this); |
8499
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
236 |
} |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
237 |
} |
c2658133775b
Add timer to send RBS to MAC
Manuel Requena <manuel.requena@cttc.es>
parents:
8493
diff
changeset
|
238 |
|
8361 | 239 |
} // namespace ns3 |