A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
ipv4-global-routing-test-suite.cc
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: GPL-2.0-only
3 */
4
5#include "ns3/boolean.h"
6#include "ns3/bridge-helper.h"
7#include "ns3/config.h"
8#include "ns3/inet-socket-address.h"
9#include "ns3/internet-stack-helper.h"
10#include "ns3/ipv4-address-helper.h"
11#include "ns3/ipv4-global-routing-helper.h"
12#include "ns3/ipv4-global-routing.h"
13#include "ns3/ipv4-l3-protocol.h"
14#include "ns3/ipv4-packet-info-tag.h"
15#include "ns3/ipv4-routing-protocol.h"
16#include "ns3/ipv4-routing-table-entry.h"
17#include "ns3/ipv4-static-routing-helper.h"
18#include "ns3/log.h"
19#include "ns3/node-container.h"
20#include "ns3/node.h"
21#include "ns3/packet.h"
22#include "ns3/pointer.h"
23#include "ns3/simple-channel.h"
24#include "ns3/simple-net-device-helper.h"
25#include "ns3/simple-net-device.h"
26#include "ns3/simulator.h"
27#include "ns3/socket-factory.h"
28#include "ns3/string.h"
29#include "ns3/test.h"
30#include "ns3/udp-socket-factory.h"
31#include "ns3/uinteger.h"
32
33#include <vector>
34
35using namespace ns3;
36
37NS_LOG_COMPONENT_DEFINE("Ipv4GlobalRoutingTestSuite");
38
39// This test suite tests the operation of global routing on a few sample
40// networks to ensure that routes are built correctly
41//
42// Link test:
43// n0 <--------> n1 (point-to-point link)
44// 10.1.1.1 10.1.1.2
45// Expected routes:
46// n0: route to 0.0.0.0 gw 10.1.1.2
47// n1: route to 0.0.0.0 gw 10.1.1.1
48// Note: These default routes to 0.0.0.0 are generated by the extension
49// in the global route manager to install default routes via the
50// peer node on a point-to-point link, when the node is on a
51// stub link
52//
53// LAN test:
54// n0 <--------> n1 (broadcast link on subnet 10.1.1.0/24)
55// Expected routes:
56// n0: route to 10.1.1.0 gw 0.0.0.0
57// n1: route to 10.1.1.0 gw 0.0.0.0
58// Two link test:
59// n0 <--------> n1 <--------> n2 (point-to-point links)
60// 10.1.1.1 10.1.1.2/ 10.1.2.2
61// 10.1.2.1
62// Expected routes:
63// n0: route to 0.0.0.0 gw 10.1.1.2
64// n1: route to 10.1.1.1 gw 10.1.1.1
65// route to 10.1.2.2 gw 10.1.2.2
66// route to 10.1.1.0 gw 10.1.1.1
67// route to 10.1.2.0 gw 10.1.2.2
68// n2: route to 0.0.0.0 gw 10.1.2.1
69// Note: These default routes to 0.0.0.0 are generated by the extension
70// in the global route manager to install default routes via the
71// peer node on a point-to-point link, when the node is on a
72// stub link
73// Two LANs test:
74// n0 <--------> n1 <--------> n2 (broadcast links)
75// Expected routes:
76// n0: route to 10.1.1.0 gw 0.0.0.0
77// route to 0.0.0.0 gw 10.1.1.2
78// n1: route to 10.1.1.1 gw 10.1.1.1
79// route to 10.1.2.2 gw 10.1.2.2
80// route to 10.1.1.0 gw 10.1.1.1
81// route to 10.1.2.0 gw 10.1.2.2
82// n2: route to 0.0.0.0 gw 10.1.2.1
83// Bridge test:
84// n0 <--------> n1 <---> Bridge-n2 <---> n3 <-------> n4 (broadcast links)
85// 10.1.1.0/24 10.1.2.0/24 10.1.3.0/24
86// Expected routes:
87// n0: route to 10.1.1.0 gw 0.0.0.0
88// route to 10.1.2.0 gw 10.1.1.2
89// route to 10.1.3.0 gw 10.1.1.2
90// n1: route to 10.1.1.0 gw 0.0.0.0
91// route to 10.1.2.0 gw 0.0.0.0
92// route to 10.1.3.0 gw 10.1.2.2
93// n3: route to 10.1.1.0 gw 10.1.2.1
94// route to 10.1.2.0 gw 0.0.0.0
95// route to 10.1.3.0 gw 0.0.0.0
96// n4: route to 10.1.3.0 gw 0.0.0.0
97// route to 10.1.2.0 gw 10.1.3.1
98// route to 10.1.1.0 gw 10.1.3.1
99// Two Bridge test:
100// n0 <------> n1 <---> Bridge-n2 <---> Bridge-n3 <---> n4 (broadcast links)
101// 10.1.1.0/24 10.1.2.0/24
102// Expected routes:
103// n0: route to 10.1.1.0 gw 0.0.0.0
104// route to 10.1.2.0 gw 10.1.1.2
105// n4: route to 10.1.2.0 gw 0.0.0.0
106// route to 10.1.1.0 gw 10.1.2.1
107
108/**
109 * @ingroup internet-test
110 *
111 * @brief IPv4 GlobalRouting Link test
112 */
113class LinkTest : public TestCase
114{
115 public:
116 void DoSetup() override;
117 void DoRun() override;
118 LinkTest();
119
120 private:
121 NodeContainer m_nodes; //!< Nodes used in the test.
122};
123
125 : TestCase("Global routing on point-to-point link")
126{
127}
128
129void
131{
132 m_nodes.Create(2);
133
137 NetDeviceContainer net = simpleHelper.Install(m_nodes, channel);
138
139 InternetStackHelper internet;
140 // By default, InternetStackHelper adds a static and global routing
141 // implementation. We just want the global for this test.
143 internet.SetRoutingHelper(ipv4RoutingHelper);
144 internet.Install(m_nodes);
145
147 ipv4.SetBase("10.1.1.0", "255.255.255.252");
148 Ipv4InterfaceContainer i = ipv4.Assign(net);
149}
150
151void
153{
155
157 NS_TEST_ASSERT_MSG_NE(ip0, nullptr, "Error-- no Ipv4 object");
159 NS_TEST_ASSERT_MSG_NE(ip1, nullptr, "Error-- no Ipv4 object");
160 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol();
162 NS_TEST_ASSERT_MSG_NE(globalRouting0, nullptr, "Error-- no Ipv4GlobalRouting object");
163 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol();
165 NS_TEST_ASSERT_MSG_NE(globalRouting1, nullptr, "Error-- no Ipv4GlobalRouting object");
166
167 // Test that the right number of routes found
168 uint32_t nRoutes0 = globalRouting0->GetNRoutes();
169 NS_LOG_DEBUG("LinkTest nRoutes0 " << nRoutes0);
170 NS_TEST_ASSERT_MSG_EQ(nRoutes0, 1, "Error-- not one route");
172 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
173 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("0.0.0.0"), "Error-- wrong destination");
174 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.1.2"), "Error-- wrong gateway");
175
176 // Test that the right number of routes found
177 uint32_t nRoutes1 = globalRouting1->GetNRoutes();
178 NS_TEST_ASSERT_MSG_EQ(nRoutes1, 1, "Error-- not one route");
179 NS_LOG_DEBUG("LinkTest nRoutes1 " << nRoutes1);
180 route = globalRouting1->GetRoute(0);
181 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
182 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("0.0.0.0"), "Error-- wrong destination");
183 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.1.1"), "Error-- wrong gateway");
184
185 bool result = true;
186
187 NS_TEST_ASSERT_MSG_EQ(result, true, "Message");
190}
191
192/**
193 * @ingroup internet-test
194 *
195 * @brief IPv4 GlobalRouting LAN test
196 */
197class LanTest : public TestCase
198{
199 public:
200 void DoSetup() override;
201 void DoRun() override;
202 LanTest();
203
204 private:
205 NodeContainer m_nodes; //!< Nodes used in the test.
206};
207
209 : TestCase("Global routing on broadcast link")
210{
211}
212
213void
215{
216 m_nodes.Create(2);
217
220 NetDeviceContainer net = simpleHelper.Install(m_nodes, channel);
221
222 InternetStackHelper internet;
223 // By default, InternetStackHelper adds a static and global routing
224 // implementation. We just want the global for this test.
226 internet.SetRoutingHelper(ipv4RoutingHelper);
227 internet.Install(m_nodes);
228
230 ipv4.SetBase("10.1.1.0", "255.255.255.0");
231 Ipv4InterfaceContainer i = ipv4.Assign(net);
232}
233
234void
236{
238
240 NS_TEST_ASSERT_MSG_NE(ip0, nullptr, "Error-- no Ipv4 object");
242 NS_TEST_ASSERT_MSG_NE(ip1, nullptr, "Error-- no Ipv4 object");
243 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol();
245 NS_TEST_ASSERT_MSG_NE(globalRouting0, nullptr, "Error-- no Ipv4GlobalRouting object");
246 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol();
248 NS_TEST_ASSERT_MSG_NE(globalRouting1, nullptr, "Error-- no Ipv4GlobalRouting object");
249
250 // Test that the right number of routes found
251 uint32_t nRoutes0 = globalRouting0->GetNRoutes();
252 NS_LOG_DEBUG("LanTest nRoutes0 " << nRoutes0);
253 NS_TEST_ASSERT_MSG_EQ(nRoutes0, 1, "Error-- more than one entry");
254 for (uint32_t i = 0; i < globalRouting0->GetNRoutes(); i++)
255 {
257 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
258 }
259
260 // Test that the right number of routes found
261 uint32_t nRoutes1 = globalRouting1->GetNRoutes();
262 NS_LOG_DEBUG("LanTest nRoutes1 " << nRoutes1);
263 NS_TEST_ASSERT_MSG_EQ(nRoutes1, 1, "Error-- more than one entry");
264 for (uint32_t i = 0; i < globalRouting0->GetNRoutes(); i++)
265 {
267 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
268 }
269
271}
272
273/**
274 * @ingroup internet-test
275 *
276 * @brief IPv4 GlobalRouting Two Link test
277 */
278class TwoLinkTest : public TestCase
279{
280 public:
281 void DoSetup() override;
282 void DoRun() override;
283 TwoLinkTest();
284
285 private:
286 NodeContainer m_nodes; //!< Nodes used in the test.
287};
288
290 : TestCase("Global routing across two hops (point-to-point links)")
291{
292}
293
294void
296{
297 m_nodes.Create(3);
298
302 NetDeviceContainer net = simpleHelper.Install(m_nodes.Get(0), channel);
303 net.Add(simpleHelper.Install(m_nodes.Get(1), channel));
304
310
311 InternetStackHelper internet;
312 // By default, InternetStackHelper adds a static and global routing
313 // implementation. We just want the global for this test.
315 internet.SetRoutingHelper(ipv4RoutingHelper);
316 internet.Install(m_nodes);
317
319 ipv4.SetBase("10.1.1.0", "255.255.255.252");
320 Ipv4InterfaceContainer i = ipv4.Assign(net);
321 ipv4.SetBase("10.1.2.0", "255.255.255.252");
322 Ipv4InterfaceContainer i2 = ipv4.Assign(net2);
323}
324
325void
327{
329
331 NS_TEST_ASSERT_MSG_NE(ip0, nullptr, "Error-- no Ipv4 object");
333 NS_TEST_ASSERT_MSG_NE(ip1, nullptr, "Error-- no Ipv4 object");
335 NS_TEST_ASSERT_MSG_NE(ip2, nullptr, "Error-- no Ipv4 object");
336 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol();
338 NS_TEST_ASSERT_MSG_NE(globalRouting0, nullptr, "Error-- no Ipv4GlobalRouting object");
339 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol();
341 NS_TEST_ASSERT_MSG_NE(globalRouting1, nullptr, "Error-- no Ipv4GlobalRouting object");
342 Ptr<Ipv4RoutingProtocol> routing2 = ip2->GetRoutingProtocol();
344 NS_TEST_ASSERT_MSG_NE(globalRouting2, nullptr, "Error-- no Ipv4GlobalRouting object");
345
346 // node n0
347 // Test that the right number of routes found
348 uint32_t nRoutes0 = globalRouting0->GetNRoutes();
349 NS_LOG_DEBUG("TwoLinkTest nRoutes0 " << nRoutes0);
350 NS_TEST_ASSERT_MSG_EQ(nRoutes0, 1, "Error-- wrong number of links");
351
353 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
354 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("0.0.0.0"), "Error-- wrong destination");
355 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.1.2"), "Error-- wrong gateway");
356
357 // node n1
358 // Test that the right number of routes found
359 uint32_t nRoutes1 = globalRouting1->GetNRoutes();
360 NS_LOG_DEBUG("TwoLinkTest nRoutes1 " << nRoutes1);
361 route = globalRouting1->GetRoute(0);
362 NS_LOG_DEBUG("TwoLinkTest entry dest " << route->GetDest() << " gw " << route->GetGateway());
363 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.1.1"), "Error-- wrong destination");
364 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.1.1"), "Error-- wrong gateway");
365 route = globalRouting1->GetRoute(1);
366 NS_LOG_DEBUG("TwoLinkTest entry dest " << route->GetDest() << " gw " << route->GetGateway());
367 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.2.2"), "Error-- wrong destination");
368 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.2.2"), "Error-- wrong gateway");
369 route = globalRouting1->GetRoute(2);
370 NS_LOG_DEBUG("TwoLinkTest entry dest " << route->GetDest() << " gw " << route->GetGateway());
371 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.1.0"), "Error-- wrong destination");
372 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.1.1"), "Error-- wrong gateway");
373 route = globalRouting1->GetRoute(3);
374 NS_LOG_DEBUG("TwoLinkTest entry dest " << route->GetDest() << " gw " << route->GetGateway());
375 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.2.0"), "Error-- wrong destination");
376 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.2.2"), "Error-- wrong gateway");
377
378 // node n2
379 // Test that the right number of routes found
380 uint32_t nRoutes2 = globalRouting2->GetNRoutes();
381 NS_LOG_DEBUG("TwoLinkTest nRoutes2 " << nRoutes2);
382 NS_TEST_ASSERT_MSG_EQ(nRoutes2, 1, "Error-- wrong number of links");
383
384 route = globalRouting2->GetRoute(0);
385 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
386 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("0.0.0.0"), "Error-- wrong destination");
387 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.2.1"), "Error-- wrong gateway");
388
390}
391
392/**
393 * @ingroup internet-test
394 *
395 * @brief IPv4 GlobalRouting Two LAN test
396 */
397class TwoLanTest : public TestCase
398{
399 public:
400 void DoSetup() override;
401 void DoRun() override;
402 TwoLanTest();
403
404 private:
405 NodeContainer m_nodes; //!< Nodes used in the test.
406};
407
409 : TestCase("Global routing across two hops (broadcast links)")
410{
411}
412
413void
415{
416 m_nodes.Create(3);
417
420 NetDeviceContainer net = simpleHelper.Install(m_nodes.Get(0), channel);
421 net.Add(simpleHelper.Install(m_nodes.Get(1), channel));
422
427
428 InternetStackHelper internet;
429 // By default, InternetStackHelper adds a static and global routing
430 // implementation. We just want the global for this test.
432 internet.SetRoutingHelper(ipv4RoutingHelper);
433 internet.Install(m_nodes);
434
436 ipv4.SetBase("10.1.1.0", "255.255.255.0");
437 Ipv4InterfaceContainer i = ipv4.Assign(net);
438 ipv4.SetBase("10.1.2.0", "255.255.255.0");
439 Ipv4InterfaceContainer i2 = ipv4.Assign(net2);
440}
441
442void
444{
446
448 NS_TEST_ASSERT_MSG_NE(ip0, nullptr, "Error-- no Ipv4 object");
450 NS_TEST_ASSERT_MSG_NE(ip1, nullptr, "Error-- no Ipv4 object");
452 NS_TEST_ASSERT_MSG_NE(ip2, nullptr, "Error-- no Ipv4 object");
453 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol();
455 NS_TEST_ASSERT_MSG_NE(globalRouting0, nullptr, "Error-- no Ipv4GlobalRouting object");
456 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol();
458 NS_TEST_ASSERT_MSG_NE(globalRouting1, nullptr, "Error-- no Ipv4GlobalRouting object");
459 Ptr<Ipv4RoutingProtocol> routing2 = ip2->GetRoutingProtocol();
461 NS_TEST_ASSERT_MSG_NE(globalRouting2, nullptr, "Error-- no Ipv4GlobalRouting object");
462
463 // Test that the right number of routes found
464 uint32_t nRoutes0 = globalRouting0->GetNRoutes();
465 NS_LOG_DEBUG("TwoLanTest nRoutes0 " << nRoutes0);
466 NS_TEST_ASSERT_MSG_EQ(nRoutes0, 2, "Error-- not two entries");
468 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
469 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.1.0"), "Error-- wrong destination");
470 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("0.0.0.0"), "Error-- wrong gateway");
471 route = globalRouting0->GetRoute(1);
472 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
473 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.2.0"), "Error-- wrong destination");
474 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("10.1.1.2"), "Error-- wrong gateway");
475
476 // Test that the right number of routes found
477 uint32_t nRoutes1 = globalRouting1->GetNRoutes();
478 NS_LOG_DEBUG("TwoLanTest nRoutes1 " << nRoutes1);
479 NS_TEST_ASSERT_MSG_EQ(nRoutes1, 2, "Error-- not two entries");
480 route = globalRouting1->GetRoute(0);
481 NS_LOG_DEBUG("TwoLanTest entry dest " << route->GetDest() << " gw " << route->GetGateway());
482 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.1.0"), "Error-- wrong destination");
483 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("0.0.0.0"), "Error-- wrong gateway");
484 route = globalRouting1->GetRoute(1);
485 NS_LOG_DEBUG("TwoLanTest entry dest " << route->GetDest() << " gw " << route->GetGateway());
486 NS_TEST_ASSERT_MSG_EQ(route->GetDest(), Ipv4Address("10.1.2.0"), "Error-- wrong destination");
487 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(), Ipv4Address("0.0.0.0"), "Error-- wrong gateway");
488
490}
491
492/**
493 * @ingroup internet-test
494 *
495 * @brief IPv4 GlobalRouting Bridge test
496 */
497class BridgeTest : public TestCase
498{
499 public:
500 void DoSetup() override;
501 void DoRun() override;
502 BridgeTest();
503
504 private:
505 NodeContainer m_nodes; //!< Nodes used in the test.
506};
507
509 : TestCase("Global routing across bridging topology (bug 2102)")
510{
511}
512
513void
515{
516 m_nodes.Create(5);
517
518 // connect node0 to node1
521 NetDeviceContainer net = simpleHelper.Install(m_nodes.Get(0), channel);
522 net.Add(simpleHelper.Install(m_nodes.Get(1), channel));
523
525 NetDeviceContainer switchDevices;
526
527 // connect node1 to node2 (switch)
532 bridgeFacingDevices.Add(net2.Get(0));
533 switchDevices.Add(net2.Get(1));
534
535 // connect node2 (switch) to node3
540 bridgeFacingDevices.Add(net3.Get(1));
541 switchDevices.Add(net3.Get(0));
542
543 // connect node3 to node4
548
549 Ptr<Node> switchNode = m_nodes.Get(2);
550 BridgeHelper bridge;
551 bridge.Install(switchNode, switchDevices);
552
553 InternetStackHelper internet;
554 // By default, InternetStackHelper adds a static and global routing
555 // implementation. We just want the global for this test.
557 internet.SetRoutingHelper(ipv4RoutingHelper);
558
559 internet.Install(m_nodes.Get(0));
560 internet.Install(m_nodes.Get(1));
561 // m_nodes.Get (2) is bridge node
562 internet.Install(m_nodes.Get(3));
563 internet.Install(m_nodes.Get(4));
564
565 Ipv4AddressHelper address;
566 address.SetBase("10.1.1.0", "255.255.255.0");
567 address.Assign(net);
568
569 address.SetBase("10.1.2.0", "255.255.255.0");
570 address.Assign(bridgeFacingDevices);
571
572 address.SetBase("10.1.3.0", "255.255.255.0");
573 address.Assign(net4);
574}
575
576void
578{
580
582 NS_TEST_ASSERT_MSG_NE(ip0, nullptr, "Error-- no Ipv4 object");
583 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol();
584 NS_TEST_ASSERT_MSG_NE(routing0, nullptr, "Error-- no Ipv4 routing protocol object");
586 NS_TEST_ASSERT_MSG_NE(globalRouting0, nullptr, "Error-- no Ipv4GlobalRouting object");
587
589 NS_TEST_ASSERT_MSG_NE(ip1, nullptr, "Error-- no Ipv4 object");
590 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol();
591 NS_TEST_ASSERT_MSG_NE(routing1, nullptr, "Error-- no Ipv4 routing protocol object");
593 NS_TEST_ASSERT_MSG_NE(globalRouting1, nullptr, "Error-- no Ipv4GlobalRouting object");
594
595 // Skip to n4
597 NS_TEST_ASSERT_MSG_NE(ip4, nullptr, "Error-- no Ipv4 object");
598 Ptr<Ipv4RoutingProtocol> routing4 = ip4->GetRoutingProtocol();
599 NS_TEST_ASSERT_MSG_NE(routing4, nullptr, "Error-- no Ipv4 routing protocol object");
601 NS_TEST_ASSERT_MSG_NE(globalRouting4, nullptr, "Error-- no Ipv4GlobalRouting object");
602
603 Ipv4RoutingTableEntry* route = nullptr;
604 // n0
605 // Test that the right number of routes found
606 uint32_t nRoutes0 = globalRouting0->GetNRoutes();
607 NS_LOG_DEBUG("BridgeTest nRoutes0 " << nRoutes0);
608 NS_TEST_ASSERT_MSG_EQ(nRoutes0, 3, "Error-- not three entries");
609 for (uint32_t i = 0; i < globalRouting0->GetNRoutes(); i++)
610 {
611 route = globalRouting0->GetRoute(i);
612 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
613 }
614 // Spot check the last route
615 if (route)
616 {
617 NS_TEST_ASSERT_MSG_EQ(route->GetDest(),
618 Ipv4Address("10.1.3.0"),
619 "Error-- wrong destination");
620 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(),
621 Ipv4Address("10.1.1.2"),
622 "Error-- wrong gateway");
623 }
624
625 // n1
626 // Test that the right number of routes found
627 route = nullptr;
628 uint32_t nRoutes1 = globalRouting1->GetNRoutes();
629 NS_LOG_DEBUG("BridgeTest nRoutes1 " << nRoutes1);
630 NS_TEST_ASSERT_MSG_EQ(nRoutes1, 3, "Error-- not three entries");
631 for (uint32_t i = 0; i < globalRouting1->GetNRoutes(); i++)
632 {
633 route = globalRouting1->GetRoute(i);
634 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
635 }
636 // Spot check the last route
637 if (route)
638 {
639 NS_TEST_ASSERT_MSG_EQ(route->GetDest(),
640 Ipv4Address("10.1.3.0"),
641 "Error-- wrong destination");
642 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(),
643 Ipv4Address("10.1.2.2"),
644 "Error-- wrong gateway");
645 }
646
647 // skip n2 and n3, just verify n4
648 NS_LOG_DEBUG("BridgeTest skip print out of n2 and n3, go next to node n4");
649
650 // n4
651 route = nullptr;
652 // Test that the right number of routes found
653 uint32_t nRoutes4 = globalRouting4->GetNRoutes();
654 NS_LOG_DEBUG("BridgeTest nRoutes4 " << nRoutes4);
655 NS_TEST_ASSERT_MSG_EQ(nRoutes4, 3, "Error-- not three entries");
656 for (uint32_t i = 0; i < globalRouting4->GetNRoutes(); i++)
657 {
658 route = globalRouting4->GetRoute(i);
659 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
660 }
661 // Spot check the last route
662 if (route)
663 {
664 NS_TEST_ASSERT_MSG_EQ(route->GetDest(),
665 Ipv4Address("10.1.1.0"),
666 "Error-- wrong destination");
667 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(),
668 Ipv4Address("10.1.3.1"),
669 "Error-- wrong gateway");
670 }
671
673}
674
675/**
676 * @ingroup internet-test
677 *
678 * @brief IPv4 GlobalRouting Two bridges test
679 */
681{
682 public:
683 void DoSetup() override;
684 void DoRun() override;
686
687 private:
688 NodeContainer m_nodes; //!< Nodes used in the test.
689};
690
692 : TestCase("Global routing across two bridges")
693{
694}
695
696void
698{
699 m_nodes.Create(5);
700
701 // connect node0 to node1
704 NetDeviceContainer net = simpleHelper.Install(m_nodes.Get(0), channel);
705 net.Add(simpleHelper.Install(m_nodes.Get(1), channel));
706
710
711 // connect node1 to node2 (switch)
716 bridgeFacingDevices.Add(net2.Get(0));
717 switchn2Devices.Add(net2.Get(1));
718
719 // connect node2 (switch) to node3
724 switchn2Devices.Add(net3.Get(0));
725 switchn3Devices.Add(net3.Get(1));
726
727 // connect node3 to node4
732 switchn3Devices.Add(net4.Get(0));
733 bridgeFacingDevices.Add(net4.Get(1));
734
738
742
743 InternetStackHelper internet;
744 // By default, InternetStackHelper adds a static and global routing
745 // implementation. We just want the global for this test.
747 internet.SetRoutingHelper(ipv4RoutingHelper);
748
749 internet.Install(m_nodes.Get(0));
750 internet.Install(m_nodes.Get(1));
751 // m_nodes.Get (2) is bridge node
752 // m_nodes.Get (3) is bridge node
753 internet.Install(m_nodes.Get(4));
754
755 Ipv4AddressHelper address;
756 address.SetBase("10.1.1.0", "255.255.255.0");
757 address.Assign(net);
758
759 address.SetBase("10.1.2.0", "255.255.255.0");
760 address.Assign(bridgeFacingDevices);
761}
762
763void
765{
767
769 NS_TEST_ASSERT_MSG_NE(ip0, nullptr, "Error-- no Ipv4 object");
770 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol();
771 NS_TEST_ASSERT_MSG_NE(routing0, nullptr, "Error-- no Ipv4 routing protocol object");
773 NS_TEST_ASSERT_MSG_NE(globalRouting0, nullptr, "Error-- no Ipv4GlobalRouting object");
774
775 // Skip to n4
777 NS_TEST_ASSERT_MSG_NE(ip4, nullptr, "Error-- no Ipv4 object");
778 Ptr<Ipv4RoutingProtocol> routing4 = ip4->GetRoutingProtocol();
779 NS_TEST_ASSERT_MSG_NE(routing4, nullptr, "Error-- no Ipv4 routing protocol object");
781 NS_TEST_ASSERT_MSG_NE(globalRouting4, nullptr, "Error-- no Ipv4GlobalRouting object");
782
783 Ipv4RoutingTableEntry* route = nullptr;
784 // n0
785 // Test that the right number of routes found
786 uint32_t nRoutes0 = globalRouting0->GetNRoutes();
787 NS_LOG_DEBUG("BridgeTest nRoutes0 " << nRoutes0);
788 NS_TEST_ASSERT_MSG_EQ(nRoutes0, 2, "Error-- not two entries");
789 for (uint32_t i = 0; i < globalRouting0->GetNRoutes(); i++)
790 {
791 route = globalRouting0->GetRoute(i);
792 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
793 }
794 // Spot check the last route
795 if (route)
796 {
797 NS_TEST_ASSERT_MSG_EQ(route->GetDest(),
798 Ipv4Address("10.1.2.0"),
799 "Error-- wrong destination");
800 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(),
801 Ipv4Address("10.1.1.2"),
802 "Error-- wrong gateway");
803 }
804 // skip n2 and n3, just verify n4
805 NS_LOG_DEBUG("BridgeTest skip print out of n1-n3, go next to node n4");
806
807 // n4
808 // Test that the right number of routes found
809 route = nullptr;
810 uint32_t nRoutes4 = globalRouting4->GetNRoutes();
811 NS_LOG_DEBUG("BridgeTest nRoutes4 " << nRoutes4);
812 NS_TEST_ASSERT_MSG_EQ(nRoutes4, 2, "Error-- not two entries");
813 for (uint32_t i = 0; i < globalRouting4->GetNRoutes(); i++)
814 {
815 route = globalRouting4->GetRoute(i);
816 NS_LOG_DEBUG("entry dest " << route->GetDest() << " gw " << route->GetGateway());
817 }
818 // Spot check the last route
819 if (route)
820 {
821 NS_TEST_ASSERT_MSG_EQ(route->GetDest(),
822 Ipv4Address("10.1.1.0"),
823 "Error-- wrong destination");
824 NS_TEST_ASSERT_MSG_EQ(route->GetGateway(),
825 Ipv4Address("10.1.2.1"),
826 "Error-- wrong gateway");
827 }
828
830}
831
832/**
833 * @ingroup internet-test
834 *
835 * @brief IPv4 Dynamic GlobalRouting test
836 */
838{
839 public:
842
843 private:
844 /**
845 * @brief Send some data
846 * @param index Index of the socket to use.
847 */
848 void SendData(uint8_t index);
849
850 /**
851 * @brief Shutdown a socket
852 * @param index Index of the socket to close.
853 */
854 void ShutDownSock(uint8_t index);
855
856 /**
857 * Handle an incoming packet
858 * @param socket The input socket.
859 */
860 void HandleRead(Ptr<Socket> socket);
861 void DoRun() override;
862
863 uint16_t m_count; //!< Number of packets received.
864 std::vector<std::pair<Ptr<Socket>, bool>> m_sendSocks; //!< Sending sockets.
865 DataRate m_dataRate; //!< Data rate.
866 uint16_t m_packetSize; //!< Packet size.
867 std::vector<uint8_t>
868 m_firstInterface; //!< Packets received on the 1st interface at a given time.
869 std::vector<uint8_t>
870 m_secondInterface; //!< Packets received on the 2nd interface at a given time.
871};
872
873// Add some help text to this case to describe what it is intended to test
875 : TestCase("Dynamic global routing example"),
876 m_count(0)
877{
878 m_firstInterface.resize(16);
879 m_secondInterface.resize(16);
880 m_dataRate = DataRate("2kbps");
881 m_packetSize = 50;
882}
883
885{
886 for (auto iter = m_sendSocks.begin(); iter != m_sendSocks.end(); iter++)
887 {
888 if (iter->second)
889 {
890 iter->second = false;
891 iter->first->Close();
892 iter->first = nullptr;
893 }
894 }
895}
896
897void
899{
900 Ptr<Packet> packet;
901 Address from;
902 while ((packet = socket->RecvFrom(from)))
903 {
904 if (packet->GetSize() == 0)
905 { // EOF
906 break;
907 }
909 bool found;
910 found = packet->PeekPacketTag(tag);
911 uint8_t now = static_cast<uint8_t>(Simulator::Now().GetSeconds());
912 if (found)
913 {
914 if (tag.GetRecvIf() == 1)
915 {
916 m_firstInterface[now]++;
917 }
918 if (tag.GetRecvIf() == 2)
919 {
920 m_secondInterface[now]++;
921 }
922 m_count++;
923 }
924 }
925}
926
927void
929{
930 if (!m_sendSocks[index].second)
931 {
932 return;
933 }
935 m_sendSocks[index].first->Send(packet);
936
939}
940
941void
943{
944 m_sendSocks[index].second = false;
945 m_sendSocks[index].first->Close();
946 m_sendSocks[index].first = nullptr;
947}
948
949// Test derived from examples/routing/dynamic-global-routing.cc
950//
951// Network topology
952//
953// n0
954// \ p-p
955// \ (shared csma/cd)
956// n2 -------------------------n3
957// / | |
958// / p-p n4 n5 ---------- n6
959// n1 p-p
960// | |
961// ----------------------------------------
962// p-p
963//
964// Test that for node n6, the interface facing n5 receives packets at
965// times (1-2), (4-6), (8-10), (11-12), (14-16) and the interface
966// facing n1 receives packets at times (2-4), (6-8), (12-13)
967//
968void
970{
971 // The below value configures the default behavior of global routing.
972 // By default, it is disabled. To respond to interface events, set to true
973 Config::SetDefault("ns3::Ipv4GlobalRouting::RespondToInterfaceEvents", BooleanValue(true));
974
976 c.Create(7);
977 NodeContainer n0n2 = NodeContainer(c.Get(0), c.Get(2));
978 NodeContainer n1n2 = NodeContainer(c.Get(1), c.Get(2));
979 NodeContainer n5n6 = NodeContainer(c.Get(5), c.Get(6));
980 NodeContainer n1n6 = NodeContainer(c.Get(1), c.Get(6));
981 NodeContainer n2345 = NodeContainer(c.Get(2), c.Get(3), c.Get(4), c.Get(5));
982
983 InternetStackHelper internet;
984 internet.Install(c);
985
986 // We create the channels first without any IP addressing information
988
991 devHelper.SetNetDevicePointToPointMode(false);
992
997
998 // Later, we add IP addresses.
1000 ipv4.SetBase("10.1.1.0", "255.255.255.0");
1001 ipv4.Assign(d0d2);
1002
1003 ipv4.SetBase("10.1.2.0", "255.255.255.0");
1004 ipv4.Assign(d1d2);
1005
1006 ipv4.SetBase("10.1.3.0", "255.255.255.0");
1007 Ipv4InterfaceContainer i5i6 = ipv4.Assign(d5d6);
1008
1009 ipv4.SetBase("10.250.1.0", "255.255.255.0");
1010 ipv4.Assign(d2345);
1011
1012 ipv4.SetBase("172.16.1.0", "255.255.255.0");
1013 Ipv4InterfaceContainer i1i6 = ipv4.Assign(d1d6);
1014
1015 // Create router nodes, initialize routing database and set up the routing
1016 // tables in the nodes.
1018
1019 // Create the applications to send UDP datagrams of size
1020 // 50 bytes at a rate of 2 Kb/s
1021 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
1022 uint16_t port = 9; // Discard port (RFC 863)
1023
1024 std::pair<Ptr<Socket>, bool> sendSockA;
1025 sendSockA.first = Socket::CreateSocket(c.Get(1), tid);
1026 sendSockA.first->Bind();
1027 sendSockA.first->Connect(InetSocketAddress(i5i6.GetAddress(1), port));
1028 sendSockA.second = true;
1029 m_sendSocks.push_back(sendSockA);
1032
1033 std::pair<Ptr<Socket>, bool> sendSockB;
1034 sendSockB.first = Socket::CreateSocket(c.Get(1), tid);
1035 sendSockB.first->Bind();
1036 sendSockB.first->Connect(InetSocketAddress(i1i6.GetAddress(1), port));
1037 sendSockB.second = true;
1038 m_sendSocks.push_back(sendSockB);
1041
1042 // Create an optional packet sink to receive these packets
1043 Ptr<Socket> sink2 = Socket::CreateSocket(c.Get(6), tid);
1045 sink2->Listen();
1046 sink2->ShutdownSend();
1047
1048 sink2->SetRecvPktInfo(true);
1050
1051 Ptr<Node> n1 = c.Get(1);
1052 Ptr<Ipv4> ipv41 = n1->GetObject<Ipv4>();
1053 // The first ifIndex is 0 for loopback, then the first p2p is numbered 1,
1054 // then the next p2p is numbered 2
1056
1059
1060 Ptr<Node> n6 = c.Get(6);
1061 Ptr<Ipv4> ipv46 = n6->GetObject<Ipv4>();
1062 // The first ifIndex is 0 for loopback, then the first p2p is numbered 1,
1063 // then the next p2p is numbered 2
1067
1070
1072
1073 NS_TEST_ASSERT_MSG_EQ(m_count, 70, "Dynamic global routing did not deliver all packets");
1074 // Test that for node n6, the interface facing n5 receives packets at
1075 // times (1-2), (4-6), (8-10), (11-12), (14-16) and the interface
1076 // facing n1 receives packets at times (2-4), (6-8), (12-13)
1078 5,
1079 "Dynamic global routing did not deliver all packets "
1080 << int(m_firstInterface[1]));
1082 5,
1083 "Dynamic global routing did not deliver all packets "
1084 << int(m_secondInterface[2]));
1086 5,
1087 "Dynamic global routing did not deliver all packets "
1088 << int(m_secondInterface[3]));
1090 5,
1091 "Dynamic global routing did not deliver all packets "
1092 << int(m_firstInterface[4]));
1094 5,
1095 "Dynamic global routing did not deliver all packets "
1096 << int(m_firstInterface[5]));
1098 5,
1099 "Dynamic global routing did not deliver all packets "
1100 << int(m_secondInterface[6]));
1102 5,
1103 "Dynamic global routing did not deliver all packets "
1104 << int(m_secondInterface[7]));
1106 5,
1107 "Dynamic global routing did not deliver all packets "
1108 << int(m_firstInterface[8]));
1110 5,
1111 "Dynamic global routing did not deliver all packets "
1112 << int(m_firstInterface[9]));
1114 0,
1115 "Dynamic global routing did not deliver all packets "
1116 << int(m_firstInterface[10]));
1118 5,
1119 "Dynamic global routing did not deliver all packets "
1120 << int(m_firstInterface[11]));
1122 5,
1123 "Dynamic global routing did not deliver all packets "
1124 << int(m_secondInterface[12]));
1126 5,
1127 "Dynamic global routing did not deliver all packets "
1128 << int(m_secondInterface[13]));
1130 5,
1131 "Dynamic global routing did not deliver all packets "
1132 << int(m_firstInterface[14]));
1134 5,
1135 "Dynamic global routing did not deliver all packets "
1136 << int(m_firstInterface[15]));
1138}
1139
1140/**
1141 * @ingroup internet-test
1142 *
1143 * @brief IPv4 Dynamic GlobalRouting /32 test
1144 */
1146{
1147 public:
1150
1151 Ptr<Packet> m_receivedPacket; //!< number of received packets
1152
1153 /**
1154 * @brief Receive a packet.
1155 * @param socket The receiving socket.
1156 */
1157 void ReceivePkt(Ptr<Socket> socket);
1158 /**
1159 * @brief Send a packet.
1160 * @param socket The sending socket.
1161 * @param to The address of the receiver.
1162 */
1163 void DoSendData(Ptr<Socket> socket, std::string to);
1164 /**
1165 * @brief Send a packet.
1166 * @param socket The sending socket.
1167 * @param to The address of the receiver.
1168 */
1169 void SendData(Ptr<Socket> socket, std::string to);
1170
1171 private:
1172 void DoRun() override;
1173};
1174
1175// Add some help text to this case to describe what it is intended to test
1177 : TestCase("Slash 32 global routing example")
1178{
1179}
1180
1184
1185void
1187{
1188 uint32_t availableData [[maybe_unused]] = socket->GetRxAvailable();
1189 m_receivedPacket = socket->Recv(std::numeric_limits<uint32_t>::max(), 0);
1191 m_receivedPacket->GetSize(),
1192 "Received packet size is not equal to Rx buffer size");
1193}
1194
1195void
1197{
1198 Address realTo = InetSocketAddress(Ipv4Address(to.c_str()), 1234);
1199 NS_TEST_EXPECT_MSG_EQ(socket->SendTo(Create<Packet>(123), 0, realTo), 123, "100");
1200}
1201
1202void
1204{
1206 Simulator::ScheduleWithContext(socket->GetNode()->GetId(),
1207 Seconds(60),
1209 this,
1210 socket,
1211 to);
1214}
1215
1216// Test program for this 3-router scenario, using global routing
1217//
1218// (a.a.a.a/32)A<--x.x.x.0/30-->B<--y.y.y.0/30-->C(c.c.c.c/32)
1219//
1220void
1222{
1226
1228
1229 InternetStackHelper internet;
1230 internet.Install(c);
1231
1232 // simple links
1235
1237
1239 deviceA->SetAddress(Mac48Address::Allocate());
1240 nA->AddDevice(deviceA);
1241
1244
1246 deviceC->SetAddress(Mac48Address::Allocate());
1247 nC->AddDevice(deviceC);
1248
1249 // Later, we add IP addresses.
1250 Ipv4AddressHelper ipv4;
1251 ipv4.SetBase("10.1.1.0", "255.255.255.252");
1252 Ipv4InterfaceContainer iAiB = ipv4.Assign(dAdB);
1253
1254 ipv4.SetBase("10.1.1.4", "255.255.255.252");
1255 Ipv4InterfaceContainer iBiC = ipv4.Assign(dBdC);
1256
1257 Ptr<Ipv4> ipv4A = nA->GetObject<Ipv4>();
1258 Ptr<Ipv4> ipv4B = nB->GetObject<Ipv4>();
1259 Ptr<Ipv4> ipv4C = nC->GetObject<Ipv4>();
1260
1261 int32_t ifIndexA = ipv4A->AddInterface(deviceA);
1262 int32_t ifIndexC = ipv4C->AddInterface(deviceC);
1263
1265 Ipv4InterfaceAddress(Ipv4Address("172.16.1.1"), Ipv4Mask("/32"));
1266 ipv4A->AddAddress(ifIndexA, ifInAddrA);
1267 ipv4A->SetMetric(ifIndexA, 1);
1268 ipv4A->SetUp(ifIndexA);
1269
1271 Ipv4InterfaceAddress(Ipv4Address("192.168.1.1"), Ipv4Mask("/32"));
1272 ipv4C->AddAddress(ifIndexC, ifInAddrC);
1273 ipv4C->SetMetric(ifIndexC, 1);
1274 ipv4C->SetUp(ifIndexC);
1275
1276 // Create router nodes, initialize routing database and set up the routing
1277 // tables in the nodes.
1279
1280 // Create the UDP sockets
1282 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket();
1283 NS_TEST_EXPECT_MSG_EQ(rxSocket->Bind(InetSocketAddress(Ipv4Address("192.168.1.1"), 1234)),
1284 0,
1285 "trivial");
1287
1289 Ptr<Socket> txSocket = txSocketFactory->CreateSocket();
1290 txSocket->SetAllowBroadcast(true);
1291
1292 // ------ Now the tests ------------
1293
1294 // Unicast test
1295 SendData(txSocket, "192.168.1.1");
1297 123,
1298 "Static routing with /32 did not deliver all packets.");
1299
1301}
1302
1303/**
1304 * @ingroup internet-test
1305 *
1306 * @brief IPv4 GlobalRouting TestSuite
1307 */
1309{
1310 public:
1312};
1313
1315 : TestSuite("ipv4-global-routing", Type::UNIT)
1316{
1317 AddTestCase(new LinkTest, TestCase::Duration::QUICK);
1318 AddTestCase(new LanTest, TestCase::Duration::QUICK);
1319 AddTestCase(new TwoLinkTest, TestCase::Duration::QUICK);
1320 AddTestCase(new TwoLanTest, TestCase::Duration::QUICK);
1321 AddTestCase(new BridgeTest, TestCase::Duration::QUICK);
1322 AddTestCase(new TwoBridgeTest, TestCase::Duration::QUICK);
1323 AddTestCase(new Ipv4DynamicGlobalRoutingTestCase, TestCase::Duration::QUICK);
1324 AddTestCase(new Ipv4GlobalRoutingSlash32TestCase, TestCase::Duration::QUICK);
1325}
1326
1328 g_globalRoutingTestSuite; //!< Static variable for test initialization
NodeContainer n1n2
Nodecontainer n1 + n2.
NodeContainer n0n2
Nodecontainer n0 + n2.
IPv4 GlobalRouting Bridge test.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
NodeContainer m_nodes
Nodes used in the test.
void DoRun() override
Implementation to actually run this TestCase.
std::vector< uint8_t > m_secondInterface
Packets received on the 2nd interface at a given time.
void HandleRead(Ptr< Socket > socket)
Handle an incoming packet.
uint16_t m_count
Number of packets received.
std::vector< std::pair< Ptr< Socket >, bool > > m_sendSocks
Sending sockets.
std::vector< uint8_t > m_firstInterface
Packets received on the 1st interface at a given time.
void ShutDownSock(uint8_t index)
Shutdown a socket.
void SendData(uint8_t index)
Send some data.
IPv4 Dynamic GlobalRouting /32 test.
void ReceivePkt(Ptr< Socket > socket)
Receive a packet.
void SendData(Ptr< Socket > socket, std::string to)
Send a packet.
void DoRun() override
Implementation to actually run this TestCase.
void DoSendData(Ptr< Socket > socket, std::string to)
Send a packet.
Ptr< Packet > m_receivedPacket
number of received packets
IPv4 GlobalRouting LAN test.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
NodeContainer m_nodes
Nodes used in the test.
IPv4 GlobalRouting Two bridges test.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
NodeContainer m_nodes
Nodes used in the test.
IPv4 GlobalRouting Two LAN test.
NodeContainer m_nodes
Nodes used in the test.
void DoRun() override
Implementation to actually run this TestCase.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
a polymophic address class
Definition address.h:90
AttributeValue implementation for Boolean.
Definition boolean.h:26
Add capability to bridge multiple LAN segments (IEEE 802.1D bridging)
NetDeviceContainer Install(Ptr< Node > node, NetDeviceContainer c)
This method creates an ns3::BridgeNetDevice with the attributes configured by BridgeHelper::SetDevice...
Class for representing data rates.
Definition data-rate.h:78
uint64_t GetBitRate() const
Get the underlying bitrate.
Definition data-rate.cc:234
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.
static Ipv4Address GetAny()
Helper class that adds ns3::Ipv4GlobalRouting objects.
static void PopulateRoutingTables()
Build a routing database and initialize the routing tables of the nodes in the simulation.
Global routing protocol for IPv4 stacks.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition ipv4.h:69
virtual void SetUp(uint32_t interface)=0
virtual void SetDown(uint32_t interface)=0
a class to store IPv4 address information on an interface
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Implement the IPv4 layer.
a class to represent an Ipv4 address mask
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
static Mac48Address Allocate()
Allocate a new Mac48Address.
holds a vector of ns3::NetDevice pointers
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition object.h:511
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:66
build a set of SimpleNetDevice objects
void SetNetDevicePointToPointMode(bool pointToPointMode)
SimpleNetDevice is Broadcast capable and ARP needing.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition simulator.h:560
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 Time Now()
Return the current simulation virtual time.
Definition simulator.cc:197
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
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
Definition socket.cc:61
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
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition nstime.h:392
a unique identifier for an interface.
Definition type-id.h:49
static TypeId LookupByName(std::string name)
Get a TypeId by name.
Definition type-id.cc:872
API to create UDP socket instances.
uint16_t port
Definition dsdv-manet.cc:33
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:257
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
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not.
Definition test.h:554
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1368
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1344
static Ipv4GlobalRoutingTestSuite g_globalRoutingTestSuite
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