A Discrete-Event Network Simulator
API
ipv4-global-routing-test-suite.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 as
5 * published by the Free Software Foundation;
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 */
16
17#include <vector>
18#include "ns3/boolean.h"
19#include "ns3/config.h"
20#include "ns3/inet-socket-address.h"
21#include "ns3/internet-stack-helper.h"
22#include "ns3/ipv4-address-helper.h"
23#include "ns3/ipv4-global-routing-helper.h"
24#include "ns3/ipv4-static-routing-helper.h"
25#include "ns3/node.h"
26#include "ns3/log.h"
27#include "ns3/node-container.h"
28#include "ns3/packet.h"
29#include "ns3/simple-net-device-helper.h"
30#include "ns3/pointer.h"
31#include "ns3/simulator.h"
32#include "ns3/string.h"
33#include "ns3/test.h"
34#include "ns3/uinteger.h"
35#include "ns3/ipv4-packet-info-tag.h"
36#include "ns3/simple-net-device.h"
37#include "ns3/simple-channel.h"
38#include "ns3/socket-factory.h"
39#include "ns3/udp-socket-factory.h"
40#include "ns3/ipv4-l3-protocol.h"
41#include "ns3/ipv4-routing-protocol.h"
42#include "ns3/ipv4-routing-table-entry.h"
43#include "ns3/ipv4-global-routing.h"
44#include "ns3/bridge-helper.h"
45
46using namespace ns3;
47
48NS_LOG_COMPONENT_DEFINE ("Ipv4GlobalRoutingTestSuite");
49
50// This test suite tests the operation of global routing on a few sample
51// networks to ensure that routes are built correctly
52//
53// Link test:
54// n0 <--------> n1 (point-to-point link)
55// 10.1.1.1 10.1.1.2
56// Expected routes:
57// n0: route to 0.0.0.0 gw 10.1.1.2
58// n1: route to 0.0.0.0 gw 10.1.1.1
59// Note: These default routes to 0.0.0.0 are generated by the extension
60// in the global route manager to install default routes via the
61// peer node on a point-to-point link, when the node is on a
62// stub link
63//
64// LAN test:
65// n0 <--------> n1 (broadcast link on subnet 10.1.1.0/24)
66// Expected routes:
67// n0: route to 10.1.1.0 gw 0.0.0.0
68// n1: route to 10.1.1.0 gw 0.0.0.0
69// Two link test:
70// n0 <--------> n1 <--------> n2 (point-to-point links)
71// 10.1.1.1 10.1.1.2/ 10.1.2.2
72// 10.1.2.1
73// Expected routes:
74// n0: route to 0.0.0.0 gw 10.1.1.2
75// n1: route to 10.1.1.1 gw 10.1.1.1
76// route to 10.1.2.2 gw 10.1.2.2
77// route to 10.1.1.0 gw 10.1.1.1
78// route to 10.1.2.0 gw 10.1.2.2
79// n2: route to 0.0.0.0 gw 10.1.2.1
80// Note: These default routes to 0.0.0.0 are generated by the extension
81// in the global route manager to install default routes via the
82// peer node on a point-to-point link, when the node is on a
83// stub link
84// Two LANs test:
85// n0 <--------> n1 <--------> n2 (broadcast links)
86// Expected routes:
87// n0: route to 10.1.1.0 gw 0.0.0.0
88// route to 0.0.0.0 gw 10.1.1.2
89// n1: route to 10.1.1.1 gw 10.1.1.1
90// route to 10.1.2.2 gw 10.1.2.2
91// route to 10.1.1.0 gw 10.1.1.1
92// route to 10.1.2.0 gw 10.1.2.2
93// n2: route to 0.0.0.0 gw 10.1.2.1
94// Bridge test:
95// n0 <--------> n1 <---> Bridge-n2 <---> n3 <-------> n4 (broadcast links)
96// 10.1.1.0/24 10.1.2.0/24 10.1.3.0/24
97// Expected routes:
98// n0: route to 10.1.1.0 gw 0.0.0.0
99// route to 10.1.2.0 gw 10.1.1.2
100// route to 10.1.3.0 gw 10.1.1.2
101// n1: route to 10.1.1.0 gw 0.0.0.0
102// route to 10.1.2.0 gw 0.0.0.0
103// route to 10.1.3.0 gw 10.1.2.2
104// n3: route to 10.1.1.0 gw 10.1.2.1
105// route to 10.1.2.0 gw 0.0.0.0
106// route to 10.1.3.0 gw 0.0.0.0
107// n4: route to 10.1.3.0 gw 0.0.0.0
108// route to 10.1.2.0 gw 10.1.3.1
109// route to 10.1.1.0 gw 10.1.3.1
110// Two Bridge test:
111// n0 <------> n1 <---> Bridge-n2 <---> Bridge-n3 <---> n4 (broadcast links)
112// 10.1.1.0/24 10.1.2.0/24
113// Expected routes:
114// n0: route to 10.1.1.0 gw 0.0.0.0
115// route to 10.1.2.0 gw 10.1.1.2
116// n4: route to 10.1.2.0 gw 0.0.0.0
117// route to 10.1.1.0 gw 10.1.2.1
118
119
126class LinkTest : public TestCase
127{
128public:
129 virtual void DoSetup (void);
130 virtual void DoRun (void);
131 LinkTest ();
132private:
134};
135
137 : TestCase ("Global routing on point-to-point link")
138{
139}
140
141void
143{
144 m_nodes.Create (2);
145
146 Ptr<SimpleChannel> channel = CreateObject <SimpleChannel> ();
147 SimpleNetDeviceHelper simpleHelper;
148 simpleHelper.SetNetDevicePointToPointMode (true);
149 NetDeviceContainer net = simpleHelper.Install (m_nodes, channel);
150
151 InternetStackHelper internet;
152 // By default, InternetStackHelper adds a static and global routing
153 // implementation. We just want the global for this test.
154 Ipv4GlobalRoutingHelper ipv4RoutingHelper;
155 internet.SetRoutingHelper (ipv4RoutingHelper);
156 internet.Install (m_nodes);
157
159 ipv4.SetBase ("10.1.1.0", "255.255.255.252");
160 Ipv4InterfaceContainer i = ipv4.Assign (net);
161}
162
163void
165{
166 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
167
169 NS_TEST_ASSERT_MSG_NE (ip0, 0, "Error-- no Ipv4 object");
171 NS_TEST_ASSERT_MSG_NE (ip1, 0, "Error-- no Ipv4 object");
172 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol ();
173 Ptr<Ipv4GlobalRouting> globalRouting0 = routing0->GetObject <Ipv4GlobalRouting> ();
174 NS_TEST_ASSERT_MSG_NE (globalRouting0, 0, "Error-- no Ipv4GlobalRouting object");
175 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol ();
176 Ptr<Ipv4GlobalRouting> globalRouting1 = routing1->GetObject <Ipv4GlobalRouting> ();
177 NS_TEST_ASSERT_MSG_NE (globalRouting1, 0, "Error-- no Ipv4GlobalRouting object");
178
179 // Test that the right number of routes found
180 uint32_t nRoutes0 = globalRouting0->GetNRoutes ();
181 NS_LOG_DEBUG ("LinkTest nRoutes0 " << nRoutes0);
182 NS_TEST_ASSERT_MSG_EQ (nRoutes0, 1, "Error-- not one route");
183 Ipv4RoutingTableEntry* route = globalRouting0->GetRoute (0);
184 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
185 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("0.0.0.0"), "Error-- wrong destination");
186 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.2"), "Error-- wrong gateway");
187
188 // Test that the right number of routes found
189 uint32_t nRoutes1 = globalRouting1->GetNRoutes ();
190 NS_TEST_ASSERT_MSG_EQ (nRoutes1, 1, "Error-- not one route");
191 NS_LOG_DEBUG ("LinkTest nRoutes1 " << nRoutes1);
192 route = globalRouting1->GetRoute (0);
193 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
194 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("0.0.0.0"), "Error-- wrong destination");
195 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.1"), "Error-- wrong gateway");
196
197 bool result = true;
198
199 NS_TEST_ASSERT_MSG_EQ (result, true, "Message");
200 Simulator::Run ();
201 Simulator::Destroy ();
202}
203
210class LanTest : public TestCase
211{
212public:
213 virtual void DoSetup (void);
214 virtual void DoRun (void);
215 LanTest ();
216private:
218};
219
221 : TestCase ("Global routing on broadcast link")
222{
223}
224
225void
227{
228 m_nodes.Create (2);
229
230 Ptr<SimpleChannel> channel = CreateObject <SimpleChannel> ();
231 SimpleNetDeviceHelper simpleHelper;
232 NetDeviceContainer net = simpleHelper.Install (m_nodes, channel);
233
234 InternetStackHelper internet;
235 // By default, InternetStackHelper adds a static and global routing
236 // implementation. We just want the global for this test.
237 Ipv4GlobalRoutingHelper ipv4RoutingHelper;
238 internet.SetRoutingHelper (ipv4RoutingHelper);
239 internet.Install (m_nodes);
240
242 ipv4.SetBase ("10.1.1.0", "255.255.255.0");
243 Ipv4InterfaceContainer i = ipv4.Assign (net);
244}
245
246void
248{
249 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
250
252 NS_TEST_ASSERT_MSG_NE (ip0, 0, "Error-- no Ipv4 object");
254 NS_TEST_ASSERT_MSG_NE (ip1, 0, "Error-- no Ipv4 object");
255 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol ();
256 Ptr<Ipv4GlobalRouting> globalRouting0 = routing0->GetObject <Ipv4GlobalRouting> ();
257 NS_TEST_ASSERT_MSG_NE (globalRouting0, 0, "Error-- no Ipv4GlobalRouting object");
258 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol ();
259 Ptr<Ipv4GlobalRouting> globalRouting1 = routing1->GetObject <Ipv4GlobalRouting> ();
260 NS_TEST_ASSERT_MSG_NE (globalRouting1, 0, "Error-- no Ipv4GlobalRouting object");
261
262 // Test that the right number of routes found
263 uint32_t nRoutes0 = globalRouting0->GetNRoutes ();
264 NS_LOG_DEBUG ("LanTest nRoutes0 " << nRoutes0);
265 NS_TEST_ASSERT_MSG_EQ (nRoutes0, 1, "Error-- more than one entry");
266 for (uint32_t i = 0; i < globalRouting0->GetNRoutes (); i++)
267 {
268 Ipv4RoutingTableEntry* route = globalRouting0->GetRoute (i);
269 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
270 }
271
272 // Test that the right number of routes found
273 uint32_t nRoutes1 = globalRouting1->GetNRoutes ();
274 NS_LOG_DEBUG ("LanTest nRoutes1 " << nRoutes1);
275 NS_TEST_ASSERT_MSG_EQ (nRoutes1, 1, "Error-- more than one entry");
276 for (uint32_t i = 0; i < globalRouting0->GetNRoutes (); i++)
277 {
278 Ipv4RoutingTableEntry* route = globalRouting1->GetRoute (i);
279 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
280 }
281
282 Simulator::Destroy ();
283}
284
291class TwoLinkTest : public TestCase
292{
293public:
294 virtual void DoSetup (void);
295 virtual void DoRun (void);
296 TwoLinkTest ();
297private:
299};
300
302 : TestCase ("Global routing across two hops (point-to-point links)")
303{
304}
305
306void
308{
309 m_nodes.Create (3);
310
311 Ptr<SimpleChannel> channel = CreateObject <SimpleChannel> ();
312 SimpleNetDeviceHelper simpleHelper;
313 simpleHelper.SetNetDevicePointToPointMode (true);
314 NetDeviceContainer net = simpleHelper.Install (m_nodes.Get (0), channel);
315 net.Add (simpleHelper.Install (m_nodes.Get (1), channel));
316
317 Ptr<SimpleChannel> channel2 = CreateObject <SimpleChannel> ();
318 SimpleNetDeviceHelper simpleHelper2;
319 simpleHelper2.SetNetDevicePointToPointMode (true);
320 NetDeviceContainer net2 = simpleHelper.Install (m_nodes.Get (1), channel2);
321 net2.Add (simpleHelper2.Install (m_nodes.Get (2), channel2));
322
323 InternetStackHelper internet;
324 // By default, InternetStackHelper adds a static and global routing
325 // implementation. We just want the global for this test.
326 Ipv4GlobalRoutingHelper ipv4RoutingHelper;
327 internet.SetRoutingHelper (ipv4RoutingHelper);
328 internet.Install (m_nodes);
329
331 ipv4.SetBase ("10.1.1.0", "255.255.255.252");
332 Ipv4InterfaceContainer i = ipv4.Assign (net);
333 ipv4.SetBase ("10.1.2.0", "255.255.255.252");
334 Ipv4InterfaceContainer i2 = ipv4.Assign (net2);
335}
336
337void
339{
340 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
341
343 NS_TEST_ASSERT_MSG_NE (ip0, 0, "Error-- no Ipv4 object");
345 NS_TEST_ASSERT_MSG_NE (ip1, 0, "Error-- no Ipv4 object");
347 NS_TEST_ASSERT_MSG_NE (ip2, 0, "Error-- no Ipv4 object");
348 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol ();
349 Ptr<Ipv4GlobalRouting> globalRouting0 = routing0->GetObject <Ipv4GlobalRouting> ();
350 NS_TEST_ASSERT_MSG_NE (globalRouting0, 0, "Error-- no Ipv4GlobalRouting object");
351 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol ();
352 Ptr<Ipv4GlobalRouting> globalRouting1 = routing1->GetObject <Ipv4GlobalRouting> ();
353 NS_TEST_ASSERT_MSG_NE (globalRouting1, 0, "Error-- no Ipv4GlobalRouting object");
354 Ptr<Ipv4RoutingProtocol> routing2 = ip2->GetRoutingProtocol ();
355 Ptr<Ipv4GlobalRouting> globalRouting2 = routing2->GetObject <Ipv4GlobalRouting> ();
356 NS_TEST_ASSERT_MSG_NE (globalRouting2, 0, "Error-- no Ipv4GlobalRouting object");
357
358 // node n0
359 // Test that the right number of routes found
360 uint32_t nRoutes0 = globalRouting0->GetNRoutes ();
361 NS_LOG_DEBUG ("TwoLinkTest nRoutes0 " << nRoutes0);
362 NS_TEST_ASSERT_MSG_EQ (nRoutes0, 1, "Error-- wrong number of links");
363
364 Ipv4RoutingTableEntry* route = globalRouting0->GetRoute (0);
365 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
366 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("0.0.0.0"), "Error-- wrong destination");
367 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.2"), "Error-- wrong gateway");
368
369 // node n1
370 // Test that the right number of routes found
371 uint32_t nRoutes1 = globalRouting1->GetNRoutes ();
372 NS_LOG_DEBUG ("TwoLinkTest nRoutes1 " << nRoutes1);
373 route = globalRouting1->GetRoute (0);
374 NS_LOG_DEBUG ("TwoLinkTest entry dest " << route->GetDest () << " gw " << route->GetGateway ());
375 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.1.1"), "Error-- wrong destination");
376 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.1"), "Error-- wrong gateway");
377 route = globalRouting1->GetRoute (1);
378 NS_LOG_DEBUG ("TwoLinkTest entry dest " << route->GetDest () << " gw " << route->GetGateway ());
379 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.2.2"), "Error-- wrong destination");
380 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.2.2"), "Error-- wrong gateway");
381 route = globalRouting1->GetRoute (2);
382 NS_LOG_DEBUG ("TwoLinkTest entry dest " << route->GetDest () << " gw " << route->GetGateway ());
383 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.1.0"), "Error-- wrong destination");
384 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.1"), "Error-- wrong gateway");
385 route = globalRouting1->GetRoute (3);
386 NS_LOG_DEBUG ("TwoLinkTest entry dest " << route->GetDest () << " gw " << route->GetGateway ());
387 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.2.0"), "Error-- wrong destination");
388 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.2.2"), "Error-- wrong gateway");
389
390 // node n2
391 // Test that the right number of routes found
392 uint32_t nRoutes2 = globalRouting2->GetNRoutes ();
393 NS_LOG_DEBUG ("TwoLinkTest nRoutes2 " << nRoutes2);
394 NS_TEST_ASSERT_MSG_EQ (nRoutes2, 1, "Error-- wrong number of links");
395
396 route = globalRouting2->GetRoute (0);
397 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
398 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("0.0.0.0"), "Error-- wrong destination");
399 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.2.1"), "Error-- wrong gateway");
400
401 Simulator::Destroy ();
402}
403
410class TwoLanTest : public TestCase
411{
412public:
413 virtual void DoSetup (void);
414 virtual void DoRun (void);
415 TwoLanTest ();
416private:
418};
419
421 : TestCase ("Global routing across two hops (broadcast links)")
422{
423}
424
425void
427{
428 m_nodes.Create (3);
429
430 Ptr<SimpleChannel> channel = CreateObject <SimpleChannel> ();
431 SimpleNetDeviceHelper simpleHelper;
432 NetDeviceContainer net = simpleHelper.Install (m_nodes.Get (0), channel);
433 net.Add (simpleHelper.Install (m_nodes.Get (1), channel));
434
435 Ptr<SimpleChannel> channel2 = CreateObject <SimpleChannel> ();
436 SimpleNetDeviceHelper simpleHelper2;
437 NetDeviceContainer net2 = simpleHelper.Install (m_nodes.Get (1), channel2);
438 net2.Add (simpleHelper2.Install (m_nodes.Get (2), channel2));
439
440 InternetStackHelper internet;
441 // By default, InternetStackHelper adds a static and global routing
442 // implementation. We just want the global for this test.
443 Ipv4GlobalRoutingHelper ipv4RoutingHelper;
444 internet.SetRoutingHelper (ipv4RoutingHelper);
445 internet.Install (m_nodes);
446
448 ipv4.SetBase ("10.1.1.0", "255.255.255.0");
449 Ipv4InterfaceContainer i = ipv4.Assign (net);
450 ipv4.SetBase ("10.1.2.0", "255.255.255.0");
451 Ipv4InterfaceContainer i2 = ipv4.Assign (net2);
452}
453
454void
456{
457 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
458
460 NS_TEST_ASSERT_MSG_NE (ip0, 0, "Error-- no Ipv4 object");
462 NS_TEST_ASSERT_MSG_NE (ip1, 0, "Error-- no Ipv4 object");
464 NS_TEST_ASSERT_MSG_NE (ip2, 0, "Error-- no Ipv4 object");
465 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol ();
466 Ptr<Ipv4GlobalRouting> globalRouting0 = routing0->GetObject <Ipv4GlobalRouting> ();
467 NS_TEST_ASSERT_MSG_NE (globalRouting0, 0, "Error-- no Ipv4GlobalRouting object");
468 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol ();
469 Ptr<Ipv4GlobalRouting> globalRouting1 = routing1->GetObject <Ipv4GlobalRouting> ();
470 NS_TEST_ASSERT_MSG_NE (globalRouting1, 0, "Error-- no Ipv4GlobalRouting object");
471 Ptr<Ipv4RoutingProtocol> routing2 = ip2->GetRoutingProtocol ();
472 Ptr<Ipv4GlobalRouting> globalRouting2 = routing2->GetObject <Ipv4GlobalRouting> ();
473 NS_TEST_ASSERT_MSG_NE (globalRouting2, 0, "Error-- no Ipv4GlobalRouting object");
474
475 // Test that the right number of routes found
476 uint32_t nRoutes0 = globalRouting0->GetNRoutes ();
477 NS_LOG_DEBUG ("TwoLanTest nRoutes0 " << nRoutes0);
478 NS_TEST_ASSERT_MSG_EQ (nRoutes0, 2, "Error-- not two entries");
479 Ipv4RoutingTableEntry* route = globalRouting0->GetRoute (0);
480 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
481 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.1.0"), "Error-- wrong destination");
482 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("0.0.0.0"), "Error-- wrong gateway");
483 route = globalRouting0->GetRoute (1);
484 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
485 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.2.0"), "Error-- wrong destination");
486 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.2"), "Error-- wrong gateway");
487
488 // Test that the right number of routes found
489 uint32_t nRoutes1 = globalRouting1->GetNRoutes ();
490 NS_LOG_DEBUG ("TwoLanTest nRoutes1 " << nRoutes1);
491 NS_TEST_ASSERT_MSG_EQ (nRoutes1, 2, "Error-- not two entries");
492 route = globalRouting1->GetRoute (0);
493 NS_LOG_DEBUG ("TwoLanTest entry dest " << route->GetDest () << " gw " << route->GetGateway ());
494 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.1.0"), "Error-- wrong destination");
495 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("0.0.0.0"), "Error-- wrong gateway");
496 route = globalRouting1->GetRoute (1);
497 NS_LOG_DEBUG ("TwoLanTest entry dest " << route->GetDest () << " gw " << route->GetGateway ());
498 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.2.0"), "Error-- wrong destination");
499 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("0.0.0.0"), "Error-- wrong gateway");
500
501 Simulator::Destroy ();
502}
503
510class BridgeTest : public TestCase
511{
512public:
513 virtual void DoSetup (void);
514 virtual void DoRun (void);
515 BridgeTest ();
516private:
518};
519
521 : TestCase ("Global routing across bridging topology (bug 2102)")
522{
523}
524
525void
527{
528 m_nodes.Create (5);
529
530 //connect node0 to node1
531 Ptr<SimpleChannel> channel = CreateObject <SimpleChannel> ();
532 SimpleNetDeviceHelper simpleHelper;
533 NetDeviceContainer net = simpleHelper.Install (m_nodes.Get (0), channel);
534 net.Add (simpleHelper.Install (m_nodes.Get (1), channel));
535
536 NetDeviceContainer bridgeFacingDevices;
537 NetDeviceContainer switchDevices;
538
539 //connect node1 to node2 (switch)
540 Ptr<SimpleChannel> channel2 = CreateObject <SimpleChannel> ();
541 SimpleNetDeviceHelper simpleHelper2;
542 NetDeviceContainer net2 = simpleHelper2.Install (m_nodes.Get (1), channel2);
543 net2.Add (simpleHelper2.Install (m_nodes.Get (2), channel2));
544 bridgeFacingDevices.Add (net2.Get (0));
545 switchDevices.Add (net2.Get (1));
546
547 //connect node2 (switch) to node3
548 Ptr<SimpleChannel> channel3 = CreateObject <SimpleChannel> ();
549 SimpleNetDeviceHelper simpleHelper3;
550 NetDeviceContainer net3 = simpleHelper3.Install (m_nodes.Get (2), channel3);
551 net3.Add (simpleHelper3.Install (m_nodes.Get (3), channel3));
552 bridgeFacingDevices.Add (net3.Get (1));
553 switchDevices.Add (net3.Get (0));
554
555 //connect node3 to node4
556 Ptr<SimpleChannel> channel4 = CreateObject <SimpleChannel> ();
557 SimpleNetDeviceHelper simpleHelper4;
558 NetDeviceContainer net4 = simpleHelper4.Install (m_nodes.Get (3), channel4);
559 net4.Add (simpleHelper4.Install (m_nodes.Get (4), channel4));
560
561 Ptr<Node> switchNode = m_nodes.Get (2);
562 BridgeHelper bridge;
563 bridge.Install (switchNode, switchDevices);
564
565 InternetStackHelper internet;
566 // By default, InternetStackHelper adds a static and global routing
567 // implementation. We just want the global for this test.
568 Ipv4GlobalRoutingHelper ipv4RoutingHelper;
569 internet.SetRoutingHelper (ipv4RoutingHelper);
570
571 internet.Install (m_nodes.Get (0));
572 internet.Install (m_nodes.Get (1));
573 // m_nodes.Get (2) is bridge node
574 internet.Install (m_nodes.Get (3));
575 internet.Install (m_nodes.Get (4));
576
578 address.SetBase ("10.1.1.0", "255.255.255.0");
579 address.Assign (net);
580
581 address.SetBase ("10.1.2.0", "255.255.255.0");
582 address.Assign (bridgeFacingDevices);
583
584 address.SetBase ("10.1.3.0", "255.255.255.0");
585 address.Assign (net4);
586
587}
588
589void
591{
592 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
593
595 NS_TEST_ASSERT_MSG_NE (ip0, 0, "Error-- no Ipv4 object");
596 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol ();
597 NS_TEST_ASSERT_MSG_NE (routing0, 0, "Error-- no Ipv4 routing protocol object");
598 Ptr<Ipv4GlobalRouting> globalRouting0 = routing0->GetObject <Ipv4GlobalRouting> ();
599 NS_TEST_ASSERT_MSG_NE (globalRouting0, 0, "Error-- no Ipv4GlobalRouting object");
600
602 NS_TEST_ASSERT_MSG_NE (ip1, 0, "Error-- no Ipv4 object");
603 Ptr<Ipv4RoutingProtocol> routing1 = ip1->GetRoutingProtocol ();
604 NS_TEST_ASSERT_MSG_NE (routing1, 0, "Error-- no Ipv4 routing protocol object");
605 Ptr<Ipv4GlobalRouting> globalRouting1 = routing1->GetObject <Ipv4GlobalRouting> ();
606 NS_TEST_ASSERT_MSG_NE (globalRouting1, 0, "Error-- no Ipv4GlobalRouting object");
607
608 // Skip to n4
610 NS_TEST_ASSERT_MSG_NE (ip4, 0, "Error-- no Ipv4 object");
611 Ptr<Ipv4RoutingProtocol> routing4 = ip4->GetRoutingProtocol ();
612 NS_TEST_ASSERT_MSG_NE (routing4, 0, "Error-- no Ipv4 routing protocol object");
613 Ptr<Ipv4GlobalRouting> globalRouting4 = routing4->GetObject <Ipv4GlobalRouting> ();
614 NS_TEST_ASSERT_MSG_NE (globalRouting4, 0, "Error-- no Ipv4GlobalRouting object");
615
616 Ipv4RoutingTableEntry* route = 0;
617 // n0
618 // Test that the right number of routes found
619 uint32_t nRoutes0 = globalRouting0->GetNRoutes ();
620 NS_LOG_DEBUG ("BridgeTest nRoutes0 " << nRoutes0);
621 NS_TEST_ASSERT_MSG_EQ (nRoutes0, 3, "Error-- not three entries");
622 for (uint32_t i = 0; i < globalRouting0->GetNRoutes (); i++)
623 {
624 route = globalRouting0->GetRoute (i);
625 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
626 }
627 // Spot check the last route
628 if (route)
629 {
630 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.3.0"), "Error-- wrong destination");
631 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.2"), "Error-- wrong gateway");
632 }
633
634 // n1
635 // Test that the right number of routes found
636 route = 0;
637 uint32_t nRoutes1 = globalRouting1->GetNRoutes ();
638 NS_LOG_DEBUG ("BridgeTest nRoutes1 " << nRoutes1);
639 NS_TEST_ASSERT_MSG_EQ (nRoutes1, 3, "Error-- not three entries");
640 for (uint32_t i = 0; i < globalRouting1->GetNRoutes (); i++)
641 {
642 route = globalRouting1->GetRoute (i);
643 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
644 }
645 // Spot check the last route
646 if (route)
647 {
648 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.3.0"), "Error-- wrong destination");
649 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.2.2"), "Error-- wrong gateway");
650 }
651
652 // skip n2 and n3, just verify n4
653 NS_LOG_DEBUG ("BridgeTest skip print out of n2 and n3, go next to node n4");
654
655 // n4
656 route = 0;
657 // Test that the right number of routes found
658 uint32_t nRoutes4 = globalRouting4->GetNRoutes ();
659 NS_LOG_DEBUG ("BridgeTest nRoutes4 " << nRoutes4);
660 NS_TEST_ASSERT_MSG_EQ (nRoutes4, 3, "Error-- not three entries");
661 for (uint32_t i = 0; i < globalRouting4->GetNRoutes (); i++)
662 {
663 route = globalRouting4->GetRoute (i);
664 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
665 }
666 // Spot check the last route
667 if (route)
668 {
669 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.1.0"), "Error-- wrong destination");
670 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.3.1"), "Error-- wrong gateway");
671 }
672
673 Simulator::Destroy ();
674}
675
683{
684public:
685 virtual void DoSetup (void);
686 virtual void DoRun (void);
687 TwoBridgeTest ();
688private:
690};
691
693 : TestCase ("Global routing across two bridges")
694{
695}
696
697void
699{
700 m_nodes.Create (5);
701
702 //connect node0 to node1
703 Ptr<SimpleChannel> channel = CreateObject <SimpleChannel> ();
704 SimpleNetDeviceHelper simpleHelper;
705 NetDeviceContainer net = simpleHelper.Install (m_nodes.Get (0), channel);
706 net.Add (simpleHelper.Install (m_nodes.Get (1), channel));
707
708 NetDeviceContainer bridgeFacingDevices;
709 NetDeviceContainer switchn2Devices;
710 NetDeviceContainer switchn3Devices;
711
712 //connect node1 to node2 (switch)
713 Ptr<SimpleChannel> channel2 = CreateObject <SimpleChannel> ();
714 SimpleNetDeviceHelper simpleHelper2;
715 NetDeviceContainer net2 = simpleHelper2.Install (m_nodes.Get (1), channel2);
716 net2.Add (simpleHelper2.Install (m_nodes.Get (2), channel2));
717 bridgeFacingDevices.Add (net2.Get (0));
718 switchn2Devices.Add (net2.Get (1));
719
720 //connect node2 (switch) to node3
721 Ptr<SimpleChannel> channel3 = CreateObject <SimpleChannel> ();
722 SimpleNetDeviceHelper simpleHelper3;
723 NetDeviceContainer net3 = simpleHelper3.Install (m_nodes.Get (2), channel3);
724 net3.Add (simpleHelper3.Install (m_nodes.Get (3), channel3));
725 switchn2Devices.Add (net3.Get (0));
726 switchn3Devices.Add (net3.Get (1));
727
728 //connect node3 to node4
729 Ptr<SimpleChannel> channel4 = CreateObject <SimpleChannel> ();
730 SimpleNetDeviceHelper simpleHelper4;
731 NetDeviceContainer net4 = simpleHelper4.Install (m_nodes.Get (3), channel4);
732 net4.Add (simpleHelper4.Install (m_nodes.Get (4), channel4));
733 switchn3Devices.Add (net4.Get (0));
734 bridgeFacingDevices.Add (net4.Get (1));
735
736 Ptr<Node> switchn2Node = m_nodes.Get (2);
737 BridgeHelper bridgen2Helper;
738 bridgen2Helper.Install (switchn2Node, switchn2Devices);
739
740 Ptr<Node> switchn3Node = m_nodes.Get (3);
741 BridgeHelper bridgen3Helper;
742 bridgen3Helper.Install (switchn3Node, switchn3Devices);
743
744 InternetStackHelper internet;
745 // By default, InternetStackHelper adds a static and global routing
746 // implementation. We just want the global for this test.
747 Ipv4GlobalRoutingHelper ipv4RoutingHelper;
748 internet.SetRoutingHelper (ipv4RoutingHelper);
749
750 internet.Install (m_nodes.Get (0));
751 internet.Install (m_nodes.Get (1));
752 // m_nodes.Get (2) is bridge node
753 // m_nodes.Get (3) is bridge node
754 internet.Install (m_nodes.Get (4));
755
757 address.SetBase ("10.1.1.0", "255.255.255.0");
758 address.Assign (net);
759
760 address.SetBase ("10.1.2.0", "255.255.255.0");
761 address.Assign (bridgeFacingDevices);
762
763}
764
765void
767{
768 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
769
771 NS_TEST_ASSERT_MSG_NE (ip0, 0, "Error-- no Ipv4 object");
772 Ptr<Ipv4RoutingProtocol> routing0 = ip0->GetRoutingProtocol ();
773 NS_TEST_ASSERT_MSG_NE (routing0, 0, "Error-- no Ipv4 routing protocol object");
774 Ptr<Ipv4GlobalRouting> globalRouting0 = routing0->GetObject <Ipv4GlobalRouting> ();
775 NS_TEST_ASSERT_MSG_NE (globalRouting0, 0, "Error-- no Ipv4GlobalRouting object");
776
777 // Skip to n4
779 NS_TEST_ASSERT_MSG_NE (ip4, 0, "Error-- no Ipv4 object");
780 Ptr<Ipv4RoutingProtocol> routing4 = ip4->GetRoutingProtocol ();
781 NS_TEST_ASSERT_MSG_NE (routing4, 0, "Error-- no Ipv4 routing protocol object");
782 Ptr<Ipv4GlobalRouting> globalRouting4 = routing4->GetObject <Ipv4GlobalRouting> ();
783 NS_TEST_ASSERT_MSG_NE (globalRouting4, 0, "Error-- no Ipv4GlobalRouting object");
784
785 Ipv4RoutingTableEntry* route = 0;
786 // n0
787 // Test that the right number of routes found
788 uint32_t nRoutes0 = globalRouting0->GetNRoutes ();
789 NS_LOG_DEBUG ("BridgeTest nRoutes0 " << nRoutes0);
790 NS_TEST_ASSERT_MSG_EQ (nRoutes0, 2, "Error-- not two entries");
791 for (uint32_t i = 0; i < globalRouting0->GetNRoutes (); i++)
792 {
793 route = globalRouting0->GetRoute (i);
794 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
795 }
796 // Spot check the last route
797 if (route)
798 {
799 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.2.0"), "Error-- wrong destination");
800 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.1.2"), "Error-- wrong gateway");
801 }
802 // skip n2 and n3, just verify n4
803 NS_LOG_DEBUG ("BridgeTest skip print out of n1-n3, go next to node n4");
804
805 // n4
806 // Test that the right number of routes found
807 route = 0;
808 uint32_t nRoutes4 = globalRouting4->GetNRoutes ();
809 NS_LOG_DEBUG ("BridgeTest nRoutes4 " << nRoutes4);
810 NS_TEST_ASSERT_MSG_EQ (nRoutes4, 2, "Error-- not two entries");
811 for (uint32_t i = 0; i < globalRouting4->GetNRoutes (); i++)
812 {
813 route = globalRouting4->GetRoute (i);
814 NS_LOG_DEBUG ("entry dest " << route->GetDest () << " gw " << route->GetGateway ());
815 }
816 // Spot check the last route
817 if (route)
818 {
819 NS_TEST_ASSERT_MSG_EQ (route->GetDest (), Ipv4Address ("10.1.1.0"), "Error-- wrong destination");
820 NS_TEST_ASSERT_MSG_EQ (route->GetGateway (), Ipv4Address ("10.1.2.1"), "Error-- wrong gateway");
821 }
822
823 Simulator::Destroy ();
824}
825
833{
834public:
837
838private:
843 void SendData (uint8_t index);
844
849 void ShutDownSock (uint8_t index);
850
855 void HandleRead (Ptr<Socket> socket);
856 virtual void DoRun (void);
857
858 uint16_t m_count;
859 std::vector<std::pair<Ptr<Socket>, bool> > m_sendSocks;
861 uint16_t m_packetSize;
862 std::vector<uint8_t> m_firstInterface;
863 std::vector<uint8_t> m_secondInterface;
864};
865
866// Add some help text to this case to describe what it is intended to test
868 : TestCase ("Dynamic global routing example"), m_count (0)
869{
870 m_firstInterface.resize (16);
871 m_secondInterface.resize (16);
872 m_dataRate = DataRate ("2kbps");
873 m_packetSize = 50;
874}
875
877{
878 std::vector<std::pair<Ptr<Socket>, bool> >::iterator iter;
879
880 for (iter = m_sendSocks.begin (); iter != m_sendSocks.end (); iter++)
881 {
882 if (iter->second)
883 {
884 iter->second = false;
885 iter->first->Close ();
886 iter->first = 0;
887 }
888 }
889}
890
891void
893{
894 Ptr<Packet> packet;
895 Address from;
896 while ((packet = socket->RecvFrom (from)))
897 {
898 if (packet->GetSize () == 0)
899 { //EOF
900 break;
901 }
903 bool found;
904 found = packet->PeekPacketTag (tag);
905 uint8_t now = static_cast<uint8_t> (Simulator::Now ().GetSeconds ());
906 if (found)
907 {
908 if (tag.GetRecvIf () == 1)
909 {
910 m_firstInterface[now]++;
911 }
912 if (tag.GetRecvIf () == 2)
913 {
914 m_secondInterface[now]++;
915 }
916 m_count++;
917 }
918 }
919}
920
921void
923{
924 if (m_sendSocks[index].second == false)
925 {
926 return;
927 }
928 Ptr<Packet> packet = Create<Packet> (m_packetSize);
929 m_sendSocks[index].first->Send (packet);
930
931 Time tNext (MicroSeconds (m_packetSize * 8 * 1e6 / m_dataRate.GetBitRate ()));
932 Simulator::Schedule (tNext, &Ipv4DynamicGlobalRoutingTestCase::SendData, this, index);
933}
934
935void
937{
938 m_sendSocks[index].second = false;
939 m_sendSocks[index].first->Close ();
940 m_sendSocks[index].first = 0;
941}
942
943// Test derived from examples/routing/dynamic-global-routing.cc
944//
945// Network topology
946//
947// n0
948// \ p-p
949// \ (shared csma/cd)
950// n2 -------------------------n3
951// / | |
952// / p-p n4 n5 ---------- n6
953// n1 p-p
954// | |
955// ----------------------------------------
956// p-p
957//
958// Test that for node n6, the interface facing n5 receives packets at
959// times (1-2), (4-6), (8-10), (11-12), (14-16) and the interface
960// facing n1 receives packets at times (2-4), (6-8), (12-13)
961//
962void
964{
965 // The below value configures the default behavior of global routing.
966 // By default, it is disabled. To respond to interface events, set to true
967 Config::SetDefault ("ns3::Ipv4GlobalRouting::RespondToInterfaceEvents", BooleanValue (true));
968
970 c.Create (7);
971 NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
972 NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
973 NodeContainer n5n6 = NodeContainer (c.Get (5), c.Get (6));
974 NodeContainer n1n6 = NodeContainer (c.Get (1), c.Get (6));
975 NodeContainer n2345 = NodeContainer (c.Get (2), c.Get (3), c.Get (4), c.Get (5));
976
977 InternetStackHelper internet;
978 internet.Install (c);
979
980 // We create the channels first without any IP addressing information
981 SimpleNetDeviceHelper devHelper;
982
983 devHelper.SetNetDevicePointToPointMode (true);
984 NetDeviceContainer d0d2 = devHelper.Install (n0n2);
985 devHelper.SetNetDevicePointToPointMode (false);
986
987 NetDeviceContainer d1d6 = devHelper.Install (n1n6);
988 NetDeviceContainer d1d2 = devHelper.Install (n1n2);
989 NetDeviceContainer d5d6 = devHelper.Install (n5n6);
990 NetDeviceContainer d2345 = devHelper.Install (n2345);
991
992 // Later, we add IP addresses.
994 ipv4.SetBase ("10.1.1.0", "255.255.255.0");
995 ipv4.Assign (d0d2);
996
997 ipv4.SetBase ("10.1.2.0", "255.255.255.0");
998 ipv4.Assign (d1d2);
999
1000 ipv4.SetBase ("10.1.3.0", "255.255.255.0");
1001 Ipv4InterfaceContainer i5i6 = ipv4.Assign (d5d6);
1002
1003 ipv4.SetBase ("10.250.1.0", "255.255.255.0");
1004 ipv4.Assign (d2345);
1005
1006 ipv4.SetBase ("172.16.1.0", "255.255.255.0");
1007 Ipv4InterfaceContainer i1i6 = ipv4.Assign (d1d6);
1008
1009 // Create router nodes, initialize routing database and set up the routing
1010 // tables in the nodes.
1011 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
1012
1013 // Create the applications to send UDP datagrams of size
1014 // 50 bytes at a rate of 2 Kb/s
1015 TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
1016 uint16_t port = 9; // Discard port (RFC 863)
1017
1018 std::pair<Ptr<Socket>, bool> sendSockA;
1019 sendSockA.first = Socket::CreateSocket (c.Get (1), tid);
1020 sendSockA.first->Bind ();
1021 sendSockA.first->Connect (InetSocketAddress (i5i6.GetAddress (1), port));
1022 sendSockA.second = true;
1023 m_sendSocks.push_back (sendSockA);
1024 Simulator::Schedule (Seconds (1.0), &Ipv4DynamicGlobalRoutingTestCase::SendData, this, 0);
1025 Simulator::Schedule (Seconds (10.0), &Ipv4DynamicGlobalRoutingTestCase::ShutDownSock, this, 0);
1026
1027 std::pair<Ptr<Socket>, bool> sendSockB;
1028 sendSockB.first = Socket::CreateSocket (c.Get (1), tid);
1029 sendSockB.first->Bind ();
1030 sendSockB.first->Connect (InetSocketAddress (i1i6.GetAddress (1), port));
1031 sendSockB.second = true;
1032 m_sendSocks.push_back (sendSockB);
1033 Simulator::Schedule (Seconds (11.0), &Ipv4DynamicGlobalRoutingTestCase::SendData, this, 1);
1034 Simulator::Schedule (Seconds (16.0), &Ipv4DynamicGlobalRoutingTestCase::ShutDownSock, this, 1);
1035
1036
1037 // Create an optional packet sink to receive these packets
1038 Ptr<Socket> sink2 = Socket::CreateSocket (c.Get (6), tid);
1039 sink2->Bind (Address (InetSocketAddress (Ipv4Address::GetAny (), port)));
1040 sink2->Listen ();
1041 sink2->ShutdownSend ();
1042
1043 sink2->SetRecvPktInfo (true);
1045
1046 Ptr<Node> n1 = c.Get (1);
1047 Ptr<Ipv4> ipv41 = n1->GetObject<Ipv4> ();
1048 // The first ifIndex is 0 for loopback, then the first p2p is numbered 1,
1049 // then the next p2p is numbered 2
1050 uint32_t ipv4ifIndex1 = 2;
1051
1052 Simulator::Schedule (Seconds (2), &Ipv4::SetDown,ipv41, ipv4ifIndex1);
1053 Simulator::Schedule (Seconds (4), &Ipv4::SetUp,ipv41, ipv4ifIndex1);
1054
1055 Ptr<Node> n6 = c.Get (6);
1056 Ptr<Ipv4> ipv46 = n6->GetObject<Ipv4> ();
1057 // The first ifIndex is 0 for loopback, then the first p2p is numbered 1,
1058 // then the next p2p is numbered 2
1059 uint32_t ipv4ifIndex6 = 2;
1060 Simulator::Schedule (Seconds (6), &Ipv4::SetDown,ipv46, ipv4ifIndex6);
1061 Simulator::Schedule (Seconds (8), &Ipv4::SetUp,ipv46, ipv4ifIndex6);
1062
1063 Simulator::Schedule (Seconds (12), &Ipv4::SetDown,ipv41, ipv4ifIndex1);
1064 Simulator::Schedule (Seconds (14), &Ipv4::SetUp,ipv41, ipv4ifIndex1);
1065
1066 Simulator::Run ();
1067
1068 NS_TEST_ASSERT_MSG_EQ (m_count, 70, "Dynamic global routing did not deliver all packets");
1069// Test that for node n6, the interface facing n5 receives packets at
1070// times (1-2), (4-6), (8-10), (11-12), (14-16) and the interface
1071// facing n1 receives packets at times (2-4), (6-8), (12-13)
1072 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[1], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[1]));
1073 NS_TEST_ASSERT_MSG_EQ (m_secondInterface[2], 5, "Dynamic global routing did not deliver all packets " << int(m_secondInterface[2]));
1074 NS_TEST_ASSERT_MSG_EQ (m_secondInterface[3], 5, "Dynamic global routing did not deliver all packets " << int(m_secondInterface[3]));
1075 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[4], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[4]));
1076 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[5], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[5]));
1077 NS_TEST_ASSERT_MSG_EQ (m_secondInterface[6], 5, "Dynamic global routing did not deliver all packets " << int(m_secondInterface[6]));
1078 NS_TEST_ASSERT_MSG_EQ (m_secondInterface[7], 5, "Dynamic global routing did not deliver all packets " << int(m_secondInterface[7]));
1079 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[8], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[8]));
1080 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[9], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[9]));
1081 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[10], 0, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[10]));
1082 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[11], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[11]));
1083 NS_TEST_ASSERT_MSG_EQ (m_secondInterface[12], 5, "Dynamic global routing did not deliver all packets " << int(m_secondInterface[12]));
1084 NS_TEST_ASSERT_MSG_EQ (m_secondInterface[13], 5, "Dynamic global routing did not deliver all packets " << int(m_secondInterface[13]));
1085 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[14], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[14]));
1086 NS_TEST_ASSERT_MSG_EQ (m_firstInterface[15], 5, "Dynamic global routing did not deliver all packets " << int(m_firstInterface[15]));
1087 Simulator::Destroy ();
1088}
1089
1097{
1098public:
1101
1103
1108 void ReceivePkt (Ptr<Socket> socket);
1114 void DoSendData (Ptr<Socket> socket, std::string to);
1120 void SendData (Ptr<Socket> socket, std::string to);
1121
1122private:
1123 virtual void DoRun (void);
1124};
1125
1126// Add some help text to this case to describe what it is intended to test
1128 : TestCase ("Slash 32 global routing example")
1129{
1130}
1131
1133{
1134}
1135
1136void
1138{
1139 uint32_t availableData;
1140 availableData = socket->GetRxAvailable ();
1142 NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Received packet size is not equal to Rx buffer size");
1143 //cast availableData to void, to suppress 'availableData' set but not used
1144 //compiler warning
1145 (void) availableData;
1146}
1147
1148void
1150{
1151 Address realTo = InetSocketAddress (Ipv4Address (to.c_str ()), 1234);
1152 NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
1153 123, "100");
1154}
1155
1156void
1158{
1159 m_receivedPacket = Create<Packet> ();
1160 Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (60),
1162 Simulator::Stop (Seconds (66));
1163 Simulator::Run ();
1164}
1165
1166// Test program for this 3-router scenario, using global routing
1167//
1168// (a.a.a.a/32)A<--x.x.x.0/30-->B<--y.y.y.0/30-->C(c.c.c.c/32)
1169//
1170void
1172{
1173 Ptr<Node> nA = CreateObject<Node> ();
1174 Ptr<Node> nB = CreateObject<Node> ();
1175 Ptr<Node> nC = CreateObject<Node> ();
1176
1177 NodeContainer c = NodeContainer (nA, nB, nC);
1178
1179 InternetStackHelper internet;
1180 internet.Install (c);
1181
1182 // simple links
1183 NodeContainer nAnB = NodeContainer (nA, nB);
1184 NodeContainer nBnC = NodeContainer (nB, nC);
1185
1186 SimpleNetDeviceHelper devHelper;
1187
1188 Ptr<SimpleNetDevice> deviceA = CreateObject<SimpleNetDevice> ();
1189 deviceA->SetAddress (Mac48Address::Allocate ());
1190 nA->AddDevice (deviceA);
1191
1192 NetDeviceContainer dAdB = devHelper.Install (nAnB);
1193 NetDeviceContainer dBdC = devHelper.Install (nBnC);
1194
1195 Ptr<SimpleNetDevice> deviceC = CreateObject<SimpleNetDevice> ();
1196 deviceC->SetAddress (Mac48Address::Allocate ());
1197 nC->AddDevice (deviceC);
1198
1199 // Later, we add IP addresses.
1200 Ipv4AddressHelper ipv4;
1201 ipv4.SetBase ("10.1.1.0", "255.255.255.252");
1202 Ipv4InterfaceContainer iAiB = ipv4.Assign (dAdB);
1203
1204 ipv4.SetBase ("10.1.1.4", "255.255.255.252");
1205 Ipv4InterfaceContainer iBiC = ipv4.Assign (dBdC);
1206
1207 Ptr<Ipv4> ipv4A = nA->GetObject<Ipv4> ();
1208 Ptr<Ipv4> ipv4B = nB->GetObject<Ipv4> ();
1209 Ptr<Ipv4> ipv4C = nC->GetObject<Ipv4> ();
1210
1211 int32_t ifIndexA = ipv4A->AddInterface (deviceA);
1212 int32_t ifIndexC = ipv4C->AddInterface (deviceC);
1213
1214 Ipv4InterfaceAddress ifInAddrA = Ipv4InterfaceAddress (Ipv4Address ("172.16.1.1"), Ipv4Mask ("/32"));
1215 ipv4A->AddAddress (ifIndexA, ifInAddrA);
1216 ipv4A->SetMetric (ifIndexA, 1);
1217 ipv4A->SetUp (ifIndexA);
1218
1219 Ipv4InterfaceAddress ifInAddrC = Ipv4InterfaceAddress (Ipv4Address ("192.168.1.1"), Ipv4Mask ("/32"));
1220 ipv4C->AddAddress (ifIndexC, ifInAddrC);
1221 ipv4C->SetMetric (ifIndexC, 1);
1222 ipv4C->SetUp (ifIndexC);
1223
1224 // Create router nodes, initialize routing database and set up the routing
1225 // tables in the nodes.
1226 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
1227
1228 // Create the UDP sockets
1229 Ptr<SocketFactory> rxSocketFactory = nC->GetObject<UdpSocketFactory> ();
1230 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
1231 NS_TEST_EXPECT_MSG_EQ (rxSocket->Bind (InetSocketAddress (Ipv4Address ("192.168.1.1"), 1234)), 0, "trivial");
1232 rxSocket->SetRecvCallback (MakeCallback (&Ipv4GlobalRoutingSlash32TestCase::ReceivePkt, this));
1233
1234 Ptr<SocketFactory> txSocketFactory = nA->GetObject<UdpSocketFactory> ();
1235 Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
1236 txSocket->SetAllowBroadcast (true);
1237
1238 // ------ Now the tests ------------
1239
1240 // Unicast test
1241 SendData (txSocket, "192.168.1.1");
1242 NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 123, "Static routing with /32 did not deliver all packets.");
1243
1244 Simulator::Destroy ();
1245}
1246
1254{
1255public:
1257};
1258
1260 : TestSuite ("ipv4-global-routing", UNIT)
1261 {
1262 AddTestCase (new LinkTest, TestCase::QUICK);
1263 AddTestCase (new LanTest, TestCase::QUICK);
1264 AddTestCase (new TwoLinkTest, TestCase::QUICK);
1265 AddTestCase (new TwoLanTest, TestCase::QUICK);
1266 AddTestCase (new BridgeTest, TestCase::QUICK);
1267 AddTestCase (new TwoBridgeTest, TestCase::QUICK);
1268 AddTestCase (new Ipv4DynamicGlobalRoutingTestCase, TestCase::QUICK);
1269 AddTestCase (new Ipv4GlobalRoutingSlash32TestCase, TestCase::QUICK);
1270 }
1271
#define max(a, b)
Definition: 80211b.c:43
NodeContainer n1n2
NodeContainer n0n2
IPv4 GlobalRouting Bridge test.
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
NodeContainer m_nodes
Nodes used in the test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
virtual void DoRun(void)
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.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void SendData(Ptr< Socket > socket, std::string to)
Send a packet.
void DoSendData(Ptr< Socket > socket, std::string to)
Send a packet.
Ptr< Packet > m_receivedPacket
number of received packets
IPv4 GlobalRouting LAN test.
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
virtual void DoRun(void)
Implementation to actually run this TestCase.
NodeContainer m_nodes
Nodes used in the test.
IPv4 GlobalRouting Two bridges test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
NodeContainer m_nodes
Nodes used in the test.
IPv4 GlobalRouting Two LAN test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
NodeContainer m_nodes
Nodes used in the test.
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
a polymophic address class
Definition: address.h:91
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Add capability to bridge multiple LAN segments (IEEE 802.1D bridging)
Definition: bridge-helper.h:44
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:89
uint64_t GetBitRate() const
Get the underlying bitrate.
Definition: data-rate.cc:287
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...
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
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
Helper class that adds ns3::Ipv4GlobalRouting objects.
Global routing protocol for IPv4 stacks.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:77
a class to store IPv4 address information on an interface
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Implement the IPv4 layer.
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:256
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
uint32_t GetRecvIf(void) const
Get the tag's receiving interface.
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
Ipv4Address GetDest(void) const
Ipv4Address GetGateway(void) const
holds a vector of ns3::NetDevice pointers
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
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.
uint32_t GetId(void) const
Definition: node.cc:109
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Definition: packet.cc:978
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
build a set of SimpleNetDevice objects
void SetNetDevicePointToPointMode(bool pointToPointMode)
SimpleNetDevice is Broadcast capable and ARP needing.
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
void SetRecvPktInfo(bool flag)
Enable/Disable receive packet information to socket.
Definition: socket.cc:358
virtual int Listen(void)=0
Listen for incoming connections.
virtual int ShutdownSend(void)=0
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
Definition: socket.cc:128
virtual uint32_t GetRxAvailable(void) const =0
Return number of bytes which can be returned from one or multiple calls to Recv.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
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
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
a unique identifier for an interface.
Definition: type-id.h:59
API to create UDP socket instances.
uint16_t port
Definition: dsdv-manet.cc:45
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_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:329
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
#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
#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:240
#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:542
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1260
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
static Ipv4GlobalRoutingTestSuite g_globalRoutingTestSuite
Static variable for test initialization.
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
Definition: second.py:1
channel
Definition: third.py:92
void SetUp(char *deviceName)