A Discrete-Event Network Simulator
API
ns3tcp-loss-test-suite.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2010 University of Washington
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  */
18 
19 #include <iomanip>
20 
21 #include "ns3/log.h"
22 #include "ns3/abort.h"
23 #include "ns3/test.h"
24 #include "ns3/pcap-file.h"
25 #include "ns3/config.h"
26 #include "ns3/string.h"
27 #include "ns3/uinteger.h"
28 #include "ns3/data-rate.h"
29 #include "ns3/inet-socket-address.h"
30 #include "ns3/point-to-point-helper.h"
31 #include "ns3/internet-stack-helper.h"
32 #include "ns3/ipv4-global-routing-helper.h"
33 #include "ns3/ipv4-address-helper.h"
34 #include "ns3/packet-sink-helper.h"
35 #include "ns3/tcp-socket-factory.h"
36 #include "ns3/node-container.h"
37 #include "ns3/simulator.h"
38 #include "ns3/error-model.h"
39 #include "ns3/pointer.h"
40 #include "ns3tcp-socket-writer.h"
41 #include "ns3/tcp-westwood.h"
42 #include "ns3/tcp-header.h"
43 
44 using namespace ns3;
45 
46 NS_LOG_COMPONENT_DEFINE ("Ns3TcpLossTest");
47 
48 // The below boolean constants should only be changed to 'true'
49 // during test debugging (i.e. do not commit the value 'true')
50 
51 // set to 'true' to have the test suite overwrite the response vectors
52 // stored in the test directory. This should only be done if you are
53 // convinced through other means (e.g. pcap tracing or logging) that the
54 // revised vectors are the correct ones. In other words, don't simply
55 // enable this to true to clear a failing test without looking at the
56 // results closely.
57 const bool WRITE_VECTORS = false;
58 const bool WRITE_PCAP = false;
59 const bool WRITE_LOGGING = false;
60 const uint32_t PCAP_LINK_TYPE = 1187373557;
61 const uint32_t PCAP_SNAPLEN = 64;
62 
69 {
70 public:
72 
79  Ns3TcpLossTestCase (std::string tcpModel, uint32_t testCase);
81  {
82  }
83 
84 private:
85  virtual void DoSetup (void);
86  virtual void DoRun (void);
87  virtual void DoTeardown (void);
88 
90  std::string m_pcapFilename;
92  uint32_t m_testCase;
93  uint32_t m_totalTxBytes;
94  uint32_t m_currentTxBytes;
99  std::string m_tcpModel;
100 
110  void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
117  void CwndTracer (uint32_t oldval, uint32_t newval);
124  void WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace);
132  void StartFlow (Ptr<Socket> localSocket, Ipv4Address servAddress, uint16_t servPort);
133 
134 };
135 
137  : TestCase ("Check the operation of the TCP state machine for several cases"),
138  m_testCase (0),
139  m_totalTxBytes (200000),
140  m_currentTxBytes (0),
141  m_writeVectors (WRITE_VECTORS),
142  m_writeResults (WRITE_PCAP),
143  m_writeLogging (WRITE_LOGGING),
144  m_needToClose (true),
145  m_tcpModel ("ns3::TcpWestwood")
146 {
147 }
148 
149 Ns3TcpLossTestCase::Ns3TcpLossTestCase (std::string tcpModel, uint32_t testCase)
150  : TestCase ("Check the behaviour of TCP upon packet losses"),
151  m_testCase (testCase),
152  m_totalTxBytes (200000),
153  m_currentTxBytes (0),
154  m_writeVectors (WRITE_VECTORS),
155  m_writeResults (WRITE_PCAP),
156  m_writeLogging (WRITE_LOGGING),
157  m_needToClose (true),
158  m_tcpModel (tcpModel)
159 {
160 }
161 
162 void
164 {
165  // This test was written before SACK was added to ns-3
166  Config::SetDefault ("ns3::TcpSocketBase::Sack", BooleanValue (false));
167  // This test was written with initial window of 1 segment
168  Config::SetDefault ("ns3::TcpSocket::InitialCwnd", UintegerValue (1));
169  // This test was written with the TCP Classic Recovery algorithm
170  Config::SetDefault ("ns3::TcpL4Protocol::RecoveryType", TypeIdValue (TypeId (ns3::TcpClassicRecovery::GetTypeId ())));
171 
172  //
173  // We expect there to be a file called ns3tcp-state-response-vectors.pcap in
174  // the data directory
175  //
176  std::ostringstream oss;
177  oss << "ns3tcp-loss-" << m_tcpModel << m_testCase << "-response-vectors.pcap";
178  m_pcapFilename = CreateDataDirFilename (oss.str ());
179 
180  if (m_writeVectors)
181  {
182  m_pcapFile.Open (m_pcapFilename, std::ios::out | std::ios::binary);
184  }
185  else
186  {
187  m_pcapFile.Open (m_pcapFilename, std::ios::in | std::ios::binary);
189  "Wrong response vectors in directory: opening " <<
191  }
192 }
193 
194 void
196 {
197  m_pcapFile.Close ();
198 }
199 
200 void
202 {
203  //
204  // We're not testing IP so remove and toss the header. In order to do this,
205  // though, we need to copy the packet since we have a const version.
206  //
207  Ptr<Packet> received = packet->Copy ();
208  Ipv4Header ipHeader;
209  received->RemoveHeader (ipHeader);
210 
211  //
212  // What is left is the TCP header and any data that may be sent. We aren't
213  // sending any TCP data, so we expect what remains is only TCP header, which
214  // is a small thing to save.
215  //
216  if (m_writeVectors)
217  {
218  //
219  // Save the TCP under test response for later testing.
220  //
221  Time tNow = Simulator::Now ();
222  int64_t tMicroSeconds = tNow.GetMicroSeconds ();
223 
224 
225  m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000),
226  uint32_t (tMicroSeconds % 1000000),
227  received);
228  }
229  else
230  {
231  //
232  // Read the TCP under test expected response from the expected vector
233  // file and see if it still does the right thing.
234  //
235  uint8_t expectedBuffer[PCAP_SNAPLEN];
236  uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
237  m_pcapFile.Read (expectedBuffer, sizeof(expectedBuffer), tsSec, tsUsec, inclLen, origLen, readLen);
238 
239  NS_LOG_INFO ("read " << readLen << " bytes");
240 
241  uint8_t *actual = new uint8_t[readLen];
242  received->CopyData (actual, readLen);
243 
244  int result = memcmp (actual, expectedBuffer, readLen);
245 
246  TcpHeader expectedHeader, receivedHeader;
247  Ptr<Packet> expected = Create<Packet> (expectedBuffer, readLen);
248 
249  expected->RemoveHeader (expectedHeader);
250  received->RemoveHeader (receivedHeader);
251 
252  NS_LOG_DEBUG ("Expected " << expectedHeader << " received: " << receivedHeader);
253 
254  delete [] actual;
255 
256  //
257  // Avoid streams of errors -- only report the first.
258  //
259  if (IsStatusSuccess ())
260  {
261  NS_TEST_EXPECT_MSG_EQ (result, 0, "Expected data comparison error: " << m_tcpModel << "-" << m_testCase);
262  }
263  }
264 }
265 
266 void
267 Ns3TcpLossTestCase::CwndTracer (uint32_t oldval, uint32_t newval)
268 {
269  if (m_writeLogging)
270  {
271  *(m_osw->GetStream ()) << "Moving cwnd from " << oldval << " to " << newval
272  << " at time " << Simulator::Now ().GetSeconds ()
273  << " seconds" << std::endl;
274  }
275 }
276 
278 // Implementing an "application" to send bytes over a TCP connection
279 void
281 {
283  {
284  uint32_t left = m_totalTxBytes - m_currentTxBytes;
285  uint32_t dataOffset = m_currentTxBytes % 1040;
286  uint32_t toWrite = 1040 - dataOffset;
287  uint32_t txAvail = localSocket->GetTxAvailable ();
288  toWrite = std::min (toWrite, left);
289  toWrite = std::min (toWrite, txAvail);
290  if (txAvail == 0)
291  {
292  return;
293  }
294  if (m_writeLogging)
295  {
296  std::clog << "Submitting " << toWrite
297  << " bytes to TCP socket" << std::endl;
298  }
299  int amountSent = localSocket->Send (0, toWrite, 0);
300  NS_ASSERT (amountSent > 0); // Given GetTxAvailable() non-zero, amountSent should not be zero
301  m_currentTxBytes += amountSent;
302  }
303  if (m_needToClose)
304  {
305  if (m_writeLogging)
306  {
307  std::clog << "Close socket at "
308  << Simulator::Now ().GetSeconds () << std::endl;
309  }
310  localSocket->Close ();
311  m_needToClose = false;
312  }
313 }
314 
315 void
317  Ipv4Address servAddress,
318  uint16_t servPort)
319 {
320  if (m_writeLogging)
321  {
322  std::clog << "Starting flow at time "
323  << Simulator::Now ().GetSeconds () << std::endl;
324  }
325  localSocket->Connect (InetSocketAddress (servAddress, servPort)); // connect
326 
327  // tell the tcp implementation to call WriteUntilBufferFull again
328  // if we blocked and new tx buffer space becomes available
329  localSocket->SetSendCallback (MakeCallback
331  this));
332  WriteUntilBufferFull (localSocket, localSocket->GetTxAvailable ());
333 }
334 
335 void
337 {
338  // Network topology
339  //
340  // 8Mb/s, 0.1ms 0.8Mb/s, 100ms
341  // s1-----------------r1-----------------k1
342  //
343  // Example corresponding to simulations in the paper "Simulation-based
344  // Comparisons of Tahoe, Reno, and SACK TCP
345 
346  Config::SetDefault ("ns3::TcpSocketBase::Sack", BooleanValue (false));
347 
348  std::ostringstream tcpModel;
349  tcpModel << "ns3::Tcp" << m_tcpModel;
350  if (m_tcpModel.compare ("WestwoodPlus") == 0)
351  {
352  Config::SetDefault ("ns3::TcpL4Protocol::SocketType",
353  TypeIdValue (TcpWestwood::GetTypeId ()));
354  Config::SetDefault ("ns3::TcpWestwood::ProtocolType",
355  EnumValue (TcpWestwood::WESTWOODPLUS));
356  }
357  else
358  {
359  Config::SetDefault ("ns3::TcpL4Protocol::SocketType",
360  StringValue (tcpModel.str ()));
361  }
362 
363  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1000));
364  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
365  Config::SetDefault ("ns3::TcpSocketBase::Timestamp", BooleanValue (false));
366 
367  if (m_writeLogging)
368  {
370  LogComponentEnable ("Ns3TcpLossTest", LOG_LEVEL_ALL);
371  LogComponentEnable ("ErrorModel", LOG_LEVEL_DEBUG);
372  LogComponentEnable ("TcpWestwood", LOG_LEVEL_ALL);
373  LogComponentEnable ("TcpCongestionOps", LOG_LEVEL_INFO);
374  LogComponentEnable ("TcpSocketBase", LOG_LEVEL_INFO);
375  }
376 
378  // Topology construction
379  //
380 
381  // Create three nodes: s1, r1, and k1
382  NodeContainer s1r1;
383  s1r1.Create (2);
384 
385  NodeContainer r1k1;
386  r1k1.Add (s1r1.Get (1));
387  r1k1.Create (1);
388 
389  // Set up TCP/IP stack to all nodes (and create loopback device at device 0)
390  InternetStackHelper internet;
391  internet.InstallAll ();
392 
393  // Connect the nodes
394  PointToPointHelper p2p;
395  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (8000000)));
396  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.0001)));
397  NetDeviceContainer dev0 = p2p.Install (s1r1);
398  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (800000)));
399  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.1)));
400  NetDeviceContainer dev1 = p2p.Install (r1k1);
401 
402  // Add IP addresses to each network interfaces
403  Ipv4AddressHelper ipv4;
404  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
405  ipv4.Assign (dev0);
406  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
407  Ipv4InterfaceContainer ipInterfs = ipv4.Assign (dev1);
408 
409  // Set up routes to all nodes
410  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
411 
413  // Send 20000 (totalTxBytes) bytes from node s1 to node k1
414  //
415 
416  // Create a packet sink to receive packets on node k1
417  uint16_t servPort = 50000; // Destination port number
418  PacketSinkHelper sink ("ns3::TcpSocketFactory",
419  InetSocketAddress (Ipv4Address::GetAny (), servPort));
420  ApplicationContainer apps = sink.Install (r1k1.Get (1));
421  apps.Start (Seconds (0.0));
422  apps.Stop (Seconds (100.0));
423 
424  // Create a data source to send packets on node s0.
425  // Instead of full application, here use the socket directly by
426  // registering callbacks in function StarFlow().
427  Ptr<Socket> localSocket = Socket::CreateSocket (s1r1.Get (0), TcpSocketFactory::GetTypeId ());
428  localSocket->Bind ();
429  Simulator::ScheduleNow (&Ns3TcpLossTestCase::StartFlow,
430  this,
431  localSocket,
432  ipInterfs.GetAddress (1),
433  servPort);
434 
435  Config::Connect ("/NodeList/0/$ns3::Ipv4L3Protocol/Tx",
437 
439  ("/NodeList/0/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow",
441 
443  // Set up loss model at node k1
444  //
445  std::list<uint32_t> sampleList;
446  switch (m_testCase)
447  {
448  case 0:
449  break;
450  case 1:
451  // Force a loss for 15th data packet. TCP cwnd will be at 14 segments
452  // (14000 bytes) when duplicate acknowledgments start to come.
453  sampleList.push_back (16);
454  break;
455  case 2:
456  sampleList.push_back (16);
457  sampleList.push_back (17);
458  break;
459  case 3:
460  sampleList.push_back (16);
461  sampleList.push_back (17);
462  sampleList.push_back (18);
463  break;
464  case 4:
465  sampleList.push_back (16);
466  sampleList.push_back (17);
467  sampleList.push_back (18);
468  sampleList.push_back (19);
469  break;
470  default:
471  NS_FATAL_ERROR ("Program fatal error: loss value " << m_testCase << " not supported.");
472  break;
473  }
474 
475  Ptr<ReceiveListErrorModel> pem = CreateObject<ReceiveListErrorModel> ();
476  pem->SetList (sampleList);
477  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (pem));
478 
479  // One can toggle the comment for the following line on or off to see the
480  // effects of finite send buffer modelling. One can also change the size of
481  // that buffer.
482  // localSocket->SetAttribute("SndBufSize", UintegerValue(4096));
483 
484  std::ostringstream oss;
485  oss << "tcp-loss-" << m_tcpModel << m_testCase << "-test-case";
486  if (m_writeResults)
487  {
488  p2p.EnablePcapAll (oss.str ());
489  p2p.EnableAsciiAll (oss.str ());
490  }
491 
492  std::ostringstream oss2;
493  oss2 << "src/test/ns3tcp/Tcp" << m_tcpModel << "." << m_testCase << ".log";
494  AsciiTraceHelper ascii;
495  if (m_writeLogging)
496  {
497  m_osw = ascii.CreateFileStream (oss2.str ());
498  *(m_osw->GetStream ()) << std::setprecision (9) << std::fixed;
499  p2p.EnableAsciiAll (m_osw);
500  }
501 
502  // Finally, set up the simulator to run. The 1000 second hard limit is a
503  // failsafe in case some change above causes the simulation to never end
504  Simulator::Stop (Seconds (1000));
505  Simulator::Run ();
506  Simulator::Destroy ();
507 }
508 
515 {
516 public:
518 };
519 
521  : TestSuite ("ns3-tcp-loss", SYSTEM)
522 {
523  // We can't use NS_TEST_SOURCEDIR variable here because we use subdirectories
524  SetDataDir ("src/test/ns3tcp/response-vectors");
525  Packet::EnablePrinting (); // Enable packet metadata for all test cases
526 
527  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 0), TestCase::QUICK);
528  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 1), TestCase::QUICK);
529  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 2), TestCase::QUICK);
530  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 3), TestCase::QUICK);
531  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 4), TestCase::QUICK);
532 
533  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 0), TestCase::QUICK);
534  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 1), TestCase::QUICK);
535  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 2), TestCase::QUICK);
536  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 3), TestCase::QUICK);
537  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 4), TestCase::QUICK);
538 
539  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 0), TestCase::QUICK);
540  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 1), TestCase::QUICK);
541  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 2), TestCase::QUICK);
542  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 3), TestCase::QUICK);
543  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 4), TestCase::QUICK);
544 
545 }
546 
549 
#define min(a, b)
Definition: 80211b.c:42
Tests of TCP implementation loss behavior.
void CwndTracer(uint32_t oldval, uint32_t newval)
CWND trace.
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
uint32_t m_currentTxBytes
Current number of bytes sent.
void StartFlow(Ptr< Socket > localSocket, Ipv4Address servAddress, uint16_t servPort)
Start transmitting a TCP flow.
PcapFile m_pcapFile
The PCAP ffile.
bool m_writeVectors
True if response vectors have to be written (and not read).
uint32_t m_testCase
Testcase number.
Ptr< OutputStreamWrapper > m_osw
The output stream.
bool m_writeResults
True if write PCAP files.
bool m_writeLogging
True if write logging.
virtual void DoRun(void)
Implementation to actually run this TestCase.
uint32_t m_totalTxBytes
Total number of bytes to send.
void WriteUntilBufferFull(Ptr< Socket > localSocket, uint32_t txSpace)
Write to the socket until the buffer is full.
std::string m_pcapFilename
The PCAP filename.
void Ipv4L3Tx(std::string context, Ptr< const Packet > packet, Ptr< Ipv4 > ipv4, uint32_t interface)
Check that the transmitted packets are consitent with the trace.
virtual void DoTeardown(void)
Implementation to do any local setup required for this TestCase.
std::string m_tcpModel
The TCP model name.
bool m_needToClose
Check if the sending socket need to be closed.
TCP implementation loss behavior TestSuite.
holds a vector of ns3::Application pointers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void EnableAsciiAll(std::string prefix)
Enable ascii trace output on each device (which is of the appropriate type) in the set of all nodes c...
Manage ASCII trace files for device models.
Definition: trace-helper.h:163
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.
Definition: boolean.h:37
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
Definition: data-rate.h:298
Hold variables of type enum.
Definition: enum.h:55
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void InstallAll(void) const
Aggregate IPv4, IPv6, UDP, and TCP stacks to all nodes in the simulation.
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.
Definition: ipv4-address.h:41
Packet header for IPv4.
Definition: ipv4-header.h:34
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
holds a vector of ns3::NetDevice pointers
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
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.
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this 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.
Definition: object-base.cc:256
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:378
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
A class representing a pcap file.
Definition: pcap-file.h:43
void Open(std::string const &filename, std::ios::openmode mode)
Create a new pcap file or open an existing pcap file.
Definition: pcap-file.cc:325
void Read(uint8_t *const data, uint32_t maxBytes, uint32_t &tsSec, uint32_t &tsUsec, uint32_t &inclLen, uint32_t &origLen, uint32_t &readLen)
Read next packet from file.
Definition: pcap-file.cc:469
void Write(uint32_t tsSec, uint32_t tsUsec, uint8_t const *const data, uint32_t totalLen)
Write next packet to file.
Definition: pcap-file.cc:434
void Init(uint32_t dataLinkType, uint32_t snapLen=SNAPLEN_DEFAULT, int32_t timeZoneCorrection=ZONE_DEFAULT, bool swapMode=false, bool nanosecMode=false)
Initialize the pcap file associated with this object.
Definition: pcap-file.cc:345
uint32_t GetDataLinkType(void)
Returns the data link type field of the pcap file as defined by the network field in the pcap global ...
Definition: pcap-file.cc:137
void Close(void)
Close the underlying file.
Definition: pcap-file.cc:88
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)
Hold objects of type Ptr<T>.
Definition: pointer.h:37
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
Definition: socket.cc:121
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
virtual int Close(void)=0
Close a socket.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
virtual uint32_t GetTxAvailable(void) const =0
Returns the number of bytes which can be sent in a single call to Send.
Hold variables of type string.
Definition: string.h:41
static TypeId GetTypeId(void)
Get the type ID.
Header for the Transmission Control Protocol.
Definition: tcp-header.h:45
encapsulates test code
Definition: test.h:994
bool IsStatusSuccess(void) const
Check if all tests passed.
Definition: test.cc:458
std::string CreateDataDirFilename(std::string filename)
Construct the full path to a file in the data directory.
Definition: test.cc:412
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found.
Definition: test.cc:465
A suite of tests to run.
Definition: test.h:1188
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:387
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
AttributeValue implementation for Time.
Definition: nstime.h:1308
a unique identifier for an interface.
Definition: type-id.h:59
AttributeValue implementation for TypeId.
Definition: type-id.h:595
Hold an unsigned integer type.
Definition: uinteger.h:44
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition: assert.h:67
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:920
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:901
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
Definition: abort.h:144
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition: test.h:240
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ LOG_LEVEL_ALL
Print everything.
Definition: log.h:116
@ LOG_PREFIX_FUNC
Prefix all trace prints with function.
Definition: log.h:118
@ LOG_LEVEL_DEBUG
LOG_DEBUG and above.
Definition: log.h:104
@ LOG_LEVEL_INFO
LOG_INFO and above.
Definition: log.h:107
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
void LogComponentEnableAll(enum LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:385
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...
Definition: callback.h:1648
const uint32_t PCAP_LINK_TYPE
Some large random number – we use to verify data was written by this program.
const bool WRITE_VECTORS
Set to true to write response vectors.
const bool WRITE_PCAP
Set to true to write out pcap.
static Ns3TcpLossTestSuite g_ns3TcpLossTestSuite
Do not forget to allocate an instance of this TestSuite.
const bool WRITE_LOGGING
Set to true to write logging.
const uint32_t PCAP_SNAPLEN
Don't bother to save much data.
void WriteUntilBufferFull(Ptr< Socket >, uint32_t)
void StartFlow(Ptr< Socket >, Ipv4Address, uint16_t)
static void CwndTracer(uint32_t oldval, uint32_t newval)
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:56