A Discrete-Event Network Simulator
API
ns3tcp-state-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 #include <string>
21 
22 #include "ns3/log.h"
23 #include "ns3/abort.h"
24 #include "ns3/test.h"
25 #include "ns3/pcap-file.h"
26 #include "ns3/config.h"
27 #include "ns3/string.h"
28 #include "ns3/uinteger.h"
29 #include "ns3/boolean.h"
30 #include "ns3/data-rate.h"
31 #include "ns3/inet-socket-address.h"
32 #include "ns3/point-to-point-helper.h"
33 #include "ns3/internet-stack-helper.h"
34 #include "ns3/ipv4-global-routing-helper.h"
35 #include "ns3/ipv4-address-helper.h"
36 #include "ns3/packet-sink-helper.h"
37 #include "ns3/tcp-socket-factory.h"
38 #include "ns3/node-container.h"
39 #include "ns3/simulator.h"
40 #include "ns3/error-model.h"
41 #include "ns3/pointer.h"
42 #include "ns3tcp-socket-writer.h"
43 #include "ns3/tcp-header.h"
44 
45 using namespace ns3;
46 
47 NS_LOG_COMPONENT_DEFINE ("Ns3TcpStateTest");
48 
49 const bool WRITE_VECTORS = false; // set to true to write response vectors
50 const bool WRITE_LOGGING = false; // set to true to write logging
51 const uint32_t PCAP_LINK_TYPE = 1187373554; // Some large random number -- we use to verify data was written by this program
52 const uint32_t PCAP_SNAPLEN = 64; // Don't bother to save much data
53 
54 // ===========================================================================
55 // Tests of TCP implementation state machine behavior
56 // ===========================================================================
57 //
58 
60 {
61 public:
63  Ns3TcpStateTestCase (uint32_t testCase);
64  virtual ~Ns3TcpStateTestCase () {}
65 
66 private:
67  virtual void DoSetup (void);
68  virtual void DoRun (void);
69  virtual void DoTeardown (void);
70 
71  std::string m_pcapFilename;
73  uint32_t m_testCase;
74  uint32_t m_totalTxBytes;
75  uint32_t m_currentTxBytes;
80 
81  void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
82  void WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace);
83  void StartFlow (Ptr<Socket> localSocket,
84  Ipv4Address servAddress,
85  uint16_t servPort);
86 
87 };
88 
90  : TestCase ("Check the operation of the TCP state machine for several cases"),
91  m_testCase (0),
92  m_totalTxBytes (20000),
93  m_currentTxBytes (0),
94  m_writeVectors (WRITE_VECTORS),
95  m_writeResults (false),
96  m_writeLogging (WRITE_LOGGING),
97  m_needToClose (true)
98 {
99 }
100 
102  : TestCase ("Check the operation of the TCP state machine for several cases"),
103  m_testCase (testCase),
104  m_totalTxBytes (20000),
105  m_currentTxBytes (0),
106  m_writeVectors (WRITE_VECTORS),
107  m_writeResults (false),
108  m_writeLogging (WRITE_LOGGING),
109  m_needToClose (true)
110 {
111 }
112 
113 void
115 {
116  //
117  // We expect there to be a file called ns3tcp-state-response-vectors.pcap in
118  // the data directory
119  //
120  std::ostringstream oss;
121  oss << "ns3tcp-state" << m_testCase << "-response-vectors.pcap";
122  m_pcapFilename = CreateDataDirFilename (oss.str ());
123  std::cout << "m_pcapFilename=" << m_pcapFilename << std::endl;
124 
125  if (m_writeVectors)
126  {
127  m_pcapFile.Open (m_pcapFilename, std::ios::out|std::ios::binary);
129  }
130  else
131  {
132  m_pcapFile.Open (m_pcapFilename, std::ios::in|std::ios::binary);
134  "Wrong response vectors in directory: opening " <<
136  }
137 }
138 
139 void
141 {
142  m_pcapFile.Close ();
143 }
144 
145 void
146 Ns3TcpStateTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
147 {
148  //
149  // We're not testing IP so remove and toss the header. In order to do this,
150  // though, we need to copy the packet since we have a const version.
151  //
152  Ptr<Packet> p = packet->Copy ();
153  Ipv4Header ipHeader;
154  p->RemoveHeader (ipHeader);
155 
156  if (g_log.IsEnabled (ns3::LOG_DEBUG))
157  {
158  TcpHeader th;
159  p->PeekHeader (th);
160  std::clog << Simulator::Now ().GetSeconds () << " TCP header " << th << std::endl;
161  }
162 
163  //
164  // What is left is the TCP header and any data that may be sent. We aren't
165  // sending any TCP data, so we expect what remains is only TCP header, which
166  // is a small thing to save.
167  //
168  if (m_writeVectors)
169  {
170  //
171  // Save the TCP under test response for later testing.
172  //
173  Time tNow = Simulator::Now ();
174  int64_t tMicroSeconds = tNow.GetMicroSeconds ();
175 
176  m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000),
177  uint32_t (tMicroSeconds % 1000000),
178  p);
179  }
180  else
181  {
182  //
183  // Read the TCP under test expected response from the expected vector
184  // file and see if it still does the right thing.
185  //
186  uint8_t expected[PCAP_SNAPLEN];
187  uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
188  m_pcapFile.Read (expected, sizeof(expected), tsSec, tsUsec, inclLen, origLen, readLen);
189 
190  uint8_t *actual = new uint8_t[readLen];
191  p->CopyData (actual, readLen);
192 
193  uint32_t result = memcmp (actual, expected, readLen);
194 
195  delete [] actual;
196 
197  //
198  // Avoid streams of errors -- only report the first.
199  //
200  if (IsStatusSuccess ())
201  {
202  NS_TEST_EXPECT_MSG_EQ (result, 0, "Expected data comparison error");
203  }
204  }
205 }
206 
208 // Implementing an "application" to send bytes over a TCP connection
209 void
211 {
213  {
214  uint32_t left = m_totalTxBytes - m_currentTxBytes;
215  uint32_t dataOffset = m_currentTxBytes % 1040;
216  uint32_t toWrite = 1040 - dataOffset;
217  uint32_t txAvail = localSocket->GetTxAvailable ();
218  toWrite = std::min (toWrite, left);
219  toWrite = std::min (toWrite, txAvail);
220  if (txAvail == 0)
221  {
222  return;
223  };
224  if (m_writeLogging)
225  {
226  std::clog << "Submitting "
227  << toWrite << " bytes to TCP socket" << std::endl;
228  }
229  int amountSent = localSocket->Send (0, toWrite, 0);
230  NS_ASSERT (amountSent > 0); // Given GetTxAvailable() non-zero, amountSent should not be zero
231  m_currentTxBytes += amountSent;
232  }
233  if (m_needToClose)
234  {
235  if (m_writeLogging)
236  {
237  std::clog << "Close socket at "
238  << Simulator::Now ().GetSeconds ()
239  << std::endl;
240  }
241  localSocket->Close ();
242  m_needToClose = false;
243  }
244 }
245 
246 void
248  Ipv4Address servAddress,
249  uint16_t servPort)
250 {
251  if (m_writeLogging)
252  {
253  std::clog << "Starting flow at time "
254  << Simulator::Now ().GetSeconds ()
255  << std::endl;
256  }
257 
258  localSocket->Connect (InetSocketAddress (servAddress, servPort)); // connect
259 
260  // tell the tcp implementation to call WriteUntilBufferFull again
261  // if we blocked and new tx buffer space becomes available
262  localSocket->SetSendCallback (MakeCallback
264  this));
265  WriteUntilBufferFull (localSocket, localSocket->GetTxAvailable ());
266 }
267 
268 void
270 {
271  // Network topology
272  //
273  // 10Mb/s, 0.1ms 10Mb/s, 0.1ms
274  // n0-----------------n1-----------------n2
275 
276  std::string tcpModel ("ns3::TcpNewReno");
277 
278  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue (tcpModel));
279  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1000));
280  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
281  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", UintegerValue (20));
282  Config::SetDefault ("ns3::TcpSocketBase::Timestamp", BooleanValue (false));
283 
284  if (m_writeLogging)
285  {
287  LogComponentEnable ("ErrorModel", LOG_LEVEL_DEBUG);
288  LogComponentEnable ("Ns3TcpStateTest", LOG_LEVEL_DEBUG);
289  LogComponentEnable ("TcpNewReno", LOG_LEVEL_INFO);
290  LogComponentEnable ("TcpReno", LOG_LEVEL_INFO);
291  LogComponentEnable ("TcpTahoe", LOG_LEVEL_INFO);
292  LogComponentEnable ("TcpSocketBase", LOG_LEVEL_INFO);
293  }
294 
296  // Topology construction
297  //
298 
299  // Create three nodes
300  NodeContainer n0n1;
301  n0n1.Create (2);
302 
304  n1n2.Add (n0n1.Get (1));
305  n1n2.Create (1);
306 
307  // Set up TCP/IP stack to all nodes (and create loopback device at device 0)
308  InternetStackHelper internet;
309  internet.InstallAll ();
310 
311  // Connect the nodes
312  PointToPointHelper p2p;
313  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (1000000)));
314  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.0001)));
315  NetDeviceContainer dev0 = p2p.Install (n0n1);
316  NetDeviceContainer dev1 = p2p.Install (n1n2);
317 
318  // Add IP addresses to each network interfaces
319  Ipv4AddressHelper ipv4;
320  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
321  ipv4.Assign (dev0);
322  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
323  Ipv4InterfaceContainer ipInterfs = ipv4.Assign (dev1);
324 
325  // Set up routes to all nodes
326  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
327 
329  // A flow from node n0 to node n2
330  //
331 
332  // Create a packet sink to receive packets on node n2
333  uint16_t servPort = 50000; // Destination port number
334  PacketSinkHelper sink ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), servPort));
335  ApplicationContainer sinkApps = sink.Install (n1n2.Get (1));
336  sinkApps.Start (Seconds (0.0));
337  sinkApps.Stop (Seconds (100.0));
338 
339  // Create a data source to send packets on node n0
340  // Instead of full application, here use the socket directly by
341  // registering callbacks in function StarFlow().
342  Ptr<Socket> localSocket = Socket::CreateSocket (n0n1.Get (0),
343  TcpSocketFactory::GetTypeId ());
344  localSocket->Bind ();
345  Simulator::ScheduleNow (&Ns3TcpStateTestCase::StartFlow, this,
346  localSocket, ipInterfs.GetAddress (1), servPort);
347 
348  Config::Connect ("/NodeList/0/$ns3::Ipv4L3Protocol/Tx",
350 
352  // Set up different test cases: Lost model at node n1, different file size
353  //
354 
355  std::list<uint32_t> dropListN0;
356  std::list<uint32_t> dropListN1;
357  std::string caseDescription;
358  switch (m_testCase)
359  {
360  case 0:
361  m_totalTxBytes = 1000;
362  caseDescription = "Verify connection establishment";
363  break;
364  case 1:
365  m_totalTxBytes = 100*1000;
366  caseDescription = "Verify a bigger (100 pkts) transfer: Sliding window operation, etc.";
367  break;
368  case 2:
369  m_totalTxBytes = 1000;
370  caseDescription = "Survive a SYN lost";
371  dropListN0.push_back (0);
372  break;
373  case 3:
374  m_totalTxBytes = 2000;
375  caseDescription = "Survive a SYN+ACK lost";
376  dropListN1.push_back (0);
377  break;
378  case 4:
379  m_totalTxBytes = 2000;
380  caseDescription = "Survive a ACK (last packet in 3-way handshake) lost";
381  dropListN0.push_back (1);
382  break;
383  case 5:
384  m_totalTxBytes = 0;
385  caseDescription = "Immediate FIN upon SYN_RCVD";
386  m_needToClose = false;
387  dropListN0.push_back (1); // Hide the ACK in 3WHS
388  Simulator::Schedule (Seconds (0.002), &Socket::Close, localSocket);
389  break;
390  case 6:
391  m_totalTxBytes = 5000;
392  caseDescription = "Simulated simultaneous close";
393  dropListN1.push_back (5); // Hide the ACK-to-FIN from n2
394  break;
395  case 7:
396  m_totalTxBytes = 5000;
397  caseDescription = "FIN check 1: Loss of initiator's FIN. Wait until app close";
398  m_needToClose = false;
399  dropListN0.push_back (7); // Hide the FIN from n0
400  Simulator::Schedule (Seconds (0.04), &Socket::Close, localSocket);
401  break;
402  case 8:
403  m_totalTxBytes = 5000;
404  caseDescription = "FIN check 2: Loss responder's FIN. FIN will be resent after last ack timeout";
405  dropListN1.push_back (6); // Hide the FIN from n2
406  break;
407  default:
408  NS_FATAL_ERROR ("Program fatal error: specified test case not supported: "
409  << m_testCase);
410  break;
411  }
412 
413  Ptr<ReceiveListErrorModel> errN0 = CreateObject<ReceiveListErrorModel> ();
414  errN0->SetList (dropListN0);
415  dev0.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (errN0));
416 
417  Ptr<ReceiveListErrorModel> errN1 = CreateObject<ReceiveListErrorModel> ();
418  errN1->SetList (dropListN1);
419  dev1.Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (errN1));
420 
421  std::ostringstream oss;
422  oss << "tcp-state" << m_testCase << "-test-case";
423  if (m_writeResults)
424  {
425  p2p.EnablePcapAll (oss.str ());
426  p2p.EnableAsciiAll (oss.str ());
427  }
428 
429  if (m_writeLogging)
430  {
431  Ptr<OutputStreamWrapper> osw = Create<OutputStreamWrapper> (&std::clog);
432  *(osw->GetStream ()) << std::setprecision (9) << std::fixed;
433  p2p.EnableAsciiAll (osw);
434 
435  std::clog << std::endl << "Running TCP test-case " << m_testCase << ": "
436  << caseDescription << std::endl;
437  }
438 
439  // Finally, set up the simulator to run. The 1000 second hard limit is a
440  // failsafe in case some change above causes the simulation to never end
441  Simulator::Stop (Seconds (1000));
442  Simulator::Run ();
443  Simulator::Destroy ();
444 
445 
446 }
447 
449 {
450 public:
452 };
453 
455  : TestSuite ("ns3-tcp-state", SYSTEM)
456 {
457  // We can't use NS_TEST_SOURCEDIR variable here because we use subdirectories
458  SetDataDir ("src/test/ns3tcp/response-vectors");
459  Packet::EnablePrinting (); // Enable packet metadata for all test cases
460 
461  AddTestCase (new Ns3TcpStateTestCase (0), TestCase::QUICK);
462  AddTestCase (new Ns3TcpStateTestCase (1), TestCase::QUICK);
463  AddTestCase (new Ns3TcpStateTestCase (2), TestCase::QUICK);
464  AddTestCase (new Ns3TcpStateTestCase (3), TestCase::QUICK);
465  AddTestCase (new Ns3TcpStateTestCase (4), TestCase::QUICK);
466  AddTestCase (new Ns3TcpStateTestCase (5), TestCase::QUICK);
467  AddTestCase (new Ns3TcpStateTestCase (6), TestCase::QUICK);
468  AddTestCase (new Ns3TcpStateTestCase (7), TestCase::QUICK);
469  AddTestCase (new Ns3TcpStateTestCase (8), TestCase::QUICK);
470 }
471 
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:266
holds a vector of ns3::Application pointers.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
an Inet address class
AttributeValue implementation for Boolean.
Definition: boolean.h:34
NodeContainer n1n2
Definition: red-tests.cc:63
holds a vector of std::pair of Ptr and interface index.
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.
NetDeviceContainer Install(NodeContainer c)
A suite of tests to run.
Definition: test.h:1333
#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
#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:278
LOG_INFO and above.
Definition: log.h:103
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:145
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
Build a set of PointToPointNetDevice objects.
encapsulates test code
Definition: test.h:1147
void StartFlow(Ptr< Socket > localSocket, Ipv4Address servAddress, uint16_t servPort)
Rare ad-hoc debug messages.
Definition: log.h:99
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)
void WriteUntilBufferFull(Ptr< Socket > localSocket, uint32_t txSpace)
Class for representing data rates.
Definition: data-rate.h:88
Packet header for IPv4.
Definition: ipv4-header.h:31
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:341
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:351
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 ...
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.
void AddTestCase(TestCase *testCase, enum TestDuration duration)
Add an individual child TestCase to this test suite.
Definition: test.cc:297
AttributeValue implementation for Time.
Definition: nstime.h:957
A class representing a pcap file.
Definition: pcap-file.h:42
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:441
Hold an unsigned integer type.
Definition: uinteger.h:44
holds a vector of ns3::NetDevice pointers
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1480
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:835
virtual void DoRun(void)
Implementation to actually run this TestCase.
virtual void DoTeardown(void)
Implementation to do any local setup required for this TestCase.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:122
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:276
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:375
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.
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:410
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
const uint32_t PCAP_LINK_TYPE
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
void Init(uint32_t dataLinkType, uint32_t snapLen=SNAPLEN_DEFAULT, int32_t timeZoneCorrection=ZONE_DEFAULT, bool swapMode=false)
Initialize the pcap file associated with this object.
Definition: pcap-file.cc:330
void Close(void)
Close the underlying file.
Definition: pcap-file.cc:87
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
Definition: socket.cc:121
static Ns3TcpStateTestSuite ns3TcpLossTestSuite
bool IsStatusSuccess(void) const
Check if all tests passed.
Definition: test.cc:456
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:311
const bool WRITE_LOGGING
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:241
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:895
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:774
void SetDataDir(std::string directory)
Set the data directory where reference trace files can be found.
Definition: test.cc:463
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:354
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:330
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:136
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:406
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.
virtual uint32_t GetTxAvailable(void) const =0
Returns the number of bytes which can be sent in a single call to Send.
void Ipv4L3Tx(std::string context, Ptr< const Packet > packet, Ptr< Ipv4 > ipv4, uint32_t interface)
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.
const bool WRITE_VECTORS
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
const uint32_t PCAP_SNAPLEN