28 #include "ns3/simulator.h"    29 #include "ns3/simple-channel.h"    30 #include "ns3/simple-net-device.h"    31 #include "ns3/socket.h"    32 #include "ns3/boolean.h"    33 #include "ns3/double.h"    34 #include "ns3/uinteger.h"    35 #include "ns3/string.h"    36 #include "ns3/config.h"    38 #include "ns3/names.h"    41 #include "ns3/inet-socket-address.h"    42 #include "ns3/random-variable-stream.h"    44 #include "ns3/ipv4-l3-protocol.h"    45 #include "ns3/ipv4-static-routing.h"    46 #include "ns3/udp-socket-factory.h"    47 #include "ns3/udp-socket.h"    48 #include "ns3/internet-stack-helper.h"    49 #include "ns3/ipv4-list-routing-helper.h"    50 #include "ns3/ipv4-static-routing-helper.h"    51 #include "ns3/ipv4-address-helper.h"    52 #include "ns3/simple-net-device-helper.h"    54 #include "ns3/traffic-control-layer.h"    94   void DoSendData (
Ptr<Socket> socket, std::string to);
   107   void SendData (
Ptr<Socket> socket, std::string to);
   121   void CheckPackets (
const std::string &name);
   127   void CheckDrops (
const std::string &name);
   130   static std::string MakeName (
bool enable, 
Time expire);
   141   virtual void DoRun (
void);
   167   : 
TestCase (MakeName (enable, expire))
   183   uint32_t availableData;
   188   auto node = socket->
GetNode ();
   189   std::string name = Names::FindName (node);
   212   std::string name = Names::FindName (node);
   220   SendPacket (socket, Create<Packet> (123), to);
   246   std::ostringstream oss;
   247   oss << 
"IP v4 RFC 6621 De-duplication: ";
   252   else if (expire > 
DELAY)
   260   oss << 
", expire = " << expire.
ToDouble (Time::MS) << 
"ms";
   269   const std::string targetAddr = 
"239.192.100.1";
   280   Names::Add (
"A", 
nodes.Get (0));
   281   Names::Add (
"B", 
nodes.Get (1));
   282   Names::Add (
"C", 
nodes.Get (2));
   283   Names::Add (
"D", 
nodes.Get (3));
   284   Names::Add (
"E", 
nodes.Get (4));
   289   Names::Add (
"A/dev", 
devices.Get (0));
   290   Names::Add (
"B/dev", 
devices.Get (1));
   291   Names::Add (
"C/dev", 
devices.Get (2));
   292   Names::Add (
"D/dev", 
devices.Get (3));
   293   Names::Add (
"E/dev", 
devices.Get (4));
   297   listRouting.Add (staticRouting, 0);
   306   ipv4address.
SetBase (
"10.0.0.0", 
"255.255.255.0");
   311   for (
auto end = 
nodes.End (),
   312            iter = 
nodes.Begin (); iter != end; ++iter)
   325       auto ipv4 = (*iter)->GetObject <
