A Discrete-Event Network Simulator
API
tcp-socket-base.h
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2007 Georgia Tech Research Corporation
4 * Copyright (c) 2010 Adrian Sai-wah Tam
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation;
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Author: Adrian Sai-wah Tam <adrian.sw.tam@gmail.com>
20 */
21#ifndef TCP_SOCKET_BASE_H
22#define TCP_SOCKET_BASE_H
23
24#include <stdint.h>
25#include <queue>
26#include "ns3/traced-value.h"
27#include "ns3/tcp-socket.h"
28#include "ns3/ipv4-header.h"
29#include "ns3/ipv6-header.h"
30#include "ns3/timer.h"
31#include "ns3/sequence-number.h"
32#include "ns3/data-rate.h"
33#include "ns3/node.h"
34#include "ns3/tcp-socket-state.h"
35
36namespace ns3 {
37
38class Ipv4EndPoint;
39class Ipv6EndPoint;
40class Node;
41class Packet;
42class TcpL4Protocol;
43class TcpHeader;
44class TcpCongestionOps;
45class TcpRecoveryOps;
46class RttEstimator;
47class TcpRxBuffer;
48class TcpTxBuffer;
49class TcpOption;
50class Ipv4Interface;
51class Ipv6Interface;
52class TcpRateOps;
53
60{
61public:
73 RttHistory (const RttHistory& h); // Copy constructor
74public:
78 bool retx;
79};
80
218{
219public:
225 static TypeId GetTypeId (void);
226
231 virtual TypeId GetInstanceTypeId () const;
232
237 friend class TcpGeneralTest;
238
242 TcpSocketBase (void);
243
249 TcpSocketBase (const TcpSocketBase& sock);
250 virtual ~TcpSocketBase (void);
251
252 // Set associated Node, TcpL4Protocol, RttEstimator to this socket
253
258 virtual void SetNode (Ptr<Node> node);
259
264 virtual void SetTcp (Ptr<TcpL4Protocol> tcp);
265
270 virtual void SetRtt (Ptr<RttEstimator> rtt);
271
276 void SetMinRto (Time minRto);
277
282 Time GetMinRto (void) const;
283
288 void SetClockGranularity (Time clockGranularity);
289
294 Time GetClockGranularity (void) const;
295
300 Ptr<TcpTxBuffer> GetTxBuffer (void) const;
301
306 Ptr<TcpRxBuffer> GetRxBuffer (void) const;
307
312 void SetRetxThresh (uint32_t retxThresh);
313
318 uint32_t GetRetxThresh (void) const { return m_retxThresh; }
319
324
329
334
339
344
349
354
359
364
369
375 void UpdatePacingRateTrace (DataRate oldValue, DataRate newValue);
376
382 void UpdateCwnd (uint32_t oldValue, uint32_t newValue);
383
389 void UpdateCwndInfl (uint32_t oldValue, uint32_t newValue);
390
396 void UpdateSsThresh (uint32_t oldValue, uint32_t newValue);
397
405
413
419 void UpdateHighTxMark (SequenceNumber32 oldValue, SequenceNumber32 newValue);
420
427
433 void UpdateBytesInFlight (uint32_t oldValue, uint32_t newValue);
434
440 void UpdateRtt (Time oldValue, Time newValue);
441
448
455
462 inline uint8_t MarkEcnEct0 (uint8_t tos) const
463 {
464 return ((tos & 0xfc) | 0x02);
465 }
466
473 inline uint8_t MarkEcnEct1 (uint8_t tos) const
474 {
475 return ((tos & 0xfc) | 0x01);
476 }
477
484 inline uint8_t MarkEcnCe (uint8_t tos) const
485 {
486 return ((tos & 0xfc) | 0x03);
487 }
488
495 inline uint8_t ClearEcnBits (uint8_t tos) const
496 {
497 return tos & 0xfc;
498 }
499
506 inline bool CheckNoEcn (uint8_t tos) const
507 {
508 return ((tos & 0x03) == 0x00);
509 }
510
517 inline bool CheckEcnEct0 (uint8_t tos) const
518 {
519 return ((tos & 0x03) == 0x02);
520 }
521
528 inline bool CheckEcnEct1 (uint8_t tos) const
529 {
530 return ((tos & 0x03) == 0x01);
531 }
532
539 inline bool CheckEcnCe (uint8_t tos) const
540 {
541 return ((tos & 0x03) == 0x03);
542 }
543
551 inline uint8_t MarkEcnCodePoint (const uint8_t tos, const TcpSocketState::EcnCodePoint_t codePoint) const
552 {
553 return ((tos & 0xfc) | codePoint);
554 }
555
562
567 void SetPacingStatus (bool pacing);
568
573 void SetPaceInitialWindow (bool paceWindow);
574
575 // Necessary implementations of null functions from ns3::Socket
576 virtual enum SocketErrno GetErrno (void) const; // returns m_errno
577 virtual enum SocketType GetSocketType (void) const; // returns socket type
578 virtual Ptr<Node> GetNode (void) const; // returns m_node
579 virtual int Bind (void); // Bind a socket by setting up endpoint in TcpL4Protocol
580 virtual int Bind6 (void); // Bind a socket by setting up endpoint in TcpL4Protocol
581 virtual int Bind (const Address &address); // ... endpoint of specific addr or port
582 virtual int Connect (const Address &address); // Setup endpoint and call ProcessAction() to connect
583 virtual int Listen (void); // Verify the socket is in a correct state and call ProcessAction() to listen
584 virtual int Close (void); // Close by app: Kill socket upon tx buffer emptied
585 virtual int ShutdownSend (void); // Assert the m_shutdownSend flag to prevent send to network
586 virtual int ShutdownRecv (void); // Assert the m_shutdownRecv flag to prevent forward to app
587 virtual int Send (Ptr<Packet> p, uint32_t flags); // Call by app to send data to network
588 virtual int SendTo (Ptr<Packet> p, uint32_t flags, const Address &toAddress); // Same as Send(), toAddress is insignificant
589 virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags); // Return a packet to be forwarded to app
590 virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress); // ... and write the remote address at fromAddress
591 virtual uint32_t GetTxAvailable (void) const; // Available Tx buffer size
592 virtual uint32_t GetRxAvailable (void) const; // Available-to-read data size, i.e. value of m_rxAvailable
593 virtual int GetSockName (Address &address) const; // Return local addr:port in address
594 virtual int GetPeerName (Address &address) const;
595 virtual void BindToNetDevice (Ptr<NetDevice> netdevice); // NetDevice with my m_endPoint
596
604 typedef void (* TcpTxRxTracedCallback)(const Ptr<const Packet> packet, const TcpHeader& header,
605 const Ptr<const TcpSocketBase> socket);
606
607protected:
608 // Implementing ns3::TcpSocket -- Attribute get/set
609 // inherited, no need to doc
610
611 virtual void SetSndBufSize (uint32_t size);
612 virtual uint32_t GetSndBufSize (void) const;
613 virtual void SetRcvBufSize (uint32_t size);
614 virtual uint32_t GetRcvBufSize (void) const;
615 virtual void SetSegSize (uint32_t size);
616 virtual uint32_t GetSegSize (void) const;
617 virtual void SetInitialSSThresh (uint32_t threshold);
618 virtual uint32_t GetInitialSSThresh (void) const;
619 virtual void SetInitialCwnd (uint32_t cwnd);
620 virtual uint32_t GetInitialCwnd (void) const;
621 virtual void SetConnTimeout (Time timeout);
622 virtual Time GetConnTimeout (void) const;
623 virtual void SetSynRetries (uint32_t count);
624 virtual uint32_t GetSynRetries (void) const;
625 virtual void SetDataRetries (uint32_t retries);
626 virtual uint32_t GetDataRetries (void) const;
627 virtual void SetDelAckTimeout (Time timeout);
628 virtual Time GetDelAckTimeout (void) const;
629 virtual void SetDelAckMaxCount (uint32_t count);
630 virtual uint32_t GetDelAckMaxCount (void) const;
631 virtual void SetTcpNoDelay (bool noDelay);
632 virtual bool GetTcpNoDelay (void) const;
633 virtual void SetPersistTimeout (Time timeout);
634 virtual Time GetPersistTimeout (void) const;
635 virtual bool SetAllowBroadcast (bool allowBroadcast);
636 virtual bool GetAllowBroadcast (void) const;
637
638
639
640 // Helper functions: Connection set up
641
647 int SetupCallback (void);
648
654 int DoConnect (void);
655
659 void ConnectionSucceeded (void);
660
666 int SetupEndpoint (void);
667
673 int SetupEndpoint6 (void);
674
687 virtual void CompleteFork (Ptr<Packet> p, const TcpHeader& tcpHeader,
688 const Address& fromAddress, const Address& toAddress);
689
690
691
692 // Helper functions: Transfer operation
693
702 bool IsValidTcpSegment (const SequenceNumber32 seq, const uint32_t tcpHeaderSize,
703 const uint32_t tcpPayloadSize);
704
713 void ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface);
714
723 void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
724
737 virtual void DoForwardUp (Ptr<Packet> packet, const Address &fromAddress,
738 const Address &toAddress);
739
749 void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
750
760 void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
761
770 uint32_t SendPendingData (bool withAck = false);
771
781 virtual uint32_t SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck);
782
788 virtual void SendEmptyPacket (uint8_t flags);
789
793 void SendRST (void);
794
802 bool OutOfRange (SequenceNumber32 head, SequenceNumber32 tail) const;
803
804
805 // Helper functions: Connection close
806
812 int DoClose (void);
813
817 void CloseAndNotify (void);
818
825 void Destroy (void);
826
833 void Destroy6 (void);
834
838 void DeallocateEndPoint (void);
839
846 void PeerClose (Ptr<Packet> p, const TcpHeader& tcpHeader);
847
851 void DoPeerClose (void);
852
856 void CancelAllTimers (void);
857
861 void TimeWait (void);
862
863 // State transition functions
864
873 void ProcessEstablished (Ptr<Packet> packet, const TcpHeader& tcpHeader); // Received a packet upon ESTABLISHED state
874
883 void ProcessListen (Ptr<Packet> packet, const TcpHeader& tcpHeader,
884 const Address& fromAddress, const Address& toAddress);
885
892 void ProcessSynSent (Ptr<Packet> packet, const TcpHeader& tcpHeader);
893
902 void ProcessSynRcvd (Ptr<Packet> packet, const TcpHeader& tcpHeader,
903 const Address& fromAddress, const Address& toAddress);
904
911 void ProcessWait (Ptr<Packet> packet, const TcpHeader& tcpHeader);
912
919 void ProcessClosing (Ptr<Packet> packet, const TcpHeader& tcpHeader);
920
927 void ProcessLastAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
928
929 // Window management
930
938 virtual uint32_t UnAckDataCount (void) const;
939
947 virtual uint32_t BytesInFlight (void) const;
948
953 virtual uint32_t Window (void) const;
954
959 virtual uint32_t AvailableWindow (void) const;
960
967 virtual uint16_t AdvertisedWindowSize (bool scale = true) const;
968
981 void UpdateWindowSize (const TcpHeader& header);
982
983
984 // Manage data tx/rx
985
990 virtual Ptr<TcpSocketBase> Fork (void);
991
997 virtual void ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
998
1007 virtual void ProcessAck (const SequenceNumber32 &ackNumber, bool scoreboardUpdated,
1008 uint32_t currentDelivered, const SequenceNumber32 &oldHeadSequence);
1009
1015 virtual void ReceivedData (Ptr<Packet> packet, const TcpHeader& tcpHeader);
1016
1021 virtual void EstimateRtt (const TcpHeader& tcpHeader);
1022
1031 virtual void UpdateRttHistory (const SequenceNumber32 &seq, uint32_t sz,
1032 bool isRetransmission);
1033
1039 virtual void NewAck (SequenceNumber32 const& seq, bool resetRTO);
1040
1046 void DupAck (uint32_t currentDelivered);
1047
1053 void EnterCwr (uint32_t currentDelivered);
1054
1060 void EnterRecovery (uint32_t currentDelivered);
1061
1065 virtual void ReTxTimeout (void);
1066
1070 virtual void DelAckTimeout (void);
1071
1075 virtual void LastAckTimeout (void);
1076
1080 virtual void PersistTimeout (void);
1081
1086 void DoRetransmit (void);
1087
1095 void AddOptions (TcpHeader& tcpHeader);
1096
1105 void ReadOptions (const TcpHeader &tcpHeader, uint32_t *bytesSacked);
1106
1113 bool IsTcpOptionEnabled (uint8_t kind) const;
1114
1123 void ProcessOptionWScale (const Ptr<const TcpOption> option);
1132 void AddOptionWScale (TcpHeader& header);
1133
1141 uint8_t CalculateWScale () const;
1142
1152
1160
1166 void AddOptionSackPermitted (TcpHeader &header);
1167
1173 void AddOptionSack (TcpHeader& header);
1174
1186 const SequenceNumber32 &seq);
1195 void AddOptionTimestamp (TcpHeader& header);
1196
1207
1211 void NotifyPacingPerformed (void);
1212
1217 bool IsPacingEnabled (void) const;
1218
1222 void UpdatePacingRate (void);
1223
1228 void AddSocketTags (const Ptr<Packet> &p) const;
1229
1235 uint32_t GetRWnd (void) const;
1236
1242 SequenceNumber32 GetHighRxAck (void) const;
1243
1244protected:
1245 // Counters and events
1251
1252 // ACK management
1256
1257 // Nagle algorithm
1258 bool m_noDelay {false};
1259
1260 // Retries
1265
1266 // Timeouts
1273
1274 // History of RTT
1275 std::deque<RttHistory> m_history;
1276
1277 // Connections to other layers of TCP/IP
1284
1286
1287 // Tx buffer management
1289
1290 // State-related attributes
1292 mutable enum SocketErrno m_errno {ERROR_NOTERROR};
1293 bool m_closeNotified {false};
1294 bool m_closeOnEmpty {false};
1295 bool m_shutdownSend {false};
1296 bool m_shutdownRecv {false};
1297 bool m_connected {false};
1298 double m_msl {0.0};
1299
1300 // Window management
1301 uint16_t m_maxWinSize {0};
1308
1309 // Options
1310 bool m_sackEnabled {true};
1312 uint8_t m_rcvWindShift {0};
1313 uint8_t m_sndWindShift {0};
1316
1318
1319 // Fast Retransmit and Recovery
1321 bool m_recoverActive {false};
1325 bool m_limitedTx {true};
1326
1327 // Transmission Control Block
1332
1333 // Guesses over the other connection end
1335
1336 // The following two traces pass a packet with a TCP header
1339
1342
1343 // Pacing related variable
1345
1346 // Parameters related to Explicit Congestion Notification
1350};
1351
1360 const TcpSocketState::TcpCongState_t newValue);
1361
1370 const TcpSocketState::EcnState_t newValue);
1371
1372} // namespace ns3
1373
1374#endif /* TCP_SOCKET_BASE_H */
a polymophic address class
Definition: address.h:91
Callback template class.
Definition: callback.h:1279
Class for representing data rates.
Definition: data-rate.h:89
An identifier for simulation events.
Definition: event-id.h:54
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
A representation of an internet endpoint/connection.
Packet header for IPv4.
Definition: ipv4-header.h:34
Describes an IPv6 address.
Definition: ipv6-address.h:50
A representation of an IPv6 endpoint/connection.
Packet header for IPv6.
Definition: ipv6-header.h:36
Helper class to store RTT measurements.
uint32_t count
Number of bytes sent.
RttHistory(SequenceNumber32 s, uint32_t c, Time t)
Constructor - builds an RttHistory with the given parameters.
bool retx
True if this has been retransmitted.
Time time
Time this one was sent.
SequenceNumber32 seq
First sequence number in packet sent.
SocketType
Enumeration of the possible socket types.
Definition: socket.h:104
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
@ ERROR_NOTERROR
Definition: socket.h:83
Ptr< Packet > Recv(void)
Read a single packet from the socket.
Definition: socket.cc:175
General infrastructure for TCP testing.
Header for the Transmission Control Protocol.
Definition: tcp-header.h:45
A base class for implementation of a stream socket using TCP.
void AddOptionSack(TcpHeader &header)
Add the SACK option to the header.
Time m_persistTimeout
Time between sending 1-byte probes.
virtual void SetSegSize(uint32_t size)
Set the segment size.
void UpdateCwndInfl(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState inflated congestion window.
void CloseAndNotify(void)
Peacefully close the socket by notifying the upper layer and deallocate end point.
uint16_t m_maxWinSize
Maximum window size to advertise.
uint8_t m_rcvWindShift
Window shift to apply to outgoing segments.
void SetPaceInitialWindow(bool paceWindow)
Enable or disable pacing of the initial window.
Ptr< TcpTxBuffer > GetTxBuffer(void) const
Get a pointer to the Tx buffer.
void SendRST(void)
Send reset and tear down this socket.
bool CheckEcnEct1(uint8_t tos) const
Checks for ECT(1) codepoint.
Ptr< TcpCongestionOps > m_congestionControl
Congestion control.
virtual void SetPersistTimeout(Time timeout)
Set the timeout for persistent connection.
void ProcessEstablished(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon ESTABLISHED state.
Time m_minRto
minimum value of the Retransmit timeout
uint32_t SendPendingData(bool withAck=false)
Send as much pending data as possible according to the Tx window.
TracedValue< uint32_t > m_advWnd
Advertised Window size.
TracedCallback< Ptr< const Packet >, const TcpHeader &, Ptr< const TcpSocketBase > > m_txTrace
Trace of transmitted packets.
virtual void NewAck(SequenceNumber32 const &seq, bool resetRTO)
Update buffers w.r.t.
void DoRetransmit(void)
Retransmit the first segment marked as lost, without considering available window nor pacing.
virtual Ptr< Node > GetNode(void) const
Return the node this socket is associated with.
virtual int Send(Ptr< Packet > p, uint32_t flags)
Send data (or dummy data) to the remote host.
SequenceNumber32 m_recover
Previous highest Tx seqnum for fast recovery (set it to initial seq number)
int SetupCallback(void)
Common part of the two Bind(), i.e.
void Destroy6(void)
Kill this socket by zeroing its attributes (IPv6)
bool m_recoverActive
Whether "m_recover" has been set/activated It is used to avoid comparing with the old m_recover value...
bool CheckNoEcn(uint8_t tos) const
Checks if TOS has no ECN codepoints.
virtual void SetNode(Ptr< Node > node)
Set the associated node.
uint8_t m_sndWindShift
Window shift to apply to incoming segments.
Ptr< TcpL4Protocol > m_tcp
the associated TCP L4 protocol
Ptr< TcpSocketState > m_tcb
Congestion control information.
TracedCallback< Ptr< const Packet >, const TcpHeader &, Ptr< const TcpSocketBase > > m_rxTrace
Trace of received packets.
virtual void SetTcp(Ptr< TcpL4Protocol > tcp)
Set the associated TCP L4 protocol.
void EnterRecovery(uint32_t currentDelivered)
Enter the CA_RECOVERY, and retransmit the head.
virtual void SetDelAckTimeout(Time timeout)
Set the time to delay an ACK.
void ProcessSynSent(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon SYN_SENT.
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 ConnectionSucceeded(void)
Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
Ptr< TcpRecoveryOps > m_recoveryOps
Recovery Algorithm.
TracedCallback< uint32_t, uint32_t > m_bytesInFlightTrace
Callback pointer for bytesInFlight trace chaining.
void UpdatePacingRateTrace(DataRate oldValue, DataRate newValue)
Callback function to hook to TcpSocketState pacing rate.
virtual uint32_t GetSndBufSize(void) const
Get the send buffer size.
virtual void SetConnTimeout(Time timeout)
Set the connection timeout.
virtual uint32_t GetSynRetries(void) const
Get the number of connection retries before giving up.
uint8_t MarkEcnEct1(uint8_t tos) const
Mark ECT(1) codepoint.
virtual void SetRcvBufSize(uint32_t size)
Set the receive buffer size.
Ptr< TcpRateOps > m_rateOps
Rate operations.
void PeerClose(Ptr< Packet > p, const TcpHeader &tcpHeader)
Received a FIN from peer, notify rx buffer.
virtual uint32_t GetRcvBufSize(void) const
Get the receive buffer size.
bool m_shutdownSend
Send no longer allowed.
void ProcessOptionWScale(const Ptr< const TcpOption > option)
Read and parse the Window scale option.
bool m_closeOnEmpty
Close socket upon tx buffer emptied.
void AddOptionSackPermitted(TcpHeader &header)
Add the SACK PERMITTED option to the header.
TracedValue< Time > m_rto
Retransmit timeout.
virtual void ReceivedData(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Recv of a data, put into buffer, call L7 to get it if necessary.
EventId m_timewaitEvent
TIME_WAIT expiration event: Move this socket to CLOSED state.
Ptr< TcpTxBuffer > m_txBuffer
Tx buffer.
void UpdateHighTxMark(SequenceNumber32 oldValue, SequenceNumber32 newValue)
Callback function to hook to TcpSocketState high tx mark.
virtual ~TcpSocketBase(void)
uint32_t m_dupAckCount
Dupack counter.
void SetRetxThresh(uint32_t retxThresh)
Set the retransmission threshold (dup ack threshold for a fast retransmit)
virtual int Listen(void)
Listen for incoming connections.
virtual uint32_t GetDelAckMaxCount(void) const
Get the number of packet to fire an ACK before delay timeout.
virtual uint32_t BytesInFlight(void) const
Return total bytes in flight.
TracedCallback< SequenceNumber32, SequenceNumber32 > m_nextTxSequenceTrace
Callback pointer for next tx sequence chaining.
EventId m_delAckEvent
Delayed ACK timeout event.
TracedCallback< Time, Time > m_lastRttTrace
Callback pointer for RTT trace chaining.
virtual void SetRtt(Ptr< RttEstimator > rtt)
Set the associated RTT estimator.
TracedCallback< uint32_t, uint32_t > m_cWndTrace
Callback pointer for cWnd trace chaining.
void DeallocateEndPoint(void)
Deallocate m_endPoint and m_endPoint6.
virtual uint32_t GetTxAvailable(void) const
Returns the number of bytes which can be sent in a single call to Send.
void AddOptions(TcpHeader &tcpHeader)
Add options to TcpHeader.
TracedCallback< TcpSocketState::EcnState_t, TcpSocketState::EcnState_t > m_ecnStateTrace
Callback pointer for ECN state trace chaining.
virtual enum SocketType GetSocketType(void) const
bool IsPacingEnabled(void) const
Return true if packets in the current window should be paced.
void ProcessWait(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2.
SequenceNumber32 m_highTxAck
Highest ack sent.
bool m_timestampEnabled
Timestamp option enabled.
TracedValue< TcpStates_t > m_state
TCP state.
virtual void SetTcpNoDelay(bool noDelay)
Enable/Disable Nagle's algorithm.
virtual uint32_t UnAckDataCount(void) const
Return count of number of unacked bytes.
void UpdateEcnState(TcpSocketState::EcnState_t oldValue, TcpSocketState::EcnState_t newValue)
Callback function to hook to EcnState state.
Ptr< RttEstimator > m_rtt
Round trip time estimator.
uint8_t MarkEcnEct0(uint8_t tos) const
Mark ECT(0) codepoint.
virtual int GetPeerName(Address &address) const
Get the peer address of a connected socket.
virtual void ReTxTimeout(void)
An RTO event happened.
Timer m_pacingTimer
Pacing Event.
EventId m_retxEvent
Retransmission event.
uint32_t m_bytesAckedNotProcessed
Bytes acked, but not processed.
void AddOptionTimestamp(TcpHeader &header)
Add the timestamp option to the header.
virtual uint32_t GetSegSize(void) const
Get the segment size.
uint32_t m_dataRetries
Number of data retransmission attempts.
double m_msl
Max segment lifetime.
void ProcessLastAck(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon LAST_ACK.
bool m_limitedTx
perform limited transmit
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,...
TracedCallback< TcpSocketState::TcpCongState_t, TcpSocketState::TcpCongState_t > m_congStateTrace
Callback pointer for congestion state trace chaining.
void ProcessSynRcvd(Ptr< Packet > packet, const TcpHeader &tcpHeader, const Address &fromAddress, const Address &toAddress)
Received a packet upon SYN_RCVD.
virtual void ReceivedAck(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received an ACK packet.
virtual void SetDataRetries(uint32_t retries)
Set the number of data transmission retries before giving up.
virtual void DelAckTimeout(void)
Action upon delay ACK timeout, i.e.
TracedValue< SequenceNumber32 > m_ecnCWRSeq
Sequence number of the last sent CWR.
virtual bool SetAllowBroadcast(bool allowBroadcast)
Configure whether broadcast datagram transmissions are allowed.
Callback< void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback6
ICMPv6 callback.
uint32_t m_delAckCount
Delayed ACK counter.
virtual int ShutdownRecv(void)
virtual Time GetPersistTimeout(void) const
Get the timeout for persistent connection.
virtual uint32_t GetInitialSSThresh(void) const
Get the initial Slow Start Threshold.
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
static uint32_t SafeSubtraction(uint32_t a, uint32_t b)
Performs a safe subtraction between a and b (a-b)
virtual void SetSynRetries(uint32_t count)
Set the number of connection retries before giving up.
virtual int Bind(void)
Allocate a local IPv4 endpoint for this socket.
static TypeId GetTypeId(void)
Get the type ID.
Time m_cnTimeout
Timeout for connection retry.
virtual void PersistTimeout(void)
Send 1 byte probe to get an updated window size.
bool m_winScalingEnabled
Window Scale option enabled (RFC 7323)
virtual uint32_t AvailableWindow(void) const
Return unfilled portion of window.
EventId m_sendPendingDataEvent
micro-delay event to send pending data
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
TcpSocketBase(void)
Create an unbound TCP socket.
uint32_t m_delAckMaxCount
Number of packet to fire an ACK before delay timeout.
void DoPeerClose(void)
FIN is in sequence, notify app and respond with a FIN.
uint8_t CalculateWScale() const
Calculate window scale value based on receive buffer space.
bool m_closeNotified
Told app to close socket.
void UpdateRtt(Time oldValue, Time newValue)
Callback function to hook to TcpSocketState rtt.
void UpdateCongState(TcpSocketState::TcpCongState_t oldValue, TcpSocketState::TcpCongState_t newValue)
Callback function to hook to TcpSocketState congestion state.
void CancelAllTimers(void)
Cancel all timer when endpoint is deleted.
uint8_t MarkEcnCe(uint8_t tos) const
Mark CE codepoint.
TracedValue< SequenceNumber32 > m_ecnCESeq
Sequence number of the last received Congestion Experienced.
virtual Time GetDelAckTimeout(void) const
Get the time to delay an ACK.
void SetClockGranularity(Time clockGranularity)
Sets the Clock Granularity (used in RTO calcs).
bool IsValidTcpSegment(const SequenceNumber32 seq, const uint32_t tcpHeaderSize, const uint32_t tcpPayloadSize)
Checks whether the given TCP segment is valid or not.
Time m_clockGranularity
Clock Granularity used in RTO calcs.
virtual enum SocketErrno GetErrno(void) const
Get last error number.
uint32_t GetRWnd(void) const
Get the current value of the receiver's offered window (RCV.WND)
void DupAck(uint32_t currentDelivered)
Dupack management.
bool m_shutdownRecv
Receive no longer allowed.
virtual Ptr< TcpSocketBase > Fork(void)
Call CopyObject<> to clone me.
std::deque< RttHistory > m_history
List of sent packet.
void(* TcpTxRxTracedCallback)(const Ptr< const Packet > packet, const TcpHeader &header, const Ptr< const TcpSocketBase > socket)
TracedCallback signature for tcp packet transmission or reception events.
void ProcessOptionSackPermitted(const Ptr< const TcpOption > option)
Read the SACK PERMITTED option.
TracedValue< SequenceNumber32 > m_highRxMark
Highest seqno received.
uint8_t ClearEcnBits(uint8_t tos) const
Clears ECN bits from TOS.
void ReadOptions(const TcpHeader &tcpHeader, uint32_t *bytesSacked)
Read TCP options before Ack processing.
void Destroy(void)
Kill this socket by zeroing its attributes (IPv4)
virtual uint16_t AdvertisedWindowSize(bool scale=true) const
The amount of Rx window announced to the peer.
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.
void UpdatePacingRate(void)
Dynamically update the pacing rate.
void UpdateSsThresh(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState slow start threshold.
int SetupEndpoint(void)
Configure the endpoint to a local address.
virtual uint32_t GetRxAvailable(void) const
Return number of bytes which can be returned from one or multiple calls to Recv.
virtual void SetInitialCwnd(uint32_t cwnd)
Set the initial Congestion Window.
bool m_connected
Connection established.
TracedValue< SequenceNumber32 > m_highRxAckMark
Highest ack received.
void AddOptionWScale(TcpHeader &header)
Add the window scale option to the header.
virtual void SendEmptyPacket(uint8_t flags)
Send a empty packet that carries a flag, e.g., ACK.
void UpdateWindowSize(const TcpHeader &header)
Update the receiver window (RWND) based on the value of the window field in the header.
virtual bool GetAllowBroadcast(void) const
Query whether broadcast datagram transmissions are allowed.
virtual int Connect(const Address &address)
Initiate a connection to a remote host.
virtual void SetDelAckMaxCount(uint32_t count)
Set the number of packet to fire an ACK before delay timeout.
TracedCallback< DataRate, DataRate > m_pacingRateTrace
Callback pointer for pacing rate trace chaining.
virtual uint32_t GetDataRetries(void) const
Get the number of data transmission retries before giving up.
virtual bool GetTcpNoDelay(void) const
Check if Nagle's algorithm is enabled or not.
uint32_t m_timestampToEcho
Timestamp to echo.
Ipv6EndPoint * m_endPoint6
the IPv6 endpoint
virtual int ShutdownSend(void)
TracedCallback< uint32_t, uint32_t > m_ssThTrace
Callback pointer for ssTh trace chaining.
virtual void CompleteFork(Ptr< Packet > p, const TcpHeader &tcpHeader, const Address &fromAddress, const Address &toAddress)
Complete a connection by forking the socket.
void ProcessClosing(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon CLOSING.
bool CheckEcnCe(uint8_t tos) const
Checks for CE codepoint.
TracedCallback< SequenceNumber32, SequenceNumber32 > m_highTxMarkTrace
Callback pointer for high tx mark chaining.
virtual int Bind6(void)
Allocate a local IPv6 endpoint for this socket.
Ptr< Node > m_node
the associated node
int DoConnect(void)
Perform the real connection tasks: Send SYN if allowed, RST if invalid.
uint32_t GetRetxThresh(void) const
Get the retransmission threshold (dup ack threshold for a fast retransmit)
SequenceNumber32 GetHighRxAck(void) const
Get the current value of the receiver's highest (in-sequence) sequence number acked.
uint32_t m_synRetries
Number of connection attempts.
virtual uint32_t Window(void) const
Return the max possible number of unacked bytes.
EventId m_lastAckEvent
Last ACK timeout event.
bool IsTcpOptionEnabled(uint8_t kind) const
Return true if the specified option is enabled.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)
Send data to a specified peer.
EventId m_persistEvent
Persist event: Send 1 byte to probe for a non-zero Rx window.
void SetPacingStatus(bool pacing)
Enable or disable pacing.
void SetCongestionControlAlgorithm(Ptr< TcpCongestionOps > algo)
Install a congestion control algorithm on this socket.
void TimeWait(void)
Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state.
uint32_t m_dataRetrCount
Count of remaining data retransmission attempts.
bool m_noDelay
Set to true to disable Nagle's algorithm.
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.
virtual void ProcessAck(const SequenceNumber32 &ackNumber, bool scoreboardUpdated, uint32_t currentDelivered, const SequenceNumber32 &oldHeadSequence)
Process a received ack.
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 void DoForwardUp(Ptr< Packet > packet, const Address &fromAddress, const Address &toAddress)
Called by TcpSocketBase::ForwardUp{,6}().
bool m_isFirstPartialAck
First partial ACK during RECOVERY.
uint8_t MarkEcnCodePoint(const uint8_t tos, const TcpSocketState::EcnCodePoint_t codePoint) const
mark ECN code point
virtual void SetSndBufSize(uint32_t size)
Set the send buffer size.
Time m_delAckTimeout
Time to delay an ACK.
void UpdateNextTxSequence(SequenceNumber32 oldValue, SequenceNumber32 newValue)
Callback function to hook to TcpSocketState next tx sequence.
void SetUseEcn(TcpSocketState::UseEcn_t useEcn)
Set ECN mode of use on the socket.
virtual int Close(void)
Close a socket.
bool CheckEcnEct0(uint8_t tos) const
Checks for ECT(0) codepoint.
void ProcessListen(Ptr< Packet > packet, const TcpHeader &tcpHeader, const Address &fromAddress, const Address &toAddress)
Received a packet upon LISTEN state.
uint32_t m_synCount
Count of remaining connection retries.
virtual int GetSockName(Address &address) const
Get socket address.
virtual void SetInitialSSThresh(uint32_t threshold)
Set the initial Slow Start Threshold.
int DoClose(void)
Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state.
Time GetClockGranularity(void) const
Get the Clock Granularity (used in RTO calcs).
void UpdateBytesInFlight(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState bytes inflight.
bool OutOfRange(SequenceNumber32 head, SequenceNumber32 tail) const
Check if a sequence number range is within the rx window.
TracedValue< SequenceNumber32 > m_ecnEchoSeq
Sequence number of the last received ECN Echo.
uint32_t m_retxThresh
Fast Retransmit threshold.
void NotifyPacingPerformed(void)
Notify Pacing.
Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback
ICMP callback.
void EnterCwr(uint32_t currentDelivered)
Enter CA_CWR state upon receipt of an ECN Echo.
virtual void EstimateRtt(const TcpHeader &tcpHeader)
Take into account the packet for RTT estimation.
Ptr< TcpRxBuffer > GetRxBuffer(void) const
Get a pointer to the Rx buffer.
TracedValue< uint32_t > m_rWnd
Receiver window (RCV.WND in RFC793)
void UpdateCwnd(uint32_t oldValue, uint32_t newValue)
Callback function to hook to TcpSocketState congestion window.
void ProcessOptionTimestamp(const Ptr< const TcpOption > option, const SequenceNumber32 &seq)
Process the timestamp option from other side.
virtual TypeId GetInstanceTypeId() const
Get the instance TypeId.
virtual void UpdateRttHistory(const SequenceNumber32 &seq, uint32_t sz, bool isRetransmission)
Update the RTT history, when we send TCP segments.
bool m_sackEnabled
RFC SACK option enabled.
void SetMinRto(Time minRto)
Sets the Minimum RTO.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)
Read a single packet from the socket and retrieve the sender address.
uint32_t ProcessOptionSack(const Ptr< const TcpOption > option)
Read the SACK option.
void SetRecoveryAlgorithm(Ptr< TcpRecoveryOps > recovery)
Install a recovery algorithm on this socket.
virtual Time GetConnTimeout(void) const
Get the connection timeout.
virtual uint32_t GetInitialCwnd(void) const
Get the initial Congestion Window.
Time GetMinRto(void) const
Get the Minimum RTO.
int SetupEndpoint6(void)
Configure the endpoint v6 to a local address.
void AddSocketTags(const Ptr< Packet > &p) const
Add Tags for the Socket.
TracedCallback< uint32_t, uint32_t > m_cWndInflTrace
Callback pointer for cWndInfl trace chaining.
virtual void LastAckTimeout(void)
Timeout at LAST_ACK, close the connection.
(abstract) base class of all TcpSockets
Definition: tcp-socket.h:48
EcnCodePoint_t
ECN code points.
UseEcn_t
Parameter value related to ECN enable/disable functionality similar to sysctl for tcp_ecn.
TcpCongState_t
Definition of the Congestion state machine.
EcnState_t
Definition of the Ecn state machine.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
static Time Max()
Maximum representable Time Not to be confused with Max(Time,Time).
Definition: nstime.h:282
A simple virtual Timer class.
Definition: timer.h:74
@ CANCEL_ON_DESTROY
This policy cancels the event from the destructor of the Timer or from Suspend().
Definition: timer.h:93
Forward calls to a chain of Callback.
a unique identifier for an interface.
Definition: type-id.h:59
uint16_t port
Definition: dsdv-manet.cc:45
void(* EcnStatesTracedValueCallback)(const TcpSocketState::EcnState_t oldValue, const TcpSocketState::EcnState_t newValue)
TracedValue Callback signature for ECN state trace.
void(* TcpCongStatesTracedValueCallback)(const TcpSocketState::TcpCongState_t oldValue, const TcpSocketState::TcpCongState_t newValue)
TracedValue Callback signature for TcpCongState_t.
@ CLOSED
Socket is finished
Definition: tcp-socket.h:66
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::Time timeout