38#include "ns3/applications-module.h"
39#include "ns3/core-module.h"
40#include "ns3/internet-module.h"
41#include "ns3/network-module.h"
42#include "ns3/point-to-point-module.h"
43#include "ns3/traffic-control-module.h"
51std::string
dir =
"results/";
63 std::ofstream fPlotQueue(std::stringstream(
dir +
"queue-size.dat").str(),
64 std::ios::out | std::ios::app);
73 std::ofstream fPlotQueue(
dir +
"cwndTraces/n0.dat", std::ios::out | std::ios::app);
90 "/$ns3::TcpL4Protocol/SocketList/" +
91 std::to_string(cwndWindow) +
"/CongestionWindow",
100 std::string socketFactory,
124main(
int argc,
char* argv[])
127 std::string socketFactory =
"ns3::TcpSocketFactory";
128 std::string tcpTypeId =
"ns3::TcpLinuxReno";
129 std::string qdiscTypeId =
"ns3::FifoQueueDisc";
132 std::string recovery =
"ns3::TcpClassicRecovery";
135 cmd.AddValue(
"tcpTypeId",
136 "TCP variant to use (e.g., ns3::TcpNewReno, ns3::TcpLinuxReno, etc.)",
138 cmd.AddValue(
"qdiscTypeId",
"Queue disc for gateway (e.g., ns3::CoDelQueueDisc)", qdiscTypeId);
139 cmd.AddValue(
"segmentSize",
"TCP segment size (bytes)",
segmentSize);
140 cmd.AddValue(
"delAckCount",
"Delayed ack count", delAckCount);
141 cmd.AddValue(
"enableSack",
"Flag to enable/disable sack in TCP", isSack);
142 cmd.AddValue(
"stopTime",
143 "Stop time for applications / simulation time will be stopTime",
145 cmd.AddValue(
"recovery",
"Recovery algorithm type to use (e.g., ns3::TcpPrrRecovery", recovery);
146 cmd.Parse(argc, argv);
150 "TypeId " << qdiscTypeId <<
" not found");
157 "TypeId " << tcpTypeId <<
" not found");
169 std::vector<NetDeviceContainer> leftToRouter;
170 std::vector<NetDeviceContainer> routerToRight;
182 leftToRouter.push_back(pointToPointLeaf.
Install(leftNodes.
Get(0), routers.
Get(0)));
183 routerToRight.push_back(pointToPointLeaf.
Install(routers.
Get(1), rightNodes.
Get(0)));
187 internetStack.
Install(leftNodes);
188 internetStack.
Install(rightNodes);
189 internetStack.
Install(routers);
195 ipAddresses.NewNetwork();
197 std::vector<Ipv4InterfaceContainer> leftToRouterIPAddress;
198 leftToRouterIPAddress.push_back(ipAddresses.Assign(leftToRouter[0]));
199 ipAddresses.NewNetwork();
201 std::vector<Ipv4InterfaceContainer> routerToRightIPAddress;
202 routerToRightIPAddress.push_back(ipAddresses.Assign(routerToRight[0]));
204 Ipv4GlobalRoutingHelper::PopulateRoutingTables();
224 int retVal [[maybe_unused]];
225 if ((stat(
dir.c_str(), &buffer)) == 0)
227 std::string dirToRemove =
"rm -rf " +
dir;
228 retVal = system(dirToRemove.c_str());
231 std::string dirToSave =
"mkdir -p " +
dir;
232 retVal = system(dirToSave.c_str());
234 retVal = system((dirToSave +
"/pcap/").c_str());
236 retVal = system((dirToSave +
"/queueTraces/").c_str());
238 retVal = system((dirToSave +
"/cwndTraces/").c_str());
265 uint16_t
port = 50000;
270 routerToRightIPAddress[0].GetAddress(1),
284 std::ofstream myfile;
285 myfile.open(
dir +
"queueStats.txt", std::fstream::in | std::fstream::out | std::fstream::app);
287 myfile <<
"Stat for Queue 1";
292 myfile.open(
dir +
"config.txt", std::fstream::in | std::fstream::out | std::fstream::app);
293 myfile <<
"qdiscTypeId " << qdiscTypeId <<
"\n";
294 myfile <<
"stream " << stream <<
"\n";
296 myfile <<
"delAckCount " << delAckCount <<
"\n";
297 myfile <<
"stopTime " <<
stopTime.
As(Time::S) <<
"\n";
300 Simulator::Destroy();
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
Manage ASCII trace files for device models.
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits.
AttributeValue implementation for Boolean.
A helper to make it easier to instantiate an ns3::BulkSendApplication on a set of nodes.
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes, not the socket attributes.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::BulkSendApplication on each node of the input container configured with all the attri...
Parse command-line arguments.
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...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Ipv4 addresses are stored in host order in this class.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
std::ostream * GetStream()
Return a pointer to an ostream previously set in the wrapper.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Holds a vector of ns3::QueueDisc pointers.
void Add(QueueDiscContainer other)
Append the contents of another QueueDiscContainer to the end of this container.
Ptr< QueueDisc > Get(std::size_t i) const
Get the Ptr<QueueDisc> stored in this container at a given index.
QueueSize GetCurrentSize()
Get the current size of the queue disc in bytes, if operating in bytes mode, or packets,...
const Stats & GetStats()
Retrieve all the collected statistics.
Class for representing queue sizes.
uint32_t GetValue() const
Get the underlying value.
AttributeValue implementation for QueueSize.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Build a set of QueueDisc objects.
QueueDiscContainer Install(NetDeviceContainer c)
uint16_t SetRootQueueDisc(const std::string &type, Args &&... args)
Helper function used to set a root queue disc of the given type and with the given attributes.
void SetQueueLimits(std::string type, Args &&... args)
Helper function used to add a queue limits object to the transmission queues of the devices.
void Uninstall(NetDeviceContainer c)
a unique identifier for an interface.
AttributeValue implementation for TypeId.
Hold an unsigned integer type.
static void CwndTrace(Ptr< OutputStreamWrapper > stream, uint32_t oldCwnd, uint32_t newCwnd)
void InstallBulkSend(Ptr< Node > node, Ipv4Address address, uint16_t port, std::string socketFactory, uint32_t nodeId, uint32_t cwndWindow, Callback< void, uint32_t, uint32_t > CwndTrace)
void TraceCwnd(uint32_t node, uint32_t cwndWindow, Callback< void, uint32_t, uint32_t > CwndTrace)
void InstallPacketSink(Ptr< Node > node, uint16_t port, std::string socketFactory)
static void DropAtQueue(Ptr< OutputStreamWrapper > stream, Ptr< const QueueDiscItem > item)
void CheckQueueSize(Ptr< QueueDisc > queue)
static void CwndChange(uint32_t oldCwnd, uint32_t newCwnd)
#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 SetDefault(std::string name, const AttributeValue &value)
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs &&... bargs)
Make Callbacks with varying number of bound arguments.
Time Now()
create an ns3::Time instance which contains the current simulation time.
Time Seconds(double value)
Construct a Time in the indicated unit.
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...
Ptr< PacketSink > sink
Pointer to the packet sink application.