Ipv4> ();
   326       NS_ASSERT_MSG ((
bool) ipv4, 
"Node " << Names::FindName (*iter) << 
" does not have Ipv4 aggregate");
   328       routing->AddHostRouteTo (targetAddr.c_str (), ipv4->GetInterfaceForDevice (*diter), 0);
   338   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"A/dev"), Names::Find <SimpleNetDevice> (
"D/dev"));
   339   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"D/dev"), Names::Find <SimpleNetDevice> (
"A/dev"));
   341   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"A/dev"), Names::Find <SimpleNetDevice> (
"E/dev"));
   342   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"E/dev"), Names::Find <SimpleNetDevice> (
"A/dev"));
   344   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"B/dev"), Names::Find <SimpleNetDevice> (
"E/dev"));
   345   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"E/dev"), Names::Find <SimpleNetDevice> (
"B/dev"));
   347   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"C/dev"), Names::Find <SimpleNetDevice> (
"E/dev"));
   348   simplechannel->BlackList (Names::Find <SimpleNetDevice> (
"E/dev"), Names::Find <SimpleNetDevice> (
"C/dev"));
   351   std::list<Ptr<Socket> > sockets;
   352   for (
auto end = 
nodes.End (),
   353            iter = 
nodes.Begin (); iter != end; ++iter)
   357       socket->SetAllowBroadcast (
true);
   359                              "Could not bind socket for node " << Names::FindName (*iter));
   363       udpSocket->SetAttribute (
"IpMulticastTtl", 
StringValue (
"4"));
   366       sockets.push_back (socket);
   374   auto txSocket = sockets.front ();
   381   Simulator::Destroy ();
   383   for (
auto end = 
nodes.End (),
   384            iter = 
nodes.Begin (); iter != end; ++iter)
   386       std::string name = Names::FindName (*iter);
   408     std::map <std::string, uint32_t> packets = {
   409       {
"A", 14}, {
"B", 16}, {
"C", 16}, {
"D", 16}, {
"E", 4}
   416     std::map <std::string, uint32_t> degenerates = {
   417       {
"A", 3}, {
"B", 4}, {
"C", 4}, {
"D", 3}, {
"E", 2}
   421                           "No packets received for node " << name);
   439     std::map <std::string, uint32_t> drops;
   447           drops = {{
"A", 1}, {
"B", 3}, {
"C", 3}, {
"D", 2}, {
"E", 0}};
   451           drops = {{
"A", 10}, {
"B", 9}, {
"C", 9}, {
"D", 12}, {
"E", 2}};
   463           drops = {{
"A", 4}, {
"B", 5}, {
"C", 5}, {
"D", 5}, {
"E", 1}};
   533     virtual void DoRun (
void);
   542   : 
TestCase (
"Ipv4Deduplication performance test")
   551   const std::string targetAddr = 
"239.192.100.1";
   564   listRouting.
Add (staticRouting, 0);
   573   ipv4address.
SetBase (
"10.0.0.0", 
"255.255.255.0");
   578   for (
auto iter = 
nodes.Begin (); iter != 
nodes.End (); ++iter)
   591       auto ipv4 = (*iter)->GetObject <
Ipv4> ();
   592       NS_ASSERT_MSG ((
bool) ipv4, 
"Node " << (*iter)->GetId () << 
" does not have Ipv4 aggregate");
   594       routing->AddHostRouteTo (targetAddr.c_str (), ipv4->GetInterfaceForDevice (*diter), 0);
   603   for (
auto iter = 
nodes.Begin (); iter != 
nodes.End (); ++iter)
   610   for (uint8_t i = 0; i<
nodes.GetN (); i++)
   612       Simulator::ScheduleWithContext (
m_sockets[i]->GetNode ()->GetId (),
   618   NS_LOG_UNCOND (
"Executed " << Simulator::GetEventCount () << 
" events");
   625   Simulator::Destroy ();
   631   socket->
SendTo (Create<Packet> (512), 0, to);
   635       Simulator::ScheduleWithContext (
m_sockets[socketIndex]->GetNode ()->GetId (), 
Seconds (.5),
   654   : 
TestSuite (
"ipv4-deduplication-performance", PERFORMANCE)
 (abstract) base class of all UdpSockets 
Simulation virtual time values and global simulation resolution. 
Ipv4DeduplicationTest(bool enable, Time expire=Seconds(1))
  AttributeValue implementation for Boolean. 
uint32_t GetId(void) const
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload). 
Hold variables of type string. 
void SetIpv4ArpJitter(bool enable)
Enable/disable IPv4 ARP Jitter. 
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit. 
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. 
double ToDouble(enum Unit unit) const
Get the Time value expressed in a particular unit. 
virtual Ptr< Socket > CreateSocket(void)=0
virtual Ptr< NetDevice > GetNetDevice(uint32_t interface)=0
Object to create transport layer instances that provide a socket API to applications. 
a polymophic address class 
void AddMulticastRoute(Ptr< Node > n, Ipv4Address source, Ipv4Address group, Ptr< NetDevice > input, NetDeviceContainer output)
Add a multicast route to a node and net device using explicit Ptr<Node> and Ptr<NetDevice> ...
DropReason
Reason why a packet has been dropped. 
static Ipv4DeduplicationTestSuite g_ipv4DeduplicationTestSuite
Static variable for test initialization. 
static Ipv4DeduplicationPerformanceTestSuite g_ipv4DeduplicationPerformanceTestSuite
Static variable for test initialization. 
virtual int MulticastJoinGroup(uint32_t interface, const Address &groupAddress)=0
Corresponds to socket option MCAST_JOIN_GROUP. 
  AttributeValue implementation for Time. 
void DoSendPacket(Ptr< Socket > socket, Ptr< Packet > packet, std::string to)
Send data. 
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite. 
holds a vector of ns3::NetDevice pointers 
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
void CheckPackets(const std::string &name)
Check packet receptions. 
Access to the IPv4 forwarding table, interfaces, and configuration. 
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object. 
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. 
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally. 
void DoSendData(Ptr< Socket > socket, std::string to)
Send data. 
void SendData(Ptr< Socket > socket, std::string to)
Send data. 
void Add(const Ipv4RoutingHelper &routing, int16_t priority)
void DropPkt(const Ipv4Header &ipHeader, Ptr< const Packet > packet, Ipv4L3Protocol::DropReason reason, Ptr< Ipv4 > ipv4, uint32_t interface)
Register dropped packet. 
void SendPacket(Ptr< NetDevice > sourceDevice, Address &destination)
This example (inspired from tv-trans-example) enables to generate the transmitted spectra of Wi-Fi st...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
Ipv4DeduplicationTestSuite()
Ipv4 addresses are stored in host order in this class. 
virtual void DoRun(void)
Implementation to actually run this TestCase. 
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not...
void SendPacket(Ptr< Socket > socket, Ptr< Packet > packet, std::string to)
Send data. 
Helper class that adds ns3::Ipv4StaticRouting objects. 
virtual Ptr< Node > GetNode(void) const =0
Return the node this socket is associated with. 
A simple channel, for simple things and testing. 
std::map< std::string, uint32_t > m_packetCountMap
Time Seconds(double value)
Construct a Time in the indicated unit. 
void SetDefault(std::string name, const AttributeValue &value)
Helper class that adds ns3::Ipv4ListRouting objects. 
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer. 
A helper class to make life easier while doing simple IPv4 address assignment in scripts. 
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit. 
std::map< std::string, uint32_t > m_dropCountMap
API to create UDP socket instances. 
build a set of SimpleNetDevice objects 
This class can be used to hold variables of floating point type such as 'double' or 'float'...
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
IPv4 Deduplication TestSuite. 
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful. 
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
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...
static std::string MakeName(bool enable, Time expire)
void ReceivePkt(Ptr< Socket > socket)
Receive data. 
void SetIpv6StackInstall(bool enable)
Enable/disable IPv6 stack install. 
Ptr< Ipv4StaticRouting > GetStaticRouting(Ptr< Ipv4 > ipv4) const
Try and find the static routing protocol as either the main routing protocol or in the list of routin...
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address. 
void CheckDrops(const std::string &name)
Check packet drops. 
virtual uint32_t GetRxAvailable(void) const =0
Return number of bytes which can be returned from one or multiple calls to Recv.