22 #include "ns3/socket-factory.h"
23 #include "ns3/udp-socket-factory.h"
24 #include "ns3/simulator.h"
25 #include "ns3/socket.h"
27 #include "ns3/internet-stack-helper.h"
28 #include "ns3/ipv4-address-helper.h"
29 #include "ns3/ipv4-l3-protocol.h"
30 #include "ns3/icmpv4-l4-protocol.h"
31 #include "ns3/ipv6-address-helper.h"
32 #include "ns3/ipv6-l3-protocol.h"
33 #include "ns3/icmpv6-l4-protocol.h"
34 #include "ns3/udp-l4-protocol.h"
35 #include "ns3/simple-net-device-helper.h"
36 #include "ns3/nix-vector-helper.h"
101 virtual void DoRun (
void);
114 :
TestCase (
"three router, two path test")
120 [[maybe_unused]] uint32_t availableData = socket->
GetRxAvailable ();
123 "availableData should be equal to the size of packet received.");
131 socket->
SendTo (Create<Packet> (123), 0, realTo);
138 socket->
SendTo (Create<Packet> (123), 0, realTo);
145 Simulator::ScheduleWithContext (socket->
GetNode ()->
GetId (), delay,
153 Simulator::ScheduleWithContext (socket->
GetNode ()->
GetId (), delay,
169 nAnB.
Add (nSrcnA.
Get (1));
175 nCnDst.
Add (nBnC.
Get (1));
179 nAnC.
Add (nCnDst.
Get (0));
186 std::ostringstream stringStream1v4;
188 std::ostringstream stringStream1v6;
190 std::ostringstream stringStream2v4;
192 std::ostringstream stringStream2v6;
194 std::ostringstream stringStream3v4;
196 std::ostringstream stringStream3v6;
203 stack.SetRoutingHelper (ipv4NixRouting);
204 stack.SetRoutingHelper (ipv6NixRouting);
205 stack.Install (allNodes);
212 dSrcdA = devHelper.
Install (nSrcnA);
213 dAdB = devHelper.
Install (nAnB);
214 dBdC = devHelper.
Install (nBnC);
215 dCdDst = devHelper.
Install (nCnDst);
216 dAdC = devHelper.
Install (nAnC);
219 aSrcaAv4.
SetBase (
"10.1.0.0",
"255.255.255.0");
221 aAaBv4.
SetBase (
"10.1.1.0",
"255.255.255.0");
223 aBaCv4.
SetBase (
"10.1.2.0",
"255.255.255.0");
225 aCaDstv4.
SetBase (
"10.1.3.0",
"255.255.255.0");
227 aAaCv4.
SetBase (
"10.1.4.0",
"255.255.255.0");
254 Ptr<Socket> rxSocketv4 = rxSocketFactory->CreateSocket ();
255 Ptr<Socket> rxSocketv6 = rxSocketFactory->CreateSocket ();
262 Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
263 txSocket->SetAllowBroadcast (
true);
273 int32_t ifIndex = ipv4->GetInterfaceForDevice (dAdC.
Get (0));
274 Simulator::Schedule (
Seconds (5), &Ipv4::SetDown, ipv4, ifIndex);
278 ifIndex = ipv6->GetInterfaceForDevice (dAdC.
Get (0));
279 Simulator::Schedule (
Seconds (5), &Ipv6::SetDown, ipv6, ifIndex);
281 ipv4NixRouting.PrintRoutingTableAllAt (
Seconds (7), cacheStreamv4);
282 ipv6NixRouting.PrintRoutingTableAllAt (
Seconds (7), cacheStreamv6);
292 ifIndex = ipv4->GetInterfaceForDevice (dBdC.
Get (1));
293 Simulator::Schedule (
Seconds (10), &Ipv4::SetDown, ipv4, ifIndex);
297 ifIndex = ipv6->GetInterfaceForDevice (dBdC.
Get (1));
298 Simulator::Schedule (
Seconds (10), &Ipv6::SetDown, ipv6, ifIndex);
303 Simulator::Stop (
Seconds (66));
314 const std::string p_nSrcnAnCnDstv4 =
"Time: +3s, Nix Routing\n"
315 "Route path from Node 0 to Node 4, Nix Vector: 01001 (5 bits left)\n"
316 "10.1.0.1 (Node 0) ----> 10.1.0.2 (Node 1)\n"
317 "10.1.4.1 (Node 1) ----> 10.1.4.2 (Node 3)\n"
318 "10.1.3.1 (Node 3) ----> 10.1.3.2 (Node 4)\n\n";
321 const std::string p_nSrcnAnCnDstv6 =
"Time: +3s, Nix Routing\n"
322 "Route path from Node 0 to Node 4, Nix Vector: 01001 (5 bits left)\n"
323 "2001::200:ff:fe00:1 (Node 0) ----> fe80::200:ff:fe00:2 (Node 1)\n"
324 "fe80::200:ff:fe00:9 (Node 1) ----> fe80::200:ff:fe00:a (Node 3)\n"
325 "fe80::200:ff:fe00:7 (Node 3) ----> 2001:3::200:ff:fe00:8 (Node 4)\n\n";
328 const std::string p_nSrcnAnBnCnDstv4 =
"Time: +9s, Nix Routing\n"
329 "Route path from Node 0 to Node 4, Nix Vector: 0111 (4 bits left)\n"
330 "10.1.0.1 (Node 0) ----> 10.1.0.2 (Node 1)\n"
331 "10.1.1.1 (Node 1) ----> 10.1.1.2 (Node 2)\n"
332 "10.1.2.1 (Node 2) ----> 10.1.2.2 (Node 3)\n"
333 "10.1.3.1 (Node 3) ----> 10.1.3.2 (Node 4)\n\n";
336 const std::string p_nSrcnAnBnCnDstv6 =
"Time: +9s, Nix Routing\n"
337 "Route path from Node 0 to Node 4, Nix Vector: 0111 (4 bits left)\n"
338 "2001::200:ff:fe00:1 (Node 0) ----> fe80::200:ff:fe00:2 (Node 1)\n"
339 "fe80::200:ff:fe00:3 (Node 1) ----> fe80::200:ff:fe00:4 (Node 2)\n"
340 "fe80::200:ff:fe00:5 (Node 2) ----> fe80::200:ff:fe00:6 (Node 3)\n"
341 "fe80::200:ff:fe00:7 (Node 3) ----> 2001:3::200:ff:fe00:8 (Node 4)\n\n";
344 const std::string emptyCaches =
"Node: 0, Time: +7s, Local time: +7s, Nix Routing\n"
347 "Node: 1, Time: +7s, Local time: +7s, Nix Routing\n"
350 "Node: 2, Time: +7s, Local time: +7s, Nix Routing\n"
353 "Node: 3, Time: +7s, Local time: +7s, Nix Routing\n"
356 "Node: 4, Time: +7s, Local time: +7s, Nix Routing\n"
362 Simulator::Destroy ();
The topology is of the form:
void DoSendDatav4(Ptr< Socket > socket, Ipv4Address to)
Send data immediately after being called.
std::vector< uint32_t > m_receivedPacketSizes
Received packet sizes.
Ptr< Packet > m_receivedPacket
Received packet.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void ReceivePkt(Ptr< Socket > socket)
Receive data.
void DoSendDatav6(Ptr< Socket > socket, Ipv6Address to)
Send data immediately after being called.
void SendData(Time delay, Ptr< Socket > socket, Ipv4Address to)
Schedules the DoSendData () function to send the data.
IPv4 Nix-Vector Routing TestSuite.
NixVectorRoutingTestSuite()
a polymophic 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.
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.
Access to the IPv4 forwarding table, interfaces, and configuration.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Helper class to auto-assign global IPv6 unicast addresses.
void SetBase(Ipv6Address network, Ipv6Prefix prefix, Ipv6Address base=Ipv6Address("::1"))
Set the base network number, network prefix, and base interface ID.
Ipv6InterfaceContainer Assign(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer with auto-assigned addresses.
Describes an IPv6 address.
Access to the IPv6 forwarding table, interfaces, and configuration.
Keep track of a set of IPv6 interfaces.
Ipv6Address GetAddress(uint32_t i, uint32_t j) const
Get the address for the specified index.
Describes an IPv6 prefix.
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
Helper class that adds Nix-vector routing to nodes.
void PrintRoutingPathAt(Time printTime, Ptr< Node > source, IpAddress dest, Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S)
prints the routing path for a source and destination at a particular time.
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.
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
uint32_t GetId(void) const
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
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 > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
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.
virtual uint32_t GetRxAvailable(void) const =0
Return number of bytes which can be returned from one or multiple calls to Recv.
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.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
@ UNIT
This test suite implements a Unit Test.
Simulation virtual time values and global simulation resolution.
API to create UDP socket instances.
#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.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Time Seconds(double value)
Construct a Time in the indicated unit.
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...
static NixVectorRoutingTestSuite g_nixVectorRoutingTestSuite
Static variable for test initialization.