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  // response-vectors/ of this directory
119  //
120  std::ostringstream oss;
121  oss << "/response-vectors/ns3tcp-state" << m_testCase << "-response-vectors.pcap";
122  m_pcapFilename = static_cast<std::string> (NS_TEST_SOURCEDIR) + oss.str ();
123 
124  if (m_writeVectors)
125  {
126  m_pcapFile.Open (m_pcapFilename, std::ios::out|std::ios::binary);
128  }
129  else
130  {
131  m_pcapFile.Open (m_pcapFilename, std::ios::in|std::ios::binary);
132  NS_ABORT_MSG_UNLESS (m_pcapFile.GetDataLinkType () == PCAP_LINK_TYPE, "Wrong response vectors in directory");
133  }
134 }
135 
136 void
138 {
139  m_pcapFile.Close ();
140 }
141 
142 void
143 Ns3TcpStateTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
144 {
145  //
146  // We're not testing IP so remove and toss the header. In order to do this,
147  // though, we need to copy the packet since we have a const version.
148  //
149  Ptr<Packet> p = packet->Copy ();
150  Ipv4Header ipHeader;
151  p->RemoveHeader (ipHeader);
152 
153  if (g_log.IsEnabled (ns3::LOG_DEBUG))
154  {
155  TcpHeader th;
156  p->PeekHeader (th);
157  std::clog << Simulator::Now ().GetSeconds () << " TCP header " << th << std::endl;
158  }
159 
160  //
161  // What is left is the TCP header and any data that may be sent. We aren't
162  // sending any TCP data, so we expect what remains is only TCP header, which
163  // is a small thing to save.
164  //
165  if (m_writeVectors)
166  {
167  //
168  // Save the TCP under test response for later testing.
169  //
170  Time tNow = Simulator::Now ();
171  int64_t tMicroSeconds = tNow.GetMicroSeconds ();
172 
173  uint32_t size = p->GetSize ();
174  uint8_t *buf = new uint8_t[size];
175  p->CopyData (buf, size);
176 
177  m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000),
178  uint32_t (tMicroSeconds % 1000000),
179  buf,
180  size);
181  delete [] buf;
182  }
183  else
184  {
185  //
186  // Read the TCP under test expected response from the expected vector
187  // file and see if it still does the right thing.
188  //
189  uint8_t expected[PCAP_SNAPLEN];
190  uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
191  m_pcapFile.Read (expected, sizeof(expected), tsSec, tsUsec, inclLen, origLen, readLen);
192 
193  uint8_t *actual = new uint8_t[readLen];
194  p->CopyData (actual, readLen);
195 
196  uint32_t result = memcmp (actual, expected, readLen);
197 
198  delete [] actual;
199 
200  //
201  // Avoid streams of errors -- only report the first.
202  //
203  if (IsStatusSuccess ())
204  {
205  NS_TEST_EXPECT_MSG_EQ (result, 0, "Expected data comparison error");
206  }
207  }
208 }
209 
211 // Implementing an "application" to send bytes over a TCP connection
212 void
214 {
216  {
217  uint32_t left = m_totalTxBytes - m_currentTxBytes;
218  uint32_t dataOffset = m_currentTxBytes % 1040;
219  uint32_t toWrite = 1040 - dataOffset;
220  uint32_t txAvail = localSocket->GetTxAvailable ();
221  toWrite = std::min (toWrite, left);
222  toWrite = std::min (toWrite, txAvail);
223  if (txAvail == 0)
224  {
225  return;
226  };
227  if (m_writeLogging)
228  {
229  std::clog << "Submitting "
230  << toWrite << " bytes to TCP socket" << std::endl;
231  }
232  int amountSent = localSocket->Send (0, toWrite, 0);
233  NS_ASSERT (amountSent > 0); // Given GetTxAvailable() non-zero, amountSent should not be zero
234  m_currentTxBytes += amountSent;
235  }
236  if (m_needToClose)
237  {
238  if (m_writeLogging)
239  {
240  std::clog << "Close socket at "
241  << Simulator::Now ().GetSeconds ()
242  << std::endl;
243  }
244  localSocket->Close ();
245  m_needToClose = false;
246  }
247 }
248 
249 void
251  Ipv4Address servAddress,
252  uint16_t servPort)
253 {
254  if (m_writeLogging)
255  {
256  std::clog << "Starting flow at time "
257  << Simulator::Now ().GetSeconds ()
258  << std::endl;
259  }
260 
261  localSocket->Connect (InetSocketAddress (servAddress, servPort)); // connect
262 
263  // tell the tcp implementation to call WriteUntilBufferFull again
264  // if we blocked and new tx buffer space becomes available
265  localSocket->SetSendCallback (MakeCallback
267  this));
268  WriteUntilBufferFull (localSocket, localSocket->GetTxAvailable ());
269 }
270 
271 void
273 {
274  // Network topology
275  //
276  // 10Mb/s, 0.1ms 10Mb/s, 0.1ms
277  // n0-----------------n1-----------------n2
278 
279  std::string tcpModel ("ns3::TcpNewReno");
280 
281  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue (tcpModel));
282  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1000));
283  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
284  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", UintegerValue (20));
285  Config::SetDefault ("ns3::TcpSocketBase::Timestamp", BooleanValue (false));
286 
287  if (m_writeLogging)
288  {
290  LogComponentEnable ("ErrorModel", LOG_LEVEL_DEBUG);
291  LogComponentEnable ("Ns3TcpStateTest", LOG_LEVEL_DEBUG);
292  LogComponentEnable ("TcpNewReno", LOG_LEVEL_INFO);
293  LogComponentEnable ("TcpReno", LOG_LEVEL_INFO);
294  LogComponentEnable ("TcpTahoe", LOG_LEVEL_INFO);
295  LogComponentEnable ("TcpSocketBase", LOG_LEVEL_INFO);
296  }
297 
299  // Topology construction
300  //
301 
302  // Create three nodes
303  NodeContainer n0n1;
304  n0n1.Create (2);
305 
307  n1n2.Add (n0n1.Get (1));
308  n1n2.Create (1);
309 
310  // Set up TCP/IP stack to all nodes (and create loopback device at device 0)
311  InternetStackHelper internet;
312  internet.InstallAll ();
313 
314  // Connect the nodes
315  PointToPointHelper p2p;
316  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (1000000)));
317  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.0001)));
318  NetDeviceContainer dev0 = p2p.Install (n0n1);
319  NetDeviceContainer dev1 = p2p.Install (n1n2);
320 
321  // Add IP addresses to each network interfaces
322  Ipv4AddressHelper ipv4;
323  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
324  ipv4.Assign (dev0);
325  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
326  Ipv4InterfaceContainer ipInterfs = ipv4.Assign (dev1);
327 
328  // Set up routes to all nodes
329  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
330 
332  // A flow from node n0 to node n2
333  //
334 
335  // Create a packet sink to receive packets on node n2
336  uint16_t servPort = 50000; // Destination port number
337  PacketSinkHelper sink ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), servPort));
338  ApplicationContainer sinkApps = sink.Install (n1n2.Get (1));
339  sinkApps.Start (Seconds (0.0));
340  sinkApps.Stop (Seconds (100.0));
341 
342  // Create a data source to send packets on node n0
343  // Instead of full application, here use the socket directly by
344  // registering callbacks in function StarFlow().
345  Ptr<Socket> localSocket = Socket::CreateSocket (n0n1.Get (0),
346  TcpSocketFactory::GetTypeId ());
347  localSocket->Bind ();
348  Simulator::ScheduleNow (&Ns3TcpStateTestCase::StartFlow, this,
349  localSocket, ipInterfs.GetAddress (1), servPort);
350 
351  Config::Connect ("/NodeList/0/$ns3::Ipv4L3Protocol/Tx",
353 
355  // Set up different test cases: Lost model at node n1, different file size
356  //
357 
358  std::list<uint32_t> dropListN0;
359  std::list<uint32_t> dropListN1;
360  std::string caseDescription;
361  switch (m_testCase)
362  {
363  case 0:
364  m_totalTxBytes = 1000;
365  caseDescription = "Verify connection establishment";
366  break;
367  case 1:
368  m_totalTxBytes = 100*1000;
369  caseDescription = "Verify a bigger (100 pkts) transfer: Sliding window operation, etc.";
370  break;
371  case 2:
372  m_totalTxBytes = 1000;
373  caseDescription = "Survive a SYN lost";
374  dropListN0.push_back (0);
375  break;
376  case 3:
377  m_totalTxBytes = 2000;
378  caseDescription = "Survive a SYN+ACK lost";
379  dropListN1.push_back (0);
380  break;
381  case 4:
382  m_totalTxBytes = 2000;
383  caseDescription = "Survive a ACK (last packet in 3-way handshake) lost";
384  dropListN0.push_back (1);
385  break;
386  case 5:
387  m_totalTxBytes = 0;
388  caseDescription = "Immediate FIN upon SYN_RCVD";
389  m_needToClose = false;
390  dropListN0.push_back (1); // Hide the ACK in 3WHS
391  Simulator::Schedule (Seconds (0.002), &Socket::Close, localSocket);
392  break;
393  case 6:
394  m_totalTxBytes = 5000;
395  caseDescription = "Simulated simultaneous close";
396  dropListN1.push_back (5); // Hide the ACK-to-FIN from n2
397  break;
398  case 7:
399  m_totalTxBytes = 5000;
400  caseDescription = "FIN check 1: Loss of initiator's FIN. Wait until app close";
401  m_needToClose = false;
402  dropListN0.push_back (7); // Hide the FIN from n0
403  Simulator::Schedule (Seconds (0.04), &Socket::Close, localSocket);
404  break;
405  case 8:
406  m_totalTxBytes = 5000;
407  caseDescription = "FIN check 2: Loss responder's FIN. FIN will be resent after last ack timeout";
408  dropListN1.push_back (6); // Hide the FIN from n2
409  break;
410  default:
411  NS_FATAL_ERROR ("Program fatal error: specified test case not supported: "
412  << m_testCase);
413  break;
414  }
415 
416  Ptr<ReceiveListErrorModel> errN0 = CreateObject<ReceiveListErrorModel> ();
417  errN0->SetList (dropListN0);
418  dev0.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (errN0));
419 
420  Ptr<ReceiveListErrorModel> errN1 = CreateObject<ReceiveListErrorModel> ();
421  errN1->SetList (dropListN1);
422  dev1.Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (errN1));
423 
424  std::ostringstream oss;
425  oss << "tcp-state" << m_testCase << "-test-case";
426  if (m_writeResults)
427  {
428  p2p.EnablePcapAll (oss.str ());
429  p2p.EnableAsciiAll (oss.str ());
430  }
431 
432  if (m_writeLogging)
433  {
434  Ptr<OutputStreamWrapper> osw = Create<OutputStreamWrapper> (&std::clog);
435  *(osw->GetStream ()) << std::setprecision (9) << std::fixed;
436  p2p.EnableAsciiAll (osw);
437 
438  std::clog << std::endl << "Running TCP test-case " << m_testCase << ": "
439  << caseDescription << std::endl;
440  }
441 
442  // Finally, set up the simulator to run. The 1000 second hard limit is a
443  // failsafe in case some change above causes the simulation to never end
444  Simulator::Stop (Seconds (1000));
445  Simulator::Run ();
446  Simulator::Destroy ();
447 
448 
449 }
450 
452 {
453 public:
455 };
456 
458  : TestSuite ("ns3-tcp-state", SYSTEM)
459 {
460  Packet::EnablePrinting (); // Enable packet metadata for all test cases
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:268
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:1276
#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:273
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:766
LOG_INFO and above.
Definition: log.h:103
#define NS_FATAL_ERROR(msg)
Fatal error handling.
Definition: fatal-error.h:100
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:1108
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:334
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:342
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:190
AttributeValue implementation for Time.
Definition: nstime.h:928
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:437
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:1296
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:744
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:277
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
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:329
void Close(void)
Close the underlying file.
Definition: pcap-file.cc:86
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
Definition: test.cc:341
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:310
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:238
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:866
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:683
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:368
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:135
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:404
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