A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
44 using namespace ns3;
45 
46 NS_LOG_COMPONENT_DEFINE ("Ns3TcpStateTest");
47 
48 const bool WRITE_VECTORS = false; // set to true to write response vectors
49 const bool WRITE_LOGGING = false; // set to true to write logging
50 const uint32_t PCAP_LINK_TYPE = 1187373554; // Some large random number -- we use to verify data was written by this program
51 const uint32_t PCAP_SNAPLEN = 64; // Don't bother to save much data
52 
53 // ===========================================================================
54 // Tests of TCP implementation state machine behavior
55 // ===========================================================================
56 //
57 
59 {
60 public:
62  Ns3TcpStateTestCase (uint32_t testCase);
63  virtual ~Ns3TcpStateTestCase () {}
64 
65 private:
66  virtual void DoSetup (void);
67  virtual void DoRun (void);
68  virtual void DoTeardown (void);
69 
70  std::string m_pcapFilename;
72  uint32_t m_testCase;
73  uint32_t m_totalTxBytes;
74  uint32_t m_currentTxBytes;
79 
80  void Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
81  void WriteUntilBufferFull (Ptr<Socket> localSocket, uint32_t txSpace);
82  void StartFlow (Ptr<Socket> localSocket,
83  Ipv4Address servAddress,
84  uint16_t servPort);
85 
86 };
87 
89  : TestCase ("Check the operation of the TCP state machine for several cases"),
90  m_testCase (0),
91  m_totalTxBytes (20000),
92  m_currentTxBytes (0),
93  m_writeVectors (WRITE_VECTORS),
94  m_writeResults (false),
95  m_writeLogging (WRITE_LOGGING),
96  m_needToClose (true)
97 {
98 }
99 
101  : TestCase ("Check the operation of the TCP state machine for several cases"),
102  m_testCase (testCase),
103  m_totalTxBytes (20000),
104  m_currentTxBytes (0),
105  m_writeVectors (WRITE_VECTORS),
106  m_writeResults (false),
107  m_writeLogging (WRITE_LOGGING),
108  m_needToClose (true)
109 {
110 }
111 
112 void
114 {
115  //
116  // We expect there to be a file called ns3tcp-state-response-vectors.pcap in
117  // response-vectors/ of this directory
118  //
119  std::ostringstream oss;
120  oss << "/response-vectors/ns3tcp-state" << m_testCase << "-response-vectors.pcap";
121  m_pcapFilename = static_cast<std::string> (NS_TEST_SOURCEDIR) + oss.str ();
122 
123  if (m_writeVectors)
124  {
125  m_pcapFile.Open (m_pcapFilename, std::ios::out|std::ios::binary);
127  }
128  else
129  {
130  m_pcapFile.Open (m_pcapFilename, std::ios::in|std::ios::binary);
131  NS_ABORT_MSG_UNLESS (m_pcapFile.GetDataLinkType () == PCAP_LINK_TYPE, "Wrong response vectors in directory");
132  }
133 }
134 
135 void
137 {
138  m_pcapFile.Close ();
139 }
140 
141 void
142 Ns3TcpStateTestCase::Ipv4L3Tx (std::string context, Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface)
143 {
144  //
145  // We're not testing IP so remove and toss the header. In order to do this,
146  // though, we need to copy the packet since we have a const version.
147  //
148  Ptr<Packet> p = packet->Copy ();
149  Ipv4Header ipHeader;
150  p->RemoveHeader (ipHeader);
151 
152  //
153  // What is left is the TCP header and any data that may be sent. We aren't
154  // sending any TCP data, so we expect what remains is only TCP header, which
155  // is a small thing to save.
156  //
157  if (m_writeVectors)
158  {
159  //
160  // Save the TCP under test response for later testing.
161  //
162  Time tNow = Simulator::Now ();
163  int64_t tMicroSeconds = tNow.GetMicroSeconds ();
164 
165  uint32_t size = p->GetSize ();
166  uint8_t *buf = new uint8_t[size];
167  p->CopyData (buf, size);
168 
169  m_pcapFile.Write (uint32_t (tMicroSeconds / 1000000),
170  uint32_t (tMicroSeconds % 1000000),
171  buf,
172  size);
173  delete [] buf;
174  }
175  else
176  {
177  //
178  // Read the TCP under test expected response from the expected vector
179  // file and see if it still does the right thing.
180  //
181  uint8_t expected[PCAP_SNAPLEN];
182  uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
183  m_pcapFile.Read (expected, sizeof(expected), tsSec, tsUsec, inclLen, origLen, readLen);
184 
185  uint8_t *actual = new uint8_t[readLen];
186  p->CopyData (actual, readLen);
187 
188  uint32_t result = memcmp (actual, expected, readLen);
189 
190  delete [] actual;
191 
192  //
193  // Avoid streams of errors -- only report the first.
194  //
195  if (IsStatusSuccess ())
196  {
197  NS_TEST_EXPECT_MSG_EQ (result, 0, "Expected data comparison error");
198  }
199  }
200 }
201 
203 // Implementing an "application" to send bytes over a TCP connection
204 void
206 {
208  {
209  uint32_t left = m_totalTxBytes - m_currentTxBytes;
210  uint32_t dataOffset = m_currentTxBytes % 1040;
211  uint32_t toWrite = 1040 - dataOffset;
212  uint32_t txAvail = localSocket->GetTxAvailable ();
213  toWrite = std::min (toWrite, left);
214  toWrite = std::min (toWrite, txAvail);
215  if (txAvail == 0)
216  {
217  return;
218  };
219  if (m_writeLogging)
220  {
221  std::clog << "Submitting "
222  << toWrite << " bytes to TCP socket" << std::endl;
223  }
224  int amountSent = localSocket->Send (0, toWrite, 0);
225  NS_ASSERT (amountSent > 0); // Given GetTxAvailable() non-zero, amountSent should not be zero
226  m_currentTxBytes += amountSent;
227  }
228  if (m_needToClose)
229  {
230  if (m_writeLogging)
231  {
232  std::clog << "Close socket at "
233  << Simulator::Now ().GetSeconds ()
234  << std::endl;
235  }
236  localSocket->Close ();
237  m_needToClose = false;
238  }
239 }
240 
241 void
243  Ipv4Address servAddress,
244  uint16_t servPort)
245 {
246  if (m_writeLogging)
247  {
248  std::clog << "Starting flow at time "
249  << Simulator::Now ().GetSeconds ()
250  << std::endl;
251  }
252 
253  localSocket->Connect (InetSocketAddress (servAddress, servPort)); // connect
254 
255  // tell the tcp implementation to call WriteUntilBufferFull again
256  // if we blocked and new tx buffer space becomes available
257  localSocket->SetSendCallback (MakeCallback
259  this));
260  WriteUntilBufferFull (localSocket, localSocket->GetTxAvailable ());
261 }
262 
263 void
265 {
266  // Network topology
267  //
268  // 10Mb/s, 0.1ms 10Mb/s, 0.1ms
269  // n0-----------------n1-----------------n2
270 
271  std::string tcpModel ("ns3::TcpNewReno");
272 
273  Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue (tcpModel));
274  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1000));
275  Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
276  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", UintegerValue (20));
277  Config::SetDefault ("ns3::TcpSocketBase::Timestamp", BooleanValue (false));
278 
279  if (m_writeLogging)
280  {
282  LogComponentEnable ("ErrorModel", LOG_LEVEL_DEBUG);
283  LogComponentEnable ("Ns3TcpStateTest", LOG_LEVEL_DEBUG);
284  LogComponentEnable ("TcpNewReno", LOG_LEVEL_INFO);
285  LogComponentEnable ("TcpReno", LOG_LEVEL_INFO);
286  LogComponentEnable ("TcpTahoe", LOG_LEVEL_INFO);
287  LogComponentEnable ("TcpSocketBase", LOG_LEVEL_INFO);
288  }
289 
291  // Topology construction
292  //
293 
294  // Create three nodes
295  NodeContainer n0n1;
296  n0n1.Create (2);
297 
299  n1n2.Add (n0n1.Get (1));
300  n1n2.Create (1);
301 
302  // Set up TCP/IP stack to all nodes (and create loopback device at device 0)
303  InternetStackHelper internet;
304  internet.InstallAll ();
305 
306  // Connect the nodes
307  PointToPointHelper p2p;
308  p2p.SetDeviceAttribute ("DataRate", DataRateValue (DataRate (1000000)));
309  p2p.SetChannelAttribute ("Delay", TimeValue (Seconds (0.0001)));
310  NetDeviceContainer dev0 = p2p.Install (n0n1);
311  NetDeviceContainer dev1 = p2p.Install (n1n2);
312 
313  // Add IP addresses to each network interfaces
314  Ipv4AddressHelper ipv4;
315  ipv4.SetBase ("10.1.3.0", "255.255.255.0");
316  ipv4.Assign (dev0);
317  ipv4.SetBase ("10.1.2.0", "255.255.255.0");
318  Ipv4InterfaceContainer ipInterfs = ipv4.Assign (dev1);
319 
320  // Set up routes to all nodes
321  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
322 
324  // A flow from node n0 to node n2
325  //
326 
327  // Create a packet sink to receive packets on node n2
328  uint16_t servPort = 50000; // Destination port number
329  PacketSinkHelper sink ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), servPort));
330  ApplicationContainer sinkApps = sink.Install (n1n2.Get (1));
331  sinkApps.Start (Seconds (0.0));
332  sinkApps.Stop (Seconds (100.0));
333 
334  // Create a data source to send packets on node n0
335  // Instead of full application, here use the socket directly by
336  // registering callbacks in function StarFlow().
337  Ptr<Socket> localSocket = Socket::CreateSocket (n0n1.Get (0),
338  TcpSocketFactory::GetTypeId ());
339  localSocket->Bind ();
340  Simulator::ScheduleNow (&Ns3TcpStateTestCase::StartFlow, this,
341  localSocket, ipInterfs.GetAddress (1), servPort);
342 
343  Config::Connect ("/NodeList/0/$ns3::Ipv4L3Protocol/Tx",
345 
347  // Set up different test cases: Lost model at node n1, different file size
348  //
349 
350  std::list<uint32_t> dropListN0;
351  std::list<uint32_t> dropListN1;
352  std::string caseDescription;
353  switch (m_testCase)
354  {
355  case 0:
356  m_totalTxBytes = 1000;
357  caseDescription = "Verify connection establishment";
358  break;
359  case 1:
360  m_totalTxBytes = 100*1000;
361  caseDescription = "Verify a bigger (100 pkts) transfer: Sliding window operation, etc.";
362  break;
363  case 2:
364  m_totalTxBytes = 1000;
365  caseDescription = "Survive a SYN lost";
366  dropListN0.push_back (0);
367  break;
368  case 3:
369  m_totalTxBytes = 2000;
370  caseDescription = "Survive a SYN+ACK lost";
371  dropListN1.push_back (0);
372  break;
373  case 4:
374  m_totalTxBytes = 2000;
375  caseDescription = "Survive a ACK (last packet in 3-way handshake) lost";
376  dropListN0.push_back (1);
377  break;
378  case 5:
379  m_totalTxBytes = 0;
380  caseDescription = "Immediate FIN upon SYN_RCVD";
381  m_needToClose = false;
382  dropListN0.push_back (1); // Hide the ACK in 3WHS
383  Simulator::Schedule (Seconds (0.002), &Socket::Close, localSocket);
384  break;
385  case 6:
386  m_totalTxBytes = 5000;
387  caseDescription = "Simulated simultaneous close";
388  dropListN1.push_back (5); // Hide the ACK-to-FIN from n2
389  break;
390  case 7:
391  m_totalTxBytes = 5000;
392  caseDescription = "FIN check 1: Loss of initiator's FIN. Wait until app close";
393  m_needToClose = false;
394  dropListN0.push_back (7); // Hide the FIN from n0
395  Simulator::Schedule (Seconds (0.04), &Socket::Close, localSocket);
396  break;
397  case 8:
398  m_totalTxBytes = 5000;
399  caseDescription = "FIN check 2: Loss responder's FIN. FIN will be resent after last ack timeout";
400  dropListN1.push_back (6); // Hide the FIN from n2
401  break;
402  default:
403  NS_FATAL_ERROR ("Program fatal error: specified test case not supported: "
404  << m_testCase);
405  break;
406  }
407 
408  Ptr<ReceiveListErrorModel> errN0 = CreateObject<ReceiveListErrorModel> ();
409  errN0->SetList (dropListN0);
410  dev0.Get (1)->SetAttribute ("ReceiveErrorModel", PointerValue (errN0));
411 
412  Ptr<ReceiveListErrorModel> errN1 = CreateObject<ReceiveListErrorModel> ();
413  errN1->SetList (dropListN1);
414  dev1.Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (errN1));
415 
416  std::ostringstream oss;
417  oss << "tcp-state" << m_testCase << "-test-case";
418  if (m_writeResults)
419  {
420  p2p.EnablePcapAll (oss.str ());
421  p2p.EnableAsciiAll (oss.str ());
422  }
423 
424  if (m_writeLogging)
425  {
426  Ptr<OutputStreamWrapper> osw = Create<OutputStreamWrapper> (&std::clog);
427  *(osw->GetStream ()) << std::setprecision (9) << std::fixed;
428  p2p.EnableAsciiAll (osw);
429 
430  std::clog << std::endl << "Running TCP test-case " << m_testCase << ": "
431  << caseDescription << std::endl;
432  }
433 
434  // Finally, set up the simulator to run. The 1000 second hard limit is a
435  // failsafe in case some change above causes the simulation to never end
436  Simulator::Stop (Seconds (1000));
437  Simulator::Run ();
438  Simulator::Destroy ();
439 
440 
441 }
442 
444 {
445 public:
447 };
448 
450  : TestSuite ("ns3-tcp-state", SYSTEM)
451 {
452  Packet::EnablePrinting (); // Enable packet metadata for all test cases
453  AddTestCase (new Ns3TcpStateTestCase (0), TestCase::QUICK);
454  AddTestCase (new Ns3TcpStateTestCase (1), TestCase::QUICK);
455  AddTestCase (new Ns3TcpStateTestCase (2), TestCase::QUICK);
456  AddTestCase (new Ns3TcpStateTestCase (3), TestCase::QUICK);
457  AddTestCase (new Ns3TcpStateTestCase (4), TestCase::QUICK);
458  AddTestCase (new Ns3TcpStateTestCase (5), TestCase::QUICK);
459  AddTestCase (new Ns3TcpStateTestCase (6), TestCase::QUICK);
460  AddTestCase (new Ns3TcpStateTestCase (7), TestCase::QUICK);
461  AddTestCase (new Ns3TcpStateTestCase (8), TestCase::QUICK);
462 }
463 
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.
void LogComponentEnableAll(enum LogLevel level)
Enable the logging output for all registered log components.
Definition: log.cc:342
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:95
an Inet address class
Hold a bool native type.
Definition: boolean.h:38
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:18
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:1289
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:61
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
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:265
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:744
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:95
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:1113
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:738
void StartFlow(Ptr< Socket > localSocket, Ipv4Address servAddress, uint16_t servPort)
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:71
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:322
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:330
void InstallAll(void) const
Aggregate IPv4, IPv6, UDP, and TCP stacks to all nodes in the simulation.
Attribute for objects of type ns3::Time.
Definition: nstime.h:912
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:46
holds a vector of ns3::NetDevice pointers
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1283
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
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
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:677
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
keep track of a set of node pointers.
hold objects of type Ptr
Definition: pointer.h:33
void WriteUntilBufferFull(Ptr< Socket >, uint32_t)
prefix all trace prints with function
Definition: log.h:95
void SetList(const std::list< uint32_t > &packetlist)
Definition: error-model.cc:515
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 AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual child TestCase case to this TestCase.
Definition: test.cc:184
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
Definition: socket.cc:120
static Ns3TcpStateTestSuite ns3TcpLossTestSuite
bool IsStatusSuccess(void) const
Definition: test.cc:347
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:38
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 cond is false.
Definition: abort.h:136
hold objects of type ns3::DataRate
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
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:845
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:381
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.
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.
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:318
const bool WRITE_VECTORS
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
const uint32_t PCAP_SNAPLEN