|
A Discrete-Event Network Simulator
|
API
|
Go to the documentation of this file.
23 #include "ns3/ipv4-interface-address.h"
24 #include "ns3/ipv4-route.h"
25 #include "ns3/ipv6-route.h"
26 #include "ns3/ipv4-routing-protocol.h"
27 #include "ns3/ipv6-routing-protocol.h"
28 #include "ns3/ipv4-end-point.h"
29 #include "ns3/ipv6-end-point.h"
34 #include "ns3/tcp-l4-protocol.h"
35 #include "ns3/tcp-tx-buffer.h"
36 #include "ns3/tcp-rx-buffer.h"
62 TcpEcnTest (uint32_t testcase,
const std::string &desc);
65 virtual void CWndTrace (uint32_t oldValue, uint32_t newValue);
136 static TypeId tid =
TypeId (
"ns3::TcpSocketCongestedRouter")
138 .SetGroupName (
"Internet")
162 bool isRetransmission =
false;
165 isRetransmission =
true;
341 NS_LOG_LOGIC (
this <<
" SendDataPacket Schedule ReTxTimeout at time " <<
353 NS_LOG_DEBUG (
"Send segment of size " << sz <<
" with remaining data " <<
355 ". Header " << header);
361 NS_LOG_DEBUG (
"Send segment of size " << sz <<
" with remaining data " <<
363 ". Header " << header);
382 return CopyObject<TcpSocketCongestedRouter> (
this);
388 m_cwndChangeCount (0),
390 m_senderReceived (0),
391 m_receiverReceived (0),
392 m_testcase (testcase)
415 if (newValue < oldValue)
467 NS_TEST_ASSERT_MSG_EQ (((h.
GetFlags ()) &
TcpHeader::ECE), 0,
"The flag ECE should not be set in TCP header of the packet sent by the receiver after sender sends CWR flags to receiver and receiver receives a packet without CE bit set in IP header");
486 ipTos =
static_cast<uint16_t
> (ipTosTag.
GetTos ());
490 NS_TEST_ASSERT_MSG_EQ (ipTos, 0x2,
"IP TOS should have ECT set if ECN negotiation between endpoints is successful");
496 NS_TEST_ASSERT_MSG_EQ (ipTos, 0x3,
"IP TOS should have CE bit set for 3rd and 5th packet sent in test case 5");
500 NS_TEST_ASSERT_MSG_EQ (ipTos, 0x2,
"IP TOS should have ECT set if ECN negotiation between endpoints is successful");
505 NS_TEST_ASSERT_MSG_NE (ipTos, 0x2,
"IP TOS should not have ECT set if ECN negotiation between endpoints is unsuccessful");
540 AddTestCase (
new TcpEcnTest (1,
"ECN Negotiation Test : ECN incapable sender and ECN incapable receiver"),
542 AddTestCase (
new TcpEcnTest (2,
"ECN Negotiation Test : ECN capable sender and ECN incapable receiver"),
544 AddTestCase (
new TcpEcnTest (3,
"ECN Negotiation Test : ECN incapable sender and ECN capable receiver"),
546 AddTestCase (
new TcpEcnTest (4,
"ECN Negotiation Test : ECN capable sender and ECN capable receiver"),
548 AddTestCase (
new TcpEcnTest (5,
"ECE and CWR Functionality Test: ECN capable sender and ECN capable receiver"),
550 AddTestCase (
new TcpEcnTest (6,
"Congestion Window Reduction Test :ECN capable sender and ECN capable receiver"),
a unique identifier for an interface.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
bool ReplacePacketTag(Tag &tag)
Replace the value of a packet tag.
TracedValue< SequenceNumber32 > m_ecnCWRSeq
Sequence number of the last sent CWR.
uint32_t m_receiverReceived
Number of segments received by the receiver.
virtual uint16_t AdvertisedWindowSize(bool scale=true) const
The amount of Rx window announced to the peer.
uint8_t m_testcase
Test case type.
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
T Get(void) const
Get the underlying value.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
@ ECN_ECE_RCVD
Last ACK received had ECE bit set in TCP header
@ LAST_ACK
Our side has shutdown after remote has shutdown.
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
static Time Now(void)
Return the current simulation virtual time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
TracedValue< SequenceNumber32 > m_highTxMark
Highest seqno ever sent, regardless of ReTx.
uint32_t m_senderReceived
Number of segments received by the sender.
virtual void ConfigureProperties(void)
Change the configuration of the socket properties.
uint8_t GetTos(void) const
Get the tag's TOS.
Ipv6Address GetLocalAddress()
Get the local address.
Class for inserting callbacks special points of the flow of TCP sockets.
virtual Ptr< TcpSocketMsgBase > CreateSocket(Ptr< Node > node, TypeId socketType, TypeId congControl)
Create a socket.
bool m_closeOnEmpty
Close socket upon tx buffer emptied.
TracedValue< SequenceNumber32 > m_ecnEchoSeq
Sequence number of the last received ECN Echo.
static TcpEcnTestSuite g_tcpECNTestSuite
static var for test initialization
@ FIN_WAIT_1
Our side has shutdown, waiting to complete transmission of remaining buffered data
virtual void Tx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet transmitted down to IP layer.
uint32_t m_dataPacketSent
Number of packets sent.
void AddOptions(TcpHeader &tcpHeader)
Add options to TcpHeader.
virtual void Rx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet received from IP layer.
TracedValue< EcnState_t > m_ecnState
Current ECN State, represented as combination of EcnState values.
EventId m_retxEvent
Retransmission event.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
virtual void ReTxTimeout(void)
An RTO event happened.
A TCP socket which sends certain data packets with CE flags set for tests 5 and 6.
TcpSocketCongestedRouter(const TcpSocketCongestedRouter &other)
Constructor.
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Ptr< TcpSocketState > m_tcb
Congestion control information.
#define NS_TEST_ASSERT_MSG_NE(actual, limit, msg)
Test that an actual and expected (limit) value are not equal and report and abort if not.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
virtual uint8_t GetIpTtl(void) const
Query the value of IP Time to Live field of this socket.
Ptr< TcpSocketBase > Fork(void)
Call CopyObject<> to clone me.
static const char *const EcnStateName[TcpSocketState::ECN_CWR_SENT+1]
Literal names of ECN states for use in log messages.
virtual uint8_t GetIpv6HopLimit(void) const
Query the value of IP Hop Limit field of this socket.
void SetPriority(uint8_t priority)
Set the tag's priority.
uint32_t m_senderSent
Number of segments sent by the sender.
Ptr< TcpL4Protocol > m_tcp
the associated TCP L4 protocol
Ipv6Address GetPeerAddress()
Get the peer address.
uint16_t GetLocalPort(void)
Get the local port.
@ CLOSE_WAIT
Remote side has shutdown and is waiting for us to finish writing our data and to shutdown (we have to...
@ ESTABLISHED
Connection established
virtual void UpdateRttHistory(const SequenceNumber32 &seq, uint32_t sz, bool isRetransmission)
Update the RTT history, when we send TCP segments.
EventId m_delAckEvent
Delayed ACK timeout event.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
@ ECN_DISABLED
ECN disabled traffic
Ipv6EndPoint * m_endPoint6
the IPv6 endpoint
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer.
TcpEcnTest(uint32_t testcase, const std::string &desc)
Constructor.
checks if ECT, CWR and ECE bits are set correctly in different scenarios
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
uint16_t GetLocalPort()
Get the local port.
Ptr< TcpTxBuffer > m_txBuffer
Tx buffer.
uint8_t MarkEcnEct0(uint8_t tos) const
Mark ECT(0) codepoint.
@ ECN_CWR_SENT
Sender has reduced the congestion window, and sent a packet with CWR bit set in TCP header.
void SetTestCase(uint8_t testCase)
Set the test case type.
uint16_t GetPeerPort()
Get the peer port.
Ipv4Address GetLocalAddress(void)
Get the local address.
bool IsManualIpv6HopLimit(void) const
Checks if the socket has a specific IPv6 Hop Limit set.
indicates whether the socket has IPV6_TCLASS set.
uint8_t MarkEcnCe(uint8_t tos) const
Mark CE codepoint.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
TracedValue< TcpStates_t > m_state
TCP state.
General infrastructure for TCP testing.
Ptr< TcpRxBuffer > m_rxBuffer
Rx buffer (reordering buffer)
void AddPacketTag(const Tag &tag) const
Add a packet tag.
indicates whether the socket has a priority set.
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
uint32_t m_testcase
Test case type.
bool IsManualIpv6Tclass(void) const
Checks if the socket has a specific IPv6 Tclass set.
virtual uint32_t SendDataPacket(SequenceNumber32 seq, uint32_t maxSize, bool withAck)
Extract at most maxSize bytes from the TxBuffer at sequence seq, add the TCP header,...
void SetTclass(uint8_t tclass)
Set the tag's Tclass.
indicates whether the socket has IP_TOS set.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
uint32_t m_delAckCount
Delayed ACK counter.
void SetTos(uint8_t tos)
Set the tag's TOS.
@ UNIT
This test suite implements a Unit Test.
TracedValue< Time > m_rto
Retransmit timeout.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer.
TypeId m_congControlTypeId
Congestion control.
uint8_t GetPriority(void) const
Query the priority value of this socket.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
uint16_t GetPeerPort(void)
Get the peer port.
TcpSocketCongestedRouter()
TracedCallback< Ptr< const Packet >, const TcpHeader &, Ptr< const TcpSocketBase > > m_txTrace
Trace of transmitted packets.
void ConfigureProperties()
Change the configuration of the socket properties.
void SetUseEcn(SocketWho who, TcpSocketState::UseEcn_t useEcn)
Forcefully set the ECN mode of use.
Ptr< NetDevice > m_boundnetdevice
the device this socket is bound to (might be null).
Ipv4Address GetPeerAddress(void)
Get the peer address.
static TypeId GetTypeId(void)
Get the type ID.
void NotifyDataSent(uint32_t size)
Notify through the callback (if set) that some data have been sent.
bool IsManualIpTtl(void) const
Checks if the socket has a specific IPv4 TTL set.
uint8_t GetIpTos(void) const
Query the value of IP Type of Service of this socket.
virtual void CWndTrace(uint32_t oldValue, uint32_t newValue)
Tracks the congestion window changes.
uint8_t GetIpv6Tclass(void) const
Query the value of IPv6 Traffic Class field of this socket.
uint32_t m_cwndChangeCount
Number of times the congestion window did change.
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
virtual void ReTxTimeout()
An RTO event happened.
void SetHopLimit(uint8_t hopLimit)
Set the tag's Hop Limit.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.