/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ /* * Copyright (c) 2007 Georgia Tech Research Corporation * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Raj Bhattacharjea */ /** * This is the test code for udp-socket-impl.cc, it was moved out of udp-socket-impl.cc to * be in an independent file for clarity purposes. */ #ifdef RUN_SELF_TESTS #include "ns3/test.h" #include "ns3/socket-factory.h" #include "ns3/udp-socket-factory.h" #include "ns3/simulator.h" #include "ns3/simple-channel.h" #include "ns3/simple-net-device.h" #include "ns3/drop-tail-queue.h" #include "ns3/socket.h" #include "ns3/log.h" #include "ns3/node.h" #include "ns3/inet-socket-address.h" #include "arp-l3-protocol.h" #include "ipv4-l3-protocol.h" #include "icmpv4-l4-protocol.h" #include "udp-l4-protocol.h" #include "tcp-l4-protocol.h" #include "ipv4-list-routing-impl.h" #include "ipv4-static-routing-impl.h" #include #include namespace ns3 { static void AddInternetStack (Ptr node) { //ARP Ptr arp = CreateObject (); node->AggregateObject(arp); //IPV4 Ptr ipv4 = CreateObject (); //Routing for Ipv4 Ptr ipv4RoutingImpl = CreateObject (); ipv4->SetRoutingProtocol (ipv4RoutingImpl); ipv4RoutingImpl->SetNode (node); Ptr ipv4staticRoutingImpl = CreateObject (); ipv4staticRoutingImpl->SetNode (node); ipv4RoutingImpl->AddRoutingProtocol (ipv4staticRoutingImpl, 0); node->AggregateObject(ipv4); //ICMP Ptr icmp = CreateObject (); node->AggregateObject(icmp); //UDP Ptr udp = CreateObject (); node->AggregateObject(udp); //TCP Ptr tcp = CreateObject (); node->AggregateObject(tcp); } class UdpSocketImplTest: public Test { Ptr m_receivedPacket; Ptr m_receivedPacket2; public: virtual bool RunTests (void); UdpSocketImplTest (); void ReceivePacket (Ptr socket, Ptr packet, const Address &from); void ReceivePacket2 (Ptr socket, Ptr packet, const Address &from); void ReceivePkt (Ptr socket); void ReceivePkt2 (Ptr socket); }; UdpSocketImplTest::UdpSocketImplTest () : Test ("UdpSocketImpl") { } void UdpSocketImplTest::ReceivePacket (Ptr socket, Ptr packet, const Address &from) { m_receivedPacket = packet; } void UdpSocketImplTest::ReceivePacket2 (Ptr socket, Ptr packet, const Address &from) { m_receivedPacket2 = packet; } void UdpSocketImplTest::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 UdpSocketImplTest::ReceivePkt2 (Ptr socket) { uint32_t availableData; availableData = socket->GetRxAvailable (); m_receivedPacket2 = socket->Recv (std::numeric_limits::max(), 0); NS_ASSERT (availableData == m_receivedPacket2->GetSize ()); } bool UdpSocketImplTest::RunTests (void) { bool result = true; // Create topology // Receiver Node Ptr rxNode = CreateObject (); AddInternetStack (rxNode); Ptr rxDev1, rxDev2; { // first interface rxDev1 = CreateObject (); rxDev1->SetAddress (Mac48Address::Allocate ()); rxNode->AddDevice (rxDev1); Ptr ipv4 = rxNode->GetObject (); uint32_t netdev_idx = ipv4->AddInterface (rxDev1); Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("10.0.0.1"), Ipv4Mask (0xffff0000U)); ipv4->AddAddress (netdev_idx, ipv4Addr); ipv4->SetUp (netdev_idx); } { // second interface rxDev2 = CreateObject (); rxDev2->SetAddress (Mac48Address::Allocate ()); rxNode->AddDevice (rxDev2); Ptr ipv4 = rxNode->GetObject (); uint32_t netdev_idx = ipv4->AddInterface (rxDev2); Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("10.0.1.1"), Ipv4Mask (0xffff0000U)); ipv4->AddAddress (netdev_idx, ipv4Addr); ipv4->SetUp (netdev_idx); } // Sender Node Ptr txNode = CreateObject (); AddInternetStack (txNode); Ptr txDev1; { txDev1 = CreateObject (); txDev1->SetAddress (Mac48Address::Allocate ()); txNode->AddDevice (txDev1); Ptr ipv4 = txNode->GetObject (); uint32_t netdev_idx = ipv4->AddInterface (txDev1); Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("10.0.0.2"), Ipv4Mask (0xffff0000U)); ipv4->AddAddress (netdev_idx, ipv4Addr); ipv4->SetUp (netdev_idx); } Ptr txDev2; { txDev2 = CreateObject (); txDev2->SetAddress (Mac48Address::Allocate ()); txNode->AddDevice (txDev2); Ptr ipv4 = txNode->GetObject (); uint32_t netdev_idx = ipv4->AddInterface (txDev2); Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("10.0.1.2"), 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_ASSERT_EQUAL (rxSocket->Bind (InetSocketAddress (Ipv4Address ("10.0.0.1"), 1234)), 0); rxSocket->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt, this)); Ptr rxSocket2 = rxSocketFactory->CreateSocket (); rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this)); NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("10.0.1.1"), 1234)), 0); Ptr txSocketFactory = txNode->GetObject (); Ptr txSocket = txSocketFactory->CreateSocket (); // ------ Now the tests ------------ // Unicast test m_receivedPacket = Create (); m_receivedPacket2 = Create (); NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create (123), 0, InetSocketAddress (Ipv4Address("10.0.0.1"), 1234)), 123); Simulator::Run (); NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it m_receivedPacket->RemoveAllByteTags (); m_receivedPacket2->RemoveAllByteTags (); // Simple broadcast test m_receivedPacket = Create (); m_receivedPacket2 = Create (); NS_TEST_ASSERT_EQUAL (txSocket->SendTo ( Create (123), 0, InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123); Simulator::Run (); NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); // second socket should not receive it (it is bound specifically to the second interface's address NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); m_receivedPacket->RemoveAllByteTags (); m_receivedPacket2->RemoveAllByteTags (); // Broadcast test with multiple receiving sockets // When receiving broadcast packets, all sockets sockets bound to // the address/port should receive a copy of the same packet -- if // the socket address matches. rxSocket2->Dispose (); rxSocket2 = rxSocketFactory->CreateSocket (); rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketImplTest::ReceivePkt2, this)); NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0); m_receivedPacket = Create (); m_receivedPacket2 = Create (); NS_TEST_ASSERT_EQUAL (txSocket->SendTo (Create (123), 0, InetSocketAddress (Ipv4Address("255.255.255.255"), 1234)), 123); Simulator::Run (); NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123); NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 123); m_receivedPacket->RemoveAllByteTags (); m_receivedPacket2->RemoveAllByteTags (); Simulator::Destroy (); return result; } static UdpSocketImplTest gUdpSocketImplTest; }; // namespace ns3 #endif /* RUN_SELF_TESTS */