15#include "ns3/boolean.h"
16#include "ns3/config.h"
17#include "ns3/double.h"
18#include "ns3/inet-socket-address.h"
19#include "ns3/internet-stack-helper.h"
20#include "ns3/ipv4-address-helper.h"
21#include "ns3/ipv4-l3-protocol.h"
22#include "ns3/ipv4-list-routing-helper.h"
23#include "ns3/ipv4-static-routing-helper.h"
24#include "ns3/ipv4-static-routing.h"
28#include "ns3/random-variable-stream.h"
29#include "ns3/simple-channel.h"
30#include "ns3/simple-net-device-helper.h"
31#include "ns3/simple-net-device.h"
32#include "ns3/simulator.h"
33#include "ns3/socket.h"
34#include "ns3/string.h"
36#include "ns3/traffic-control-layer.h"
37#include "ns3/udp-socket-factory.h"
38#include "ns3/udp-socket.h"
39#include "ns3/uinteger.h"
135 std::map<std::string, uint32_t>
137 std::map<std::string, uint32_t>
141 void DoRun()
override;
174 :
TestCase(MakeName(enable, expire)),
192 availableData = socket->GetRxAvailable();
193 Ptr<Packet> packet = socket->Recv(std::numeric_limits<uint32_t>::max(), 0);
196 "Received packet size is not equal to the Rx buffer size");
198 auto node = socket->GetNode();
223 auto node = ipv4->GetNetDevice(interface)->GetNode();
263 std::ostringstream oss;
264 oss <<
"IP v4 RFC 6621 De-duplication: ";
269 else if (expire >
DELAY)
286 const std::string targetAddr =
"239.192.100.1";
315 listRouting.
Add(staticRouting, 0);
318 internet.SetIpv6StackInstall(
false);
319 internet.SetIpv4ArpJitter(
true);
320 internet.SetRoutingHelper(listRouting);
321 internet.Install(
nodes);
324 ipv4address.
SetBase(
"10.0.0.0",
"255.255.255.0");
325 ipv4address.
Assign(devices);
328 auto diter = devices.Begin();
346 auto ipv4 = (*iter)->GetObject<
Ipv4>();
351 routing->AddHostRouteTo(targetAddr.c_str(), ipv4->GetInterfaceForDevice(*diter), 0);
357 auto channel = devices.Get(0)->GetChannel();
382 std::list<Ptr<Socket>> sockets;
387 socket->SetAllowBroadcast(
true);
394 udpSocket->SetAttribute(
"IpMulticastTtl",
StringValue(
"4"));
397 sockets.push_back(socket);
405 auto txSocket = sockets.front();
438 std::map<std::string, uint32_t> packets = {
447 std::map<std::string, uint32_t> packetsDuped = {
459 std::map<std::string, uint32_t> degenerates = {
472 "Wrong number of packets received for node " << name);
477 "Wrong number of packets received for node " << name);
482 "Wrong number of packets received for node " << name);
490 std::map<std::string, uint32_t> drops;
498 drops = {{
"A", 2}, {
"B", 2}, {
"C", 2}, {
"D", 2}, {
"E", 0}};
502 drops = {{
"A", 10}, {
"B", 9}, {
"C", 9}, {
"D", 12}, {
"E", 2}};
514 drops = {{
"A", 4}, {
"B", 5}, {
"C", 5}, {
"D", 5}, {
"E", 1}};
522 "No drops for node " << name);
525 "Wrong number of drops for node " << name);
531 "Non-0 drops for node " << name);
587 void DoRun()
override;
604 :
TestCase(
"Ipv4Deduplication performance test")
613 const std::string targetAddr =
"239.192.100.1";
626 listRouting.
Add(staticRouting, 0);
629 internet.SetIpv6StackInstall(
false);
630 internet.SetIpv4ArpJitter(
true);
631 internet.SetRoutingHelper(listRouting);
632 internet.Install(
nodes);
635 ipv4address.
SetBase(
"10.0.0.0",
"255.255.255.0");
636 ipv4address.
Assign(devices);
639 auto diter = devices.Begin();
657 auto ipv4 = (*iter)->GetObject<
Ipv4>();
660 "Node " << (*iter)->GetId() <<
" does not have Ipv4 aggregate");
662 routing->AddHostRouteTo(targetAddr.c_str(), ipv4->GetInterfaceForDevice(*diter), 0);
674 m_sockets.push_back(udpSocketFactory->CreateSocket());
681 Seconds(4 + jitter->GetValue()),
729 :
TestSuite(
"ipv4-deduplication-performance",
Type::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
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.
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.
static Ipv4Address GetAny()
Access to the IPv4 forwarding table, interfaces, and configuration.
DropReason
Reason why a packet has been dropped.
@ DROP_DUPLICATE
Duplicate packet received.
@ DROP_TTL_EXPIRED
Packet TTL has expired.
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>
static void Add(std::string name, Ptr< Object > object)
Add the association between the string "name" and the Ptr<Object> obj.
static Ptr< T > Find(std::string path)
Given a name path string, look to see if there's an object in the system with that associated to it.
static void Clear()
Clear the list of objects associated with names.
static std::string FindName(Ptr< Object > object)
Given a pointer to an object, look to see if that object has a name associated with it and,...
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.
Smart pointer class similar to boost::intrusive_ptr.
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...
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
static void Run()
Run the simulation.
static uint64_t GetEventCount()
Get the number of events executed.
Object to create transport layer instances that provide a socket API to applications.
virtual Ptr< Socket > CreateSocket()=0
Hold variables of type string.
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
double ToDouble(Unit unit) const
Get the Time value expressed in a particular unit.
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.
Ptr< T > CreateObjectWithAttributes(Args... args)
Allocate an Object on the heap and initialize with a set of attributes.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
#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.
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...