A Discrete-Event Network Simulator
API
ipv4-packet-info-tag-test-suite.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010 Hajime Tazaki
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Authors: Hajime Tazaki <tazaki@sfc.wide.ad.jp>
19  */
20 
21 //-----------------------------------------------------------------------------
22 // Unit tests
23 //-----------------------------------------------------------------------------
24 
25 #include <string>
26 
27 #include "ns3/test.h"
28 #include "ns3/ipv4-packet-info-tag.h"
29 #include "ns3/ipv4-address.h"
30 #include "ns3/log.h"
31 #include "ns3/abort.h"
32 #include "ns3/attribute.h"
33 #include "ns3/simple-net-device.h"
34 #include "ns3/object-factory.h"
35 #include "ns3/socket-factory.h"
36 #include "ns3/udp-socket-factory.h"
37 #include "ns3/udp-socket.h"
38 #include "ns3/inet-socket-address.h"
39 #include "ns3/ipv4-l3-protocol.h"
40 #include "ns3/ipv4-raw-socket-factory.h"
41 #include "ns3/ipv4-interface.h"
42 #include "ns3/arp-l3-protocol.h"
43 #include "ns3/icmpv4-l4-protocol.h"
44 #include "ns3/ipv4-static-routing.h"
45 #include "ns3/ipv4-list-routing.h"
46 #include "ns3/udp-l4-protocol.h"
47 #include "ns3/tcp-l4-protocol.h"
48 #include "ns3/traffic-control-layer.h"
49 #include "ns3/simulator.h"
50 #include "ns3/node.h"
51 #include "ns3/internet-stack-helper.h"
52 #include "ns3/simple-net-device-helper.h"
53 
54 using namespace ns3;
55 
63 {
64 public:
66 private:
67  virtual void DoRun (void);
68 
73  void RxCb (Ptr<Socket> socket);
79  void DoSendData (Ptr<Socket> socket, std::string to);
80 };
81 
83  : TestCase ("Ipv4PacketInfoTagTest")
84 {
85 }
86 
87 void
89 {
90  uint32_t availableData;
91  Ptr<Packet> m_receivedPacket;
92 
93  availableData = socket->GetRxAvailable ();
94  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
95  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (), "Did not read expected data");
96 
98  bool found;
99  found = m_receivedPacket->RemovePacketTag (tag);
100  NS_TEST_ASSERT_MSG_EQ (found, true, "Could not find tag");
101 }
102 
103 void
105 {
106  Address realTo = InetSocketAddress (Ipv4Address (to.c_str ()), 200);
107  if (DynamicCast<UdpSocket> (socket) != 0)
108  {
109  NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
110  123, "100");
111  }
112  // Should only Ipv4RawSock
113  else
114  {
115  socket->SendTo (Create<Packet> (123), 0, realTo);
116  }
117 }
118 
119 void
121 {
122  Ptr<Node> node0 = CreateObject<Node> ();
123  Ptr<Node> node1 = CreateObject<Node> ();
124 
125  SimpleNetDeviceHelper simpleNetDevHelper;
126  NetDeviceContainer devs = simpleNetDevHelper.Install (NodeContainer (node0, node1));
127  Ptr<SimpleNetDevice> device = DynamicCast<SimpleNetDevice> (devs.Get (0));
128  Ptr<SimpleNetDevice> device2 = DynamicCast<SimpleNetDevice> (devs.Get (1));
129 
130  InternetStackHelper internet;
131  internet.SetIpv6StackInstall (false);
132 
133  // For Node 0
134  node0->AddDevice (device);
135  internet.Install (node0);
136  Ptr<Ipv4> ipv4 = node0->GetObject<Ipv4> ();
137 
138  uint32_t index = ipv4->AddInterface (device);
139  Ipv4InterfaceAddress ifaceAddr1 = Ipv4InterfaceAddress ("10.1.1.1",
140  "255.255.255.0");
141  ipv4->AddAddress (index, ifaceAddr1);
142  ipv4->SetMetric (index, 1);
143  ipv4->SetUp (index);
144 
145  // For Node 1
146  node1->AddDevice (device2);
147  internet.Install (node1);
148  ipv4 = node1->GetObject<Ipv4> ();
149 
150  index = ipv4->AddInterface (device2);
151  Ipv4InterfaceAddress ifaceAddr2 = Ipv4InterfaceAddress ("10.1.1.2",
152  "255.255.255.0");
153  ipv4->AddAddress (index, ifaceAddr2);
154  ipv4->SetMetric (index, 1);
155  ipv4->SetUp (index);
156 
157  // IPv4 test
158  Ptr<SocketFactory> factory = node0->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
159  Ptr<Socket> socket = factory->CreateSocket ();
160  InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), 200);
161  socket->Bind (local);
162  socket->SetRecvPktInfo (true);
163  socket->SetRecvCallback (MakeCallback (&Ipv4PacketInfoTagTest::RxCb, this));
164 
165  // receive on loopback
166  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
167  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "127.0.0.1");
168  Simulator::Run ();
169 
170  Ptr<SocketFactory> factory2 = node1->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
171  Ptr<Socket> socket2 = factory2->CreateSocket ();
172  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
173  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
174  Simulator::Run ();
175 
176  // ipv4 w rawsocket
177  factory = node0->GetObject<SocketFactory> (Ipv4RawSocketFactory::GetTypeId ());
178  socket = factory->CreateSocket ();
179  local = InetSocketAddress (Ipv4Address::GetAny (), 0);
180  socket->Bind (local);
181  socket->SetRecvPktInfo (true);
182  socket->SetRecvCallback (MakeCallback (&Ipv4PacketInfoTagTest::RxCb, this));
183 
184  // receive on loopback
185  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
186  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "127.0.0.1");
187  Simulator::Run ();
188 
189  factory2 = node1->GetObject<SocketFactory> (Ipv4RawSocketFactory::GetTypeId ());
190  socket2 = factory2->CreateSocket ();
191  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
192  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
193  Simulator::Run ();
194  Simulator::Destroy ();
195 }
196 
204 {
205 public:
207 private:
208 };
209 
211  : TestSuite ("ipv4-packet-info-tag", UNIT)
212 {
213  AddTestCase (new Ipv4PacketInfoTagTest (), TestCase::QUICK);
214 }
215 
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
virtual uint32_t AddInterface(Ptr< NetDevice > device)=0
an Inet address class
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
static Ipv4PacketInfoTagTestSuite g_packetinfotagTests
Static variable for test initialization.
A suite of tests to run.
Definition: test.h:1343
aggregate IP/TCP/UDP functionality to existing Nodes.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition: test.h:283
virtual Ptr< Socket > CreateSocket(void)=0
encapsulates test code
Definition: test.h:1153
Object to create transport layer instances that provide a socket API to applications.
a polymophic address class
Definition: address.h:90
virtual void DoRun(void)
Implementation to actually run this TestCase.
#define max(a, b)
Definition: 80211b.c:43
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
virtual void SetUp(uint32_t interface)=0
#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.
Definition: test.h:166
holds a vector of ns3::NetDevice pointers
void DoSendData(Ptr< Socket > socket, std::string to)
Send data.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:76
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
a class to store IPv4 address information on an interface
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
Definition: packet.cc:963
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1288
virtual void SetMetric(uint32_t interface, uint16_t metric)=0
virtual bool AddAddress(uint32_t interface, Ipv4InterfaceAddress address)=0
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
build a set of SimpleNetDevice objects
void RxCb(Ptr< Socket > socket)
Receive callback.
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...
Definition: callback.h:1642
void SetIpv6StackInstall(bool enable)
Enable/disable IPv6 stack install.
virtual uint32_t GetRxAvailable(void) const =0
Return number of bytes which can be returned from one or multiple calls to Recv.