A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
47 NS_LOG_COMPONENT_DEFINE ("EpcTestS1uDownlink");
48 
49 
50 
52 {
53  UeDlTestData (uint32_t n, uint32_t s);
54 
55  uint32_t numPkts;
56  uint32_t pktSize;
57 
60 };
61 
62 UeDlTestData::UeDlTestData (uint32_t n, uint32_t s)
63  : numPkts (n),
64  pktSize (s)
65 {
66 }
67 
69 {
70  std::vector<UeDlTestData> ues;
71 };
72 
73 
74 
75 class EpcS1uDlTestCase : public TestCase
76 {
77 public:
78  EpcS1uDlTestCase (std::string name, std::vector<EnbDlTestData> v);
79  virtual ~EpcS1uDlTestCase ();
80 
81 private:
82  virtual void DoRun (void);
83  std::vector<EnbDlTestData> m_enbDlTestData;
84 };
85 
86 
87 EpcS1uDlTestCase::EpcS1uDlTestCase (std::string name, std::vector<EnbDlTestData> v)
88  : TestCase (name),
89  m_enbDlTestData (v)
90 {
91 }
92 
94 {
95 }
96 
97 void
99 {
100  Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
101  Ptr<Node> pgw = epcHelper->GetPgwNode ();
102 
103  // allow jumbo packets
104  Config::SetDefault ("ns3::CsmaNetDevice::Mtu", UintegerValue (30000));
105  Config::SetDefault ("ns3::PointToPointNetDevice::Mtu", UintegerValue (30000));
106  epcHelper->SetAttribute ("S1uLinkMtu", UintegerValue (30000));
107 
108  // Create a single RemoteHost
109  NodeContainer remoteHostContainer;
110  remoteHostContainer.Create (1);
111  Ptr<Node> remoteHost = remoteHostContainer.Get (0);
112  InternetStackHelper internet;
113  internet.Install (remoteHostContainer);
114 
115  // Create the internet
116  PointToPointHelper p2ph;
117  p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
118  NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
119  Ipv4AddressHelper ipv4h;
120  ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
121  ipv4h.Assign (internetDevices);
122 
123  // setup default gateway for the remote hosts
124  Ipv4StaticRoutingHelper ipv4RoutingHelper;
125  Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
126 
127  // hardcoded UE addresses for now
128  remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.255.255.0"), 1);
129 
130 
131 
132 
133  NodeContainer enbs;
134  uint16_t cellIdCounter = 0;
135 
136  for (std::vector<EnbDlTestData>::iterator enbit = m_enbDlTestData.begin ();
137  enbit < m_enbDlTestData.end ();
138  ++enbit)
139  {
140  Ptr<Node> enb = CreateObject<Node> ();
141  enbs.Add (enb);
142 
143  // we test EPC without LTE, hence we use:
144  // 1) a CSMA network to simulate the cell
145  // 2) a raw socket opened on the CSMA device to simulate the LTE socket
146 
147  uint16_t cellId = ++cellIdCounter;
148 
149  NodeContainer ues;
150  ues.Create (enbit->ues.size ());
151 
152  NodeContainer cell;
153  cell.Add (ues);
154  cell.Add (enb);
155 
156  CsmaHelper csmaCell;
157  NetDeviceContainer cellDevices = csmaCell.Install (cell);
158 
159  // the eNB's CSMA NetDevice acting as an LTE NetDevice.
160  Ptr<NetDevice> enbDevice = cellDevices.Get (cellDevices.GetN () - 1);
161 
162  // Note that the EpcEnbApplication won't care of the actual NetDevice type
163  epcHelper->AddEnb (enb, enbDevice, cellId);
164 
165  // Plug test RRC entity
167  NS_ASSERT_MSG (enbApp != 0, "cannot retrieve EpcEnbApplication");
168  Ptr<EpcTestRrc> rrc = CreateObject<EpcTestRrc> ();
169  rrc->SetS1SapProvider (enbApp->GetS1SapProvider ());
170  enbApp->SetS1SapUser (rrc->GetS1SapUser ());
171 
172  // we install the IP stack on UEs only
173  InternetStackHelper internet;
174  internet.Install (ues);
175 
176  // assign IP address to UEs, and install applications
177  for (uint32_t u = 0; u < ues.GetN (); ++u)
178  {
179  Ptr<NetDevice> ueLteDevice = cellDevices.Get (u);
180  Ipv4InterfaceContainer ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevice));
181 
182  Ptr<Node> ue = ues.Get (u);
183 
184  // disable IP Forwarding on the UE. This is because we use
185  // CSMA broadcast MAC addresses for this test. The problem
186  // won't happen with a LteUeNetDevice.
187  ue->GetObject<Ipv4> ()->SetAttribute ("IpForward", BooleanValue (false));
188 
189  uint16_t port = 1234;
190  PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
191  ApplicationContainer apps = packetSinkHelper.Install (ue);
192  apps.Start (Seconds (1.0));
193  apps.Stop (Seconds (10.0));
194  enbit->ues[u].serverApp = apps.Get (0)->GetObject<PacketSink> ();
195 
196  Time interPacketInterval = Seconds (0.01);
197  UdpEchoClientHelper client (ueIpIface.GetAddress (0), port);
198  client.SetAttribute ("MaxPackets", UintegerValue (enbit->ues[u].numPkts));
199  client.SetAttribute ("Interval", TimeValue (interPacketInterval));
200  client.SetAttribute ("PacketSize", UintegerValue (enbit->ues[u].pktSize));
201  apps = client.Install (remoteHost);
202  apps.Start (Seconds (2.0));
203  apps.Stop (Seconds (10.0));
204  enbit->ues[u].clientApp = apps.Get (0);
205 
206  uint64_t imsi = u+1;
207  epcHelper->AddUe (ueLteDevice, imsi);
208  epcHelper->ActivateEpsBearer (ueLteDevice, imsi, EpcTft::Default (), EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT));
209  enbApp->GetS1SapProvider ()->InitialUeMessage (imsi, (uint16_t) imsi);
210  }
211 
212  }
213 
214  Simulator::Run ();
215 
216  for (std::vector<EnbDlTestData>::iterator enbit = m_enbDlTestData.begin ();
217  enbit < m_enbDlTestData.end ();
218  ++enbit)
219  {
220  for (std::vector<UeDlTestData>::iterator ueit = enbit->ues.begin ();
221  ueit < enbit->ues.end ();
222  ++ueit)
223  {
224  NS_TEST_ASSERT_MSG_EQ (ueit->serverApp->GetTotalRx (), (ueit->numPkts) * (ueit->pktSize), "wrong total received bytes");
225  }
226  }
227 
228  Simulator::Destroy ();
229 }
230 
231 
232 
233 
234 
239 {
240 public:
242 
244 
246  : TestSuite ("epc-s1u-downlink", SYSTEM)
247 {
248  std::vector<EnbDlTestData> v1;
249  EnbDlTestData e1;
250  UeDlTestData f1 (1, 100);
251  e1.ues.push_back (f1);
252  v1.push_back (e1);
253  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 1UE", v1), TestCase::QUICK);
254 
255 
256  std::vector<EnbDlTestData> v2;
257  EnbDlTestData e2;
258  UeDlTestData f2_1 (1, 100);
259  e2.ues.push_back (f2_1);
260  UeDlTestData f2_2 (2, 200);
261  e2.ues.push_back (f2_2);
262  v2.push_back (e2);
263  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 2UEs", v2), TestCase::QUICK);
264 
265 
266  std::vector<EnbDlTestData> v3;
267  v3.push_back (e1);
268  v3.push_back (e2);
269  AddTestCase (new EpcS1uDlTestCase ("2 eNBs", v3), TestCase::QUICK);
270 
271 
272  EnbDlTestData e3;
273  UeDlTestData f3_1 (3, 50);
274  e3.ues.push_back (f3_1);
275  UeDlTestData f3_2 (5, 1472);
276  e3.ues.push_back (f3_2);
277  UeDlTestData f3_3 (1, 1);
278  e3.ues.push_back (f3_2);
279  std::vector<EnbDlTestData> v4;
280  v4.push_back (e3);
281  v4.push_back (e1);
282  v4.push_back (e2);
283  AddTestCase (new EpcS1uDlTestCase ("3 eNBs", v4), TestCase::QUICK);
284 
285  std::vector<EnbDlTestData> v5;
286  EnbDlTestData e5;
287  UeDlTestData f5 (10, 3000);
288  e5.ues.push_back (f5);
289  v5.push_back (e5);
290  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 10 pkts 3000 bytes each", v5), TestCase::QUICK);
291 
292  std::vector<EnbDlTestData> v6;
293  EnbDlTestData e6;
294  UeDlTestData f6 (50, 3000);
295  e6.ues.push_back (f6);
296  v6.push_back (e6);
297  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 50 pkts 3000 bytes each", v6), TestCase::QUICK);
298 
299  std::vector<EnbDlTestData> v7;
300  EnbDlTestData e7;
301  UeDlTestData f7 (10, 15000);
302  e7.ues.push_back (f7);
303  v7.push_back (e7);
304  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 10 pkts 15000 bytes each", v7), TestCase::QUICK);
305 
306  std::vector<EnbDlTestData> v8;
307  EnbDlTestData e8;
308  UeDlTestData f8 (100, 15000);
309  e8.ues.push_back (f8);
310  v8.push_back (e8);
311  AddTestCase (new EpcS1uDlTestCase ("1 eNB, 100 pkts 15000 bytes each", v8), TestCase::QUICK);
312 }
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:79
an Inet address class
Hold a bool native type.
Definition: boolean.h:38
std::vector< EnbDlTestData > m_enbDlTestData
holds a vector of std::pair of Ptr and interface index.
virtual void ActivateEpsBearer(Ptr< NetDevice > ueLteDevice, uint64_t imsi, Ptr< EpcTft > tft, EpsBearer bearer)
Activate an EPS bearer, setting up the corresponding S1-U tunnel.
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:222
A suite of tests to run.
Definition: test.h:1105
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:170
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:929
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:71
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
Definition: node.cc:160
Ptr< PacketSink > serverApp
hold objects of type ns3::Time
Definition: nstime.h:1008
Ptr< Application > clientApp
Hold an unsigned integer type.
Definition: uinteger.h:46
#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:148
Ptr< SampleEmitter > s
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
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:667
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()
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:184
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:84
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:38
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.
hold objects of type ns3::DataRate
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
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)
Definition: object-base.cc:176
Ptr< T > GetObject(void) const
Definition: object.h:362
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