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).
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
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...
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.