A Discrete-Event Network Simulator
API
lte-test-rlc-am-transmitter.cc
Go to the documentation of this file.
1/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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>
19 */
20
21#include "ns3/simulator.h"
22#include "ns3/log.h"
23
24#include "ns3/lte-rlc-header.h"
25#include "ns3/lte-rlc-am.h"
26
28#include "lte-test-entities.h"
29
30using namespace ns3;
31
32NS_LOG_COMPONENT_DEFINE ("LteRlcAmTransmitterTest");
33
39 : TestSuite ("lte-rlc-am-transmitter", SYSTEM)
40{
41 // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
42 // LogComponentEnable ("LteRlcAmTransmitterTest", logLevel);
43
44 AddTestCase (new LteRlcAmTransmitterOneSduTestCase ("One SDU, one PDU"), TestCase::QUICK);
45 AddTestCase (new LteRlcAmTransmitterSegmentationTestCase ("Segmentation"), TestCase::QUICK);
46 AddTestCase (new LteRlcAmTransmitterConcatenationTestCase ("Concatenation"), TestCase::QUICK);
47 AddTestCase (new LteRlcAmTransmitterReportBufferStatusTestCase ("ReportBufferStatus primitive"), TestCase::QUICK);
48
49}
50
52
53
55 : TestCase (name)
56{
57}
58
60{
61}
62
63void
65{
66 // LogLevel logLevel = (LogLevel)(LOG_PREFIX_FUNC | LOG_PREFIX_TIME | LOG_LEVEL_ALL);
67 // LogComponentEnable ("LteRlcAmTransmitterTest", logLevel);
68 // LogComponentEnable ("LteTestEntities", logLevel);
69 // LogComponentEnable ("LteRlc", logLevel);
70 // LogComponentEnable ("LteRlcAm", logLevel);
71 // LogComponentEnable ("LteRlcHeader", logLevel);
72
73 uint16_t rnti = 1111;
74 uint8_t lcid = 222;
75
76 Packet::EnablePrinting ();
77
78 // Create topology
79
80 // Create transmission PDCP test entity
81 txPdcp = CreateObject<LteTestPdcp> ();
82
83 // Create transmission RLC entity
84 txRlc = CreateObject<LteRlcAm> ();
85 txRlc->SetRnti (rnti);
86 txRlc->SetLcId (lcid);
87
88 // Create transmission MAC test entity
89 txMac = CreateObject<LteTestMac> ();
90 txMac->SetRlcHeaderType (LteTestMac::AM_RLC_HEADER);
91
92 // Connect SAPs: PDCP (TX) <-> RLC (Tx) <-> MAC (Tx)
95
98
99}
100
101void
102LteRlcAmTransmitterTestCase::CheckDataReceived (Time time, std::string shouldReceived, std::string assertMsg)
103{
104 Simulator::Schedule (time, &LteRlcAmTransmitterTestCase::DoCheckDataReceived, this, shouldReceived, assertMsg);
105}
106
107void
108LteRlcAmTransmitterTestCase::DoCheckDataReceived (std::string shouldReceived, std::string assertMsg)
109{
110 NS_TEST_ASSERT_MSG_EQ (shouldReceived, txMac->GetDataReceived (), assertMsg);
111}
112
113
119{
120}
121
123{
124}
125
126void
128{
129 // Create topology
131
132 //
133 // a) One SDU generates one PDU
134 //
135
136 // PDCP entity sends data
137 txPdcp->SendData (Seconds (0.100), "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
138
139 txMac->SendTxOpportunity (Seconds (0.150), 30);
140 CheckDataReceived (Seconds (0.200), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "SDU is not OK");
141
142 Simulator::Stop (Seconds (0.3));
144 Simulator::Destroy ();
145}
146
152{
153}
154
156{
157}
158
159void
161{
162 // Create topology
164
165 //
166 // b) Segmentation: one SDU generates n PDUs
167 //
168
169 // PDCP entity sends data
170 txPdcp->SendData (Seconds (0.100), "ABCDEFGHIJKLMNOPQRSTUVWXYZZ");
171
172 // MAC entity sends small TxOpp to RLC entity generating four segments
173 txMac->SendTxOpportunity (Seconds (0.150), 12);
174 CheckDataReceived (Seconds (0.200), "ABCDEFGH", "Segment #1 is not OK");
175
176 txMac->SendTxOpportunity (Seconds (0.250), 12);
177 CheckDataReceived (Seconds (0.300), "IJKLMNOP", "Segment #2 is not OK");
178
179 txMac->SendTxOpportunity (Seconds (0.350), 12);
180 CheckDataReceived (Seconds (0.400), "QRSTUVWX", "Segment #3 is not OK");
181
182 txMac->SendTxOpportunity (Seconds (0.450), 7);
183 CheckDataReceived (Seconds (0.500), "YZZ", "Segment #4 is not OK");
184
185 Simulator::Stop (Seconds (0.6));
187 Simulator::Destroy ();
188}
189
195{
196}
197
199{
200}
201
202void
204{
205 // Create topology
207
208 //
209 // c) Concatenation: n SDUs generate one PDU
210 //
211
212 // PDCP entity sends three data packets
213 txPdcp->SendData (Seconds (0.100), "ABCDEFGH");
214 txPdcp->SendData (Seconds (0.150), "IJKLMNOPQR");
215 txPdcp->SendData (Seconds (0.200), "STUVWXYZ");
216
217 // MAC entity sends TxOpp to RLC entity generating only one concatenated PDU
218
219 txMac->SendTxOpportunity (Seconds (0.250), 33);
220 CheckDataReceived (Seconds (0.300), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "Concatenation is not OK");
221
222 Simulator::Stop (Seconds (0.4));
224 Simulator::Destroy ();
225}
226
232{
233}
234
236{
237}
238
239void
241{
242 // Create topology
244
245 //
246 // d) Test the parameters of the ReportBufferStatus primitive
247 //
248
249// txMac->SendTxOpportunity (Seconds (0.1), (2+2) + (10+6));
250
251 // PDCP entity sends data
252 txPdcp->SendData (Seconds (0.100), "ABCDEFGHIJ"); // 10
253 txPdcp->SendData (Seconds (0.150), "KLMNOPQRS"); // 9
254 txPdcp->SendData (Seconds (0.200), "TUVWXYZ"); // 7
255
256 txMac->SendTxOpportunity (Seconds (0.250), (4+2) + (10+6));
257 CheckDataReceived (Seconds (0.300), "ABCDEFGHIJKLMNOP", "SDU #1 is not OK");
258
259 txPdcp->SendData (Seconds (0.350), "ABCDEFGH"); // 8
260 txPdcp->SendData (Seconds (0.400), "IJKLMNOPQRST"); // 12
261 txPdcp->SendData (Seconds (0.450), "UVWXYZ"); // 6
262
263 txMac->SendTxOpportunity (Seconds (0.500), 4 + 3);
264 CheckDataReceived (Seconds (0.550), "QRS", "SDU #2 is not OK");
265
266 txPdcp->SendData (Seconds (0.600), "ABCDEFGH"); // 8
267 txPdcp->SendData (Seconds (0.650), "IJKLMNOPQRST"); // 12
268 txPdcp->SendData (Seconds (0.700), "UVWXYZ"); // 6
269
270 txPdcp->SendData (Seconds (0.750), "ABCDEFGHIJ"); // 10
271 txPdcp->SendData (Seconds (0.800), "KLMNOPQRST"); // 10
272 txPdcp->SendData (Seconds (0.850), "UVWXYZ"); // 6
273
274 txMac->SendTxOpportunity (Seconds (0.900), 4 + 7);
275 CheckDataReceived (Seconds (0.950), "TUVWXYZ", "SDU #3 is not OK");
276
277 txMac->SendTxOpportunity (Seconds (1.000), (4+2) + (8+2));
278 CheckDataReceived (Seconds (1.050), "ABCDEFGHIJ", "SDU #4 is not OK");
279
280 txPdcp->SendData (Seconds (1.100), "ABCDEFGHIJ"); // 10
281 txPdcp->SendData (Seconds (1.150), "KLMNOPQRSTU"); // 11
282 txPdcp->SendData (Seconds (1.200), "VWXYZ"); // 5
283
284 txMac->SendTxOpportunity (Seconds (1.250), 4 + 3);
285 CheckDataReceived (Seconds (1.300), "KLM", "SDU #5 is not OK");
286
287 txMac->SendTxOpportunity (Seconds (1.350), 4 + 3);
288 CheckDataReceived (Seconds (1.400), "NOP", "SDU #6 is not OK");
289
290 txMac->SendTxOpportunity (Seconds (1.450), 4 + 4);
291 CheckDataReceived (Seconds (1.500), "QRST", "SDU #7 is not OK");
292
293 txMac->SendTxOpportunity (Seconds (1.550), (4+2+1+2+1+2+1) + (6+8+12+6+10+10+3));
294 CheckDataReceived (Seconds (1.600), "UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW", "SDU #8 is not OK");
295
296 txMac->SendTxOpportunity (Seconds (1.650), (4+2+1+2) + (3+10+10+7));
297 CheckDataReceived (Seconds (1.700), "XYZABCDEFGHIJKLMNOPQRSTUVWXYZ", "SDU #9 is not OK");
298
299 Simulator::Stop (Seconds (2));
301 Simulator::Destroy ();
302}
void Run(ObjectFactory &factory, uint32_t pop, uint32_t total, uint32_t runs, Ptr< RandomVariableStream > eventStream, bool calRev)
Perform the runs for a single scheduler type.
Test 4.1.1.3 Test that concatenation functionality works properly.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Test 4.1.1.1 Test that SDU transmitted at PDCP corresponds to PDU received by MAC.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Test 4.1.1.4 Test checks functionality of Report Buffer Status by testing primitive parameters.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Test 4.1.1.2 Test the correct functionality of the Segmentation.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Test case used by LteRlcAmTransmitterOneSduTestCase to create topology and to implement functionaliti...
Ptr< LteTestPdcp > txPdcp
the transmit PDCP
virtual void DoRun(void)
Implementation to actually run this TestCase.
void CheckDataReceived(Time time, std::string shouldReceived, std::string assertMsg)
Check data received function.
void DoCheckDataReceived(std::string shouldReceived, std::string assertMsg)
Check data received function.
TestSuite 4.1.1 RLC AM: Only transmitter functionality.
LteRlcAmTransmitterTestSuite()
TestSuite 4.1.1 RLC AM: Only transmitter.
void SetLteRlcSapUser(LteRlcSapUser *s)
Definition: lte-rlc.cc:147
void SetRnti(uint16_t rnti)
Definition: lte-rlc.cc:133
void SetLteMacSapProvider(LteMacSapProvider *s)
Definition: lte-rlc.cc:161
LteMacSapUser * GetLteMacSapUser()
Definition: lte-rlc.cc:168
void SetLcId(uint8_t lcId)
Definition: lte-rlc.cc:140
LteRlcSapProvider * GetLteRlcSapProvider()
Definition: lte-rlc.cc:154
void SendTxOpportunity(Time time, uint32_t bytes)
Send transmit opportunity function.
void SetLteMacSapUser(LteMacSapUser *s)
Set the MAC SAP user.
LteMacSapProvider * GetLteMacSapProvider(void)
Get the MAC SAP provider.
void SetRlcHeaderType(uint8_t rlcHeaderType)
Set RLC header type.
std::string GetDataReceived(void)
Get data received function.
LteRlcSapUser * GetLteRlcSapUser(void)
Get the RLC SAP user.
void SetLteRlcSapProvider(LteRlcSapProvider *s)
Set the RLC SAP provider.
void SendData(Time time, std::string dataToSend)
Send data function.
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:206
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:141
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1245
static LteRlcAmTransmitterTestSuite lteRlcAmTransmitterTestSuite
Every class exported by the ns3 library is enclosed in the ns3 namespace.