22 #include "ns3/socket-factory.h"
23 #include "ns3/udp-socket-factory.h"
24 #include "ns3/simulator.h"
25 #include "ns3/simple-channel.h"
26 #include "ns3/simple-net-device.h"
27 #include "ns3/socket.h"
28 #include "ns3/boolean.h"
33 #include "ns3/inet6-socket-address.h"
35 #include "ns3/internet-stack-helper.h"
36 #include "ns3/ipv6-address-helper.h"
37 #include "ns3/ipv6-l3-protocol.h"
38 #include "ns3/icmpv6-l4-protocol.h"
39 #include "ns3/udp-l4-protocol.h"
40 #include "ns3/ripng.h"
41 #include "ns3/ripng-helper.h"
42 #include "ns3/node-container.h"
64 void DoSendData (
Ptr<Socket> socket, std::string to);
73 virtual void DoRun (
void);
90 uint32_t availableData;
113 Simulator::Stop (
Seconds (66));
122 Ptr<Node> txNode = CreateObject<Node> ();
123 Ptr<Node> rxNode = CreateObject<Node> ();
124 Ptr<Node> routerA = CreateObject<Node> ();
125 Ptr<Node> routerB = CreateObject<Node> ();
126 Ptr<Node> routerC = CreateObject<Node> ();
135 internetv6routers.
Install (routers);
148 txDev = CreateObject<SimpleNetDevice> ();
157 fwDev1routerA = CreateObject<SimpleNetDevice> ();
158 fwDev1routerA->SetAddress (
Mac48Address (
"00:00:00:00:00:02"));
161 net1.
Add (fwDev1routerA);
164 fwDev2routerA = CreateObject<SimpleNetDevice> ();
165 fwDev2routerA->SetAddress (
Mac48Address (
"00:00:00:00:00:03"));
168 net2.
Add (fwDev2routerA);
173 fwDev1routerB = CreateObject<SimpleNetDevice> ();
174 fwDev1routerB->SetAddress (
Mac48Address (
"00:00:00:00:00:04"));
177 net2.
Add (fwDev1routerB);
180 fwDev2routerB = CreateObject<SimpleNetDevice> ();
181 fwDev2routerB->SetAddress (
Mac48Address (
"00:00:00:00:00:05"));
184 net3.
Add (fwDev2routerB);
189 fwDev1routerC = CreateObject<SimpleNetDevice> ();
190 fwDev1routerC->SetAddress (
Mac48Address (
"00:00:00:00:00:06"));
193 net3.
Add (fwDev1routerC);
196 fwDev2routerC = CreateObject<SimpleNetDevice> ();
197 fwDev2routerC->SetAddress (
Mac48Address (
"00:00:00:00:00:07"));
200 net4.
Add (fwDev2routerC);
205 rxDev = CreateObject<SimpleNetDevice> ();
213 txDev->SetChannel (channel1);
214 fwDev1routerA->SetChannel (channel1);
217 fwDev2routerA->SetChannel (channel2);
218 fwDev1routerB->SetChannel (channel2);
221 fwDev2routerB->SetChannel (channel3);
222 fwDev1routerC->SetChannel (channel3);
225 fwDev2routerC->SetChannel (channel4);
226 rxDev->SetChannel (channel4);
251 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
256 Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
257 txSocket->SetAllowBroadcast (
true);
262 SendData (txSocket,
"2001:2::200:ff:fe00:8");
267 Simulator::Destroy ();
296 virtual void DoRun (
void);
307 :
TestCase (
"RIPng counting to infinity")
313 uint32_t availableData;
319 (void) availableData;
336 Simulator::Stop (
Seconds (66));
345 Ptr<Node> txNode = CreateObject<Node> ();
346 Ptr<Node> rxNode = CreateObject<Node> ();
347 Ptr<Node> routerA = CreateObject<Node> ();
348 Ptr<Node> routerB = CreateObject<Node> ();
349 Ptr<Node> routerC = CreateObject<Node> ();
365 internetv6routers.
Install (routers);
378 txDev = CreateObject<SimpleNetDevice> ();
387 fwDev1routerA = CreateObject<SimpleNetDevice> ();
388 fwDev1routerA->SetAddress (
Mac48Address (
"00:00:00:00:00:02"));
391 net1.
Add (fwDev1routerA);
394 fwDev2routerA = CreateObject<SimpleNetDevice> ();
395 fwDev2routerA->SetAddress (
Mac48Address (
"00:00:00:00:00:03"));
398 net2.
Add (fwDev2routerA);
403 fwDev1routerB = CreateObject<SimpleNetDevice> ();
404 fwDev1routerB->SetAddress (
Mac48Address (
"00:00:00:00:00:04"));
407 net2.
Add (fwDev1routerB);
410 fwDev2routerB = CreateObject<SimpleNetDevice> ();
411 fwDev2routerB->SetAddress (
Mac48Address (
"00:00:00:00:00:05"));
414 net3.
Add (fwDev2routerB);
419 fwDev1routerC = CreateObject<SimpleNetDevice> ();
420 fwDev1routerC->SetAddress (
Mac48Address (
"00:00:00:00:00:06"));
423 net3.
Add (fwDev1routerC);
426 fwDev2routerC = CreateObject<SimpleNetDevice> ();
427 fwDev2routerC->SetAddress (
Mac48Address (
"00:00:00:00:00:07"));
430 net4.
Add (fwDev2routerC);
435 rxDev = CreateObject<SimpleNetDevice> ();
443 txDev->SetChannel (channel1);
444 fwDev1routerA->SetChannel (channel1);
447 fwDev2routerA->SetChannel (channel2);
448 fwDev1routerB->SetChannel (channel2);
451 fwDev2routerB->SetChannel (channel3);
452 fwDev1routerC->SetChannel (channel3);
455 fwDev2routerC->SetChannel (channel4);
456 rxDev->SetChannel (channel4);
481 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
486 Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
487 txSocket->SetAllowBroadcast (
true);
491 SendData (txSocket,
"2001:2::200:ff:fe00:8");
494 Simulator::Destroy ();
509 virtual void DoRun (
void);
524 :
TestCase (
"RIPng Split Horizon strategy")
531 uint32_t availableData;
536 Ipv6Address senderAddress = Inet6SocketAddress::ConvertFrom (srcAddr).GetIpv6 ();
538 if (senderAddress ==
"fe80::200:ff:fe00:4")
545 for (std::list<RipNgRte>::iterator iter = rtes.begin ();
546 iter != rtes.end (); iter++)
548 if (iter->GetPrefix () ==
"2001:1::")
550 bool correct =
false;
551 if (iter->GetRouteMetric () == 16)
556 else if (iter->GetRouteMetric () == 2)
561 NS_TEST_EXPECT_MSG_EQ (correct,
true,
"RIPng: unexpected metric value: " << iter->GetRouteMetric ());
568 (void) availableData;
576 Ptr<Node> fakeNode = CreateObject<Node> ();
577 Ptr<Node> listener = CreateObject<Node> ();
579 Ptr<Node> routerA = CreateObject<Node> ();
580 Ptr<Node> routerB = CreateObject<Node> ();
591 internetv6routers.
Install (routers);
594 internetv6nodes.
Install (listeners);
602 silentDev = CreateObject<SimpleNetDevice> ();
603 silentDev->SetAddress (
Mac48Address (
"00:00:00:00:00:01"));
606 net0.
Add (silentDev);
611 silentDevRouterA = CreateObject<SimpleNetDevice> ();
612 silentDevRouterA->SetAddress (
Mac48Address (
"00:00:00:00:00:02"));
615 net0.
Add (silentDevRouterA);
618 fwDevRouterA = CreateObject<SimpleNetDevice> ();
619 fwDevRouterA->SetAddress (
Mac48Address (
"00:00:00:00:00:03"));
622 net1.
Add (fwDevRouterA);
627 fwDevRouterB = CreateObject<SimpleNetDevice> ();
628 fwDevRouterB->SetAddress (
Mac48Address (
"00:00:00:00:00:04"));
631 net1.
Add (fwDevRouterB);
636 listenerDev = CreateObject<SimpleNetDevice> ();
637 listenerDev->SetAddress (
Mac48Address (
"00:00:00:00:00:05"));
640 net1.
Add (listenerDev);
644 silentDev->SetChannel (channel0);
645 silentDevRouterA->SetChannel (channel0);
648 fwDevRouterA->SetChannel (channel1);
649 fwDevRouterB->SetChannel (channel1);
650 listenerDev->SetChannel (channel1);
664 Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
665 rxSocket->BindToNetDevice (listenerDev);
674 Simulator::Stop (
Seconds (66));
678 Simulator::Destroy ();
IPv6 RIPng count to infinity Test.
void SendData(Ptr< Socket > socket, std::string to)
Send data.
void DoSendData(Ptr< Socket > socket, std::string to)
Send data.
Ipv6RipngCountToInfinityTest()
void ReceivePkt(Ptr< Socket > socket)
Receive data.
Ptr< Packet > m_receivedPacket
Received packet.
virtual void DoRun(void)
Implementation to actually run this TestCase.
IPv6 RIPng SplitHorizon strategy Test.
Ipv6RipngSplitHorizonStrategyTest(RipNg::SplitHorizonType_e strategy)
Constructor.
RipNg::SplitHorizonType_e m_setStrategy
Strategy set.
RipNg::SplitHorizonType_e m_detectedStrategy
Strategy detected.
virtual void DoRun(void)
Implementation to actually run this TestCase.
void ReceivePktProbe(Ptr< Socket > socket)
Receive data.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Ptr< Packet > m_receivedPacket
Received packet.
void SendData(Ptr< Socket > socket, std::string to)
Send data.
void DoSendData(Ptr< Socket > socket, std::string to)
Send data.
void ReceivePkt(Ptr< Socket > socket)
Receive data.
a polymophic address class
Hold variables of type enum.
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)
Helper class to auto-assign global IPv6 unicast addresses.
Ipv6InterfaceContainer AssignWithoutAddress(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer but do not assign any IPv6 addresses.
void SetBase(Ipv6Address network, Ipv6Prefix prefix, Ipv6Address base=Ipv6Address("::1"))
Set the base network number, network prefix, and base interface ID.
Ipv6InterfaceContainer AssignWithoutOnLink(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer with auto-assigned addresses, but do not set the on-link property ...
Describes an IPv6 address.
Keep track of a set of IPv6 interfaces.
void SetForwarding(uint32_t i, bool state)
Set the state of the stack (act as a router or as an host) for the specified index.
void SetDefaultRouteInAllNodes(uint32_t router)
Set the default route for all the devices (except the router itself).
Describes an IPv6 prefix.
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.
uint32_t GetId(void) const
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
void RemoveAllByteTags(void)
Remove all byte tags stored in this packet.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Helper class that adds RIPng routing to nodes.
void SetInterfaceMetric(Ptr< Node > node, uint32_t interface, uint8_t metric)
Set a metric for an interface.
void Set(std::string name, const AttributeValue &value)
SplitHorizonType_e
Split Horizon strategy type.
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.
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 > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
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.
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.
static Ipv6RipngTestSuite g_ipv6ripngTestSuite
Static variable for test initialization.
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...