40 #include "ns3/core-module.h" 41 #include "ns3/network-module.h" 42 #include "ns3/internet-module.h" 43 #include "ns3/point-to-point-module.h" 44 #include "ns3/applications-module.h" 45 #include "ns3/error-model.h" 46 #include "ns3/tcp-header.h" 47 #include "ns3/udp-header.h" 49 #include "ns3/event-id.h" 50 #include "ns3/flow-monitor-helper.h" 51 #include "ns3/ipv4-global-routing-helper.h" 52 #include "ns3/traffic-control-module.h" 207 int main (
int argc,
char *argv[])
209 std::string transport_prot =
"TcpWestwood";
210 double error_p = 0.0;
211 std::string bandwidth =
"2Mbps";
212 std::string delay =
"0.01ms";
213 std::string access_bandwidth =
"10Mbps";
214 std::string access_delay =
"45ms";
215 bool tracing =
false;
216 std::string prefix_file_name =
"TcpVariantsComparison";
217 uint64_t data_mbytes = 0;
218 uint32_t mtu_bytes = 400;
219 uint16_t num_flows = 1;
220 double duration = 100.0;
222 bool flow_monitor =
false;
225 std::string queue_disc_type =
"ns3::PfifoFastQueueDisc";
226 std::string recovery =
"ns3::TcpClassicRecovery";
230 cmd.AddValue (
"transport_prot",
"Transport protocol to use: TcpNewReno, " 231 "TcpHybla, TcpHighSpeed, TcpHtcp, TcpVegas, TcpScalable, TcpVeno, " 232 "TcpBic, TcpYeah, TcpIllinois, TcpWestwood, TcpWestwoodPlus, TcpLedbat, " 233 "TcpLp", transport_prot);
234 cmd.AddValue (
"error_p",
"Packet error rate", error_p);
235 cmd.AddValue (
"bandwidth",
"Bottleneck bandwidth", bandwidth);
236 cmd.AddValue (
"delay",
"Bottleneck delay", delay);
237 cmd.AddValue (
"access_bandwidth",
"Access link bandwidth", access_bandwidth);
238 cmd.AddValue (
"access_delay",
"Access link delay", access_delay);
239 cmd.AddValue (
"tracing",
"Flag to enable/disable tracing", tracing);
240 cmd.AddValue (
"prefix_name",
"Prefix of output trace file", prefix_file_name);
241 cmd.AddValue (
"data",
"Number of Megabytes of data to transmit", data_mbytes);
242 cmd.AddValue (
"mtu",
"Size of IP packets to send in bytes", mtu_bytes);
243 cmd.AddValue (
"num_flows",
"Number of flows", num_flows);
244 cmd.AddValue (
"duration",
"Time to allow flows to run in seconds", duration);
245 cmd.AddValue (
"run",
"Run index (for setting repeatable seeds)", run);
246 cmd.AddValue (
"flow_monitor",
"Enable flow monitor", flow_monitor);
247 cmd.AddValue (
"pcap_tracing",
"Enable or disable PCAP tracing", pcap);
248 cmd.AddValue (
"queue_disc_type",
"Queue disc type for gateway (e.g. ns3::CoDelQueueDisc)", queue_disc_type);
249 cmd.AddValue (
"sack",
"Enable or disable SACK option", sack);
250 cmd.AddValue (
"recovery",
"Recovery algorithm type to use (e.g., ns3::TcpPrrRecovery", recovery);
251 cmd.Parse (argc, argv);
253 transport_prot = std::string (
"ns3::") + transport_prot;
272 uint32_t tcp_adu_size = mtu_bytes - 20 - (ip_header + tcp_header);
276 double start_time = 0.1;
277 double stop_time = start_time + duration;
287 if (transport_prot.compare (
"ns3::TcpWestwoodPlus") == 0)
305 sources.
Create (num_flows);
334 address.SetBase (
"10.0.0.0",
"255.255.255.0");
344 DataRate access_b (access_bandwidth);
346 Time access_d (access_delay);
347 Time bottle_d (delay);
349 uint32_t size =
static_cast<uint32_t
>((
std::min (access_b, bottle_b).GetBitRate () / 8) *
350 ((access_d + bottle_d) * 2).GetSeconds ());
357 for (uint32_t i = 0; i < num_flows; i++)
366 if (queue_disc_type.compare (
"ns3::PfifoFastQueueDisc") == 0)
370 else if (queue_disc_type.compare (
"ns3::CoDelQueueDisc") == 0)
376 NS_FATAL_ERROR (
"Queue not recognized. Allowed values are ns3::CoDelQueueDisc or ns3::PfifoFastQueueDisc");
386 uint16_t
port = 50000;
390 for (uint16_t i = 0; i < sources.
GetN (); i++)
395 ftp.SetAttribute (
"Remote", remoteAddress);
397 ftp.SetAttribute (
"MaxBytes",
UintegerValue (data_mbytes * 1000000));
414 ascii.open ((prefix_file_name +
"-ascii").c_str ());
417 stack.EnableAsciiIpv4All (ascii_wrap);
holds a vector of ns3::Application pointers.
static Ptr< OutputStreamWrapper > nextTxStream
Simulation virtual time values and global simulation resolution.
Manage ASCII trace files for device models.
static Ipv4Address GetAny(void)
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
AttributeValue implementation for Boolean.
QueueDiscContainer Install(NetDeviceContainer c)
Class for representing queue sizes.
A helper to make it easier to instantiate an ns3::BulkSendApplication on a set of nodes...
holds a vector of std::pair of Ptr<Ipv4> and interface index.
static void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation.
Hold variables of type string.
static Ptr< OutputStreamWrapper > nextRxStream
NetDeviceContainer Install(NodeContainer c)
static void TraceNextRx(std::string &next_rx_seq_file_name)
void Add(const Ipv4InterfaceContainer &other)
Concatenate the entries in the other container with ours.
static uint32_t ssThreshValue
static uint32_t cWndValue
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
static void Run(void)
Run the simulation.
static Ptr< OutputStreamWrapper > cWndStream
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
aggregate IP/TCP/UDP functionality to existing Nodes.
#define NS_UNUSED(x)
Mark a local variable as unused.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
static bool LookupByNameFailSafe(std::string name, TypeId *tid)
Get a TypeId by name.
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. ...
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 SerializeToXmlFile(std::string fileName, bool enableHistograms, bool enableProbes)
Same as SerializeToXmlStream, but writes to a file instead.
static void SetRun(uint64_t run)
Set the run number of simulation.
a polymophic address class
Class for representing data rates.
static Ptr< OutputStreamWrapper > rttStream
static void RttTracer(Time oldval, Time newval)
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 ...
Hold variables of type enum.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Hold an unsigned integer type.
Use number of packets for queue size.
void SetRate(double rate)
holds a vector of ns3::NetDevice pointers
A class encapsulating an output stream.
static void InFlightTracer(uint32_t old, uint32_t inFlight)
AttributeValue implementation for TypeId.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Build a set of QueueDisc objects.
Ptr< FlowMonitor > InstallAll()
Enable flow monitoring on all nodes.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
Parse command-line arguments.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
static void CwndTracer(uint32_t oldval, uint32_t newval)
static TypeId GetTypeId(void)
Get the type ID.
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Hold objects of type Ptr<T>.
static void TraceSsThresh(std::string ssthresh_tr_file_name)
uint16_t SetRootQueueDisc(std::string type, std::string n01="", const AttributeValue &v01=EmptyAttributeValue(), std::string n02="", const AttributeValue &v02=EmptyAttributeValue(), std::string n03="", const AttributeValue &v03=EmptyAttributeValue(), std::string n04="", const AttributeValue &v04=EmptyAttributeValue(), std::string n05="", const AttributeValue &v05=EmptyAttributeValue(), std::string n06="", const AttributeValue &v06=EmptyAttributeValue(), std::string n07="", const AttributeValue &v07=EmptyAttributeValue(), std::string n08="", const AttributeValue &v08=EmptyAttributeValue(), std::string n09="", const AttributeValue &v09=EmptyAttributeValue(), std::string n10="", const AttributeValue &v10=EmptyAttributeValue(), std::string n11="", const AttributeValue &v11=EmptyAttributeValue(), std::string n12="", const AttributeValue &v12=EmptyAttributeValue(), std::string n13="", const AttributeValue &v13=EmptyAttributeValue(), std::string n14="", const AttributeValue &v14=EmptyAttributeValue(), std::string n15="", const AttributeValue &v15=EmptyAttributeValue())
Helper function used to set a root queue disc of the given type and with the given attributes...
static Ptr< OutputStreamWrapper > inFlightStream
static TypeId GetTypeId(void)
Get the type ID.
static Ptr< OutputStreamWrapper > rtoStream
Helper to enable IP flow monitoring on a set of Nodes.
static Time Now(void)
Return the current simulation virtual time.
static void NextRxTracer(SequenceNumber32 old, SequenceNumber32 nextRx)
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
static void SetSeed(uint32_t seed)
Set the seed.
static void TraceNextTx(std::string &next_tx_seq_file_name)
void SetUnit(enum ErrorUnit error_unit)
AttributeValue implementation for Address.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Time Seconds(double value)
Construct a Time in the indicated unit.
void SetDefault(std::string name, const AttributeValue &value)
void SetRandomVariable(Ptr< RandomVariableStream >)
static void NextTxTracer(SequenceNumber32 old, SequenceNumber32 nextTx)
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
static void TraceRtt(std::string rtt_tr_file_name)
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Determine which packets are errored corresponding to an underlying distribution, rate, and unit.
static void TraceInFlight(std::string &in_flight_file_name)
Use number of bytes for queue size.
a unique identifier for an interface.
static void RtoTracer(Time oldval, Time newval)
static void TraceCwnd(std::string cwnd_tr_file_name)
static void SsThreshTracer(uint32_t oldval, uint32_t newval)
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
static Ptr< OutputStreamWrapper > ssThreshStream
static TypeId LookupByName(std::string name)
Get a TypeId by name.
static void TraceRto(std::string rto_tr_file_name)