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"
79 void DoRun()
override;
111 const char* netmask);
175 std::ostringstream oss;
176 oss << str <<
" total=" << totalStreamSize <<
" sourceWrite=" << sourceWriteSize
177 <<
" sourceRead=" << sourceReadSize <<
" serverRead=" << serverReadSize
178 <<
" serverWrite=" << serverWriteSize <<
" useIpv6=" << useIpv6;
182static inline std::string
185 std::ostringstream oss;
196 :
TestCase(
Name(
"Send string data from client to server and back",
203 m_totalBytes(totalStreamSize),
204 m_sourceWriteSize(sourceWriteSize),
205 m_sourceReadSize(sourceReadSize),
206 m_serverWriteSize(serverWriteSize),
207 m_serverReadSize(serverReadSize),
224 uint8_t m = (uint8_t)(97 + (i % 26));
246 "Server received expected data buffers");
249 "Source received back expected data buffers");
258 Simulator::Destroy();
275 if (!p && sock->
GetErrno() != Socket::ERROR_NOTERROR)
281 "Server received too many bytes");
299 int sent = sock->
Send(p);
319 int sent = sock->
Send(p);
332 if (!p && sock->
GetErrno() != Socket::ERROR_NOTERROR)
338 "Source received too many bytes");
359 arp->SetTrafficControl(tc);
364 ipv4->SetRoutingProtocol(ipv4Routing);
366 ipv4Routing->AddRoutingProtocol(ipv4staticRouting, 0);
384 dev->SetAddress(Mac48Address::ConvertFrom(Mac48Address::Allocate()));
387 uint32_t ndid = ipv4->AddInterface(dev);
389 ipv4->AddAddress(ndid, ipv4Addr);
397 const char* netmask =
"255.255.255.0";
398 const char* ipaddr0 =
"192.168.1.1";
399 const char* ipaddr1 =
"192.168.1.2";
415 uint16_t
port = 50000;
419 server->Bind(serverlocaladdr);
431 Socket::ERROR_NOTCONN,
432 "socket error code should be ERROR_NOTCONN");
434 err = source->
Connect(serverremoteaddr);
441 "address from socket GetPeerName() should equal the connected address");
465 uint16_t
port = 50000;
469 server->Bind(serverlocaladdr);
481 Socket::ERROR_NOTCONN,
482 "socket error code should be ERROR_NOTCONN");
484 err = source->
Connect(serverremoteaddr);
491 "address from socket GetPeerName() should equal the connected address");
502 ipv6->SetRoutingProtocol(ipv6Routing);
504 ipv6Routing->AddRoutingProtocol(ipv6staticRouting, 0);
510 ipv6->RegisterExtensions();
511 ipv6->RegisterOptions();
528 dev->SetAddress(Mac48Address::ConvertFrom(Mac48Address::Allocate()));
531 uint32_t ndid = ipv6->AddInterface(dev);
533 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)