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;
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");
257 Simulator::Destroy();
274 if (!p && sock->
GetErrno() != Socket::ERROR_NOTERROR)
280 "Server received too many bytes");
298 int sent = sock->
Send(p);
318 int sent = sock->
Send(p);
331 if (!p && sock->
GetErrno() != Socket::ERROR_NOTERROR)
337 "Source received too many bytes");
358 arp->SetTrafficControl(tc);
363 ipv4->SetRoutingProtocol(ipv4Routing);
365 ipv4Routing->AddRoutingProtocol(ipv4staticRouting, 0);
383 dev->SetAddress(Mac48Address::ConvertFrom(Mac48Address::Allocate()));
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";
414 uint16_t
port = 50000;
418 server->Bind(serverlocaladdr);
430 Socket::ERROR_NOTCONN,
431 "socket error code should be ERROR_NOTCONN");
433 err = source->
Connect(serverremoteaddr);
440 "address from socket GetPeerName() should equal the connected address");
464 uint16_t
port = 50000;
468 server->Bind(serverlocaladdr);
480 Socket::ERROR_NOTCONN,
481 "socket error code should be ERROR_NOTCONN");
483 err = source->
Connect(serverremoteaddr);
490 "address from socket GetPeerName() should equal the connected address");
501 ipv6->SetRoutingProtocol(ipv6Routing);
503 ipv6Routing->AddRoutingProtocol(ipv6staticRouting, 0);
509 ipv6->RegisterExtensions();
510 ipv6->RegisterOptions();
527 dev->SetAddress(Mac48Address::ConvertFrom(Mac48Address::Allocate()));
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.
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.
Access to the IPv6 forwarding table, interfaces, and configuration.
IPv6 address associated with an interface.
Describes an IPv6 prefix.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
virtual uint32_t GetRxAvailable() const =0
Return number of bytes which can be returned from one or multiple calls to Recv.
virtual int GetPeerName(Address &address) const =0
Get the peer address of a connected socket.
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
virtual enum Socket::SocketErrno GetErrno() const =0
Get last error number.
virtual Ptr< Packet > Recv(uint32_t maxSize, uint32_t flags)=0
Read data from the socket.
virtual int Close()=0
Close a socket.
virtual uint32_t GetTxAvailable() const =0
Returns the number of bytes which can be sent in a single call to Send.
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)