22 #define NS_LOG_APPEND_CONTEXT \
23 if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_node->GetId () << "] "; }
25 #include "ns3/abort.h"
27 #include "ns3/inet-socket-address.h"
28 #include "ns3/inet6-socket-address.h"
32 #include "ns3/ipv4-interface-address.h"
33 #include "ns3/ipv4-route.h"
34 #include "ns3/ipv6-route.h"
35 #include "ns3/ipv4-routing-protocol.h"
36 #include "ns3/ipv6-routing-protocol.h"
37 #include "ns3/simulation-singleton.h"
38 #include "ns3/simulator.h"
39 #include "ns3/packet.h"
40 #include "ns3/uinteger.h"
41 #include "ns3/double.h"
42 #include "ns3/trace-source-accessor.h"
69 .AddAttribute (
"MaxSegLifetime",
70 "Maximum segment lifetime in seconds, use for TIME_WAIT state transition to CLOSED state",
73 MakeDoubleChecker<double> (0))
74 .AddAttribute (
"MaxWindowSize",
"Max size of advertised window",
77 MakeUintegerChecker<uint16_t> ())
78 .AddTraceSource (
"RTO",
79 "Retransmission timeout",
81 .AddTraceSource (
"RTT",
84 .AddTraceSource (
"NextTxSequence",
85 "Next sequence number to send (SND.NXT)",
87 .AddTraceSource (
"HighestSequence",
88 "Highest sequence number ever sent in socket's life time",
90 .AddTraceSource (
"State",
93 .AddTraceSource (
"RWND",
94 "Remote side's flow control window",
108 m_nextTxSequence (0),
114 m_errno (ERROR_NOTERROR),
115 m_closeNotified (false),
116 m_closeOnEmpty (false),
117 m_shutdownSend (false),
118 m_shutdownRecv (false),
130 m_dupAckCount (sock.m_dupAckCount),
132 m_delAckMaxCount (sock.m_delAckMaxCount),
133 m_noDelay (sock.m_noDelay),
134 m_cnRetries (sock.m_cnRetries),
135 m_delAckTimeout (sock.m_delAckTimeout),
136 m_persistTimeout (sock.m_persistTimeout),
137 m_cnTimeout (sock.m_cnTimeout),
140 m_node (sock.m_node),
143 m_nextTxSequence (sock.m_nextTxSequence),
144 m_highTxMark (sock.m_highTxMark),
145 m_rxBuffer (sock.m_rxBuffer),
146 m_txBuffer (sock.m_txBuffer),
147 m_state (sock.m_state),
148 m_errno (sock.m_errno),
149 m_closeNotified (sock.m_closeNotified),
150 m_closeOnEmpty (sock.m_closeOnEmpty),
151 m_shutdownSend (sock.m_shutdownSend),
152 m_shutdownRecv (sock.m_shutdownRecv),
153 m_connected (sock.m_connected),
155 m_segmentSize (sock.m_segmentSize),
156 m_maxWinSize (sock.m_maxWinSize),
169 Callback<void, Ptr<Socket>, uint32_t> vPSUI = MakeNullCallback<void, Ptr<Socket>, uint32_t> ();
484 NS_ABORT_MSG_IF (flags,
"use of flags is not supported in TcpSocketBase::Send()");
512 return Send (p, flags);
521 NS_ABORT_MSG_IF (flags,
"use of flags is not supported in TcpSocketBase::Recv()");
524 return Create<Packet> ();
527 if (outPacket != 0 && outPacket->
GetSize () != 0)
550 if (packet != 0 && packet->
GetSize () != 0)
766 DoForwardUp (packet, header, port, incomingInterface);
800 if (
m_rWnd.
Get () == 0 && tcpHeader.GetWindowSize () != 0)
802 NS_LOG_LOGIC (
this <<
" Leaving zerowindow persist state");
805 m_rWnd = tcpHeader.GetWindowSize ();
809 &&
OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumber () + packet->
GetSize ()))
812 " received packet of seq [" << tcpHeader.GetSequenceNumber () <<
813 ":" << tcpHeader.GetSequenceNumber () + packet->
GetSize () <<
895 if (
m_rWnd.
Get () == 0 && tcpHeader.GetWindowSize () != 0)
897 NS_LOG_LOGIC (
this <<
" Leaving zerowindow persist state");
900 m_rWnd = tcpHeader.GetWindowSize ();
904 &&
OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumber () + packet->
GetSize ()))
907 " received packet of seq [" << tcpHeader.GetSequenceNumber () <<
908 ":" << tcpHeader.GetSequenceNumber () + packet->
GetSize () <<
996 else if (tcpflags == 0)
1008 NS_LOG_LOGIC (
"Illegal flag " << tcpflags <<
" received. Reset packet is sent.");
1079 packet, tcpHeader, fromAddress, toAddress);
1133 NS_LOG_LOGIC (
"Illegal flag " << std::hex << static_cast<uint32_t> (tcpflags) << std::dec <<
" received. Reset packet is sent.");
1213 NS_LOG_LOGIC (
"Illegal flag " << tcpflags <<
" received. Reset packet is sent.");
1269 NS_LOG_LOGIC (
"Illegal flag " << tcpflags <<
" received. Reset packet is sent.");
1326 NS_LOG_LOGIC (
"Illegal flag " << tcpflags <<
" received. Reset packet is sent.");
1363 NS_LOG_LOGIC (
"Illegal flag " << tcpflags <<
" received. Reset packet is sent.");
1424 NS_LOG_LOGIC (
"TCP " <<
this <<
" calling NotifyNormalClose");
1438 NS_LOG_LOGIC (
"TcpSocketBase " <<
this <<
" scheduling LATO1");
1453 std::vector<Ptr<TcpSocketBase> >::iterator it
1460 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
1474 std::vector<Ptr<TcpSocketBase> >::iterator it
1481 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
1497 NS_LOG_WARN (
"Failed to send empty packet due to null endpoint");
1509 header.SetFlags (flags);
1510 header.SetSequenceNumber (s);
1526 bool hasFin = flags & TcpHeader::FIN;
1560 NS_LOG_LOGIC (
"Schedule retransmission timeout at time "
1586 std::vector<Ptr<TcpSocketBase> >::iterator it
1599 std::vector<Ptr<TcpSocketBase> >::iterator it
1646 if (ipv6->GetRoutingProtocol () == 0)
1657 route = ipv6->GetRoutingProtocol ()->RouteOutput (
Ptr<Packet> (), header, oif, errno_);
1764 NS_LOG_LOGIC (
this <<
" SendDataPacket Schedule ReTxTimeout at time " <<
1769 NS_LOG_LOGIC (
"Send packet via TcpL4Protocol with flags 0x" << std::hex << static_cast<uint32_t> (flags) << std::dec);
1808 uint32_t nPacketsSent = 0;
1812 NS_LOG_LOGIC (
"TcpSocketBase " <<
this <<
" SendPendingData" <<
1836 NS_LOG_LOGIC (
"Invoking Nagle's algorithm. Wait to send.");
1844 NS_LOG_LOGIC (
"SendPendingData sent " << nPacketsSent <<
" packets");
1845 return (nPacketsSent > 0);
1874 uint32_t win =
Window ();
1875 NS_LOG_LOGIC (
"UnAckCount=" << unack <<
", Win=" << win);
1876 return (win < unack) ? 0 : (win - unack);
1892 " pkt size " << p->
GetSize () );
1931 NS_LOG_WARN (
"Why TCP " <<
this <<
" got data after close notification?");
1962 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
1967 NS_LOG_LOGIC (
this <<
" Schedule ReTxTimeout at time " <<
1974 NS_LOG_LOGIC (
this <<
"Enter zerowindow persist state");
1975 NS_LOG_LOGIC (
this <<
"Cancelled ReTxTimeout event which was set to expire at " <<
1998 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
2271 return (!allowBroadcast);