22#include "ns3/arp-l3-protocol.h"
23#include "ns3/config.h"
24#include "ns3/icmpv4-l4-protocol.h"
25#include "ns3/icmpv6-l4-protocol.h"
26#include "ns3/inet-socket-address.h"
27#include "ns3/inet6-socket-address.h"
28#include "ns3/ipv4-l3-protocol.h"
29#include "ns3/ipv4-list-routing.h"
30#include "ns3/ipv4-static-routing.h"
31#include "ns3/ipv6-l3-protocol.h"
32#include "ns3/ipv6-list-routing.h"
33#include "ns3/ipv6-static-routing.h"
36#include "ns3/simple-channel.h"
37#include "ns3/simple-net-device.h"
38#include "ns3/simulator.h"
39#include "ns3/socket-factory.h"
40#include "ns3/tcp-l4-protocol.h"
41#include "ns3/tcp-socket-factory.h"
43#include "ns3/traffic-control-layer.h"
44#include "ns3/udp-l4-protocol.h"
45#include "ns3/uinteger.h"
78 void DoRun()
override;
110 const char* netmask);
174 std::ostringstream oss;
175 oss << str <<
" total=" << totalStreamSize <<
" sourceWrite=" << sourceWriteSize
176 <<
" sourceRead=" << sourceReadSize <<
" serverRead=" << serverReadSize
177 <<
" serverWrite=" << serverWriteSize <<
" useIpv6=" << useIpv6;
181static inline std::string
184 std::ostringstream oss;
185 p->CopyData(&oss, p->GetSize());
195 :
TestCase(
Name(
"Send string data from client to server and back",
202 m_totalBytes(totalStreamSize),
203 m_sourceWriteSize(sourceWriteSize),
204 m_sourceReadSize(sourceReadSize),
205 m_serverWriteSize(serverWriteSize),
206 m_serverReadSize(serverReadSize),
223 uint8_t m = (uint8_t)(97 + (i % 26));
245 "Server received expected data buffers");
248 "Source received back expected data buffers");
270 while (sock->GetRxAvailable() > 0)
280 "Server received too many bytes");
294 uint32_t toSend = std::min(left, sock->GetTxAvailable());
298 int sent = sock->Send(p);
314 uint32_t toSend = std::min(left, sock->GetTxAvailable());
318 int sent = sock->Send(p);
337 "Source received too many bytes");
354 node->AggregateObject(tc);
357 node->AggregateObject(arp);
358 arp->SetTrafficControl(tc);
363 ipv4->SetRoutingProtocol(ipv4Routing);
365 ipv4Routing->AddRoutingProtocol(ipv4staticRouting, 0);
366 node->AggregateObject(ipv4);
369 node->AggregateObject(icmp);
372 node->AggregateObject(udp);
375 node->AggregateObject(tcp);
384 node->AddDevice(dev);
386 uint32_t ndid = ipv4->AddInterface(dev);
388 ipv4->AddAddress(ndid, ipv4Addr);
396 const char* netmask =
"255.255.255.0";
397 const char* ipaddr0 =
"192.168.1.1";
398 const char* ipaddr1 =
"192.168.1.2";
405 dev0->SetChannel(channel);
406 dev1->SetChannel(channel);
414 uint16_t
port = 50000;
418 server->Bind(serverlocaladdr);
427 int err = source->GetPeerName(peerAddress);
431 "socket error code should be ERROR_NOTCONN");
433 err = source->Connect(serverremoteaddr);
436 err = source->GetPeerName(peerAddress);
440 "address from socket GetPeerName() should equal the connected address");
455 dev0->SetChannel(channel);
456 dev1->SetChannel(channel);
464 uint16_t
port = 50000;
468 server->Bind(serverlocaladdr);
477 int err = source->GetPeerName(peerAddress);
481 "socket error code should be ERROR_NOTCONN");
483 err = source->Connect(serverremoteaddr);
486 err = source->GetPeerName(peerAddress);
490 "address from socket GetPeerName() should equal the connected address");
501 ipv6->SetRoutingProtocol(ipv6Routing);
503 ipv6Routing->AddRoutingProtocol(ipv6staticRouting, 0);
504 node->AggregateObject(ipv6);
507 node->AggregateObject(icmp);
509 ipv6->RegisterExtensions();
510 ipv6->RegisterOptions();
513 node->AggregateObject(udp);
516 node->AggregateObject(tcp);
519 node->AggregateObject(tc);
528 node->AddDevice(dev);
530 uint32_t ndid = ipv6->AddInterface(dev);
532 ipv6->AddAddress(ndid, ipv6Addr);
TCP Test - send string data from client to server and back.
uint32_t m_serverReadSize
Server data size when receiving.
uint8_t * m_sourceTxPayload
Client Tx payload.
Ptr< SimpleNetDevice > AddSimpleNetDevice(Ptr< Node > node, const char *ipaddr, const char *netmask)
Add a SimpleNetDevice to a node (IPv4 version).
bool m_useIpv6
Use IPv6 instead of IPv4.
void ServerHandleSend(Ptr< Socket > sock, uint32_t available)
Server: Send data.
uint32_t m_currentServerTxBytes
Server Rx bytes.
void DoRun() override
Implementation to actually run this TestCase.
uint32_t m_currentSourceTxBytes
Client Tx bytes.
void ServerHandleRecv(Ptr< Socket > sock)
Server: Receive data.
Ptr< SimpleNetDevice > AddSimpleNetDevice6(Ptr< Node > node, Ipv6Address ipaddr, Ipv6Prefix prefix)
Add a SimpleNetDevice to a node (IPv6 version).
Ptr< Node > CreateInternetNode()
Create a node with the Internet stack (IPv4 version).
Ptr< Node > CreateInternetNode6()
Create a node with the Internet stack (IPv6 version).
void SourceHandleRecv(Ptr< Socket > sock)
Client: Receive data.
void ServerHandleConnectionCreated(Ptr< Socket > s, const Address &addr)
Server: Handle connection created.
TcpTestCase(uint32_t totalStreamSize, uint32_t sourceWriteSize, uint32_t sourceReadSize, uint32_t serverWriteSize, uint32_t serverReadSize, bool useIpv6)
Constructor.
uint32_t m_currentSourceRxBytes
Client Rx bytes.
uint32_t m_totalBytes
Total stream size (in bytes).
uint32_t m_sourceReadSize
Client data size when receiving.
void SetupDefaultSim6()
Setup the test (IPv6 version).
uint8_t * m_sourceRxPayload
Client Rx payload.
uint32_t m_serverWriteSize
Server data size when sending.
void SourceHandleSend(Ptr< Socket > sock, uint32_t available)
Client: Send data.
void SetupDefaultSim()
Setup the test (IPv4 version).
uint32_t m_currentServerRxBytes
Server Tx bytes.
uint8_t * m_serverRxPayload
Server Rx payload.
uint32_t m_sourceWriteSize
Client data size when sending.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
TCP TestSuite - send string data from client to server and back.
a polymophic address class
Ipv4 addresses are stored in host order in this class.
static Ipv4Address GetAny()
Access to the IPv4 forwarding table, interfaces, and configuration.
a class to store IPv4 address information on an interface
a class to represent an Ipv4 address mask
Describes an IPv6 address.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
Access to the IPv6 forwarding table, interfaces, and configuration.
IPv6 address associated with an interface.
Describes an IPv6 prefix.
static Mac48Address ConvertFrom(const Address &address)
static Mac48Address Allocate()
Allocate a new Mac48Address.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
API to create TCP socket instances.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
@ UNIT
This test suite implements a Unit Test.
Callback< R, Args... > MakeNullCallback()
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
static TcpTestSuite g_tcpTestSuite
Static variable for test initialization.
static std::string Name(std::string str, uint32_t totalStreamSize, uint32_t sourceWriteSize, uint32_t serverReadSize, uint32_t serverWriteSize, uint32_t sourceReadSize, bool useIpv6)
static std::string GetString(Ptr< Packet > p)