23 #include "ns3/abort.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/data-rate.h"
30 #include "ns3/inet-socket-address.h"
31 #include "ns3/point-to-point-helper.h"
32 #include "ns3/internet-stack-helper.h"
33 #include "ns3/ipv4-global-routing-helper.h"
34 #include "ns3/ipv4-address-helper.h"
35 #include "ns3/packet-sink-helper.h"
36 #include "ns3/tcp-socket-factory.h"
37 #include "ns3/node-container.h"
38 #include "ns3/simulator.h"
39 #include "ns3/error-model.h"
40 #include "ns3/pointer.h"
41 #include "ns3tcp-socket-writer.h"
47 const bool WRITE_VECTORS =
false;
48 const bool WRITE_LOGGING =
false;
49 const uint32_t PCAP_LINK_TYPE = 1187373554;
50 const uint32_t PCAP_SNAPLEN = 64;
65 virtual void DoSetup (
void);
66 virtual void DoRun (
void);
67 virtual void DoTeardown (
void);
69 std::string m_pcapFilename;
72 uint32_t m_totalTxBytes;
73 uint32_t m_currentTxBytes;
80 void WriteUntilBufferFull (
Ptr<Socket> localSocket, uint32_t txSpace);
87 Ns3TcpStateTestCase::Ns3TcpStateTestCase ()
88 :
TestCase (
"Check the operation of the TCP state machine for several cases"),
90 m_totalTxBytes (20000),
92 m_writeVectors (WRITE_VECTORS),
93 m_writeResults (false),
94 m_writeLogging (WRITE_LOGGING),
99 Ns3TcpStateTestCase::Ns3TcpStateTestCase (uint32_t testCase)
100 :
TestCase (
"Check the operation of the TCP state machine for several cases"),
101 m_testCase (testCase),
102 m_totalTxBytes (20000),
103 m_currentTxBytes (0),
104 m_writeVectors (WRITE_VECTORS),
105 m_writeResults (false),
106 m_writeLogging (WRITE_LOGGING),
118 std::ostringstream oss;
119 oss <<
"/response-vectors/ns3tcp-state" << m_testCase <<
"-response-vectors.pcap";
120 m_pcapFilename =
static_cast<std::string
> (NS_TEST_SOURCEDIR) + oss.str ();
124 m_pcapFile.
Open (m_pcapFilename, std::ios::out|std::ios::binary);
125 m_pcapFile.
Init (PCAP_LINK_TYPE, PCAP_SNAPLEN);
129 m_pcapFile.
Open (m_pcapFilename, std::ios::in|std::ios::binary);
130 NS_ABORT_MSG_UNLESS (m_pcapFile.GetDataLinkType () == PCAP_LINK_TYPE,
"Wrong response vectors in directory");
161 Time tNow = Simulator::Now ();
165 uint8_t *buf =
new uint8_t[size];
168 m_pcapFile.
Write (uint32_t (tMicroSeconds / 1000000),
169 uint32_t (tMicroSeconds % 1000000),
180 uint8_t expected[PCAP_SNAPLEN];
181 uint32_t tsSec, tsUsec, inclLen, origLen, readLen;
182 m_pcapFile.
Read (expected,
sizeof(expected), tsSec, tsUsec, inclLen, origLen, readLen);
184 uint8_t *actual =
new uint8_t[readLen];
187 uint32_t result = memcmp (actual, expected, readLen);
196 NS_TEST_EXPECT_MSG_EQ (result, 0,
"Expected data comparison error");
204 Ns3TcpStateTestCase::WriteUntilBufferFull (
Ptr<Socket> localSocket, uint32_t txSpace)
206 while (m_currentTxBytes < m_totalTxBytes)
208 uint32_t left = m_totalTxBytes - m_currentTxBytes;
209 uint32_t dataOffset = m_currentTxBytes % 1040;
210 uint32_t toWrite = 1040 - dataOffset;
212 toWrite = std::min (toWrite, left);
213 toWrite = std::min (toWrite, txAvail);
220 std::clog <<
"Submitting "
221 << toWrite <<
" bytes to TCP socket" << std::endl;
223 int amountSent = localSocket->
Send (0, toWrite, 0);
225 m_currentTxBytes += amountSent;
231 std::clog <<
"Close socket at "
232 << Simulator::Now ().GetSeconds ()
235 localSocket->
Close ();
236 m_needToClose =
false;
241 Ns3TcpStateTestCase::StartFlow (
Ptr<Socket> localSocket,
247 std::clog <<
"Starting flow at time "
248 << Simulator::Now ().GetSeconds ()
257 (&Ns3TcpStateTestCase::WriteUntilBufferFull,
259 WriteUntilBufferFull (localSocket, localSocket->
GetTxAvailable ());
270 std::string tcpModel (
"ns3::TcpNewReno");
272 Config::SetDefault (
"ns3::TcpL4Protocol::SocketType",
StringValue (tcpModel));
273 Config::SetDefault (
"ns3::TcpSocket::SegmentSize",
UintegerValue (1000));
274 Config::SetDefault (
"ns3::TcpSocket::DelAckCount",
UintegerValue (1));
275 Config::SetDefault (
"ns3::DropTailQueue::MaxPackets",
UintegerValue (20));
314 ipv4.
SetBase (
"10.1.3.0",
"255.255.255.0");
316 ipv4.
SetBase (
"10.1.2.0",
"255.255.255.0");
320 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
327 uint16_t servPort = 50000;
337 TcpSocketFactory::GetTypeId ());
338 localSocket->
Bind ();
339 Simulator::ScheduleNow (&Ns3TcpStateTestCase::StartFlow,
this,
340 localSocket, ipInterfs.
GetAddress (1), servPort);
342 Config::Connect (
"/NodeList/0/$ns3::Ipv4L3Protocol/Tx",
349 std::list<uint32_t> dropListN0;
350 std::list<uint32_t> dropListN1;
351 std::string caseDescription;
355 m_totalTxBytes = 1000;
356 caseDescription =
"Verify connection establishment";
359 m_totalTxBytes = 100*1000;
360 caseDescription =
"Verify a bigger (100 pkts) transfer: Sliding window operation, etc.";
363 m_totalTxBytes = 1000;
364 caseDescription =
"Survive a SYN lost";
365 dropListN0.push_back (0);
368 m_totalTxBytes = 2000;
369 caseDescription =
"Survive a SYN+ACK lost";
370 dropListN1.push_back (0);
373 m_totalTxBytes = 2000;
374 caseDescription =
"Survive a ACK (last packet in 3-way handshake) lost";
375 dropListN0.push_back (1);
379 caseDescription =
"Immediate FIN upon SYN_RCVD";
380 m_needToClose =
false;
381 dropListN0.push_back (1);
382 Simulator::Schedule (
Seconds (0.002), &Socket::Close, localSocket);
385 m_totalTxBytes = 5000;
386 caseDescription =
"Simulated simultaneous close";
387 dropListN1.push_back (5);
390 m_totalTxBytes = 5000;
391 caseDescription =
"FIN check 1: Loss of initiator's FIN. Wait until app close";
392 m_needToClose =
false;
393 dropListN0.push_back (7);
394 Simulator::Schedule (
Seconds (0.04), &Socket::Close, localSocket);
397 m_totalTxBytes = 5000;
398 caseDescription =
"FIN check 2: Loss responder's FIN. FIN will be resent after last ack timeout";
399 dropListN1.push_back (6);
402 NS_FATAL_ERROR (
"Program fatal error: specified test case not supported: "
409 dev0.
Get (1)->SetAttribute (
"ReceiveErrorModel",
PointerValue (errN0));
413 dev1.
Get (0)->SetAttribute (
"ReceiveErrorModel",
PointerValue (errN1));
415 std::ostringstream oss;
416 oss <<
"tcp-state" << m_testCase <<
"-test-case";
426 *(osw->
GetStream ()) << std::setprecision (9) << std::fixed;
429 std::clog << std::endl <<
"Running TCP test-case " << m_testCase <<
": "
430 << caseDescription << std::endl;
435 Simulator::Stop (
Seconds (1000));
437 Simulator::Destroy ();
448 Ns3TcpStateTestSuite::Ns3TcpStateTestSuite ()
451 Packet::EnablePrinting ();
uint32_t RemoveHeader(Header &header)
holds a vector of ns3::Application pointers.
void LogComponentEnableAll(enum LogLevel level)
holds a vector of std::pair of Ptr<Ipv4> and interface index.
hold variables of type string
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
aggregate IP/TCP/UDP functionality to existing Nodes.
uint32_t GetSize(void) const
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if cond is false.
#define NS_FATAL_ERROR(msg)
fatal error handling
Class for representing data rates.
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
void InstallAll(void) const
hold objects of type ns3::Time
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.
Hold an unsigned integer type.
holds a vector of ns3::NetDevice pointers
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
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 test case.
virtual void DoTeardown(void)
Implementation to do any local setup required for this test case.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
Ptr< Packet > Copy(void) const
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<T>
void SetList(const std::list< uint32_t > &packetlist)
virtual void DoSetup(void)
Implementation to do any local setup required for this test case.
void Init(uint32_t dataLinkType, uint32_t snapLen=SNAPLEN_DEFAULT, int32_t timeZoneCorrection=ZONE_DEFAULT, bool swapMode=false)
void AddTestCase(TestCase *testCase) NS_DEPRECATED
Add an individual test case to this test suite.
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
bool IsStatusSuccess(void) const
void Open(std::string const &filename, std::ios::openmode mode)
void SetChannelAttribute(std::string name, const AttributeValue &value)
Ipv4 addresses are stored in host order in this class.
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...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
hold objects of type ns3::DataRate
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
ApplicationContainer Install(NodeContainer c) const
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.
void Write(uint32_t tsSec, uint32_t tsUsec, uint8_t const *const data, uint32_t totalLen)
Write next packet to file.
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.
std::ostream * GetStream(void)
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)
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const