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 
43 using namespace ns3;
44 
45 NS_LOG_COMPONENT_DEFINE ("Ns3TcpLossTest");
46 
47 // The below boolean constants should only be changed to 'true'
48 // during test debugging (i.e. do not commit the value 'true')
49 
50 // set to 'true' to have the test suite overwrite the response vectors
51 // stored in the test directory. This should only be done if you are
52 // convinced through other means (e.g. pcap tracing or logging) that the
53 // revised vectors are the correct ones. In other words, don't simply
54 // enable this to true to clear a failing test without looking at the
55 // results closely.
56 const bool WRITE_VECTORS = false; // set to true to write response vectors
57 const bool WRITE_PCAP = false; // set to true to write out pcap
58 const bool WRITE_LOGGING = false; // set to true to write logging
59 const uint32_t PCAP_LINK_TYPE = 1187373557; // Some large random number -- we use to verify data was written by this program
60 const uint32_t PCAP_SNAPLEN = 64; // Don't bother to save much data
61 
62 // ===========================================================================
63 // Tests of TCP implementation loss behavior
64 // ===========================================================================
65 //
66 
68 {
69 public:
71  Ns3TcpLossTestCase (std::string tcpModel, uint32_t testCase);
73  {
74  }
75 
76 private:
77  virtual void DoSetup (void);
78  virtual void DoRun (void);
79  virtual void DoTeardown (void);
80 
82  std::string m_pcapFilename;
84  uint32_t m_testCase;
85  uint32_t m_totalTxBytes;
86  uint32_t m_currentTxBytes;
91  std::string m_tcpModel;
92 
93  void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
94  void CwndTracer (uint32_t oldval, uint32_t newval);
95  void WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace);
96  void StartFlow (Ptr<Socket> localSocket,
97  Ipv4Address servAddress,
98  uint16_t servPort);
99 
100 };
101 
103  : TestCase ("Check the operation of the TCP state machine for several cases"),
104  m_testCase (0),
105  m_totalTxBytes (200000),
106  m_currentTxBytes (0),
107  m_writeVectors (WRITE_VECTORS),
108  m_writeResults (WRITE_PCAP),
109  m_writeLogging (WRITE_LOGGING),
110  m_needToClose (true),
111  m_tcpModel ("ns3::TcpWestwood")
112 {
113 }
114 
115 Ns3TcpLossTestCase::Ns3TcpLossTestCase (std::string tcpModel, uint32_t testCase)
116  : TestCase ("Check the behaviour of TCP upon packet losses"),
117  m_testCase (testCase),
118  m_totalTxBytes (200000),
119  m_currentTxBytes (0),
120  m_writeVectors (WRITE_VECTORS),
121  m_writeResults (WRITE_PCAP),
122  m_writeLogging (WRITE_LOGGING),
123  m_needToClose (true),
124  m_tcpModel (tcpModel)
125 {
126 }
127 
128 void
130 {
131  // This test was written before SACK was added to ns-3
132  Config::SetDefault ("ns3::TcpSocketBase::Sack", BooleanValue (false));
133 
134  //
135  // We expect there to be a file called ns3tcp-state-response-vectors.pcap in
136  // the data directory
137  //
138  std::ostringstream oss;
139  oss << "ns3tcp-loss-" << m_tcpModel << m_testCase << "-response-vectors.pcap";
140  m_pcapFilename = CreateDataDirFilename (oss.str ());
141 
142  if (m_writeVectors)
143  {
144  m_pcapFile.Open (m_pcapFilename, std::ios::out | std::ios::binary);
146  }
147  else
148  {
149  m_pcapFile.Open (m_pcapFilename, std::ios::in | std::ios::binary);
151  "Wrong response vectors in directory: opening " <<
153  }
154 }
155 
156 void
158 {
159  m_pcapFile.Close ();
160 }
161 
162 void
163 Ns3TcpLossTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
164 {
165  //
166  // We're not testing IP so remove and toss the header. In order to do this,
167  // though, we need to copy the packet since we have a const version.
168  //
169  Ptr<Packet> received = packet->Copy ();
170  Ipv4Header ipHeader;
171  received->RemoveHeader (ipHeader);
172 
173  //
174  // What is left is the TCP header and any data that may be sent. We aren't
175  // sending any TCP data, so we expect what remains is only TCP header, which
176  // is a small thing to save.
177  //
178  if (m_writeVectors)
179  {
180  //
181  // Save the TCP under test response for later testing.
182  //
183  Time tNow = Simulator::Now ();
184  int64_t tMicroSeconds = tNow.GetMicroSeconds ();
185 
186 
187  m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000),
188  uint32_t (tMicroSeconds % 1000000),
189  received);
190  }
191  else
192  {
193  //
194  // Read the TCP under test expected response from the expected vector
195  // file and see if it still does the right thing.
196  //
197  uint8_t expectedBuffer[PCAP_SNAPLEN];
198  uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
199  m_pcapFile.Read (expectedBuffer, sizeof(expectedBuffer), tsSec, tsUsec, inclLen, origLen, readLen);
200 
201  NS_LOG_INFO ("read " << readLen << " bytes");
202 
203  uint8_t *actual = new uint8_t[readLen];
204  received->CopyData (actual, readLen);
205 
206  int result = memcmp (actual, expectedBuffer, readLen);
207 
208  TcpHeader expectedHeader, receivedHeader;
209  Ptr<Packet> expected = Create<Packet> (expectedBuffer, readLen);
210 
211  expected->RemoveHeader (expectedHeader);
212  received->RemoveHeader (receivedHeader);
213 
214  NS_LOG_DEBUG ("Expected " << expectedHeader << " received: " << receivedHeader);
215 
216  delete [] actual;
217 
218  //
219  // Avoid streams of errors -- only report the first.
220  //
221  if (IsStatusSuccess ())
222  {
223  NS_TEST_EXPECT_MSG_EQ (result, 0, "Expected data comparison error: " << m_tcpModel << "-" << m_testCase);
224  }
225  }
226 }
227 
228 void
229 Ns3TcpLossTestCase::CwndTracer (uint32_t oldval, uint32_t newval)
230 {
231  if (m_writeLogging)
232  {
233  *(m_osw->GetStream ()) << "Moving cwnd from " << oldval << " to " << newval
234  << " at time " << Simulator::Now ().GetSeconds ()
235  << " seconds" << std::endl;
236  }
237 }
238 
240 // Implementing an "application" to send bytes over a TCP connection
241 void
243 {
245  {
246  uint32_t left = m_totalTxBytes - m_currentTxBytes;
247  uint32_t dataOffset = m_currentTxBytes % 1040;
248  uint32_t toWrite = 1040 - dataOffset;
249  uint32_t txAvail = localSocket->GetTxAvailable ();
250  toWrite = std::min (toWrite, left);
251  toWrite = std::min (toWrite, txAvail);
252  if (txAvail == 0)
253  {
254  return;
255  }
256  if (m_writeLogging)
257  {
258  std::clog << "Submitting " << toWrite
259  << " bytes to TCP socket" << std::endl;
260  }
261  int amountSent = localSocket->Send (0, toWrite, 0);
262  NS_ASSERT (amountSent > 0); // Given GetTxAvailable() non-zero, amountSent should not be zero
263  m_currentTxBytes += amountSent;
264  }
265  if (m_needToClose)
266  {
267  if (m_writeLogging)
268  {
269  std::clog << "Close socket at "
270  << Simulator::Now ().GetSeconds () << std::endl;
271  }
272  localSocket->Close ();
273  m_needToClose = false;
274  }
275 }
276 
277 void
279  Ipv4Address servAddress,
280  uint16_t servPort)
281 {
282  if (m_writeLogging)
283  {
284  std::clog << "Starting flow at time "
285  << Simulator::Now ().GetSeconds () << std::endl;
286  }
287  localSocket->Connect (InetSocketAddress (servAddress, servPort)); // connect
288 
289  // tell the tcp implementation to call WriteUntilBufferFull again
290  // if we blocked and new tx buffer space becomes available
291  localSocket->SetSendCallback (MakeCallback
293  this));
294  WriteUntilBufferFull (localSocket, localSocket->GetTxAvailable ());
295 }
296 
297 void
299 {
300  // Network topology
301  //
302  // 8Mb/s, 0.1ms 0.8Mb/s, 100ms
303  // s1-----------------r1-----------------k1
304  //
305  // Example corresponding to simulations in the paper "Simulation-based
306  // Comparisons of Tahoe, Reno, and SACK TCP
307 
308  Config::SetDefault ("ns3::TcpSocketBase::Sack", BooleanValue (false));
309 
310  std::ostringstream tcpModel;
311  tcpModel << "ns3::Tcp" << m_tcpModel;
312  if (m_tcpModel.compare ("WestwoodPlus") == 0)
313  {
314  Config::SetDefault ("ns3::TcpL4Protocol::SocketType",
315  TypeIdValue (TcpWestwood::GetTypeId ()));
316  Config::SetDefault ("ns3::TcpWestwood::ProtocolType",
317  EnumValue (TcpWestwood::WESTWOODPLUS));
318  }
319  else
320  {
321  Config::SetDefault ("ns3::TcpL4Protocol::SocketType",
322  StringValue (tcpModel.str ()));
323  }
324 
325  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1000));
326  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
327  Config::SetDefault ("ns3::TcpSocketBase::Timestamp", BooleanValue (false));
328 
329  if (m_writeLogging)
330  {
332  LogComponentEnable ("Ns3TcpLossTest", LOG_LEVEL_ALL);
333  LogComponentEnable ("ErrorModel", LOG_LEVEL_DEBUG);
334  LogComponentEnable ("TcpWestwood", LOG_LEVEL_ALL);
335  LogComponentEnable ("TcpCongestionOps", LOG_LEVEL_INFO);
336  LogComponentEnable ("TcpSocketBase", LOG_LEVEL_INFO);
337  }
338 
340  // Topology construction
341  //
342 
343  // Create three nodes: s1, r1, and k1
344  NodeContainer s1r1;
345  s1r1.Create (2);
346 
347  NodeContainer r1k1;
348  r1k1.Add (s1r1.Get (1));
349  r1k1.Create (1);
350 
351  // Set up TCP/IP stack to all nodes (and create loopback device at device 0)
352  InternetStackHelper internet;
353  internet.InstallAll ();
354 
355  // Connect the nodes
356  PointToPointHelper p2p;
357  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (8000000)));
358  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.0001)));
359  NetDeviceContainer dev0 = p2p.Install (s1r1);
360  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (800000)));
361  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.1)));
362  NetDeviceContainer dev1 = p2p.Install (r1k1);
363 
364  // Add IP addresses to each network interfaces
365  Ipv4AddressHelper ipv4;
366  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
367  ipv4.Assign (dev0);
368  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
369  Ipv4InterfaceContainer ipInterfs = ipv4.Assign (dev1);
370 
371  // Set up routes to all nodes
372  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
373 
375  // Send 20000 (totalTxBytes) bytes from node s1 to node k1
376  //
377 
378  // Create a packet sink to receive packets on node k1
379  uint16_t servPort = 50000; // Destination port number
380  PacketSinkHelper sink ("ns3::TcpSocketFactory",
381  InetSocketAddress (Ipv4Address::GetAny (), servPort));
382  ApplicationContainer apps = sink.Install (r1k1.Get (1));
383  apps.Start (Seconds (0.0));
384  apps.Stop (Seconds (100.0));
385 
386  // Create a data source to send packets on node s0.
387  // Instead of full application, here use the socket directly by
388  // registering callbacks in function StarFlow().
389  Ptr<Socket> localSocket = Socket::CreateSocket (s1r1.Get (0), TcpSocketFactory::GetTypeId ());
390  localSocket->Bind ();
391  Simulator::ScheduleNow (&Ns3TcpLossTestCase::StartFlow,
392  this,
393  localSocket,
394  ipInterfs.GetAddress (1),
395  servPort);
396 
397  Config::Connect ("/NodeList/0/$ns3::Ipv4L3Protocol/Tx",
399 
401  ("/NodeList/0/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow",
403 
405  // Set up loss model at node k1
406  //
407  std::list<uint32_t> sampleList;
408  switch (m_testCase)
409  {
410  case 0:
411  break;
412  case 1:
413  // Force a loss for 15th data packet. TCP cwnd will be at 14 segments
414  // (14000 bytes) when duplicate acknowledgments start to come.
415  sampleList.push_back (16);
416  break;
417  case 2:
418  sampleList.push_back (16);
419  sampleList.push_back (17);
420  break;
421  case 3:
422  sampleList.push_back (16);
423  sampleList.push_back (17);
424  sampleList.push_back (18);
425  break;
426  case 4:
427  sampleList.push_back (16);
428  sampleList.push_back (17);
429  sampleList.push_back (18);
430  sampleList.push_back (19);
431  break;
432  default:
433  NS_FATAL_ERROR ("Program fatal error: loss value " << m_testCase << " not supported.");
434  break;
435  }
436 
437  Ptr<ReceiveListErrorModel> pem = CreateObject<ReceiveListErrorModel> ();
438  pem->SetList (sampleList);
439  dev1.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (pem));
440 
441  // One can toggle the comment for the following line on or off to see the
442  // effects of finite send buffer modelling. One can also change the size of
443  // that buffer.
444  // localSocket->SetAttribute("SndBufSize", UintegerValue(4096));
445 
446  std::ostringstream oss;
447  oss << "tcp-loss-" << m_tcpModel << m_testCase << "-test-case";
448  if (m_writeResults)
449  {
450  p2p.EnablePcapAll (oss.str ());
451  p2p.EnableAsciiAll (oss.str ());
452  }
453 
454  std::ostringstream oss2;
455  oss2 << "src/test/ns3tcp/Tcp" << m_tcpModel << "." << m_testCase << ".log";
456  AsciiTraceHelper ascii;
457  if (m_writeLogging)
458  {
459  m_osw = ascii.CreateFileStream (oss2.str ());
460  *(m_osw->GetStream ()) << std::setprecision (9) << std::fixed;
461  p2p.EnableAsciiAll (m_osw);
462  }
463 
464  // Finally, set up the simulator to run. The 1000 second hard limit is a
465  // failsafe in case some change above causes the simulation to never end
466  Simulator::Stop (Seconds (1000));
467  Simulator::Run ();
468  Simulator::Destroy ();
469 }
470 
472 {
473 public:
475 };
476 
478  : TestSuite ("ns3-tcp-loss", SYSTEM)
479 {
480  // We can't use NS_TEST_SOURCEDIR variable here because we use subdirectories
481  SetDataDir ("src/test/ns3tcp/response-vectors");
482  Packet::EnablePrinting (); // Enable packet metadata for all test cases
483 
484  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 0), TestCase::QUICK);
485  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 1), TestCase::QUICK);
486  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 2), TestCase::QUICK);
487  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 3), TestCase::QUICK);
488  AddTestCase (new Ns3TcpLossTestCase ("NewReno", 4), TestCase::QUICK);
489 
490  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 0), TestCase::QUICK);
491  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 1), TestCase::QUICK);
492  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 2), TestCase::QUICK);
493  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 3), TestCase::QUICK);
494  AddTestCase (new Ns3TcpLossTestCase ("Westwood", 4), TestCase::QUICK);
495 
496  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 0), TestCase::QUICK);
497  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 1), TestCase::QUICK);
498  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 2), TestCase::QUICK);
499  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 3), TestCase::QUICK);
500  AddTestCase (new Ns3TcpLossTestCase ("WestwoodPlus", 4), TestCase::QUICK);
501 
502 }
503 
505 
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:267
Ptr< PacketSink > sink
Definition: wifi-tcp.cc:45
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
Manage ASCII trace files for device models.
Definition: trace-helper.h:161
an Inet address class
const bool WRITE_PCAP
AttributeValue implementation for Boolean.
Definition: boolean.h:36
holds a vector of std::pair of Ptr and interface index.
void Ipv4L3Tx(std::string context, Ptr< const Packet > packet, Ptr< Ipv4 > ipv4, uint32_t interface)
Hold variables of type string.
Definition: string.h:41
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#define min(a, b)
Definition: 80211b.c:44
NetDeviceContainer Install(NodeContainer c)
A suite of tests to run.
Definition: test.h:1342
void StartFlow(Ptr< Socket > localSocket, Ipv4Address servAddress, uint16_t servPort)
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
#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
virtual void DoTeardown(void)
Implementation to do any local setup required for this TestCase.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
aggregate IP/TCP/UDP functionality to existing Nodes.
#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:285
LOG_INFO and above.
Definition: log.h:103
const bool WRITE_VECTORS
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:277
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
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.
encapsulates test code
Definition: test.h:1155
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void StartFlow(Ptr< Socket >, Ipv4Address, uint16_t)
Class for representing data rates.
Definition: data-rate.h:88
Packet header for IPv4.
Definition: ipv4-header.h:33
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
virtual void DoRun(void)
Implementation to actually run this TestCase.
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:369
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.
Definition: enum.h:54
static void CwndTracer(uint32_t oldval, uint32_t newval)
void CwndTracer(uint32_t oldval, uint32_t newval)
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:349
void InstallAll(void) const
Aggregate IPv4, IPv6, UDP, and TCP stacks to all nodes in the simulation.
AttributeValue implementation for Time.
Definition: nstime.h:1055
A class representing a pcap file.
Definition: pcap-file.h:42
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
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
Hold an unsigned integer type.
Definition: uinteger.h:44
Ptr< OutputStreamWrapper > m_osw
static Ns3TcpLossTestSuite ns3TcpLossTestSuite
holds a vector of ns3::NetDevice pointers
AttributeValue implementation for TypeId.
Definition: type-id.h:608
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:832
const bool WRITE_LOGGING
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:843
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
const uint32_t PCAP_LINK_TYPE
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:121
LOG_DEBUG and above.
Definition: log.h:100
void LogComponentEnableAll(enum LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:393
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void WriteUntilBufferFull(Ptr< Socket > localSocket, uint32_t txSpace)
keep track of a set of node pointers.
Hold objects of type Ptr.
Definition: pointer.h:36
std::string CreateDataDirFilename(std::string filename)
Construct the full path to a file in the data directory.
Definition: test.cc:412
Header for the Transmission Control Protocol.
Definition: tcp-header.h:44
void WriteUntilBufferFull(Ptr< Socket >, uint32_t)
Prefix all trace prints with function.
Definition: log.h:114
void SetList(const std::list< uint32_t > &packetlist)
Definition: error-model.cc:520
void Close(void)
Close the underlying file.
Definition: pcap-file.cc:88
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
Definition: socket.cc:121
bool IsStatusSuccess(void) const
Check if all tests passed.
Definition: test.cc:458
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 SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
Definition: abort.h:144
AttributeValue implementation for DataRate.
Definition: data-rate.h:242
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:269
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:993
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:782
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found.
Definition: test.cc:465
Print everything.
Definition: log.h:112
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:355
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:365
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...
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
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 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
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
virtual int Close(void)=0
Close a socket.
const uint32_t PCAP_SNAPLEN
virtual uint32_t GetTxAvailable(void) const =0
Returns the number of bytes which can be sent in a single call to Send.
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const