A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
ipv4-static-routing-test-suite.cc
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: GPL-2.0-only
3 */
4
5// End-to-end tests for Ipv4 static routing
6
7#include "ns3/boolean.h"
8#include "ns3/config.h"
9#include "ns3/inet-socket-address.h"
10#include "ns3/internet-stack-helper.h"
11#include "ns3/ipv4-address-helper.h"
12#include "ns3/ipv4-static-routing-helper.h"
13#include "ns3/node-container.h"
14#include "ns3/node.h"
15#include "ns3/packet.h"
16#include "ns3/pointer.h"
17#include "ns3/simple-channel.h"
18#include "ns3/simple-net-device-helper.h"
19#include "ns3/simple-net-device.h"
20#include "ns3/simulator.h"
21#include "ns3/socket-factory.h"
22#include "ns3/string.h"
23#include "ns3/test.h"
24#include "ns3/udp-socket-factory.h"
25#include "ns3/uinteger.h"
26
27using namespace ns3;
28
29/**
30 * @ingroup internet-test
31 *
32 * @brief IPv4 StaticRouting /32 Test
33 */
35{
36 public:
39
40 Ptr<Packet> m_receivedPacket; //!< Received packet
41
42 /**
43 * @brief Send data.
44 * @param socket The sending socket.
45 * @param to Destination address.
46 */
47 void DoSendData(Ptr<Socket> socket, std::string to);
48 /**
49 * @brief Send data.
50 * @param socket The sending socket.
51 * @param to Destination address.
52 */
53 void SendData(Ptr<Socket> socket, std::string to);
54
55 /**
56 * @brief Receive data.
57 * @param socket The receiving socket.
58 */
59 void ReceivePkt(Ptr<Socket> socket);
60
61 private:
62 void DoRun() override;
63};
64
65// Add some help text to this case to describe what it is intended to test
67 : TestCase("Slash 32 static routing example")
68{
69}
70
74
75void
77{
78 uint32_t availableData [[maybe_unused]] = socket->GetRxAvailable();
79 m_receivedPacket = socket->Recv(std::numeric_limits<uint32_t>::max(), 0);
81 m_receivedPacket->GetSize(),
82 "Received packet size is not equal to Rx buffer size");
83}
84
85void
87{
88 Address realTo = InetSocketAddress(Ipv4Address(to.c_str()), 1234);
89 NS_TEST_EXPECT_MSG_EQ(socket->SendTo(Create<Packet>(123), 0, realTo), 123, "100");
90}
91
92void
94{
96 Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
97 Seconds(60),
99 this,
100 socket,
101 to);
104}
105
106// Test program for this 3-router scenario, using static routing
107//
108// (a.a.a.a/32)A<--x.x.x.0/30-->B<--y.y.y.0/30-->C(c.c.c.c/32)
109//
110void
112{
116
118
119 InternetStackHelper internet;
120 internet.Install(c);
121
122 // simple links
125
127
129 deviceA->SetAddress(Mac48Address::Allocate());
130 nA->AddDevice(deviceA);
131
134
136 deviceC->SetAddress(Mac48Address::Allocate());
137 nC->AddDevice(deviceC);
138
139 // Later, we add IP addresses.
141 ipv4.SetBase("10.1.1.0", "255.255.255.252");
142 Ipv4InterfaceContainer iAiB = ipv4.Assign(dAdB);
143
144 ipv4.SetBase("10.1.1.4", "255.255.255.252");
145 Ipv4InterfaceContainer iBiC = ipv4.Assign(dBdC);
146
147 Ptr<Ipv4> ipv4A = nA->GetObject<Ipv4>();
148 Ptr<Ipv4> ipv4B = nB->GetObject<Ipv4>();
149 Ptr<Ipv4> ipv4C = nC->GetObject<Ipv4>();
150
151 int32_t ifIndexA = ipv4A->AddInterface(deviceA);
152 int32_t ifIndexC = ipv4C->AddInterface(deviceC);
153
155 Ipv4InterfaceAddress(Ipv4Address("172.16.1.1"), Ipv4Mask("/32"));
156 ipv4A->AddAddress(ifIndexA, ifInAddrA);
157 ipv4A->SetMetric(ifIndexA, 1);
158 ipv4A->SetUp(ifIndexA);
159
161 Ipv4InterfaceAddress(Ipv4Address("192.168.1.1"), Ipv4Mask("/32"));
162 ipv4C->AddAddress(ifIndexC, ifInAddrC);
163 ipv4C->SetMetric(ifIndexC, 1);
164 ipv4C->SetUp(ifIndexC);
165
167 // Create static routes from A to C
169 // The ifIndex for this outbound route is 1; the first p2p link added
170 staticRoutingA->AddHostRouteTo(Ipv4Address("192.168.1.1"), Ipv4Address("10.1.1.2"), 1);
172 // The ifIndex we want on node B is 2; 0 corresponds to loopback, and 1 to the first point to
173 // point link
174 staticRoutingB->AddHostRouteTo(Ipv4Address("192.168.1.1"), Ipv4Address("10.1.1.6"), 2);
175
176 // Create the UDP sockets
178 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket();
179 NS_TEST_EXPECT_MSG_EQ(rxSocket->Bind(InetSocketAddress(Ipv4Address("192.168.1.1"), 1234)),
180 0,
181 "trivial");
183
185 Ptr<Socket> txSocket = txSocketFactory->CreateSocket();
186 txSocket->SetAllowBroadcast(true);
187
188 // ------ Now the tests ------------
189
190 // Unicast test
191 SendData(txSocket, "192.168.1.1");
193 123,
194 "Static routing with /32 did not deliver all packets.");
195
197}
198
199/**
200 * @ingroup internet-test
201 *
202 * @brief IPv4 StaticRouting /32 TestSuite
203 */
205{
206 public:
208};
209
211 : TestSuite("ipv4-static-routing", Type::UNIT)
212{
213 AddTestCase(new Ipv4StaticRoutingSlash32TestCase, TestCase::Duration::QUICK);
214}
215
217 ipv4StaticRoutingTestSuite; //!< Static variable for test initialization
void SendData(Ptr< Socket > socket, std::string to)
Send data.
void DoRun() override
Implementation to actually run this TestCase.
void ReceivePkt(Ptr< Socket > socket)
Receive data.
void DoSendData(Ptr< Socket > socket, std::string to)
Send data.
IPv4 StaticRouting /32 TestSuite.
a polymophic address class
Definition address.h:90
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Ipv4 addresses are stored in host order in this class.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition ipv4.h:69
a class to store IPv4 address information on an interface
holds a vector of std::pair of Ptr<Ipv4> and interface index.
a class to represent an Ipv4 address mask
Helper class that adds ns3::Ipv4StaticRouting objects.
static Mac48Address Allocate()
Allocate a new Mac48Address.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:66
build a set of SimpleNetDevice objects
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition simulator.h:577
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
encapsulates test code
Definition test.h:1050
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition test.cc:292
A suite of tests to run.
Definition test.h:1267
Type
Type of test.
Definition test.h:1274
API to create UDP socket instances.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
#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:134
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition test.h:241
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1344
static Ipv4StaticRoutingTestSuite ipv4StaticRoutingTestSuite
Static variable for test initialization.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition callback.h:684