26#include "ns3/boolean.h"
27#include "ns3/config.h"
28#include "ns3/double.h"
29#include "ns3/inet-socket-address.h"
30#include "ns3/internet-stack-helper.h"
31#include "ns3/ipv4-address-helper.h"
32#include "ns3/ipv4-l3-protocol.h"
33#include "ns3/ipv4-list-routing-helper.h"
34#include "ns3/ipv4-static-routing-helper.h"
35#include "ns3/ipv4-static-routing.h"
39#include "ns3/random-variable-stream.h"
40#include "ns3/simple-channel.h"
41#include "ns3/simple-net-device-helper.h"
42#include "ns3/simple-net-device.h"
43#include "ns3/simulator.h"
44#include "ns3/socket.h"
45#include "ns3/string.h"
47#include "ns3/traffic-control-layer.h"
48#include "ns3/udp-socket-factory.h"
49#include "ns3/udp-socket.h"
50#include "ns3/uinteger.h"
147 std::map<std::string, uint32_t>
149 std::map<std::string, uint32_t>
153 void DoRun()
override;
186 :
TestCase(MakeName(enable, expire)),
208 "Received packet size is not equal to the Rx buffer size");
211 std::string name = Names::FindName(node);
235 auto node = ipv4->GetNetDevice(interface)->GetNode();
236 std::string name = Names::FindName(node);
263 Simulator::ScheduleWithContext(socket->
GetNode()->
GetId(),
275 std::ostringstream oss;
276 oss <<
"IP v4 RFC 6621 De-duplication: ";
281 else if (expire >
DELAY)
289 oss <<
", expire = " << expire.
ToDouble(Time::MS) <<
"ms";
298 const std::string targetAddr =
"239.192.100.1";
319 Names::Add(
"A/dev",
devices.Get(0));
320 Names::Add(
"B/dev",
devices.Get(1));
321 Names::Add(
"C/dev",
devices.Get(2));
322 Names::Add(
"D/dev",
devices.Get(3));
323 Names::Add(
"E/dev",
devices.Get(4));
327 listRouting.
Add(staticRouting, 0);
336 ipv4address.
SetBase(
"10.0.0.0",
"255.255.255.0");
345 Ipv4Address::GetAny(),
358 auto ipv4 = (*iter)->GetObject<
Ipv4>();
361 "Node " << Names::FindName(*iter) <<
" does not have Ipv4 aggregate");
363 routing->AddHostRouteTo(targetAddr.c_str(), ipv4->GetInterfaceForDevice(*diter), 0);
373 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"A/dev"),
374 Names::Find<SimpleNetDevice>(
"D/dev"));
375 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"D/dev"),
376 Names::Find<SimpleNetDevice>(
"A/dev"));
378 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"A/dev"),
379 Names::Find<SimpleNetDevice>(
"E/dev"));
380 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"E/dev"),
381 Names::Find<SimpleNetDevice>(
"A/dev"));
383 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"B/dev"),
384 Names::Find<SimpleNetDevice>(
"E/dev"));
385 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"E/dev"),
386 Names::Find<SimpleNetDevice>(
"B/dev"));
388 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"C/dev"),
389 Names::Find<SimpleNetDevice>(
"E/dev"));
390 simplechannel->BlackList(Names::Find<SimpleNetDevice>(
"E/dev"),
391 Names::Find<SimpleNetDevice>(
"C/dev"));
394 std::list<Ptr<Socket>> sockets;
399 socket->SetAllowBroadcast(
true);
402 "Could not bind socket for node " << Names::FindName(*iter));
406 udpSocket->SetAttribute(
"IpMulticastTtl",
StringValue(
"4"));
409 sockets.push_back(socket);
417 auto txSocket = sockets.front();
424 Simulator::Destroy();
428 std::string name = Names::FindName(*iter);
450 std::map<std::string, uint32_t> packets = {{
"A", 14},
457 std::map<std::string, uint32_t> packetsDuped = {{
"A", 0},
467 std::map<std::string, uint32_t> degenerates = {{
"A", 3},
478 "Wrong number of packets received for node " << name);
483 "Wrong number of packets received for node " << name);
488 "Wrong number of packets received for node " << name);
496 std::map<std::string, uint32_t> drops;
504 drops = {{
"A", 2}, {
"B", 2}, {
"C", 2}, {
"D", 2}, {
"E", 0}};
508 drops = {{
"A", 10}, {
"B", 9}, {
"C", 9}, {
"D", 12}, {
"E", 2}};
520 drops = {{
"A", 4}, {
"B", 5}, {
"C", 5}, {
"D", 5}, {
"E", 1}};
528 "No drops for node " << name);
531 "Wrong number of drops for node " << name);
537 "Non-0 drops for node " << name);
595 void DoRun()
override;
612 :
TestCase(
"Ipv4Deduplication performance test")
621 const std::string targetAddr =
"239.192.100.1";
634 listRouting.
Add(staticRouting, 0);
643 ipv4address.
SetBase(
"10.0.0.0",
"255.255.255.0");
652 Ipv4Address::GetAny(),
665 auto ipv4 = (*iter)->GetObject<
Ipv4>();
668 "Node " << (*iter)->GetId() <<
" does not have Ipv4 aggregate");
670 routing->AddHostRouteTo(targetAddr.c_str(), ipv4->GetInterfaceForDevice(*diter), 0);
677 CreateObjectWithAttributes<UniformRandomVariable>(
"Max",
DoubleValue(4));
682 m_sockets.push_back(udpSocketFactory->CreateSocket());
688 Simulator::ScheduleWithContext(
m_sockets[i]->GetNode()->GetId(),
698 NS_LOG_UNCOND(
"Executed " << Simulator::GetEventCount() <<
" events");
705 Simulator::Destroy();
711 socket->
SendTo(Create<Packet>(512), 0, to);
715 Simulator::ScheduleWithContext(
m_sockets[socketIndex]->GetNode()->GetId(),
738 :
TestSuite(
"ipv4-deduplication-performance", PERFORMANCE)
void ReceivePkt(Ptr< Socket > socket)
Receive data.
Ipv4DeduplicationTest(bool enable, Time expire=Seconds(1))
Constructor.
std::map< std::string, uint32_t > m_dropCountMap
map of received packets (node name, counter)
void CheckDrops(const std::string &name)
Check packet drops.
void DoSendData(Ptr< Socket > socket, std::string to)
Send data.
Time m_expire
Expiration delay for duplicate cache entries.
void SendData(Ptr< Socket > socket, std::string to)
Send data.
void DoRun() override
Implementation to actually run this TestCase.
static const Time DELAY
Channel delay.
static std::string MakeName(bool enable, Time expire)
Creates the test name according to the parameters.
void DoSendPacket(Ptr< Socket > socket, Ptr< Packet > packet, std::string to)
Send data.
void DropPkt(const Ipv4Header &ipHeader, Ptr< const Packet > packet, Ipv4L3Protocol::DropReason reason, Ptr< Ipv4 > ipv4, uint32_t interface)
Register dropped packet.
std::map< std::string, uint32_t > m_packetCountMap
map of received packets (node name, counter)
void SendPacket(Ptr< Socket > socket, Ptr< Packet > packet, std::string to)
Send data.
void CheckPackets(const std::string &name)
Check packet receptions.
IPv4 Deduplication TestSuite.
Ipv4DeduplicationTestSuite()
a polymophic address class
AttributeValue implementation for Boolean.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void SetIpv4ArpJitter(bool enable)
Enable/disable IPv4 ARP Jitter.
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
void SetIpv6StackInstall(bool enable)
Enable/disable IPv6 stack install.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Access to the IPv4 forwarding table, interfaces, and configuration.
DropReason
Reason why a packet has been dropped.
Helper class that adds ns3::Ipv4ListRouting objects.
void Add(const Ipv4RoutingHelper &routing, int16_t priority)
Helper class that adds ns3::Ipv4StaticRouting objects.
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 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>
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
Iterator End() const
Get an iterator which indicates past-the-last Node in the container.
uint32_t GetN() const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Iterator Begin() const
Get an iterator which refers to the first Node in the container.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
A simple channel, for simple things and testing.
build a set of SimpleNetDevice objects
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::SimpleChannel with the attributes configured by SimpleNetDeviceHelper::Se...
Object to create transport layer instances that provide a socket API to applications.
virtual Ptr< Socket > CreateSocket()=0
virtual uint32_t GetRxAvailable() const =0
Return number of bytes which can be returned from one or multiple calls to Recv.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
virtual Ptr< Node > GetNode() const =0
Return the node this socket is associated with.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
double ToDouble(enum Unit unit) const
Get the Time value expressed in a particular unit.
AttributeValue implementation for Time.
API to create UDP socket instances.
(abstract) base class of all UdpSockets
virtual int MulticastJoinGroup(uint32_t interface, const Address &groupAddress)=0
Corresponds to socket option MCAST_JOIN_GROUP.
void SetDefault(std::string name, const AttributeValue &value)
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally.
#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.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
#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.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
static Ipv4DeduplicationPerformanceTestSuite g_ipv4DeduplicationPerformanceTestSuite
Static variable for test initialization.
static Ipv4DeduplicationTestSuite g_ipv4DeduplicationTestSuite
Static variable for test initialization.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...