A Discrete-Event Network Simulator
API
epc-test-s1u-downlink.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: Nicola Baldo <nbaldo@cttc.es>
19 */
20
21
22
23#include "ns3/simulator.h"
24#include "ns3/log.h"
25#include "ns3/test.h"
26#include "ns3/point-to-point-epc-helper.h"
27#include "ns3/epc-enb-application.h"
28#include "ns3/packet-sink-helper.h"
29#include "ns3/udp-echo-helper.h"
30#include "ns3/point-to-point-helper.h"
31#include "ns3/csma-helper.h"
32#include "ns3/internet-stack-helper.h"
33#include "ns3/ipv4-address-helper.h"
34#include "ns3/inet-socket-address.h"
35#include "ns3/packet-sink.h"
36#include <ns3/ipv4-static-routing-helper.h>
37#include <ns3/ipv4-static-routing.h>
38#include "ns3/boolean.h"
39#include "ns3/uinteger.h"
40#include "ns3/config.h"
41#include "ns3/eps-bearer.h"
42#include "lte-test-entities.h"
43
44using namespace ns3;
45
46NS_LOG_COMPONENT_DEFINE ("EpcTestS1uDownlink");
47
48
56{
64
67
70};
71
73 : numPkts (n),
74 pktSize (s)
75{
76}
77
86{
87 std::vector<UeDlTestData> ues;
88};
89
90
91
99{
100public:
107 EpcS1uDlTestCase (std::string name, std::vector<EnbDlTestData> v);
108 virtual ~EpcS1uDlTestCase ();
109
110private:
111 virtual void DoRun (void);
112 std::vector<EnbDlTestData> m_enbDlTestData;
113};
114
115
116EpcS1uDlTestCase::EpcS1uDlTestCase (std::string name, std::vector<EnbDlTestData> v)
117 : TestCase (name),
118 m_enbDlTestData (v)
119{
120}
121
123{
124}
125void
127{
128 Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
129 Ptr<Node> pgw = epcHelper->GetPgwNode ();
130
131 // allow jumbo packets
132 Config::SetDefault ("ns3::CsmaNetDevice::Mtu", UintegerValue (30000));
133 Config::SetDefault ("ns3::PointToPointNetDevice::Mtu", UintegerValue (30000));
134 epcHelper->SetAttribute ("S1uLinkMtu", UintegerValue (30000));
135
136 // Create a single RemoteHost
137 NodeContainer remoteHostContainer;
138 remoteHostContainer.Create (1);
139 Ptr<Node> remoteHost = remoteHostContainer.Get (0);
140 InternetStackHelper internet;
141 internet.Install (remoteHostContainer);
142
143 // Create the internet
145 p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
146 NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
147 Ipv4AddressHelper ipv4h;
148 ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
149 ipv4h.Assign (internetDevices);
150
151 // setup default gateway for the remote hosts
152 Ipv4StaticRoutingHelper ipv4RoutingHelper;
153 Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
154
155 // hardcoded UE addresses for now
156 remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.255.255.0"), 1);
157
158
159
160
161 NodeContainer enbs;
162 uint16_t cellIdCounter = 0;
163 uint64_t imsiCounter = 0;
164
165 for (std::vector<EnbDlTestData>::iterator enbit = m_enbDlTestData.begin ();
166 enbit < m_enbDlTestData.end ();
167 ++enbit)
168 {
169 Ptr<Node> enb = CreateObject<Node> ();
170 enbs.Add (enb);
171
172 // we test EPC without LTE, hence we use:
173 // 1) a CSMA network to simulate the cell
174 // 2) a raw socket opened on the CSMA device to simulate the LTE socket
175
176 uint16_t cellId = ++cellIdCounter;
177
178 NodeContainer ues;
179 ues.Create (enbit->ues.size ());
180
181 NodeContainer cell;
182 cell.Add (ues);
183 cell.Add (enb);
184
185 CsmaHelper csmaCell;
186 NetDeviceContainer cellDevices = csmaCell.Install (cell);
187
188 // the eNB's CSMA NetDevice acting as an LTE NetDevice.
189 Ptr<NetDevice> enbDevice = cellDevices.Get (cellDevices.GetN () - 1);
190
191 // Note that the EpcEnbApplication won't care of the actual NetDevice type
192 std::vector<uint16_t> cellIds;
193 cellIds.push_back (cellId);
194 epcHelper->AddEnb (enb, enbDevice, cellIds);
195
196 // Plug test RRC entity
198 NS_ASSERT_MSG (enbApp != 0, "cannot retrieve EpcEnbApplication");
199 Ptr<EpcTestRrc> rrc = CreateObject<EpcTestRrc> ();
200 enb->AggregateObject (rrc);
201 rrc->SetS1SapProvider (enbApp->GetS1SapProvider ());
202 enbApp->SetS1SapUser (rrc->GetS1SapUser ());
203
204 // we install the IP stack on UEs only
205 InternetStackHelper internet;
206 internet.Install (ues);
207
208 // assign IP address to UEs, and install applications
209 for (uint32_t u = 0; u < ues.GetN (); ++u)
210 {
211 Ptr<NetDevice> ueLteDevice = cellDevices.Get (u);
212 Ipv4InterfaceContainer ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevice));
213
214 Ptr<Node> ue = ues.Get (u);
215
216 // disable IP Forwarding on the UE. This is because we use
217 // CSMA broadcast MAC addresses for this test. The problem
218 // won't happen with a LteUeNetDevice.
219 ue->GetObject<Ipv4> ()->SetAttribute ("IpForward", BooleanValue (false));
220
221 uint16_t port = 1234;
222 PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
223 ApplicationContainer apps = packetSinkHelper.Install (ue);
224 apps.Start (Seconds (1.0));
225 apps.Stop (Seconds (10.0));
226 enbit->ues[u].serverApp = apps.Get (0)->GetObject<PacketSink> ();
227
228 Time interPacketInterval = Seconds (0.01);
229 UdpEchoClientHelper client (ueIpIface.GetAddress (0), port);
230 client.SetAttribute ("MaxPackets", UintegerValue (enbit->ues[u].numPkts));
231 client.SetAttribute ("Interval", TimeValue (interPacketInterval));
232 client.SetAttribute ("PacketSize", UintegerValue (enbit->ues[u].pktSize));
233 apps = client.Install (remoteHost);
234 apps.Start (Seconds (2.0));
235 apps.Stop (Seconds (10.0));
236 enbit->ues[u].clientApp = apps.Get (0);
237
238 uint64_t imsi = ++imsiCounter;
239 epcHelper->AddUe (ueLteDevice, imsi);
240 epcHelper->ActivateEpsBearer (ueLteDevice, imsi, EpcTft::Default (), EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT));
241 Simulator::Schedule (MilliSeconds (10),
242 &EpcEnbS1SapProvider::InitialUeMessage,
243 enbApp->GetS1SapProvider (), imsi, (uint16_t) imsi);
244 }
245
246 }
247
248 Simulator::Run ();
249
250 for (std::vector<EnbDlTestData>::iterator enbit = m_enbDlTestData.begin ();
251 enbit < m_enbDlTestData.end ();
252 ++enbit)
253 {
254 for (std::vector<UeDlTestData>::iterator ueit = enbit->ues.begin ();
255 ueit < enbit->ues.end ();
256 ++ueit)
257 {
258 NS_TEST_ASSERT_MSG_EQ (ueit->serverApp->GetTotalRx (), (ueit->numPkts) * (ueit->pktSize), "wrong total received bytes");
259 }
260 }
261
262 Simulator::Destroy ();
263}
264
265
266
267
268
273{
274public:
276
278
280 : TestSuite ("epc-s1u-downlink", SYSTEM)
281{
282 std::vector<EnbDlTestData> v1;
283 EnbDlTestData e1;
284 UeDlTestData f1 (1, 100);
285 e1.ues.push_back (f1);
286 v1.push_back (e1);
287 AddTestCase (new EpcS1uDlTestCase ("1 eNB, 1UE", v1), TestCase::QUICK);
288
289
290 std::vector<EnbDlTestData> v2;
291 EnbDlTestData e2;
292 UeDlTestData f2_1 (1, 100);
293 e2.ues.push_back (f2_1);
294 UeDlTestData f2_2 (2, 200);
295 e2.ues.push_back (f2_2);
296 v2.push_back (e2);
297 AddTestCase (new EpcS1uDlTestCase ("1 eNB, 2UEs", v2), TestCase::QUICK);
298
299
300 std::vector<EnbDlTestData> v3;
301 v3.push_back (e1);
302 v3.push_back (e2);
303 AddTestCase (new EpcS1uDlTestCase ("2 eNBs", v3), TestCase::QUICK);
304
305
306 EnbDlTestData e3;
307 UeDlTestData f3_1 (3, 50);
308 e3.ues.push_back (f3_1);
309 UeDlTestData f3_2 (5, 1472);
310 e3.ues.push_back (f3_2);
311 UeDlTestData f3_3 (1, 1);
312 e3.ues.push_back (f3_2);
313 std::vector<EnbDlTestData> v4;
314 v4.push_back (e3);
315 v4.push_back (e1);
316 v4.push_back (e2);
317 AddTestCase (new EpcS1uDlTestCase ("3 eNBs", v4), TestCase::QUICK);
318
319 std::vector<EnbDlTestData> v5;
320 EnbDlTestData e5;
321 UeDlTestData f5 (10, 3000);
322 e5.ues.push_back (f5);
323 v5.push_back (e5);
324 AddTestCase (new EpcS1uDlTestCase ("1 eNB, 10 pkts 3000 bytes each", v5), TestCase::QUICK);
325
326 std::vector<EnbDlTestData> v6;
327 EnbDlTestData e6;
328 UeDlTestData f6 (50, 3000);
329 e6.ues.push_back (f6);
330 v6.push_back (e6);
331 AddTestCase (new EpcS1uDlTestCase ("1 eNB, 50 pkts 3000 bytes each", v6), TestCase::QUICK);
332
333 std::vector<EnbDlTestData> v7;
334 EnbDlTestData e7;
335 UeDlTestData f7 (10, 15000);
336 e7.ues.push_back (f7);
337 v7.push_back (e7);
338 AddTestCase (new EpcS1uDlTestCase ("1 eNB, 10 pkts 15000 bytes each", v7), TestCase::QUICK);
339
340 std::vector<EnbDlTestData> v8;
341 EnbDlTestData e8;
342 UeDlTestData f8 (100, 15000);
343 e8.ues.push_back (f8);
344 v8.push_back (e8);
345 AddTestCase (new EpcS1uDlTestCase ("1 eNB, 100 pkts 15000 bytes each", v8), TestCase::QUICK);
346}
347
EpcS1uDlTestCase class.
std::vector< EnbDlTestData > m_enbDlTestData
ENB DL test data.
virtual void DoRun(void)
Implementation to actually run this TestCase.
EpcS1uDlTestCase(std::string name, std::vector< EnbDlTestData > v)
Constructor.
Test that the S1-U interface implementation works correctly.
holds a vector of ns3::Application pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
build a set of CsmaNetDevice objects
Definition: csma-helper.h:47
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::CsmaChannel with the attributes configured by CsmaHelper::SetChannelAttri...
Definition: csma-helper.cc:225
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
This application is installed inside eNBs and provides the bridge functionality for user data plane p...
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:92
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:77
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:256
Helper class that adds ns3::Ipv4StaticRouting objects.
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Try and find the static routing protocol as either the main routing protocol or in the list of routin...
holds a vector of ns3::NetDevice pointers
uint32_t GetN(void) const
Get the number of Ptr<NetDevice> stored in this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
virtual Ptr< Node > GetPgwNode() const
Get the PGW node.
virtual uint8_t ActivateEpsBearer(Ptr< NetDevice > ueLteDevice, uint64_t imsi, Ptr< EpcTft > tft, EpsBearer bearer)
Activate an EPS bearer, setting up the corresponding S1-U tunnel.
virtual void AddUe(Ptr< NetDevice > ueLteDevice, uint64_t imsi)
Notify the EPC of the existence of a new UE which might attach at a later time.
virtual Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices)
Assign IPv4 addresses to UE devices.
keep track of a set of node pointers.
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< Application > GetApplication(uint32_t index) const
Retrieve the index-th Application associated to this node.
Definition: node.cc:170
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:256
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
Definition: object.cc:252
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
Receive and consume traffic generated to an IP address and port.
Definition: packet-sink.h:72
virtual void AddEnb(Ptr< Node > enbNode, Ptr< NetDevice > lteEnbNetDevice, std::vector< uint16_t > cellIds)
Add an eNB to the EPC.
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
NetDeviceContainer Install(NodeContainer c)
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:103
AttributeValue implementation for Time.
Definition: nstime.h:1308
Create an application which sends a UDP packet and waits for an echo of this packet.
void SetAttribute(std::string name, const AttributeValue &value)
Record an attribute to be set in each Application after it is is created.
ApplicationContainer Install(Ptr< Node > node) const
Create a udp echo client application on the specified node.
Hold an unsigned integer type.
Definition: uinteger.h:44
uint16_t port
Definition: dsdv-manet.cc:45
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#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:1244
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1252
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Custom structure for testing eNodeB downlink data, contains the list of data structures for UEs.
std::vector< UeDlTestData > ues
list of data structure for different UEs
Custom structure for testing UE downlink data.
uint32_t pktSize
packet size
UeDlTestData(uint32_t n, uint32_t s)
Constructor.
uint32_t numPkts
number of packets
Ptr< Application > clientApp
Client application.
Ptr< PacketSink > serverApp
Server application.
uint32_t pktSize
packet size used for the simulation (in bytes)
Definition: wifi-bianchi.cc:89