# HG changeset patch # User Tommaso Pecorella # Date 1433021383 -7200 # Parent a9c11e262a933e00ca113726479bffaf5ef1abbf Bug 1941 - Remove unnecessary dependency on Application module in OLSR diff --git a/src/olsr/test/bug780-0-0.pcap b/src/olsr/test/bug780-0-0.pcap deleted file mode 100644 index 8822d3ab4ec889359aa35319bdae7ff5883e945e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 GIT binary patch literal 0 Hc$@ -#include - #include "ns3/test.h" #include "ns3/olsr-helper.h" #include "ns3/ipv4-list-routing-helper.h" -#include "ns3/wifi-helper.h" -#include "ns3/yans-wifi-helper.h" -#include "ns3/nqos-wifi-mac-helper.h" -#include "ns3/constant-velocity-mobility-model.h" -#include "ns3/mobility-helper.h" #include "ns3/olsr-routing-protocol.h" #include "ns3/internet-stack-helper.h" #include "ns3/log.h" -#include "ns3/config.h" #include "ns3/double.h" +#include "ns3/uinteger.h" #include "ns3/string.h" #include "ns3/boolean.h" #include "ns3/ipv4-address-helper.h" #include "ns3/ipv4-interface-container.h" #include "ns3/internet-stack-helper.h" -#include "ns3/v4ping-helper.h" -#include "ns3/pcap-file.h" -#include "ns3/pcap-test.h" #include "ns3/rng-seed-manager.h" - +#include "ns3/simple-net-device-helper.h" +#include "ns3/simple-net-device.h" +#include "ns3/icmpv4.h" #include "bug780-test.h" namespace ns3 @@ -54,20 +45,9 @@ namespace olsr { -const char * const Bug780Test::PREFIX = "bug780"; - -static void -SetVelocity (Ptr node, Vector vel) -{ - Ptr mobility = - node->GetObject (); - mobility->SetVelocity (vel); -} - - Bug780Test::Bug780Test() : TestCase ("Test OLSR bug 780"), - m_time (Seconds (200.0)) + m_time (Seconds (200.0)), m_seq (0), m_recvCount (0) { } @@ -84,118 +64,106 @@ Simulator::Stop (m_time); Simulator::Run (); + + NS_TEST_EXPECT_MSG_EQ (m_recvCount, 192, "192 out of 200 ping received."); + Simulator::Destroy (); - - CheckResults (); } void Bug780Test::CreateNodes (void) { - int nWifis = 3; - double SimTime = 200.0; - std::string phyMode ("DsssRate1Mbps"); - int64_t streamsUsed = 0; + NodeContainer c; + c.Create (3); - //sending one packets per sec - // Fix non-unicast data rate to be the same as that of unicast - Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", - StringValue ("400")); - - NodeContainer adhocNodes; - adhocNodes.Create (nWifis); - - WifiHelper wifi; - YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); - YansWifiChannelHelper wifiChannel; - wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel"); - wifiChannel.AddPropagationLoss ("ns3::FriisPropagationLossModel"); - Ptr chan = wifiChannel.Create (); - wifiPhy.SetChannel (chan); - - // Add a non-QoS upper mac, and disable rate control - NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); - wifi.SetStandard (WIFI_PHY_STANDARD_80211b); - wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", - "DataMode",StringValue (phyMode), - "ControlMode",StringValue (phyMode)); - - //set the tx range to 300 - wifiPhy.Set ("TxPowerStart",DoubleValue (-0.1615)); - wifiPhy.Set ("TxPowerEnd", DoubleValue (-0.1615)); - - // Set it to adhoc mode - wifiMac.SetType ("ns3::AdhocWifiMac"); - NetDeviceContainer adhocDevices = wifi.Install (wifiPhy, wifiMac, adhocNodes); - - // Assign fixed stream numbers to wifi and channel random variables - streamsUsed += wifi.AssignStreams (adhocDevices, streamsUsed); - // Assign 6 streams per Wifi device - NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.GetN () * 6), "Stream assignment mismatch"); - streamsUsed += wifiChannel.AssignStreams (chan, streamsUsed); - // Assign 0 additional streams per channel for this configuration - NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.GetN () * 6), "Stream assignment mismatch"); - + // install TCP/IP & OLSR OlsrHelper olsr; - InternetStackHelper internet; internet.SetRoutingHelper (olsr); - internet.Install (adhocNodes); - // Assign 3 streams per node to internet stack for this configuration - streamsUsed += internet.AssignStreams (adhocNodes, streamsUsed); - NS_TEST_ASSERT_MSG_EQ (streamsUsed, (adhocDevices.GetN () * 6) + (adhocNodes.GetN () * 3), "Stream assignment mismatch"); - // Olsr uses one additional stream per wifi device for this configuration - streamsUsed += olsr.AssignStreams (adhocNodes, 0); - NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((adhocDevices.GetN () * 6) + (adhocDevices.GetN () * 3) + nWifis), "Should have assigned 3 streams"); + internet.Install (c); + int64_t streamsUsed = olsr.AssignStreams (c, 0); + NS_TEST_EXPECT_MSG_EQ (streamsUsed, 3, "Should have assigned 3 streams"); + + // create channel & devices + SimpleNetDeviceHelper simpleNetHelper; + simpleNetHelper.SetDeviceAttribute ("DataRate", StringValue ("10Mbps")); + simpleNetHelper.SetChannelAttribute ("Delay", StringValue ("2ms")); + NetDeviceContainer nd = simpleNetHelper.Install (c); Ipv4AddressHelper addressAdhoc; addressAdhoc.SetBase ("10.1.1.0", "255.255.255.0"); Ipv4InterfaceContainer adhocInterfaces; - adhocInterfaces = addressAdhoc.Assign (adhocDevices); + adhocInterfaces = addressAdhoc.Assign (nd); - MobilityHelper mobilityAdhoc; + // Blacklist some devices (equivalent to Wireless out of range) + Ptr nd0 = DynamicCast (nd.Get (0)); + Ptr nd2 = DynamicCast (nd.Get (2)); + Ptr ch = DynamicCast (nd.Get (0)->GetChannel ()); - Ptr positionAlloc_Adhoc = - CreateObject(); - double distance = 0.0; - for (uint32_t i = 0; i <= adhocNodes.GetN (); i++) - { - positionAlloc_Adhoc->Add (Vector (distance,0.0,0.0)); - distance += 250.0; - } + Simulator::Schedule (Seconds (100.0), &SimpleChannel::BlackList, ch, nd0, nd2); + Simulator::Schedule (Seconds (100.0), &SimpleChannel::BlackList, ch, nd2, nd0); - mobilityAdhoc.SetMobilityModel ("ns3::ConstantVelocityMobilityModel"); - mobilityAdhoc.SetPositionAllocator (positionAlloc_Adhoc); - mobilityAdhoc.Install (adhocNodes); + // 3. Setup ping + m_socket = Socket::CreateSocket (c.Get (0), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory")); + m_socket->SetAttribute ("Protocol", UintegerValue (1)); // icmp + m_socket->SetRecvCallback (MakeCallback (&Bug780Test::Receive, this)); + InetSocketAddress src = InetSocketAddress (Ipv4Address::GetAny (), 0); + m_socket->Bind (src); + InetSocketAddress dst = InetSocketAddress (adhocInterfaces.GetAddress (2), 0); + m_socket->Connect (dst); - //At 50 sec node 3 moves towards node 2 - Simulator::Schedule (Seconds (50.0), &SetVelocity, adhocNodes.Get (2),Vector (-5.0,0.0,0.0)); - //AT 100 sec set node 3 with zero velocity - Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get (2),Vector (0.0,0.0,0.0)); - //Move node2 away from node 3 - Simulator::Schedule (Seconds (100.0), &SetVelocity, adhocNodes.Get (1),Vector (5.0,0.0,0.0)); - //AT 150 sec set node 2 with zero velocity - Simulator::Schedule (Seconds (150.0), &SetVelocity, adhocNodes.Get (1), Vector (0.0,0.0,0.0)); - - - // Ping 10.1.1.1 -> 10.1.1.2 - V4PingHelper ping (adhocInterfaces.GetAddress (1)); - ping.SetAttribute ("Verbose", BooleanValue (true)); - - ApplicationContainer p = ping.Install (adhocNodes.Get (0)); - p.Start (Seconds (50)); - p.Stop (Seconds (SimTime) - Seconds (0.001)); - - // pcap - wifiPhy.EnablePcapAll (CreateTempDirFilename (PREFIX)); + SendPing (); } void -Bug780Test::CheckResults () +Bug780Test::SendPing () { - for (uint32_t i = 0; i < 2; ++i) + if (Simulator::Now () >= m_time) { - NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-0.pcap"); + return; + } + + Ptr p = Create (); + Icmpv4Echo echo; + echo.SetSequenceNumber (m_seq); + m_seq++; + echo.SetIdentifier (0); + + Ptr dataPacket = Create (56); + echo.SetData (dataPacket); + p->AddHeader (echo); + Icmpv4Header header; + header.SetType (Icmpv4Header::ECHO); + header.SetCode (0); + if (Node::ChecksumEnabled ()) + { + header.EnableChecksum (); + } + p->AddHeader (header); + m_socket->Send (p, 0); + Simulator::Schedule (Seconds (1), &Bug780Test::SendPing, this); +} + +void +Bug780Test::Receive (Ptr socket) +{ + while (m_socket->GetRxAvailable () > 0) + { + Address from; + Ptr p = m_socket->RecvFrom (0xffffffff, 0, from); + + NS_ASSERT (InetSocketAddress::IsMatchingType (from)); + InetSocketAddress realFrom = InetSocketAddress::ConvertFrom (from); + NS_ASSERT (realFrom.GetPort () == 1); // protocol should be icmp. + Ipv4Header ipv4; + p->RemoveHeader (ipv4); + NS_ASSERT (ipv4.GetProtocol () == 1); // protocol should be icmp. + Icmpv4Header icmp; + p->RemoveHeader (icmp); + if (icmp.GetType () == Icmpv4Header::ECHO_REPLY) + { + m_recvCount ++; + } } } diff --git a/src/olsr/test/bug780-test.h b/src/olsr/test/bug780-test.h --- a/src/olsr/test/bug780-test.h +++ b/src/olsr/test/bug780-test.h @@ -34,16 +34,23 @@ Bug780Test (); ~Bug780Test (); private: - /// Unique PCAP files prefix for this test - static const char * const PREFIX; /// Total simulation time const Time m_time; /// Create & configure test network void CreateNodes (); - /// Compare traces with reference ones - void CheckResults (); /// Go void DoRun (); + /// Send one ping + void SendPing (); + /// Receive echo reply + /// \param socket the socket + void Receive (Ptr socket); + /// Socket + Ptr m_socket; + /// Sequence number + uint16_t m_seq; + /// Received ECHO Reply counter + uint16_t m_recvCount; }; } diff --git a/src/olsr/test/hello-regression-test.cc b/src/olsr/test/hello-regression-test.cc --- a/src/olsr/test/hello-regression-test.cc +++ b/src/olsr/test/hello-regression-test.cc @@ -18,6 +18,7 @@ * Authors: Pavel Boyko */ +#include #include "hello-regression-test.h" #include "ns3/simulator.h" #include "ns3/random-variable-stream.h" @@ -25,24 +26,25 @@ #include "ns3/double.h" #include "ns3/uinteger.h" #include "ns3/string.h" -#include "ns3/pcap-file.h" #include "ns3/olsr-helper.h" #include "ns3/internet-stack-helper.h" -#include "ns3/point-to-point-helper.h" +#include "ns3/simple-net-device-helper.h" #include "ns3/ipv4-address-helper.h" #include "ns3/abort.h" -#include "ns3/pcap-test.h" +#include "ns3/socket-factory.h" +#include "ns3/ipv4-raw-socket-factory.h" +#include "ns3/udp-l4-protocol.h" +#include "ns3/udp-header.h" +#include "ns3/olsr-header.h" namespace ns3 { namespace olsr { -const char * const HelloRegressionTest::PREFIX = "olsr-hello-regression-test"; - HelloRegressionTest::HelloRegressionTest() : TestCase ("Test OLSR Hello messages generation"), - m_time (Seconds (5)) + m_time (Seconds (5)), m_countA (0), m_countB (0) { } @@ -59,9 +61,10 @@ Simulator::Stop (m_time); Simulator::Run (); + + m_rxSocketA = 0; + m_rxSocketB = 0; Simulator::Destroy (); - - CheckResults (); } void @@ -78,26 +81,122 @@ // Assign OLSR RVs to specific streams int64_t streamsUsed = olsr.AssignStreams (c, 0); NS_TEST_ASSERT_MSG_EQ (streamsUsed, 2, "Should have assigned 2 streams"); - // create p2p channel & devices - PointToPointHelper p2p; - p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); - p2p.SetChannelAttribute ("Delay", StringValue ("2ms")); - NetDeviceContainer nd = p2p.Install (c); + // create channel & devices + SimpleNetDeviceHelper simpleNetHelper; + simpleNetHelper.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); + simpleNetHelper.SetChannelAttribute ("Delay", StringValue ("2ms")); + NetDeviceContainer nd = simpleNetHelper.Install (c); // setup IP addresses Ipv4AddressHelper ipv4; ipv4.SetBase ("10.1.1.0", "255.255.255.0"); ipv4.Assign (nd); - // setup PCAP traces - p2p.EnablePcapAll (CreateTempDirFilename (PREFIX)); + + // Create the sockets + Ptr rxSocketFactoryA = c.Get (0)->GetObject (); + m_rxSocketA = DynamicCast (rxSocketFactoryA->CreateSocket ()); + m_rxSocketA->SetProtocol (UdpL4Protocol::PROT_NUMBER); + m_rxSocketA->SetRecvCallback (MakeCallback (&HelloRegressionTest::ReceivePktProbeA, this)); + + Ptr rxSocketFactoryB = c.Get (1)->GetObject (); + m_rxSocketB = DynamicCast (rxSocketFactoryB->CreateSocket ()); + m_rxSocketB->SetProtocol (UdpL4Protocol::PROT_NUMBER); + m_rxSocketB->SetRecvCallback (MakeCallback (&HelloRegressionTest::ReceivePktProbeB, this)); } void -HelloRegressionTest::CheckResults () +HelloRegressionTest::ReceivePktProbeA (Ptr socket) { - for (uint32_t i = 0; i < 2; ++i) + uint32_t availableData; + availableData = socket->GetRxAvailable (); + Ptr receivedPacketProbe = socket->Recv (std::numeric_limits::max (), 0); + NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); + + Ipv4Header ipHdr; + receivedPacketProbe->RemoveHeader (ipHdr); + UdpHeader udpHdr; + receivedPacketProbe->RemoveHeader (udpHdr); + PacketHeader pktHdr; + receivedPacketProbe->RemoveHeader (pktHdr); + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + + if (m_countA == 0) { - NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-1.pcap"); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "No Link messages on the first Hello."); } + else + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, "One Link message on the second and third Hello."); + } + + std::vector::const_iterator iter; + for (iter = hello.linkMessages.begin (); iter != hello.linkMessages.end (); iter ++) + { + if (m_countA == 1) + { + NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 1, "Asymmetric link on second Hello."); + } + else + { + NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 6, "Symmetric link on second Hello."); + } + + NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses.size (), 1, "Only one neighbor."); + NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), "Only one neighbor."); + } + + m_countA ++; +} + +void +HelloRegressionTest::ReceivePktProbeB (Ptr socket) +{ + uint32_t availableData; + availableData = socket->GetRxAvailable (); + Ptr receivedPacketProbe = socket->Recv (std::numeric_limits::max (), 0); + NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); + + Ipv4Header ipHdr; + receivedPacketProbe->RemoveHeader (ipHdr); + UdpHeader udpHdr; + receivedPacketProbe->RemoveHeader (udpHdr); + PacketHeader pktHdr; + receivedPacketProbe->RemoveHeader (pktHdr); + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.1"), "Originator address."); + + if (m_countA == 0) + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "No Link messages on the first Hello."); + } + else + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, "One Link message on the second and third Hello."); + } + + std::vector::const_iterator iter; + for (iter = hello.linkMessages.begin (); iter != hello.linkMessages.end (); iter ++) + { + if (m_countA == 1) + { + NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 1, "Asymmetric link on second Hello."); + } + else + { + NS_TEST_EXPECT_MSG_EQ (iter->linkCode, 6, "Symmetric link on second Hello."); + } + + NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses.size (), 1, "Only one neighbor."); + NS_TEST_EXPECT_MSG_EQ (iter->neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.2"), "Only one neighbor."); + } + + m_countB ++; } } diff --git a/src/olsr/test/hello-regression-test.h b/src/olsr/test/hello-regression-test.h --- a/src/olsr/test/hello-regression-test.h +++ b/src/olsr/test/hello-regression-test.h @@ -23,6 +23,8 @@ #include "ns3/test.h" #include "ns3/nstime.h" +#include "ns3/socket.h" +#include "ns3/ipv4-raw-socket-impl.h" #include "ns3/node-container.h" namespace ns3 @@ -53,16 +55,25 @@ HelloRegressionTest (); ~HelloRegressionTest (); private: - /// Unique PCAP files prefix for this test - static const char * const PREFIX; /// Total simulation time const Time m_time; /// Create & configure test network void CreateNodes (); - /// Compare traces with reference ones - void CheckResults (); /// Go void DoRun (); + + /// Receive raw data on node A + void ReceivePktProbeA (Ptr socket); + /// Packet counter on node A + uint8_t m_countA; + /// Receiving socket on node A + Ptr m_rxSocketA; + /// Receive raw data on node B + void ReceivePktProbeB (Ptr socket); + /// Packet counter on node B + uint8_t m_countB; + /// Receiving socket on node B + Ptr m_rxSocketB; }; } diff --git a/src/olsr/test/olsr-hello-regression-test-0-1.pcap b/src/olsr/test/olsr-hello-regression-test-0-1.pcap deleted file mode 100644 index d2e2a90ada19e27cbfe23e10c974e808e1ed5609..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 GIT binary patch literal 0 Hc$@ nd0 = DynamicCast (nd.Get (0)); + Ptr nd2 = DynamicCast (nd.Get (2)); + Ptr ch = DynamicCast (nd.Get (0)->GetChannel ()); + ch->BlackList (nd0, nd2); + ch->BlackList (nd2, nd0); // setup IP addresses Ipv4AddressHelper ipv4; ipv4.SetBase ("10.1.1.0", "255.255.255.0"); ipv4.Assign (nd); - // setup PCAP traces - wifiPhy.EnablePcapAll (CreateTempDirFilename(PREFIX)); + // Create the sockets + Ptr rxSocketFactoryA = c.Get (0)->GetObject (); + m_rxSocketA = DynamicCast (rxSocketFactoryA->CreateSocket ()); + m_rxSocketA->SetProtocol (UdpL4Protocol::PROT_NUMBER); + m_rxSocketA->SetRecvCallback (MakeCallback (&TcRegressionTest::ReceivePktProbeA, this)); + + Ptr rxSocketFactoryB = c.Get (1)->GetObject (); + m_rxSocketB = DynamicCast (rxSocketFactoryB->CreateSocket ()); + m_rxSocketB->SetProtocol (UdpL4Protocol::PROT_NUMBER); + m_rxSocketB->SetRecvCallback (MakeCallback (&TcRegressionTest::ReceivePktProbeB, this)); + + Ptr rxSocketFactoryC = c.Get (2)->GetObject (); + m_rxSocketC = DynamicCast (rxSocketFactoryC->CreateSocket ()); + m_rxSocketC->SetProtocol (UdpL4Protocol::PROT_NUMBER); + m_rxSocketC->SetRecvCallback (MakeCallback (&TcRegressionTest::ReceivePktProbeC, this)); +} + +// Note: this is identical to ReceivePktProbeC, but the packet counter needs to be different. +void +TcRegressionTest::ReceivePktProbeA (Ptr socket) +{ + uint32_t availableData; + availableData = socket->GetRxAvailable (); + Ptr receivedPacketProbe = socket->Recv (std::numeric_limits::max (), 0); + NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); + + Ipv4Header ipHdr; + receivedPacketProbe->RemoveHeader (ipHdr); + UdpHeader udpHdr; + receivedPacketProbe->RemoveHeader (udpHdr); + PacketHeader pktHdr; + receivedPacketProbe->RemoveHeader (pktHdr); + + if (m_countA == 0) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "0 - Hello, No messages."); + } + else if (m_countA == 1) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, "1 - Hello, one message."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 1, "1 - Asymmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, "1 - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), "1 - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 1, "1 - Asymmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, "1 - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), "1 - Neighbor."); + } + else + { + if (m_countA == 5 || m_countA == 8) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + const olsr::MessageHeader::Tc &tc = msgHdr.GetTc (); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses.size (), 2, int(m_countA) << " - TC, one message."); + NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countA) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[1], Ipv4Address ("10.1.1.1"), int(m_countA) << " - Neighbor."); + } + if (m_countA != 8) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, int(m_countA) << " - Hello, one message."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 6, int(m_countA) << " - Symmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, int(m_countA) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countA) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 6, int(m_countA) << " - Symmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, int(m_countA) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), int(m_countA) << " - Neighbor."); + } + } + m_countA ++; } void -TcRegressionTest::CheckResults () +TcRegressionTest::ReceivePktProbeB (Ptr socket) { - for (uint32_t i = 0; i < 3; ++i) + uint32_t availableData; + availableData = socket->GetRxAvailable (); + Ptr receivedPacketProbe = socket->Recv (std::numeric_limits::max (), 0); + NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); + + Ipv4Header ipHdr; + receivedPacketProbe->RemoveHeader (ipHdr); + UdpHeader udpHdr; + receivedPacketProbe->RemoveHeader (udpHdr); + PacketHeader pktHdr; + receivedPacketProbe->RemoveHeader (pktHdr); + + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + + if (m_countB == 0 || m_countB == 2 || m_countB == 5 || m_countB == 6 || m_countB == 8 || + m_countB == 10 || m_countB == 13 || m_countB == 15 || m_countB == 17 || m_countB == 19) { - NS_PCAP_TEST_EXPECT_EQ (PREFIX << "-" << i << "-1.pcap"); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.3"), "Originator address."); } + else + { + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.1"), "Originator address."); + } + + if (m_countB == 0 || m_countB == 1) + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, int(m_countC) << " - Hello, links announced."); + } + else + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 1, int(m_countC) << " - Hello, links announced."); + if (m_countB == 2 || m_countB == 3) + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 1, int(m_countC) << " - Asymmetric Link."); + } + else if (m_countB == 4 || m_countB == 5) + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 6, int(m_countC) << " - Symmetric Link."); + } + else + { + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 10, int(m_countC) << " - MPR Link."); + } + + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.2"), int(m_countC) << " - Neighbor."); + } + + m_countB ++; +} + +// Note: this is identical to ReceivePktProbeA, but the packet counter needs to be different. +void +TcRegressionTest::ReceivePktProbeC (Ptr socket) +{ + uint32_t availableData; + availableData = socket->GetRxAvailable (); + Ptr receivedPacketProbe = socket->Recv (std::numeric_limits::max (), 0); + NS_ASSERT (availableData == receivedPacketProbe->GetSize ()); + + Ipv4Header ipHdr; + receivedPacketProbe->RemoveHeader (ipHdr); + UdpHeader udpHdr; + receivedPacketProbe->RemoveHeader (udpHdr); + PacketHeader pktHdr; + receivedPacketProbe->RemoveHeader (pktHdr); + + if (m_countC == 0) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 0, "0 - Hello, No messages."); + } + else if (m_countC == 1) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, "1 - Hello, one message."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 1, "1 - Asymmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, "1 - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), "1 - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 1, "1 - Asymmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, "1 - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), "1 - Neighbor."); + } + else + { + if (m_countC == 5 || m_countC == 8) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + const olsr::MessageHeader::Tc &tc = msgHdr.GetTc (); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses.size (), 2, int(m_countC) << " - TC, one message."); + NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countC) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (tc.neighborAddresses[1], Ipv4Address ("10.1.1.1"), int(m_countC) << " - Neighbor."); + } + if (m_countC != 8) + { + MessageHeader msgHdr; + receivedPacketProbe->RemoveHeader (msgHdr); + NS_TEST_EXPECT_MSG_EQ (msgHdr.GetOriginatorAddress (), Ipv4Address ("10.1.1.2"), "Originator address."); + const olsr::MessageHeader::Hello &hello = msgHdr.GetHello (); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages.size (), 2, int(m_countC) << " - Hello, one message."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].linkCode, 6, int(m_countC) << " - Symmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses.size (), 1, int(m_countC) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[0].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.3"), int(m_countC) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].linkCode, 6, int(m_countC) << " - Symmetric Link."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses.size (), 1, int(m_countC) << " - Neighbor."); + NS_TEST_EXPECT_MSG_EQ (hello.linkMessages[1].neighborInterfaceAddresses[0], Ipv4Address ("10.1.1.1"), int(m_countC) << " - Neighbor."); + } + } + m_countC ++; } } diff --git a/src/olsr/test/tc-regression-test.h b/src/olsr/test/tc-regression-test.h --- a/src/olsr/test/tc-regression-test.h +++ b/src/olsr/test/tc-regression-test.h @@ -23,6 +23,8 @@ #include "ns3/test.h" #include "ns3/nstime.h" +#include "ns3/socket.h" +#include "ns3/ipv4-raw-socket-impl.h" #include "ns3/node-container.h" namespace ns3 @@ -33,7 +35,7 @@ * \ingroup olsr * \brief Less trivial test of OLSR Topology Control message generation * - * This test creates 3 WiFi stations with chain topology and runs OLSR without any extra traffic. + * This test simulates 3 Wi-Fi stations with chain topology and runs OLSR without any extra traffic. * It is expected that only second station will send TC messages. * * Expected trace (20 seconds, note random b-cast jitter): @@ -78,18 +80,34 @@ TcRegressionTest(); ~TcRegressionTest(); private: - /// Unique PCAP files prefix for this test - static const char * const PREFIX; /// Total simulation time const Time m_time; - /// Distance between nodes in meters, 0.8 of RX range is recommended - const double m_step; /// Create & configure test network void CreateNodes (); - /// Compare traces with reference ones - void CheckResults (); /// Go void DoRun (); + + /// Receive raw data on node A + void ReceivePktProbeA (Ptr socket); + /// Packet counter on node A + uint8_t m_countA; + /// Receiving socket on node A + Ptr m_rxSocketA; + + /// Receive raw data on node B + void ReceivePktProbeB (Ptr socket); + /// Packet counter on node B + uint8_t m_countB; + /// Receiving socket on node B + Ptr m_rxSocketB; + + /// Receive raw data on node C + void ReceivePktProbeC (Ptr socket); + /// Packet counter on node C + uint8_t m_countC; + /// Receiving socket on node C + Ptr m_rxSocketC; + }; } diff --git a/src/olsr/wscript b/src/olsr/wscript --- a/src/olsr/wscript +++ b/src/olsr/wscript @@ -1,7 +1,7 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- def build(bld): - module = bld.create_ns3_module('olsr', ['internet', 'config-store', 'point-to-point', 'wifi', 'applications']) + module = bld.create_ns3_module('olsr', ['internet']) module.includes = '.' module.source = [ 'model/olsr-header.cc',