diff -r 2d40fbbf7dd4 src/internet/test/ipv4-forwarding-test.cc --- a/src/internet/test/ipv4-forwarding-test.cc Sun Nov 15 10:15:14 2015 -0800 +++ b/src/internet/test/ipv4-forwarding-test.cc Wed Dec 02 16:07:15 2015 -0800 @@ -43,6 +43,8 @@ using namespace ns3; +NS_LOG_COMPONENT_DEFINE ("Ipv4ForwardingTest"); + static void AddInternetStack (Ptr node) { @@ -102,7 +104,6 @@ void Ipv4ForwardingTest::SendData (Ptr socket, std::string to) { - m_receivedPacket = Create (); Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0), &Ipv4ForwardingTest::DoSendData, this, socket, to); Simulator::Run (); @@ -202,7 +203,169 @@ Ptr ipv4 = fwNode->GetObject (); ipv4->SetAttribute("IpForward", BooleanValue (false)); SendData (txSocket, "10.0.0.2"); - NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 0, "IPv4 Forwarding off"); + NS_TEST_EXPECT_MSG_EQ (m_receivedPacket, 0, "IPv4 Forwarding off; no received packet"); + + Simulator::Destroy (); + +} + +class Ipv4BindToNetDeviceTest : public TestCase +{ + Ptr m_receivedPacket; + void DoSendData (Ptr socket, std::string to, int expectedReturnValue); + void SendData (Ptr socket, std::string to, int expectedReturnValue); + +public: + virtual void DoRun (void); + Ipv4BindToNetDeviceTest (); + + void ReceivePkt (Ptr socket); +}; + +Ipv4BindToNetDeviceTest::Ipv4BindToNetDeviceTest () + : TestCase ("Test that Socket::BindToNetDevice () works") +{ +} + +void Ipv4BindToNetDeviceTest::ReceivePkt (Ptr socket) +{ + uint32_t availableData; + availableData = socket->GetRxAvailable (); + m_receivedPacket = socket->Recv (std::numeric_limits::max (), 0); + NS_ASSERT (availableData == m_receivedPacket->GetSize ()); +} + +void +Ipv4BindToNetDeviceTest::DoSendData (Ptr socket, std::string to, int expectedReturnValue) +{ + Address realTo = InetSocketAddress (Ipv4Address (to.c_str ()), 1234); + NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create (123), 0, realTo), + expectedReturnValue, "SendTo failure"); +} + +void +Ipv4BindToNetDeviceTest::SendData (Ptr socket, std::string to, int expectedReturnValue) +{ + Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0), + &Ipv4BindToNetDeviceTest::DoSendData, this, socket, to, expectedReturnValue); +} + +void +Ipv4BindToNetDeviceTest::DoRun (void) +{ + // Create topology + + // Receiver Node + Ptr rxNode = CreateObject (); + AddInternetStack (rxNode); + Ptr rxDev1; + Ptr rxDev2; + { // first interface + rxDev1 = CreateObject (); + rxDev1->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ())); + rxNode->AddDevice (rxDev1); + Ptr ipv4 = rxNode->GetObject (); + uint32_t netdev_idx = ipv4->AddInterface (rxDev1); + Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("10.0.0.2"), Ipv4Mask (0xffff0000U)); + ipv4->AddAddress (netdev_idx, ipv4Addr); + ipv4->SetUp (netdev_idx); + } + { // second interface + rxDev2 = CreateObject (); + rxDev2->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ())); + rxNode->AddDevice (rxDev2); + Ptr ipv4 = rxNode->GetObject (); + uint32_t netdev_idx = ipv4->AddInterface (rxDev2); + Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("11.0.0.2"), Ipv4Mask (0xffff0000U)); + ipv4->AddAddress (netdev_idx, ipv4Addr); + ipv4->SetUp (netdev_idx); + } + + // Sender Node + Ptr txNode = CreateObject (); + AddInternetStack (txNode); + Ptr txDev1; + Ptr txDev2; + { + // first interface + txDev1 = CreateObject (); + txDev1->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ())); + txNode->AddDevice (txDev1); + Ptr ipv4 = txNode->GetObject (); + uint32_t netdev_idx = ipv4->AddInterface (txDev1); + Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("10.0.0.1"), Ipv4Mask (0xffff0000U)); + ipv4->AddAddress (netdev_idx, ipv4Addr); + ipv4->SetUp (netdev_idx); + } + { + // second interface + txDev2 = CreateObject (); + txDev2->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ())); + txNode->AddDevice (txDev2); + Ptr ipv4 = txNode->GetObject (); + uint32_t netdev_idx = ipv4->AddInterface (txDev2); + Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("11.0.0.1"), Ipv4Mask (0xffff0000U)); + ipv4->AddAddress (netdev_idx, ipv4Addr); + ipv4->SetUp (netdev_idx); + } + + // link the two nodes + Ptr channel1 = CreateObject (); + rxDev1->SetChannel (channel1); + txDev1->SetChannel (channel1); + + Ptr channel2 = CreateObject (); + rxDev2->SetChannel (channel2); + txDev2->SetChannel (channel2); + + // Create the UDP sockets + Ptr rxSocketFactory = rxNode->GetObject (); + Ptr rxSocket = rxSocketFactory->CreateSocket (); + NS_TEST_EXPECT_MSG_EQ (rxSocket->Bind (InetSocketAddress (Ipv4Address ("10.0.0.2"), 1234)), 0, "trivial"); + // Must call BindToNetDevice() after Bind() + rxSocket->SetRecvCallback (MakeCallback (&Ipv4BindToNetDeviceTest::ReceivePkt, this)); + + Ptr txSocketFactory = txNode->GetObject (); + Ptr txSocket = txSocketFactory->CreateSocket (); + txSocket->SetAllowBroadcast (true); + + // ------ Now the tests ------------ + + // Test that data is successful when RxNode binds to rxDev1 and TxNode binds + // to txDev1 + NS_LOG_DEBUG ("Bind test case 1"); + rxSocket->BindToNetDevice (rxDev1); + txSocket->BindToNetDevice (txDev1); + SendData (txSocket, "10.0.0.2", 123); // 123 is the expected Send() return value + Simulator::Run (); + NS_TEST_EXPECT_MSG_EQ (m_receivedPacket->GetSize (), 123, "Correctly bound NetDevices"); + m_receivedPacket = 0; + + // All three other bind combinations should fail + + NS_LOG_DEBUG ("Bind test case 2"); + txSocket = txSocketFactory->CreateSocket (); + rxSocket->BindToNetDevice (rxDev1); + txSocket->BindToNetDevice (txDev2); + SendData (txSocket, "10.0.0.2", -1); + Simulator::Run (); + NS_TEST_EXPECT_MSG_EQ (m_receivedPacket, 0, "No received packet"); + + NS_LOG_DEBUG ("Bind test case 3"); + txSocket = txSocketFactory->CreateSocket (); + rxSocket->BindToNetDevice (rxDev2); + txSocket->BindToNetDevice (txDev2); + SendData (txSocket, "10.0.0.2", -1); + Simulator::Run (); + NS_TEST_EXPECT_MSG_EQ (m_receivedPacket, 0, "No received packet"); + + NS_LOG_DEBUG ("Bind test case 4"); + txSocket = txSocketFactory->CreateSocket (); + rxSocket->BindToNetDevice (rxDev2); + txSocket->BindToNetDevice (txDev1); + SendData (txSocket, "10.0.0.2", 123); + Simulator::Run (); + NS_TEST_EXPECT_MSG_EQ (m_receivedPacket, 0, "No received packet"); Simulator::Destroy (); @@ -217,5 +380,6 @@ Ipv4ForwardingTestSuite () : TestSuite ("ipv4-forwarding", UNIT) { AddTestCase (new Ipv4ForwardingTest, TestCase::QUICK); + AddTestCase (new Ipv4BindToNetDeviceTest, TestCase::QUICK); } } g_ipv4forwardingTestSuite;