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 
44 using namespace ns3;
45 
46 NS_LOG_COMPONENT_DEFINE ("EpcTestS1uDownlink");
47 
48 
50 {
51  UeDlTestData (uint32_t n, uint32_t s);
52 
53  uint32_t numPkts;
54  uint32_t pktSize;
55 
58 };
59 
60 UeDlTestData::UeDlTestData (uint32_t n, uint32_t s)
61  : numPkts (n),
62  pktSize (s)
63 {
64 }
65 
67 {
68  std::vector<UeDlTestData> ues;
69 };
70 
71 
72 
73 class EpcS1uDlTestCase : public TestCase
74 {
75 public:
76  EpcS1uDlTestCase (std::string name, std::vector<EnbDlTestData> v);
77  virtual ~EpcS1uDlTestCase ();
78 
79 private:
80  virtual void DoRun (void);
81  std::vector<EnbDlTestData> m_enbDlTestData;
82 };
83 
84 
85 EpcS1uDlTestCase::EpcS1uDlTestCase (std::string name, std::vector<EnbDlTestData> v)
86  : TestCase (name),
87  m_enbDlTestData (v)
88 {
89 }
90 
92 {
93 }
94 
95 void
97 {
98  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
99  Ptr<Node> pgw = epcHelper->GetPgwNode ();
100 
101  // allow jumbo packets
102  Config::SetDefault ("ns3::CsmaNetDevice::Mtu", UintegerValue (30000));
103  Config::SetDefault ("ns3::PointToPointNetDevice::Mtu", UintegerValue (30000));
104  epcHelper->SetAttribute ("S1uLinkMtu", UintegerValue (30000));
105 
106  // Create a single RemoteHost
107  NodeContainer remoteHostContainer;
108  remoteHostContainer.Create (1);
109  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
110  InternetStackHelper internet;
111  internet.Install (remoteHostContainer);
112 
113  // Create the internet
114  PointToPointHelper p2ph;
115  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
116  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
117  Ipv4AddressHelper ipv4h;
118  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
119  ipv4h.Assign (internetDevices);
120 
121  // setup default gateway for the remote hosts
122  Ipv4StaticRoutingHelper ipv4RoutingHelper;
123  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
124 
125  // hardcoded UE addresses for now
126  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.255.255.0"), 1);
127 
128 
129 
130 
131  NodeContainer enbs;
132  uint16_t cellIdCounter = 0;
133 
134  for (std::vector<EnbDlTestData>::iterator enbit = m_enbDlTestData.begin ();
135  enbit < m_enbDlTestData.end ();
136  ++enbit)
137  {
138  Ptr<Node> enb = CreateObject<Node> ();
139  enbs.Add (enb);
140 
141  // we test EPC without LTE, hence we use:
142  // 1) a CSMA network to simulate the cell
143  // 2) a raw socket opened on the CSMA device to simulate the LTE socket
144 
145  uint16_t cellId = ++cellIdCounter;
146 
147  NodeContainer ues;
148  ues.Create (enbit->ues.size ());
149 
150  NodeContainer cell;
151  cell.Add (ues);
152  cell.Add (enb);
153 
154  CsmaHelper csmaCell;
155  NetDeviceContainer cellDevices = csmaCell.Install (cell);
156 
157  // the eNB's CSMA NetDevice acting as an LTE NetDevice.
158  Ptr<NetDevice> enbDevice = cellDevices.Get (cellDevices.GetN () - 1);
159 
160  // Note that the EpcEnbApplication won't care of the actual NetDevice type
161  epcHelper->AddEnb (enb, enbDevice, cellId);
162 
163  // Plug test RRC entity
165  NS_ASSERT_MSG (enbApp != 0, "cannot retrieve EpcEnbApplication");
166  Ptr<EpcTestRrc> rrc = CreateObject<EpcTestRrc> ();
167  rrc->SetS1SapProvider (enbApp->GetS1SapProvider ());
168  enbApp->SetS1SapUser (rrc->GetS1SapUser ());
169 
170  // we install the IP stack on UEs only
171  InternetStackHelper internet;
172  internet.Install (ues);
173 
174  // assign IP address to UEs, and install applications
175  for (uint32_t u = 0; u < ues.GetN (); ++u)
176  {
177  Ptr<NetDevice> ueLteDevice = cellDevices.Get (u);
178  Ipv4InterfaceContainer ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevice));
179 
180  Ptr<Node> ue = ues.Get (u);
181 
182  // disable IP Forwarding on the UE. This is because we use
183  // CSMA broadcast MAC addresses for this test. The problem
184  // won't happen with a LteUeNetDevice.
185  ue->GetObject<Ipv4> ()->SetAttribute ("IpForward", BooleanValue (false));
186 
187  uint16_t port = 1234;
188  PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
189  ApplicationContainer apps = packetSinkHelper.Install (ue);
190  apps.Start (Seconds (1.0));
191  apps.Stop (Seconds (10.0));
192  enbit->ues[u].serverApp = apps.Get (0)->GetObject<PacketSink> ();
193 
194  Time interPacketInterval = Seconds (0.01);
195  UdpEchoClientHelper client (ueIpIface.GetAddress (0), port);
196  client.SetAttribute ("MaxPackets", UintegerValue (enbit->ues[u].numPkts));
197  client.SetAttribute ("Interval", TimeValue (interPacketInterval));
198  client.SetAttribute ("PacketSize", UintegerValue (enbit->ues[u].pktSize));
199  apps = client.Install (remoteHost);
200  apps.Start (Seconds (2.0));
201  apps.Stop (Seconds (10.0));
202  enbit->ues[u].clientApp = apps.Get (0);
203 
204  uint64_t imsi = u+1;
205  epcHelper->AddUe (ueLteDevice, imsi);
206  epcHelper->ActivateEpsBearer (ueLteDevice, imsi, EpcTft::Default (), EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT));
207  enbApp->GetS1SapProvider ()->InitialUeMessage (imsi, (uint16_t) imsi);
208  }
209 
210  }
211 
212  Simulator::Run ();
213 
214  for (std::vector<EnbDlTestData>::iterator enbit = m_enbDlTestData.begin ();
215  enbit < m_enbDlTestData.end ();
216  ++enbit)
217  {
218  for (std::vector<UeDlTestData>::iterator ueit = enbit->ues.begin ();
219  ueit < enbit->ues.end ();
220  ++ueit)
221  {
222  NS_TEST_ASSERT_MSG_EQ (ueit->serverApp->GetTotalRx (), (ueit->numPkts) * (ueit->pktSize), "wrong total received bytes");
223  }
224  }
225 
226  Simulator::Destroy ();
227 }
228 
229 
230 
231 
232 
237 {
238 public:
240 
242 
244  : TestSuite ("epc-s1u-downlink", SYSTEM)
245 {
246  std::vector<EnbDlTestData> v1;
247  EnbDlTestData e1;
248  UeDlTestData f1 (1, 100);
249  e1.ues.push_back (f1);
250  v1.push_back (e1);
251  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 1UE", v1), TestCase::QUICK);
252 
253 
254  std::vector<EnbDlTestData> v2;
255  EnbDlTestData e2;
256  UeDlTestData f2_1 (1, 100);
257  e2.ues.push_back (f2_1);
258  UeDlTestData f2_2 (2, 200);
259  e2.ues.push_back (f2_2);
260  v2.push_back (e2);
261  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 2UEs", v2), TestCase::QUICK);
262 
263 
264  std::vector<EnbDlTestData> v3;
265  v3.push_back (e1);
266  v3.push_back (e2);
267  AddTestCase (new EpcS1uDlTestCase ("2 eNBs", v3), TestCase::QUICK);
268 
269 
270  EnbDlTestData e3;
271  UeDlTestData f3_1 (3, 50);
272  e3.ues.push_back (f3_1);
273  UeDlTestData f3_2 (5, 1472);
274  e3.ues.push_back (f3_2);
275  UeDlTestData f3_3 (1, 1);
276  e3.ues.push_back (f3_2);
277  std::vector<EnbDlTestData> v4;
278  v4.push_back (e3);
279  v4.push_back (e1);
280  v4.push_back (e2);
281  AddTestCase (new EpcS1uDlTestCase ("3 eNBs", v4), TestCase::QUICK);
282 
283  std::vector<EnbDlTestData> v5;
284  EnbDlTestData e5;
285  UeDlTestData f5 (10, 3000);
286  e5.ues.push_back (f5);
287  v5.push_back (e5);
288  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 10 pkts 3000 bytes each", v5), TestCase::QUICK);
289 
290  std::vector<EnbDlTestData> v6;
291  EnbDlTestData e6;
292  UeDlTestData f6 (50, 3000);
293  e6.ues.push_back (f6);
294  v6.push_back (e6);
295  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 50 pkts 3000 bytes each", v6), TestCase::QUICK);
296 
297  std::vector<EnbDlTestData> v7;
298  EnbDlTestData e7;
299  UeDlTestData f7 (10, 15000);
300  e7.ues.push_back (f7);
301  v7.push_back (e7);
302  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 10 pkts 15000 bytes each", v7), TestCase::QUICK);
303 
304  std::vector<EnbDlTestData> v8;
305  EnbDlTestData e8;
306  UeDlTestData f8 (100, 15000);
307  e8.ues.push_back (f8);
308  v8.push_back (e8);
309  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 100 pkts 15000 bytes each", v8), TestCase::QUICK);
310 }
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
an Inet address class
AttributeValue implementation for Boolean.
Definition: boolean.h:34
std::vector< EnbDlTestData > m_enbDlTestData
holds a vector of std::pair of Ptr and interface index.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:462
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:257
A suite of tests to run.
Definition: test.h:1333
Create an application which sends a UDP packet and waits for an echo of this packet.
virtual void AddUe(Ptr< NetDevice > ueLteDevice, uint64_t imsi)
Notify the EPC of the existance of a new UE which might attach at a later time.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
aggregate IP/TCP/UDP functionality to existing Nodes.
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::CsmaChannel with the attributes configured by CsmaHelper::SetChannelAttri...
Definition: csma-helper.cc:215
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
Build a set of PointToPointNetDevice objects.
encapsulates test code
Definition: test.h:1147
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
std::vector< UeDlTestData > ues
EpcS1uDlTestCase(std::string name, std::vector< EnbDlTestData > v)
uint16_t port
Definition: dsdv-manet.cc:44
uint32_t GetN(void) const
Get the number of Ptr stored in this container.
uint32_t GetN(void) const
Get the number of Ptr stored in this container.
Class for representing data rates.
Definition: data-rate.h:88
void SetS1SapUser(EpcEnbS1SapUser *s)
Set the S1 SAP User.
This class contains the specification of EPS Bearers.
Definition: eps-bearer.h:71
Ptr< Application > GetApplication(uint32_t index) const
Retrieve the index-th Application associated to this node.
Definition: node.cc:168
Ptr< PacketSink > serverApp
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite.
Definition: test.cc:298
AttributeValue implementation for Time.
Definition: nstime.h:957
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.
Ptr< Application > clientApp
Hold an unsigned integer type.
Definition: uinteger.h:44
#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:161
holds a vector of ns3::NetDevice pointers
UeDlTestData(uint32_t n, uint32_t s)
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
void SetS1SapProvider(EpcEnbS1SapProvider *s)
Set the S1 SAP Provider.
EpcEnbS1SapUser * GetS1SapUser()
virtual void AddEnb(Ptr< Node > enbNode, Ptr< NetDevice > lteEnbNetDevice, uint16_t cellId)
Add an eNB to the EPC.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:76
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
EpcEnbS1SapProvider * GetS1SapProvider()
build a set of CsmaNetDevice objects
Definition: csma-helper.h:46
#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:90
virtual Ipv4InterfaceContainer AssignUeIpv4Address(NetDeviceContainer ueDevices)
Assign IPv4 addresses to UE devices.
virtual void InitialUeMessage(uint64_t imsi, uint16_t rnti)=0
void AddNetworkRouteTo(Ipv4Address network, Ipv4Mask networkMask, Ipv4Address nextHop, uint32_t interface, uint32_t metric=0)
Add a network route to the static routing table.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
This application is installed inside eNBs and provides the bridge functionality for user data plane p...
virtual void DoRun(void)
Implementation to actually run this TestCase.
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
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...
Helper class that adds ns3::Ipv4StaticRouting objects.
AttributeValue implementation for DataRate.
Definition: data-rate.h:242
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:774
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Test that the S1-U interface implementation works correctly.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void SetAttribute(std::string name, const AttributeValue &value)
Record an attribute to be set in each Application after it is is created.
Receive and consume traffic generated to an IP address and port.
Definition: packet-sink.h:68
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:191
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const