22 #define NS_LOG_APPEND_CONTEXT \ 23 if (m_node) { std::clog << " [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/pointer.h" 43 #include "ns3/trace-source-accessor.h" 44 #include "ns3/data-rate.h" 45 #include "ns3/object.h" 76 .SetGroupName (
"Internet")
83 .AddAttribute (
"MaxSegLifetime",
84 "Maximum segment lifetime in seconds, use for TIME_WAIT state transition to CLOSED state",
87 MakeDoubleChecker<double> (0))
88 .AddAttribute (
"MaxWindowSize",
"Max size of advertised window",
91 MakeUintegerChecker<uint16_t> ())
92 .AddAttribute (
"IcmpCallback",
"Callback invoked whenever an icmp error is received on this socket.",
96 .AddAttribute (
"IcmpCallback6",
"Callback invoked whenever an icmpv6 error is received on this socket.",
100 .AddAttribute (
"WindowScaling",
"Enable or disable Window Scaling option",
104 .AddAttribute (
"Sack",
"Enable or disable Sack option",
108 .AddAttribute (
"Timestamp",
"Enable or disable Timestamp option",
112 .AddAttribute (
"MinRto",
113 "Minimum retransmit timeout value",
119 .AddAttribute (
"ClockGranularity",
120 "Clock Granularity used in RTO calculations",
125 .AddAttribute (
"TxBuffer",
129 MakePointerChecker<TcpTxBuffer> ())
130 .AddAttribute (
"RxBuffer",
134 MakePointerChecker<TcpRxBuffer> ())
135 .AddAttribute (
"ReTxThreshold",
"Threshold for fast retransmit",
139 MakeUintegerChecker<uint32_t> ())
140 .AddAttribute (
"LimitedTransmit",
"Enable limited transmit",
144 .AddAttribute (
"EcnMode",
"Determines the mode of ECN",
148 EcnMode_t::ClassicEcn,
"ClassicEcn"))
149 .AddTraceSource (
"RTO",
150 "Retransmission timeout",
152 "ns3::TracedValueCallback::Time")
153 .AddTraceSource (
"RTT",
156 "ns3::TracedValueCallback::Time")
157 .AddTraceSource (
"NextTxSequence",
158 "Next sequence number to send (SND.NXT)",
160 "ns3::SequenceNumber32TracedValueCallback")
161 .AddTraceSource (
"HighestSequence",
162 "Highest sequence number ever sent in socket's life time",
164 "ns3::TracedValueCallback::SequenceNumber32")
165 .AddTraceSource (
"State",
168 "ns3::TcpStatesTracedValueCallback")
169 .AddTraceSource (
"CongState",
170 "TCP Congestion machine state",
172 "ns3::TcpSocketState::TcpCongStatesTracedValueCallback")
173 .AddTraceSource (
"EcnState",
174 "Trace ECN state change of socket",
176 "ns3::TcpSocketState::EcnStatesTracedValueCallback")
177 .AddTraceSource (
"AdvWND",
178 "Advertised Window Size",
180 "ns3::TracedValueCallback::Uint32")
181 .AddTraceSource (
"RWND",
182 "Remote side's flow control window",
184 "ns3::TracedValueCallback::Uint32")
185 .AddTraceSource (
"BytesInFlight",
186 "Socket estimation of bytes in flight",
188 "ns3::TracedValueCallback::Uint32")
189 .AddTraceSource (
"HighestRxSequence",
190 "Highest sequence number received from peer",
192 "ns3::TracedValueCallback::SequenceNumber32")
193 .AddTraceSource (
"HighestRxAck",
194 "Highest ack received from peer",
196 "ns3::TracedValueCallback::SequenceNumber32")
197 .AddTraceSource (
"CongestionWindow",
198 "The TCP connection's congestion window",
200 "ns3::TracedValueCallback::Uint32")
201 .AddTraceSource (
"CongestionWindowInflated",
202 "The TCP connection's congestion window inflates as in older RFC",
204 "ns3::TracedValueCallback::Uint32")
205 .AddTraceSource (
"SlowStartThreshold",
206 "TCP slow start threshold (bytes)",
208 "ns3::TracedValueCallback::Uint32")
209 .AddTraceSource (
"Tx",
210 "Send tcp packet to IP protocol",
212 "ns3::TcpSocketBase::TcpTxRxTracedCallback")
213 .AddTraceSource (
"Rx",
214 "Receive tcp packet from IP protocol",
216 "ns3::TcpSocketBase::TcpTxRxTracedCallback")
217 .AddTraceSource (
"EcnEchoSeq",
218 "Sequence of last received ECN Echo",
220 "ns3::SequenceNumber32TracedValueCallback")
221 .AddTraceSource (
"EcnCeSeq",
222 "Sequence of last received CE ",
224 "ns3::SequenceNumber32TracedValueCallback")
225 .AddTraceSource (
"EcnCwrSeq",
226 "Sequence of last received CWR",
228 "ns3::SequenceNumber32TracedValueCallback")
245 m_tcb = CreateObject<TcpSocketState> ();
292 m_dupAckCount (sock.m_dupAckCount),
294 m_delAckMaxCount (sock.m_delAckMaxCount),
295 m_noDelay (sock.m_noDelay),
296 m_synCount (sock.m_synCount),
297 m_synRetries (sock.m_synRetries),
298 m_dataRetrCount (sock.m_dataRetrCount),
299 m_dataRetries (sock.m_dataRetries),
301 m_minRto (sock.m_minRto),
302 m_clockGranularity (sock.m_clockGranularity),
303 m_delAckTimeout (sock.m_delAckTimeout),
304 m_persistTimeout (sock.m_persistTimeout),
305 m_cnTimeout (sock.m_cnTimeout),
306 m_endPoint (nullptr),
307 m_endPoint6 (nullptr),
308 m_node (sock.m_node),
310 m_state (sock.m_state),
311 m_errno (sock.m_errno),
312 m_closeNotified (sock.m_closeNotified),
313 m_closeOnEmpty (sock.m_closeOnEmpty),
314 m_shutdownSend (sock.m_shutdownSend),
315 m_shutdownRecv (sock.m_shutdownRecv),
316 m_connected (sock.m_connected),
318 m_maxWinSize (sock.m_maxWinSize),
319 m_bytesAckedNotProcessed (sock.m_bytesAckedNotProcessed),
320 m_rWnd (sock.m_rWnd),
321 m_highRxMark (sock.m_highRxMark),
322 m_highRxAckMark (sock.m_highRxAckMark),
323 m_sackEnabled (sock.m_sackEnabled),
324 m_winScalingEnabled (sock.m_winScalingEnabled),
325 m_rcvWindShift (sock.m_rcvWindShift),
326 m_sndWindShift (sock.m_sndWindShift),
327 m_timestampEnabled (sock.m_timestampEnabled),
328 m_timestampToEcho (sock.m_timestampToEcho),
329 m_recover (sock.m_recover),
330 m_retxThresh (sock.m_retxThresh),
331 m_limitedTx (sock.m_limitedTx),
332 m_isFirstPartialAck (sock.m_isFirstPartialAck),
333 m_txTrace (sock.m_txTrace),
334 m_rxTrace (sock.m_rxTrace),
335 m_pacingTimer (
Timer::REMOVE_ON_DESTROY),
336 m_ecnMode (sock.m_ecnMode),
337 m_ecnEchoSeq (sock.m_ecnEchoSeq),
338 m_ecnCESeq (sock.m_ecnCESeq),
339 m_ecnCWRSeq (sock.m_ecnCWRSeq)
495 m_tcp->AddSocket (
this);
511 m_tcp->AddSocket (
this);
582 m_tcp->AddSocket (
this);
593 "TcpSocketBase::SetSSThresh() cannot change initial ssThresh after connection started.");
608 "TcpSocketBase::SetInitialCwnd() cannot change initial cwnd after connection started.");
645 NS_LOG_ERROR (
"Route to destination does not exist ?!");
676 NS_LOG_ERROR (
"Route to destination does not exist ?!");
723 NS_LOG_WARN (
"Socket " <<
this <<
" << unread rx data during close. Sending reset." <<
724 "This is probably due to a bad sink application; check its code");
790 NS_ABORT_MSG_IF (flags,
"use of flags is not supported in TcpSocketBase::Send()");
830 return Send (p, flags);
839 NS_ABORT_MSG_IF (flags,
"use of flags is not supported in TcpSocketBase::Recv()");
842 return Create<Packet> ();
855 if (packet !=
nullptr && packet->
GetSize () != 0)
1089 return (
m_rxBuffer->NextRxSequence () != head);
1093 return (tail < m_rxBuffer->NextRxSequence () ||
m_rxBuffer->MaxRxSequence () <= head);
1114 uint32_t bytesRemoved = packet->
PeekHeader (tcpHeader);
1117 packet->
GetSize () - bytesRemoved))
1153 uint32_t bytesRemoved = packet->
PeekHeader (tcpHeader);
1156 packet->
GetSize () - bytesRemoved))
1179 uint8_t icmpType, uint8_t icmpCode,
1182 NS_LOG_FUNCTION (
this << icmpSource << static_cast<uint32_t> (icmpTtl) <<
1183 static_cast<uint32_t> (icmpType) <<
1184 static_cast<uint32_t> (icmpCode) << icmpInfo);
1187 m_icmpCallback (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1193 uint8_t icmpType, uint8_t icmpCode,
1196 NS_LOG_FUNCTION (
this << icmpSource << static_cast<uint32_t> (icmpTtl) <<
1197 static_cast<uint32_t> (icmpType) <<
1198 static_cast<uint32_t> (icmpCode) << icmpInfo);
1207 const uint32_t tcpPayloadSize)
1209 if (tcpHeaderSize == 0 || tcpHeaderSize > 60)
1211 NS_LOG_ERROR (
"Bytes removed: " << tcpHeaderSize <<
" invalid");
1214 else if (tcpPayloadSize > 0 &&
OutOfRange (seq, seq + tcpPayloadSize))
1218 " received packet of seq [" << seq <<
1219 ":" << seq + tcpPayloadSize <<
1220 ") out of range [" <<
m_rxBuffer->NextRxSequence () <<
":" <<
1317 " received packet of seq [" << seq <<
1318 ":" << seq + packet->
GetSize () <<
1319 ") without TS option. Silently discard it");
1336 NS_LOG_LOGIC (
this <<
" Enter zerowindow persist state");
1337 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
1401 NS_LOG_LOGIC (
this <<
" Leaving zerowindow persist state");
1426 " SND.UNA = " <<
m_txBuffer->HeadSequence ());
1469 else if (tcpflags == 0)
1512 TcpHeader::TcpOptionList::const_iterator it;
1515 for (it = options.begin (); it != options.end (); ++it)
1573 "Reset cwnd to " <<
m_tcb->
m_cWnd <<
", ssthresh to " <<
1575 " calculated in flight: " << bytesInFlight);
1683 bool scoreboardUpdated =
false;
1703 ProcessAck (ackNumber, scoreboardUpdated, oldHeadSequence);
1724 bool exitedFastRecovery =
false;
1747 : ackNumber == oldHeadSequence &&
1751 " SND.UNA=" << oldHeadSequence <<
1767 if (ackNumber == oldHeadSequence
1773 else if (ackNumber == oldHeadSequence
1778 NS_LOG_DEBUG (
"Update nextTxSequence manually to " << ackNumber);
1781 else if (ackNumber == oldHeadSequence)
1786 else if (ackNumber > oldHeadSequence)
1790 uint32_t bytesAcked = ackNumber - oldHeadSequence;
1829 NS_LOG_INFO (
"Partial ACK. Manually setting head as lost");
1836 m_txBuffer->DeleteRetransmittedFlagFromHead ();
1854 " and this is the first (RTO will be reset);" 1863 " and this is NOT the first (RTO will not be reset)" 1883 "Some segment got dup-acked in CA_LOSS state: " <<
1886 NewAck (ackNumber,
true);
1896 if (segsAcked >= oldDupAckCount)
1907 NS_LOG_DEBUG (segsAcked <<
" segments acked in CA_DISORDER, ack of " <<
1908 ackNumber <<
" exiting CA_DISORDER -> CA_OPEN");
1912 NS_LOG_DEBUG (segsAcked <<
" segments acked in CA_DISORDER, ack of " <<
1913 ackNumber <<
" but still in CA_DISORDER");
1937 exitedFastRecovery =
true;
1940 NS_LOG_DEBUG (segsAcked <<
" segments acked in CA_RECOVER, ack of " <<
1941 ackNumber <<
", exiting CA_RECOVERY -> CA_OPEN");
1956 NS_LOG_DEBUG (segsAcked <<
" segments acked in CA_LOSS, ack of" <<
1957 ackNumber <<
", exiting CA_LOSS -> CA_OPEN");
1960 if (exitedFastRecovery)
1962 NewAck (ackNumber,
true);
1964 NS_LOG_DEBUG (
"Leaving Fast Recovery; BytesInFlight() = " <<
1976 " segsAcked: " << segsAcked);
1978 NewAck (ackNumber,
true);
2011 packet, tcpHeader, fromAddress, toAddress);
2096 " received in SYN_SENT. Reset packet is sent.");
2194 " received. Reset packet is sent.");
2251 " received. Reset packet is sent.");
2407 NS_LOG_LOGIC (
"TCP " <<
this <<
" calling NotifyNormalClose");
2421 NS_LOG_LOGIC (
"TcpSocketBase " <<
this <<
" scheduling LATO1");
2434 if (
m_tcp !=
nullptr)
2436 m_tcp->RemoveSocket (
this);
2438 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
2450 if (
m_tcp !=
nullptr)
2452 m_tcp->RemoveSocket (
this);
2454 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
2467 NS_LOG_WARN (
"Failed to send empty packet due to null endpoint");
2486 header.SetFlags (flags);
2487 header.SetSequenceNumber (s);
2488 header.SetAckNumber (
m_rxBuffer->NextRxSequence ());
2545 header.SetWindowSize (windowSize);
2578 NS_LOG_LOGIC (
"Schedule retransmission timeout at time " 2605 m_tcp->RemoveSocket (
this);
2613 m_tcp->RemoveSocket (
this);
2624 if (ipv4->GetRoutingProtocol () ==
nullptr)
2635 route = ipv4->GetRoutingProtocol ()->RouteOutput (
Ptr<Packet> (), header, oif, errno_);
2654 if (ipv6->GetRoutingProtocol () ==
nullptr)
2665 route = ipv6->GetRoutingProtocol ()->RouteOutput (
Ptr<Packet> (), header, oif, errno_);
2666 if (route ==
nullptr)
2706 m_tcp->AddSocket (
this);
2837 bool isRetransmission =
false;
2840 isRetransmission =
true;
2859 NS_LOG_INFO (
"Timer is already in running state");
2872 NS_LOG_INFO (
"Backoff mechanism by reducing CWND by half because we've received ECN Echo");
2926 NS_LOG_LOGIC (
this <<
" SendDataPacket Schedule ReTxTimeout at time " <<
2938 NS_LOG_DEBUG (
"Send segment of size " << sz <<
" with remaining data " <<
2940 ". Header " << header);
2946 NS_LOG_DEBUG (
"Send segment of size " << sz <<
" with remaining data " <<
2948 ". Header " << header);
2972 bool isRetransmission)
2977 if (isRetransmission ==
false)
2983 for (std::deque<RttHistory>::iterator i =
m_history.begin (); i !=
m_history.end (); ++i)
3010 uint32_t nPacketsSent = 0;
3018 while (availableWindow > 0)
3034 NS_LOG_INFO (
"FIN_WAIT and OPEN state; no data to transmit");
3044 if (!
m_txBuffer->NextSeg (&next, enableRule3))
3046 NS_LOG_INFO (
"no valid seq to transmit, or no data available");
3052 uint32_t availableData =
m_txBuffer->SizeFromSequence (next);
3056 if (availableData < availableWindow)
3063 if (availableWindow < m_tcb->m_segmentSize && availableData > availableWindow)
3065 NS_LOG_LOGIC (
"Preventing Silly Window Syndrome. Wait to send.");
3072 NS_LOG_DEBUG (
"Invoking Nagle's algorithm for seq " << next <<
3073 ", SFS: " <<
m_txBuffer->SizeFromSequence (next) <<
3102 " highestRxAck " <<
m_txBuffer->HeadSequence () <<
3135 if (nPacketsSent > 0)
3146 NS_LOG_DEBUG (
"SendPendingData sent " << nPacketsSent <<
" segments");
3152 return nPacketsSent;
3164 uint32_t bytesInFlight =
m_txBuffer->BytesInFlight ();
3169 NS_LOG_DEBUG (
"Returning calculated bytesInFlight: " << bytesInFlight);
3170 return bytesInFlight;
3182 uint32_t win =
Window ();
3184 return (inflight > win) ? 0 : win - inflight;
3202 "Unexpected sequence number values");
3219 NS_LOG_WARN (
"Adv window size truncated to " <<
m_maxWinSize <<
"; possibly to avoid overflow of the 16-bit integer");
3221 NS_LOG_LOGIC (
"Returning AdvertisedWindowSize of " << static_cast<uint16_t> (w));
3222 return static_cast<uint16_t
> (w);
3231 " pkt size=" << p->
GetSize () );
3250 if (expectedSeq < m_rxBuffer->NextRxSequence ())
3259 NS_LOG_WARN (
"Why TCP " <<
this <<
" got data after close notification?");
3360 m_rtt->Measurement (m);
3382 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
3389 NS_LOG_LOGIC (
this <<
" Schedule ReTxTimeout at time " <<
3397 " numberAck " << (ack -
m_txBuffer->HeadSequence ()));
3409 NS_LOG_LOGIC (
this <<
" Cancelled ReTxTimeout event which was set to expire at " <<
3458 NS_LOG_DEBUG (
"Checking if Connection is Established");
3468 NS_LOG_INFO (
"No more data retries available. Dropping connection");
3538 m_txBuffer->HeadSequence () <<
" doubled rto to " <<
3857 return (!allowBroadcast);
3902 uint32_t maxSpace =
m_rxBuffer->MaxBufferSize ();
3907 maxSpace = maxSpace >> 1;
3913 NS_LOG_WARN (
"Possible error; scale exceeds 14: " << scale);
3918 static_cast<int> (scale) <<
" for buffer size " <<
m_rxBuffer->MaxBufferSize ());
3981 uint8_t allowedSackBlocks = (optionLenAvail - 2) / 8;
3984 if (allowedSackBlocks == 0 || sackList.empty ())
3986 NS_LOG_LOGIC (
"No space available or sack list empty, not adding sack blocks");
3992 TcpOptionSack::SackList::iterator i;
3993 for (i = sackList.begin (); allowedSackBlocks > 0 && i != sackList.end (); ++i)
3995 option->AddSackBlock (*i);
3996 allowedSackBlocks--;
4053 NS_LOG_INFO (
"Received (scaled) window is " << receivedWindow <<
" bytes");
4067 bool update =
false;
4210 return CopyObject<TcpSocketBase> (
this);
TracedCallback< SequenceNumber32, SequenceNumber32 > m_highTxMarkTrace
Callback pointer for high tx mark chaining.
void SetCongestionControlAlgorithm(Ptr< TcpCongestionOps > algo)
Install a congestion control algorithm on this socket.
static Time GetDelayLeft(const EventId &id)
Get the remaining time until this event will execute.
Ipv6Address GetLocalAddress()
Get the local address.
uint32_t m_rcvTimestampValue
Receiver Timestamp value.
void PeerClose(Ptr< Packet > p, const TcpHeader &tcpHeader)
Received a FIN from peer, notify rx buffer.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
log2() macro definition; to deal with Bug 1467.
void SetTclass(uint8_t tclass)
Set the tag's Tclass.
bool m_limitedTx
perform limited transmit
void ProcessListen(Ptr< Packet > packet, const TcpHeader &tcpHeader, const Address &fromAddress, const Address &toAddress)
Received a packet upon LISTEN state.
TracedValue< uint32_t > m_advWnd
Advertised Window size.
virtual void SetInitialCwnd(uint32_t cwnd)
Set the initial Congestion Window.
virtual int Listen(void)
Listen for incoming connections.
Simulation virtual time values and global simulation resolution.
static Ipv4Address GetAny(void)
virtual bool GetTcpNoDelay(void) const
Check if Nagle's algorithm is enabled or not.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void ProcessWait(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2.
Ipv4Address GetIpv4MappedAddress() const
Return the Ipv4 address.
DataRate m_currentPacingRate
Current Pacing rate.
Last ACK received had ECE bit set in TCP header.
Normal state, no dubious events.
uint32_t m_dataRetries
Number of data retransmission attempts.
virtual void SetInitialSSThresh(uint32_t threshold)
Set the initial Slow Start Threshold.
AttributeValue implementation for Boolean.
bool IsIpv4MappedAddress() const
If the address is an IPv4-mapped address.
bool m_noDelay
Set to true to disable Nagle's algorithm.
CWND was reduced, we are fast-retransmitting.
uint32_t GetId(void) const
In all the respects it is "Open", but requires a bit more attention.
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, and send to TcpL4Protocol.
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer...
virtual Time GetPersistTimeout(void) const
Get the timeout for persistent connection.
(abstract) base class of all TcpSockets
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
static Time ElapsedTimeFromTsValue(uint32_t echoTime)
Estimate the Time elapsed from a TS echo value.
bool m_pacing
Pacing status.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Ipv6Address GetIpv6(void) const
Get the IPv6 address.
NS_ASSERT_MSG(false, "Ipv4AddressGenerator::MaskToIndex(): Impossible")
virtual ~TcpSocketBase(void)
uint32_t m_dataRetrCount
Count of remaining data retransmission attempts.
uint32_t m_synRetries
Number of connection attempts.
void NotifyDataRecv(void)
Notify through the callback (if set) that some data have been received.
TracedValue< SequenceNumber32 > m_highRxAckMark
Highest ack received.
uint32_t m_initialSsThresh
Initial Slow Start Threshold value.
virtual int ShutdownRecv(void)
void SetRxCallback(Callback< void, Ptr< Packet >, Ipv4Header, uint16_t, Ptr< Ipv4Interface > > callback)
Set the reception callback.
TcpSocketBase(void)
Create an unbound TCP socket.
void SetClockGranularity(Time clockGranularity)
Sets the Clock Granularity (used in RTO calcs).
EventId m_retxEvent
Retransmission event.
Ptr< Packet > Recv(void)
Read a single packet from the socket.
IPv6 layer implementation.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void SetDestroyCallback(Callback< void > callback)
Set the default destroy callback.
void ForwardUp6(Ptr< Packet > packet, Ipv6Header header, uint16_t port, Ptr< Ipv6Interface > incomingInterface)
Called by the L3 protocol when it received a packet to pass on to TCP.
uint32_t m_rcvTimestampEchoReply
Sender Timestamp echoed by the receiver.
void ProcessOptionSackPermitted(const Ptr< const TcpOption > option)
Read the SACK PERMITTED option.
uint8_t GetTos(void) const
virtual void SetPersistTimeout(Time timeout)
Set the timeout for persistent connection.
static const char *const EcnStateName[TcpSocketState::ECN_CWR_SENT+1]
Literal names of ECN states for use in log messages.
virtual int Send(Ptr< Packet > p, uint32_t flags)
Send data (or dummy data) to the remote host.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
EventId m_timewaitEvent
TIME_WAIT expiration event: Move this socket to CLOSED state.
void UpdateEcnState(TcpSocketState::EcnState_t oldValue, TcpSocketState::EcnState_t newValue)
Callback function to hook to EcnState state.
std::list< SackBlock > SackList
SACK list definition.
uint32_t GetRetxThresh(void) const
Get the retransmission threshold (dup ack threshold for a fast retransmit)
void NotifyConnectionFailed(void)
Notify through the callback (if set) that the connection has not been established due to an error...
virtual uint32_t GetSndBufSize(void) const
Get the send buffer size.
static const char *const TcpCongStateName[TcpSocketState::CA_LAST_STATE]
Literal names of TCP states for use in log messages.
static TypeId GetTypeId(void)
Get the type ID.
void ProcessOptionTimestamp(const Ptr< const TcpOption > option, const SequenceNumber32 &seq)
Process the timestamp option from other side.
TracedValue< EcnState_t > m_ecnState
Current ECN State, represented as combination of EcnState values.
Both sides have shutdown but we still have data we have to finish sending.
virtual Time GetDelAckTimeout(void) const
Get the time to delay an ACK.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
void UpdateHighTxMark(SequenceNumber32 oldValue, SequenceNumber32 newValue)
Callback function to hook to TcpSocketState high tx mark.
void SendRST(void)
Send reset and tear down this socket.
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
Time GetDelayLeft(void) const
virtual uint32_t GetDelAckMaxCount(void) const
Get the number of packet to fire an ACK before delay timeout.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Ptr< TcpSocketState > m_tcb
Congestion control information.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
bool m_winScalingEnabled
Window Scale option enabled (RFC 7323)
bool m_timestampEnabled
Timestamp option enabled.
Timer m_pacingTimer
Pacing Event.
uint16_t m_maxWinSize
Maximum window size to advertise.
#define NS_UNUSED(x)
Mark a local variable as unused.
bool retx
True if this has been retransmitted.
virtual void NewAck(SequenceNumber32 const &seq, bool resetRTO)
Update buffers w.r.t.
uint32_t m_segmentSize
Segment size.
Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback
ICMP callback.
void CancelAllTimers(void)
Cancel all timer when endpoint is deleted.
uint32_t count
Number of bytes sent.
void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Time m_cnTimeout
Timeout for connection retry.
uint32_t m_initialCWnd
Initial cWnd value.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
virtual Time GetConnTimeout(void) const
Get the connection timeout.
EventId m_lastAckEvent
Last ACK timeout event.
void ConnectionSucceeded(void)
Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
All buffered data sent, waiting for remote to shutdown.
void SetTos(uint8_t tos)
Set the tag's TOS.
TracedValue< SequenceNumber32 > m_ecnCESeq
Sequence number of the last received Congestion Experienced.
virtual void ReceivedAck(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received an ACK packet.
void AddSocketTags(const Ptr< Packet > &p) const
Add Tags for the Socket.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
virtual uint32_t GetInitialSSThresh(void) const
Get the initial Slow Start Threshold.
virtual uint32_t BytesInFlight(void) const
Return total bytes in flight.
SocketErrno
Enumeration of the possible errors returned by a socket.
void DoPeerClose(void)
FIN is in sequence, notify app and respond with a FIN.
bool NotifyConnectionRequest(const Address &from)
Notify through the callback (if set) that an incoming connection is being requested by a remote host...
TracedCallback< TcpSocketState::EcnState_t, TcpSocketState::EcnState_t > m_ecnStateTrace
Callback pointer for ECN state trace chaining.
virtual void PersistTimeout(void)
Send 1 byte probe to get an updated window size.
virtual void SetSynRetries(uint32_t count)
Set the number of connection retries before giving up.
TracedValue< TcpStates_t > m_state
TCP state.
Time GetMinRto(void) const
Get the Minimum RTO.
uint32_t m_delAckMaxCount
Number of packet to fire an ACK before delay timeout.
bool IsExpired(void) const
This method is syntactic sugar for the ns3::Simulator::IsExpired method.
Receiver sends an ACK with ECE bit set in TCP header.
EcnMode_t m_ecnMode
Socket ECN capability.
void DupAck()
Dupack management.
a polymophic address class
void SetMinRto(Time minRto)
Sets the Minimum RTO.
void SetDestroyCallback(Callback< void > callback)
Set the default destroy callback.
uint16_t GetPeerPort()
Get the peer port.
AttributeValue implementation for Callback.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
uint32_t m_delAckCount
Delayed ACK counter.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
virtual uint8_t GetIpTtl(void) const
Query the value of IP Time to Live field of this socket.
SequenceNumber32 m_recover
Previous highest Tx seqnum for fast recovery (set it to initial seq number)
void ForwardIcmp6(Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
virtual int Bind(void)
Allocate a local IPv4 endpoint for this socket.
virtual bool GetAllowBroadcast(void) const
Query whether broadcast datagram transmissions are allowed.
Last packet received had CE bit set in IP header.
virtual uint32_t GetRcvBufSize(void) const
Get the receive buffer size.
Ptr< NetDevice > GetBoundNetDevice()
Returns socket's bound NetDevice, if any.
void SetLocalAddress(Ipv6Address addr)
Set the local address.
void UpdateBytesInFlight(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState bytes inflight.
virtual enum SocketType GetSocketType(void) const
virtual void SetDataRetries(uint32_t retries)
Set the number of data transmission retries before giving up.
Ptr< TcpCongestionOps > m_congestionControl
Congestion control.
static const char *const TcpStateName[TcpSocket::LAST_STATE]
Literal names of TCP states for use in log messages.
int64x64_t Min(const int64x64_t &a, const int64x64_t &b)
Minimum.
void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
Ptr< TcpRxBuffer > GetRxBuffer(void) const
Get a pointer to the Rx buffer.
TracedValue< uint32_t > m_cWndInfl
Inflated congestion window trace (used only for backward compatibility purpose)
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)
Send data to a specified peer.
void UpdateCwnd(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState congestion window.
bool IsTcpOptionEnabled(uint8_t kind) const
Return true if the specified option is enabled.
virtual uint32_t GetSegSize(void) const
Get the segment size.
virtual void EstimateRtt(const TcpHeader &tcpHeader)
Take into account the packet for RTT estimation.
virtual int GetSockName(Address &address) const
Get socket address.
cWnd was reduced due to some Congestion Notification event.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Hold variables of type enum.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Time time
Time this one was sent.
virtual void ProcessAck(const SequenceNumber32 &ackNumber, bool scoreboardUpdated, const SequenceNumber32 &oldHeadSequence)
Process a received ack.
virtual void UpdateRttHistory(const SequenceNumber32 &seq, uint32_t sz, bool isRetransmission)
Update the RTT history, when we send TCP segments.
Ptr< TcpTxBuffer > m_txBuffer
Tx buffer.
void ForwardUp(Ptr< Packet > packet, Ipv4Header header, uint16_t port, Ptr< Ipv4Interface > incomingInterface)
Called by the L3 protocol when it received a packet to pass on to TCP.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
AttributeValue implementation for Time.
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments.
bool OutOfRange(SequenceNumber32 head, SequenceNumber32 tail) const
Check if a sequence number range is within the rx window.
uint16_t GetLocalPort()
Get the local port.
virtual uint32_t Window(void) const
Return the max possible number of unacked bytes.
void UpdateWindowSize(const TcpHeader &header)
Update the receiver window (RWND) based on the value of the window field in the header.
void AddOptionTimestamp(TcpHeader &header)
Add the timestamp option to the header.
Hold an unsigned integer type.
SequenceNumber32 m_highTxAck
Highest ack sent.
TracedCallback< uint32_t, uint32_t > m_cWndTrace
Callback pointer for cWnd trace chaining.
Ipv6EndPoint * m_endPoint6
the IPv6 endpoint
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
virtual uint32_t GetSynRetries(void) const
Get the number of connection retries before giving up.
std::deque< RttHistory > m_history
List of sent packet.
virtual enum SocketErrno GetErrno(void) const
Get last error number.
bool ReplacePacketTag(Tag &tag)
Replace the value of a packet tag.
virtual bool SetAllowBroadcast(bool allowBroadcast)
Configure whether broadcast datagram transmissions are allowed.
Ptr< const AttributeAccessor > MakeCallbackAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Ipv4Address GetLocalAddress(void)
Get the local address.
indicates whether the socket has a priority set.
int64x64_t Max(const int64x64_t &a, const int64x64_t &b)
Maximum.
void SetRetxThresh(uint32_t retxThresh)
Set the retransmission threshold (dup ack threshold for a fast retransmit)
virtual void SetTcpNoDelay(bool noDelay)
Enable/Disable Nagle's algorithm.
Ptr< TcpRecoveryOps > m_recoveryOps
Recovery Algorithm.
RttHistory(SequenceNumber32 s, uint32_t c, Time t)
Constructor - builds an RttHistory with the given parameters.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
void NotifyPacingPerformed(void)
Notify Pacing.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
void UpdateCongState(TcpSocketState::TcpCongState_t oldValue, TcpSocketState::TcpCongState_t newValue)
Callback function to hook to TcpSocketState congestion state.
SequenceNumber32 m_lastAckedSeq
Last sequence ACKed.
void NotifyDataSent(uint32_t size)
Notify through the callback (if set) that some data have been sent.
void SetRecvCallback(Callback< void, Ptr< Socket > >)
Notify application when new data is available to be read.
ECN is enabled but currently there is no action pertaining to ECE or CWR to be taken.
virtual uint32_t GetRxAvailable(void) const
Return number of bytes which can be returned from one or multiple calls to Recv.
friend Ptr< T > CopyObject(Ptr< T > object)
Copy an Object.
A base class for implementation of a stream socket using TCP.
Ptr< RttEstimator > m_rtt
Round trip time estimator.
bool m_closeNotified
Told app to close socket.
void ProcessSynSent(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon SYN_SENT.
static uint32_t SafeSubtraction(uint32_t a, uint32_t b)
Performs a safe subtraction between a and b (a-b)
Ptr< TcpRxBuffer > m_rxBuffer
Rx buffer (reordering buffer)
int SetupCallback(void)
Common part of the two Bind(), i.e.
TracedValue< uint32_t > m_bytesInFlight
Bytes in flight.
virtual void SetTcp(Ptr< TcpL4Protocol > tcp)
Set the associated TCP L4 protocol.
end of congestion recovery
bool m_isFirstPartialAck
First partial ACK during RECOVERY.
Ptr< TcpL4Protocol > m_tcp
the associated TCP L4 protocol
void SetHopLimit(uint8_t hopLimit)
Set the tag's Hop Limit.
void SetRecoveryAlgorithm(Ptr< TcpRecoveryOps > recovery)
Install a recovery algorithm on this socket.
void ReadOptions(const TcpHeader &tcpHeader, bool &scoreboardUpdated)
Read TCP options before Ack processing.
TracedValue< uint32_t > m_ssThresh
Slow start threshold.
void ProcessSynRcvd(Ptr< Packet > packet, const TcpHeader &tcpHeader, const Address &fromAddress, const Address &toAddress)
Received a packet upon SYN_RCVD.
Ptr< TcpTxBuffer > GetTxBuffer(void) const
Get a pointer to the Tx buffer.
virtual int ShutdownSend(void)
void NotifyConnectionSucceeded(void)
Notify through the callback (if set) that the connection has been established.
uint32_t m_retxThresh
Fast Retransmit threshold.
Access to the IPv4 forwarding table, interfaces, and configuration.
TcpCongState_t
Definition of the Congestion state machine.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
virtual void SetDelAckMaxCount(uint32_t count)
Set the number of packet to fire an ACK before delay timeout.
void NotifyNormalClose(void)
Notify through the callback (if set) that the connection has been closed.
virtual uint32_t GetTxAvailable(void) const
Returns the number of bytes which can be sent in a single call to Send.
int DoConnect(void)
Perform the real connection tasks: Send SYN if allowed, RST if invalid.
virtual void CompleteFork(Ptr< Packet > p, const TcpHeader &tcpHeader, const Address &fromAddress, const Address &toAddress)
Complete a connection by forking the socket.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
void AddOptions(TcpHeader &tcpHeader)
Add options to TcpHeader.
void UpdateNextTxSequence(SequenceNumber32 oldValue, SequenceNumber32 newValue)
Callback function to hook to TcpSocketState next tx sequence.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint32_t m_dupAckCount
Dupack counter.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
void UpdateRtt(Time oldValue, Time newValue)
Callback function to hook to TcpSocketState rtt.
Ptr< Node > m_node
the associated node
Hold objects of type Ptr<T>.
virtual uint32_t AvailableWindow(void) const
Return unfilled portion of window.
Generic "sequence number" class.
void NotifyNewConnectionCreated(Ptr< Socket > socket, const Address &from)
Notify through the callback (if set) that a new connection has been created.
TracedValue< TcpCongState_t > m_congState
State in the Congestion state machine.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
void TimeWait(void)
Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state.
bool IsManualIpv6Tclass(void) const
Checks if the socket has a specific IPv6 Tclass set.
virtual void SetNode(Ptr< Node > node)
Set the associated node.
virtual uint32_t GetDataRetries(void) const
Get the number of data transmission retries before giving up.
TracedCallback< uint32_t, uint32_t > m_bytesInFlightTrace
Callback pointer for bytesInFlight trace chaining.
void AddOptionSackPermitted(TcpHeader &header)
Add the SACK PERMITTED option to the header.
uint16_t GetPort(void) const
void SetIcmpCallback(Callback< void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t > callback)
Set the ICMP callback.
indicates whether the socket has IPV6_TCLASS set.
void Destroy(void)
Kill this socket by zeroing its attributes (IPv4)
Timeout to catch resent junk before entering closed, can only be entered from FIN_WAIT2 or CLOSING...
virtual int Connect(const Address &address)
Initiate a connection to a remote host.
Time TimeStep(uint64_t ts)
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now.
virtual int Close(void)
Close a socket.
void UpdateCwndInfl(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState inflated congestion window.
TracedValue< SequenceNumber32 > m_ecnCWRSeq
Sequence number of the last sent CWR.
static Ipv4Address GetZero(void)
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Our side has shutdown after remote has shutdown.
void SetPeer(Ipv4Address address, uint16_t port)
Set the peer information (address and port).
static Time Now(void)
Return the current simulation virtual time.
void SetSendCallback(Callback< void, Ptr< Socket >, uint32_t > sendCb)
Notify application when space in transmit buffer is added.
Remote side has shutdown and is waiting for us to finish writing our data and to shutdown (we have to...
Sent a connection request, waiting for ack.
virtual void SetRtt(Ptr< RttEstimator > rtt)
Set the associated RTT estimator.
virtual TypeId GetInstanceTypeId() const
Get the instance TypeId.
double m_msl
Max segment lifetime.
virtual void ReTxTimeout(void)
An RTO event happened.
Ptr< const AttributeChecker > MakeCallbackChecker(void)
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
static uint32_t NowToTsValue()
Return an uint32_t value which represent "now".
Time m_minRto
minimum value of the Retransmit timeout
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
bool CheckEcnEct0(uint8_t tos) const
Checks for ECT(0) bits.
virtual void SendEmptyPacket(uint8_t flags)
Send a empty packet that carries a flag, e.g., ACK.
Time m_delAckTimeout
Time to delay an ACK.
virtual int GetPeerName(Address &address) const
Get the peer address of a connected socket.
TracedValue< uint32_t > m_cWnd
Congestion window.
void SetDataSentCallback(Callback< void, Ptr< Socket >, uint32_t > dataSent)
Notify application when a packet has been sent from transport protocol (non-standard socket call) ...
Listening for a connection.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)
Read a single packet from the socket and retrieve the sender address.
uint8_t GetIpv6Tclass(void) const
Query the value of IPv6 Traffic Class field of this socket.
bool IsRunning(void) const
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void SetLocalAddress(Ipv4Address address)
Set the local address.
virtual void SetSndBufSize(uint32_t size)
Set the send buffer size.
bool IsManualIpv6HopLimit(void) const
Checks if the socket has a specific IPv6 Hop Limit set.
static Time FromDouble(double value, enum Unit unit)
Create a Time equal to value in unit unit.
virtual void SetDelAckTimeout(Time timeout)
Set the time to delay an ACK.
void DeallocateEndPoint(void)
Deallocate m_endPoint and m_endPoint6.
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
Make an EnumChecker pre-configured with a set of allowed values by name.
Describes an IPv6 address.
Ipv4 addresses are stored in host order in this class.
Sender has reduced the congestion window, and sent a packet with CWR bit set in TCP header...
void ProcessEstablished(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon ESTABLISHED state.
void ProcessOptionWScale(const Ptr< const TcpOption > option)
Read and parse the Window scale option.
Ptr< NetDevice > m_boundnetdevice
the device this socket is bound to (might be null).
bool m_connected
Connection established.
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
TracedValue< Time > m_rto
Retransmit timeout.
Helper class to store RTT measurements.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
uint16_t GetLocalPort(void)
Get the local port.
uint8_t m_rcvWindShift
Window shift to apply to outgoing segments.
virtual uint16_t AdvertisedWindowSize(bool scale=true) const
The amount of Rx window announced to the peer.
virtual uint8_t GetIpv6HopLimit(void) const
Query the value of IP Hop Limit field of this socket.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
TracedValue< Time > m_lastRtt
Last RTT sample collected.
Ipv6Address GetPeerAddress()
Get the peer address.
int DoClose(void)
Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state.
SequenceNumber32 seq
First sequence number in packet sent.
Our side has shutdown, waiting to complete transmission of remaining buffered data.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
bool ProcessOptionSack(const Ptr< const TcpOption > option)
Read the SACK option.
CWND was reduced due to RTO timeout or SACK reneging.
virtual uint8_t GetKind(void) const =0
Get the ‘kind’ (as in RFC 793) of this option.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
T Get(void) const
Get the underlying value.
TracedValue< SequenceNumber32 > m_ecnEchoSeq
Sequence number of the last received ECN Echo.
Time Seconds(double value)
Construct a Time in the indicated unit.
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
void Cancel(void)
Cancel the currently-running event if there is one.
bool m_sackEnabled
RFC SACK option enabled.
Time m_minRtt
Minimum RTT observed throughout the connection.
Ipv4Address GetPeerAddress(void)
Get the peer address.
uint32_t m_timestampToEcho
Timestamp to echo.
uint32_t m_synCount
Count of remaining connection retries.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
void AddOptionSack(TcpHeader &header)
Add the SACK option to the header.
void SetRxCallback(Callback< void, Ptr< Packet >, Ipv6Header, uint16_t, Ptr< Ipv6Interface > > callback)
Set the reception callback.
static bool IsMatchingType(const Address &addr)
If the address match.
uint16_t GetPeerPort(void)
Get the peer port.
TracedValue< SequenceNumber32 > m_highRxMark
Highest seqno received.
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
TracedValue< SequenceNumber32 > m_highTxMark
Highest seqno ever sent, regardless of ReTx.
void ProcessLastAck(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon LAST_ACK.
TracedCallback< Time, Time > m_lastRttTrace
Callback pointer for RTT trace chaining.
void UpdateSsThresh(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState slow start threshold.
first transmit when no packets in flight
virtual void SetSegSize(uint32_t size)
Set the segment size.
void ProcessClosing(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon CLOSING.
Time GetClockGranularity(void) const
Get the Clock Granularity (used in RTO calcs).
Received a connection request, sent ack, waiting for final ack in three-way handshake.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
void SetEcn(EcnMode_t ecnMode)
Set ECN mode to use on the socket.
virtual uint32_t GetInitialCwnd(void) const
Get the initial Congestion Window.
virtual void ReceivedData(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Recv of a data, put into buffer, call L7 to get it if necessary.
void SetConnectCallback(Callback< void, Ptr< Socket > > connectionSucceeded, Callback< void, Ptr< Socket > > connectionFailed)
Specify callbacks to allow the caller to determine if the connection succeeds of fails.
void CloseAndNotify(void)
Peacefully close the socket by notifying the upper layer and deallocate end point.
Callback< void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback6
ICMPv6 callback.
virtual void SetRcvBufSize(uint32_t size)
Set the receive buffer size.
virtual Ptr< Node > GetNode(void) const
Return the node this socket is associated with.
bool m_shutdownRecv
Receive no longer allowed.
TracedCallback< uint32_t, uint32_t > m_ssThTrace
Callback pointer for ssTh trace chaining.
EventId m_sendPendingDataEvent
micro-delay event to send pending data
bool IsValidTcpSegment(const SequenceNumber32 seq, const uint32_t tcpHeaderSize, const uint32_t tcpPayloadSize)
Checks whether the given TCP segment is valid or not.
uint16_t GetPort(void) const
Get the port.
void EnterRecovery()
Enter the CA_RECOVERY, and retransmit the head.
uint32_t SendPendingData(bool withAck=false)
Send as much pending data as possible according to the Tx window.
DataRate m_maxPacingRate
Max Pacing rate.
virtual void DelAckTimeout(void)
Action upon delay ACK timeout, i.e.
Ipv4Address GetSource(void) const
virtual void LastAckTimeout(void)
Timeout at LAST_ACK, close the connection.
uint8_t CalculateWScale() const
Calculate window scale value based on receive buffer space.
void SetPriority(uint8_t priority)
Set the tag's priority.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
uint32_t m_bytesAckedNotProcessed
Bytes acked, but not processed.
bool IsExpired(void) const
virtual int Bind6(void)
Allocate a local IPv6 endpoint for this socket.
TracedCallback< SequenceNumber32, SequenceNumber32 > m_nextTxSequenceTrace
Callback pointer for next tx sequence chaining.
indicates whether the socket has IP_TOS set.
TracedCallback< uint32_t, uint32_t > m_cWndInflTrace
Callback pointer for cWndInfl trace chaining.
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.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void SetIcmpCallback(Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > callback)
Set the ICMP callback.
SocketType
Enumeration of the possible socket types.
void SetIpTos(uint8_t ipTos)
Manually set IP Type of Service field.
EventId m_delAckEvent
Delayed ACK timeout event.
received CE marked IP packet.
a unique identifier for an interface.
Time CalculateBytesTxTime(uint32_t bytes) const
Calculate transmission time.
uint8_t m_sndWindShift
Window shift to apply to incoming segments.
bool m_shutdownSend
Send no longer allowed.
virtual uint32_t UnAckDataCount(void) const
Return count of number of unacked bytes.
virtual Ptr< TcpSocketBase > Fork(void)
Call CopyObject<> to clone me.
int SetupEndpoint6(void)
Configure the endpoint v6 to a local address.
void NotifySend(uint32_t spaceAvailable)
Notify through the callback (if set) that some data have been sent.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Time m_clockGranularity
Clock Granularity used in RTO calcs.
void ForwardIcmp(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
TracedValue< uint32_t > m_rWnd
Receiver window (RCV.WND in RFC793)
TracedCallback< Ptr< const Packet >, const TcpHeader &, Ptr< const TcpSocketBase > > m_rxTrace
Trace of received packets.
virtual void DoForwardUp(Ptr< Packet > packet, const Address &fromAddress, const Address &toAddress)
Called by TcpSocketBase::ForwardUp{,6}().
static bool IsMatchingType(const Address &address)
void NotifyErrorClose(void)
Notify through the callback (if set) that the connection has been closed due to an error...
SequenceNumber< uint32_t, int32_t > SequenceNumber32
32 bit Sequence number.
void DoRetransmit(void)
Retransmit the first segment marked as lost, without considering available window nor pacing...
bool m_closeOnEmpty
Close socket upon tx buffer emptied.
TracedCallback< Ptr< const Packet >, const TcpHeader &, Ptr< const TcpSocketBase > > m_txTrace
Trace of transmitted packets.
uint8_t GetPriority(void) const
Query the priority value of this socket.
void AddOptionWScale(TcpHeader &header)
Add the window scale option to the header.
virtual void SetConnTimeout(Time timeout)
Set the connection timeout.
EventId m_persistEvent
Persist event: Send 1 byte to probe for a non-zero Rx window.
void SetPeer(Ipv6Address addr, uint16_t port)
Set the peer information (address and port).
Ipv4Address GetIpv4(void) const
int SetupEndpoint(void)
Configure the endpoint to a local address.
uint8_t MarkEcnEct0(uint8_t tos) const
Mark ECT(0)
TracedCallback< TcpSocketState::TcpCongState_t, TcpSocketState::TcpCongState_t > m_congStateTrace
Callback pointer for congestion state trace chaining.
void Destroy6(void)
Kill this socket by zeroing its attributes (IPv6)
TracedValue< SequenceNumber32 > m_nextTxSequence
Next seqnum to be sent (SND.NXT), ReTx pushes it back.
EcnState_t
Definition of the Ecn state machine.
ECT set, but not CE marked.
Time m_persistTimeout
Time between sending 1-byte probes.