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 "tcp-rx-buffer.h"
35 #include "tcp-tx-buffer.h"
36 #include "rtt-estimator.h"
37 #include "tcp-l4-protocol.h"
38 
39 namespace ns3 {
40 
41 class Ipv4EndPoint;
42 class Ipv6EndPoint;
43 class Node;
44 class Packet;
45 class TcpL4Protocol;
46 class TcpHeader;
47 class TcpCongestionOps;
48 class RttEstimator;
49 class TcpRxBuffer;
50 class TcpTxBuffer;
51 class TcpOption;
52 class Ipv4Interface;
53 class Ipv6Interface;
54 
61 {
62 public:
69  RttHistory (SequenceNumber32 s, uint32_t c, Time t);
74  RttHistory (const RttHistory& h); // Copy constructor
75 public:
77  uint32_t count;
79  bool retx;
80 };
81 
94 class TcpSocketState : public Object
95 {
96 public:
102  static TypeId GetTypeId (void);
103 
107  TcpSocketState () : Object () { }
108 
113  TcpSocketState (const TcpSocketState &other);
114 
129  typedef enum
130  {
141  } TcpCongState_t;
142 
143  // Note: "not triggered" events are currently not triggered by the code.
144  typedef enum
145  {
154  } TcpCAEvent_t;
155 
163  typedef void (* TcpCongStatesTracedValueCallback)(const TcpCongState_t oldValue,
164  const TcpCongState_t newValue);
165 
170 
171  // Congestion control
174  uint32_t m_initialCWnd {0};
175  uint32_t m_initialSsThresh {0};
176 
177  // Segment
178  uint32_t m_segmentSize {0};
180 
182 
185 
186  uint32_t m_rcvTimestampValue {0};
187  uint32_t m_rcvTimestampEchoReply {0};
188 
189  // Pacing related variables
190  bool m_pacing {false};
193 
195 
201  uint32_t GetCwndInSegments () const
202  {
203  return m_cWnd / m_segmentSize;
204  }
205 
211  uint32_t GetSsThreshInSegments () const
212  {
213  return m_ssThresh / m_segmentSize;
214  }
215 };
216 
351 class TcpSocketBase : public TcpSocket
352 {
353 public:
359  static TypeId GetTypeId (void);
360 
365  virtual TypeId GetInstanceTypeId () const;
366 
371  friend class TcpGeneralTest;
372 
376  TcpSocketBase (void);
377 
383  TcpSocketBase (const TcpSocketBase& sock);
384  virtual ~TcpSocketBase (void);
385 
386  // Set associated Node, TcpL4Protocol, RttEstimator to this socket
387 
392  virtual void SetNode (Ptr<Node> node);
393 
398  virtual void SetTcp (Ptr<TcpL4Protocol> tcp);
399 
404  virtual void SetRtt (Ptr<RttEstimator> rtt);
405 
410  void SetMinRto (Time minRto);
411 
416  Time GetMinRto (void) const;
417 
422  void SetClockGranularity (Time clockGranularity);
423 
428  Time GetClockGranularity (void) const;
429 
434  Ptr<TcpTxBuffer> GetTxBuffer (void) const;
435 
440  Ptr<TcpRxBuffer> GetRxBuffer (void) const;
441 
446  void SetRetxThresh (uint32_t retxThresh);
447 
452  uint32_t GetRetxThresh (void) const { return m_retxThresh; }
453 
458 
463 
468 
473 
478 
484  void UpdateCwnd (uint32_t oldValue, uint32_t newValue);
485 
491  void UpdateSsThresh (uint32_t oldValue, uint32_t newValue);
492 
500 
506  void UpdateHighTxMark (SequenceNumber32 oldValue, SequenceNumber32 newValue);
507 
513  void UpdateNextTxSequence (SequenceNumber32 oldValue, SequenceNumber32 newValue);
514 
521 
522  // Necessary implementations of null functions from ns3::Socket
523  virtual enum SocketErrno GetErrno (void) const; // returns m_errno
524  virtual enum SocketType GetSocketType (void) const; // returns socket type
525  virtual Ptr<Node> GetNode (void) const; // returns m_node
526  virtual int Bind (void); // Bind a socket by setting up endpoint in TcpL4Protocol
527  virtual int Bind6 (void); // Bind a socket by setting up endpoint in TcpL4Protocol
528  virtual int Bind (const Address &address); // ... endpoint of specific addr or port
529  virtual int Connect (const Address &address); // Setup endpoint and call ProcessAction() to connect
530  virtual int Listen (void); // Verify the socket is in a correct state and call ProcessAction() to listen
531  virtual int Close (void); // Close by app: Kill socket upon tx buffer emptied
532  virtual int ShutdownSend (void); // Assert the m_shutdownSend flag to prevent send to network
533  virtual int ShutdownRecv (void); // Assert the m_shutdownRecv flag to prevent forward to app
534  virtual int Send (Ptr<Packet> p, uint32_t flags); // Call by app to send data to network
535  virtual int SendTo (Ptr<Packet> p, uint32_t flags, const Address &toAddress); // Same as Send(), toAddress is insignificant
536  virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags); // Return a packet to be forwarded to app
537  virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress); // ... and write the remote address at fromAddress
538  virtual uint32_t GetTxAvailable (void) const; // Available Tx buffer size
539  virtual uint32_t GetRxAvailable (void) const; // Available-to-read data size, i.e. value of m_rxAvailable
540  virtual int GetSockName (Address &address) const; // Return local addr:port in address
541  virtual int GetPeerName (Address &address) const;
542  virtual void BindToNetDevice (Ptr<NetDevice> netdevice); // NetDevice with my m_endPoint
543 
551  typedef void (* TcpTxRxTracedCallback)(const Ptr<const Packet> packet, const TcpHeader& header,
552  const Ptr<const TcpSocketBase> socket);
553 
554 protected:
555  // Implementing ns3::TcpSocket -- Attribute get/set
556  // inherited, no need to doc
557 
558  virtual void SetSndBufSize (uint32_t size);
559  virtual uint32_t GetSndBufSize (void) const;
560  virtual void SetRcvBufSize (uint32_t size);
561  virtual uint32_t GetRcvBufSize (void) const;
562  virtual void SetSegSize (uint32_t size);
563  virtual uint32_t GetSegSize (void) const;
564  virtual void SetInitialSSThresh (uint32_t threshold);
565  virtual uint32_t GetInitialSSThresh (void) const;
566  virtual void SetInitialCwnd (uint32_t cwnd);
567  virtual uint32_t GetInitialCwnd (void) const;
568  virtual void SetConnTimeout (Time timeout);
569  virtual Time GetConnTimeout (void) const;
570  virtual void SetSynRetries (uint32_t count);
571  virtual uint32_t GetSynRetries (void) const;
572  virtual void SetDataRetries (uint32_t retries);
573  virtual uint32_t GetDataRetries (void) const;
574  virtual void SetDelAckTimeout (Time timeout);
575  virtual Time GetDelAckTimeout (void) const;
576  virtual void SetDelAckMaxCount (uint32_t count);
577  virtual uint32_t GetDelAckMaxCount (void) const;
578  virtual void SetTcpNoDelay (bool noDelay);
579  virtual bool GetTcpNoDelay (void) const;
580  virtual void SetPersistTimeout (Time timeout);
581  virtual Time GetPersistTimeout (void) const;
582  virtual bool SetAllowBroadcast (bool allowBroadcast);
583  virtual bool GetAllowBroadcast (void) const;
584 
585 
586 
587  // Helper functions: Connection set up
588 
594  int SetupCallback (void);
595 
601  int DoConnect (void);
602 
606  void ConnectionSucceeded (void);
607 
613  int SetupEndpoint (void);
614 
620  int SetupEndpoint6 (void);
621 
634  virtual void CompleteFork (Ptr<Packet> p, const TcpHeader& tcpHeader,
635  const Address& fromAddress, const Address& toAddress);
636 
637 
638 
639  // Helper functions: Transfer operation
640 
649  void ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface);
650 
659  void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
660 
673  virtual void DoForwardUp (Ptr<Packet> packet, const Address &fromAddress,
674  const Address &toAddress);
675 
685  void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
686 
696  void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
697 
706  uint32_t SendPendingData (bool withAck = false);
707 
717  uint32_t SendDataPacket (SequenceNumber32 seq, uint32_t maxSize, bool withAck);
718 
724  virtual void SendEmptyPacket (uint8_t flags);
725 
729  void SendRST (void);
730 
738  bool OutOfRange (SequenceNumber32 head, SequenceNumber32 tail) const;
739 
740 
741  // Helper functions: Connection close
742 
748  int DoClose (void);
749 
753  void CloseAndNotify (void);
754 
761  void Destroy (void);
762 
769  void Destroy6 (void);
770 
774  void DeallocateEndPoint (void);
775 
782  void PeerClose (Ptr<Packet> p, const TcpHeader& tcpHeader);
783 
787  void DoPeerClose (void);
788 
792  void CancelAllTimers (void);
793 
797  void TimeWait (void);
798 
799  // State transition functions
800 
809  void ProcessEstablished (Ptr<Packet> packet, const TcpHeader& tcpHeader); // Received a packet upon ESTABLISHED state
810 
819  void ProcessListen (Ptr<Packet> packet, const TcpHeader& tcpHeader,
820  const Address& fromAddress, const Address& toAddress);
821 
828  void ProcessSynSent (Ptr<Packet> packet, const TcpHeader& tcpHeader);
829 
838  void ProcessSynRcvd (Ptr<Packet> packet, const TcpHeader& tcpHeader,
839  const Address& fromAddress, const Address& toAddress);
840 
847  void ProcessWait (Ptr<Packet> packet, const TcpHeader& tcpHeader);
848 
855  void ProcessClosing (Ptr<Packet> packet, const TcpHeader& tcpHeader);
856 
863  void ProcessLastAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
864 
865  // Window management
866 
874  virtual uint32_t UnAckDataCount (void) const;
875 
883  virtual uint32_t BytesInFlight (void) const;
884 
889  virtual uint32_t Window (void) const;
890 
895  virtual uint32_t AvailableWindow (void) const;
896 
903  virtual uint16_t AdvertisedWindowSize (bool scale = true) const;
904 
917  void UpdateWindowSize (const TcpHeader& header);
918 
919 
920  // Manage data tx/rx
921 
926  virtual Ptr<TcpSocketBase> Fork (void);
927 
933  virtual void ReceivedAck (Ptr<Packet> packet, const TcpHeader& tcpHeader);
934 
942  virtual void ProcessAck (const SequenceNumber32 &ackNumber, bool scoreboardUpdated,
943  const SequenceNumber32 &oldHeadSequence);
944 
950  virtual void ReceivedData (Ptr<Packet> packet, const TcpHeader& tcpHeader);
951 
956  virtual void EstimateRtt (const TcpHeader& tcpHeader);
957 
966  virtual void UpdateRttHistory (const SequenceNumber32 &seq, uint32_t sz,
967  bool isRetransmission);
968 
974  virtual void NewAck (SequenceNumber32 const& seq, bool resetRTO);
975 
979  void DupAck ();
980 
984  void EnterRecovery ();
985 
989  virtual void ReTxTimeout (void);
990 
994  virtual void DelAckTimeout (void);
995 
999  virtual void LastAckTimeout (void);
1000 
1004  virtual void PersistTimeout (void);
1005 
1010  void DoRetransmit (void);
1011 
1019  void AddOptions (TcpHeader& tcpHeader);
1020 
1030  void ReadOptions (const TcpHeader &tcpHeader, bool &scoreboardUpdated);
1031 
1038  bool IsTcpOptionEnabled (uint8_t kind) const;
1039 
1048  void ProcessOptionWScale (const Ptr<const TcpOption> option);
1057  void AddOptionWScale (TcpHeader& header);
1058 
1066  uint8_t CalculateWScale () const;
1067 
1077 
1084  bool ProcessOptionSack (const Ptr<const TcpOption> option);
1085 
1091  void AddOptionSackPermitted (TcpHeader &header);
1092 
1098  void AddOptionSack (TcpHeader& header);
1099 
1110  void ProcessOptionTimestamp (const Ptr<const TcpOption> option,
1111  const SequenceNumber32 &seq);
1120  void AddOptionTimestamp (TcpHeader& header);
1121 
1131  static uint32_t SafeSubtraction (uint32_t a, uint32_t b);
1132 
1136  void NotifyPacingPerformed (void);
1137 
1142  void AddSocketTags (const Ptr<Packet> &p) const;
1143 
1144 protected:
1145  // Counters and events
1151 
1152  // ACK management
1153  uint32_t m_dupAckCount {0};
1154  uint32_t m_delAckCount {0};
1155  uint32_t m_delAckMaxCount {0};
1156 
1157  // Nagle algorithm
1158  bool m_noDelay {false};
1159 
1160  // Retries
1161  uint32_t m_synCount {0};
1162  uint32_t m_synRetries {0};
1163  uint32_t m_dataRetrCount {0};
1164  uint32_t m_dataRetries {0};
1165 
1166  // Timeouts
1174 
1175  // History of RTT
1176  std::deque<RttHistory> m_history;
1177 
1178  // Connections to other layers of TCP/IP
1181  Ptr<Node> m_node {nullptr};
1185 
1187 
1188  // Rx and Tx buffer management
1191 
1192  // State-related attributes
1194  mutable enum SocketErrno m_errno {ERROR_NOTERROR};
1195  bool m_closeNotified {false};
1196  bool m_closeOnEmpty {false};
1197  bool m_shutdownSend {false};
1198  bool m_shutdownRecv {false};
1199  bool m_connected {false};
1200  double m_msl {0.0};
1201 
1202  // Window management
1203  uint16_t m_maxWinSize {0};
1211 
1212  // Options
1213  bool m_sackEnabled {true};
1214  bool m_winScalingEnabled {true};
1215  uint8_t m_rcvWindShift {0};
1216  uint8_t m_sndWindShift {0};
1217  bool m_timestampEnabled {true};
1218  uint32_t m_timestampToEcho {0};
1219 
1221 
1222  // Fast Retransmit and Recovery
1224  uint32_t m_retxThresh {3};
1225  bool m_limitedTx {true};
1226 
1227  // Transmission Control Block
1230 
1231  // Guesses over the other connection end
1232  bool m_isFirstPartialAck {true};
1233 
1234  // The following two traces pass a packet with a TCP header
1237 
1238  TracedCallback<Ptr<const Packet>, const TcpHeader&,
1240 
1241  // Pacing related variable
1243 
1248 };
1249 
1258  const TcpSocketState::TcpCongState_t newValue);
1259 
1260 } // namespace ns3
1261 
1262 #endif /* TCP_SOCKET_BASE_H */
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.
uint32_t m_rcvTimestampValue
Receiver Timestamp value.
void PeerClose(Ptr< Packet > p, const TcpHeader &tcpHeader)
Received a FIN from peer, notify rx buffer.
TracedValue< uint32_t > m_bytesInFlight
Bytes in flight.
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.
Definition: nstime.h:102
Packet header for IPv6.
Definition: ipv6-header.h:34
virtual int GetSockName(Address &address) const
Get socket address.
void(* TcpCongStatesTracedValueCallback)(const TcpCongState_t oldValue, const TcpCongState_t newValue)
TracedValue Callback signature for TcpCongState_t.
virtual uint32_t Window(void) const
Return the max possible number of unacked bytes.
void ProcessWait(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2.
DataRate m_currentPacingRate
Current Pacing rate.
Normal state, no dubious events.
uint32_t m_dataRetries
Number of data retransmission attempts.
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
virtual void SetInitialSSThresh(uint32_t threshold)
Set the initial Slow Start Threshold.
Callback template class.
Definition: callback.h:1176
bool m_noDelay
Set to true to disable Nagle's algorithm.
virtual uint32_t GetSegSize(void) const
Get the segment size.
CWND was reduced, we are fast-retransmitting.
In all the respects it is "Open", but requires a bit more attention.
Time GetClockGranularity(void) const
Get the Clock Granularity (used in RTO calcs).
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.
A simple Timer class.
Definition: timer.h:73
(abstract) base class of all TcpSockets
Definition: tcp-socket.h:47
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
bool m_pacing
Pacing status.
virtual uint32_t BytesInFlight(void) const
Return total bytes in flight.
virtual ~TcpSocketBase(void)
uint32_t m_dataRetrCount
Count of remaining data retransmission attempts.
TracedValue< Time > m_lastRtt
Last RTT sample collected.
uint32_t m_synRetries
Number of connection attempts.
TracedValue< SequenceNumber32 > m_highRxAckMark
Highest ack received.
uint32_t m_initialSsThresh
Initial Slow Start Threshold value.
virtual int ShutdownRecv(void)
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.
Definition: socket.cc:175
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.
virtual void SetPersistTimeout(Time timeout)
Set the timout for persistent connection.
virtual int Send(Ptr< Packet > p, uint32_t flags)
Send data (or dummy data) to the remote host.
virtual bool GetAllowBroadcast(void) const
Query whether broadcast datagram transmissions are allowed.
EventId m_timewaitEvent
TIME_WAIT expiration event: Move this socket to CLOSED state.
static TypeId GetTypeId(void)
Get the type ID.
static const char *const TcpCongStateName[TcpSocketState::CA_LAST_STATE]
Literal names of TCP states for use in log messages.
void ProcessOptionTimestamp(const Ptr< const TcpOption > option, const SequenceNumber32 &seq)
Process the timestamp option from other side.
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.
Ptr< TcpSocketState > m_tcb
Congestion control informations.
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.
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.
TcpSocketState()
TcpSocketState Constructor.
void CancelAllTimers(void)
Cancel all timer when endpoint is deleted.
uint32_t count
Number of bytes sent.
Time m_cnTimeout
Timeout for connection retry.
uint32_t m_initialCWnd
Initial cWnd value.
Data structure that records the congestion state of a connection.
SocketType
Enumeration of the possible socket types.
Definition: socket.h:104
EventId m_lastAckEvent
Last ACK timeout event.
void ConnectionSucceeded(void)
Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
virtual void ReceivedAck(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received an ACK packet.
ns3::Time timeout
void(* TcpTxRxTracedCallback)(const Ptr< const Packet > packet, const TcpHeader &header, const Ptr< const TcpSocketBase > socket)
TracedCallback signature for tcp packet transmission or reception events.
virtual uint32_t GetDataRetries(void) const
Get the number of data transmission retries before giving up.
virtual Time GetPersistTimeout(void) const
Get the timout for persistent connection.
void DoPeerClose(void)
FIN is in sequence, notify app and respond with a FIN.
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.
Ptr< TcpTxBuffer > GetTxBuffer(void) const
Get a pointer to the Tx buffer.
TracedValue< TcpStates_t > m_state
TCP state.
uint32_t m_delAckMaxCount
Number of packet to fire an ACK before delay timeout.
uint8_t CalculateWScale() const
Calculate window scale value based on receive buffer space.
void DupAck()
Dupack management.
uint16_t port
Definition: dsdv-manet.cc:44
a polymophic address class
Definition: address.h:90
void SetMinRto(Time minRto)
Sets the Minimum RTO.
virtual uint32_t GetRcvBufSize(void) const
Get the receive buffer size.
uint32_t m_delAckCount
Delayed ACK counter.
virtual bool GetTcpNoDelay(void) const
Check if Nagle's algorithm is enabled or not.
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 int GetPeerName(Address &address) const
Get the peer address of a connected socket.
void(* TcpCongStatesTracedValueCallback)(const TcpSocketState::TcpCongState_t oldValue, const TcpSocketState::TcpCongState_t newValue)
TracedValue Callback signature for TcpCongState_t.
Class for representing data rates.
Definition: data-rate.h:88
static Time Max()
Maximum representable Time.
Definition: nstime.h:273
Packet header for IPv4.
Definition: ipv4-header.h:33
virtual void SetDataRetries(uint32_t retries)
Set the number of data transmission retries before giving up.
Ptr< TcpCongestionOps > m_congestionControl
Congestion control.
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.
virtual void EstimateRtt(const TcpHeader &tcpHeader)
Take into account the packet for RTT estimation.
cWnd was reduced due to some Congestion Notification event.
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.
virtual uint32_t GetSndBufSize(void) const
Get the send buffer size.
virtual enum SocketType GetSocketType(void) const
virtual uint16_t AdvertisedWindowSize(bool scale=true) const
The amount of Rx window announced to the peer.
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.
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.
void AddSocketTags(const Ptr< Packet > &p) const
Add Tags for the Socket.
bool OutOfRange(SequenceNumber32 head, SequenceNumber32 tail) const
Check if a sequence number range is within the rx window.
std::deque< RttHistory > m_history
List of sent packet.
virtual bool SetAllowBroadcast(bool allowBroadcast)
Configure whether broadcast datagram transmissions are allowed.
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.
RttHistory(SequenceNumber32 s, uint32_t c, Time t)
Constructor - builds an RttHistory with the given parameters.
void NotifyPacingPerformed(void)
Notify Pacing.
void UpdateCongState(TcpSocketState::TcpCongState_t oldValue, TcpSocketState::TcpCongState_t newValue)
Callback function to hook to TcpSocketState congestion state.
SequenceNumber32 m_lastAckedSeq
Last sequence ACKed.
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.
uint32_t GetCwndInSegments() const
Get cwnd in segments rather than bytes.
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.
virtual void SetTcp(Ptr< TcpL4Protocol > tcp)
Set the associated TCP L4 protocol.
bool m_isFirstPartialAck
First partial ACK during RECOVERY.
Ptr< TcpL4Protocol > m_tcp
the associated TCP L4 protocol
void ReadOptions(const TcpHeader &tcpHeader, bool &scoreboardUpdated)
Read TCP options begore 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.
virtual int ShutdownSend(void)
uint32_t m_retxThresh
Fast Retransmit threshold.
TcpCongState_t
Definition of the Congestion state machine.
TracedValue< uint32_t > m_cWndInfl
Inflated congestion window trace (not used in the real code, deprecated)
virtual void SetDelAckMaxCount(uint32_t count)
Set the number of packet to fire an ACK before delay timeout.
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.
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.
Used only in debug messages.
uint32_t GetRetxThresh(void) const
Get the retransmission threshold (dup ack threshold for a fast retransmit)
Ptr< Node > m_node
the associated node
TracedValue< TcpCongState_t > m_congState
State in the Congestion state machine.
void TimeWait(void)
Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state.
Header for the Transmission Control Protocol.
Definition: tcp-header.h:44
virtual void SetNode(Ptr< Node > node)
Set the associated node.
void AddOptionSackPermitted(TcpHeader &header)
Add the SACK PERMITTED option to the header.
virtual uint32_t UnAckDataCount(void) const
Return count of number of unacked bytes.
void Destroy(void)
Kill this socket by zeroing its attributes (IPv4)
static TypeId GetTypeId(void)
Get the type ID.
virtual uint32_t GetInitialSSThresh(void) const
Get the initial Slow Start Threshold.
virtual int Connect(const Address &address)
Initiate a connection to a remote host.
virtual int Close(void)
Close a socket.
virtual void SetRtt(Ptr< RttEstimator > rtt)
Set the associated RTT estimator.
double m_msl
Max segment lifetime.
virtual void ReTxTimeout(void)
An RTO event happened.
Time m_minRto
minimum value of the Retransmit timeout
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.
This policy removes the event from the simulation event list when the destructor of the Timer is invo...
Definition: timer.h:91
TracedValue< uint32_t > m_cWnd
Congestion window.
Socket is finished.
Definition: tcp-socket.h:66
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)
Read a single packet from the socket and retrieve the sender address.
bool IsTcpOptionEnabled(uint8_t kind) const
Return true if the specified option is enabled.
virtual void SetSndBufSize(uint32_t size)
Set the send buffer size.
virtual TypeId GetInstanceTypeId() const
Get the instance TypeId.
virtual void SetDelAckTimeout(Time timeout)
Set the time to delay an ACK.
void DeallocateEndPoint(void)
Deallocate m_endPoint and m_endPoint6.
Ptr< TcpRxBuffer > GetRxBuffer(void) const
Get a pointer to the Rx buffer.
Describes an IPv6 address.
Definition: ipv6-address.h:49
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
Time GetMinRto(void) const
Get the Minimum RTO.
void ProcessEstablished(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Received a packet upon ESTABLISHED state.
General infrastructure for TCP testing.
void ProcessOptionWScale(const Ptr< const TcpOption > option)
Read and parse the Window scale option.
bool m_connected
Connection established.
uint32_t GetSsThreshInSegments() const
Get slow start thresh in segments rather than bytes.
TracedValue< Time > m_rto
Retransmit timeout.
An identifier for simulation events.
Definition: event-id.h:53
Helper class to store RTT measurements.
uint8_t m_rcvWindShift
Window shift to apply to outgoing segments.
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.
bool ProcessOptionSack(const Ptr< const TcpOption > option)
Read the SACK option.
CWND was reduced due to RTO timeout or SACK reneging.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1007
A representation of an IPv6 endpoint/connection.
bool m_sackEnabled
RFC SACK option enabled.
virtual uint32_t GetInitialCwnd(void) const
Get the initial Congestion Window.
Time m_minRtt
Minimum RTT observed throughout the connection.
uint32_t m_timestampToEcho
Timestamp to echo.
uint32_t m_synCount
Count of remaining connection retries.
void AddOptionSack(TcpHeader &header)
Add the SACK option to the header.
TracedValue< SequenceNumber32 > m_highRxMark
Highest seqno received.
virtual enum SocketErrno GetErrno(void) const
Get last error number.
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.
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.
virtual void ReceivedData(Ptr< Packet > packet, const TcpHeader &tcpHeader)
Recv of a data, put into buffer, call L7 to get it if necessary.
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.
A base class which provides memory management and object aggregation.
Definition: object.h:87
tuple address
Definition: first.py:37
virtual Ptr< Node > GetNode(void) const
Return the node this socket is associated with.
virtual void SetRcvBufSize(uint32_t size)
Set the receive buffer size.
bool m_shutdownRecv
Receive no longer allowed.
virtual Time GetDelAckTimeout(void) const
Get the time to delay an ACK.
TracedCallback< uint32_t, uint32_t > m_ssThTrace
Callback pointer for ssTh trace chaining.
EventId m_sendPendingDataEvent
micro-delay event to send pending data
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.
virtual void LastAckTimeout(void)
Timeout at LAST_ACK, close the connection.
uint32_t m_bytesAckedNotProcessed
Bytes acked, but not processed.
virtual int Bind6(void)
Allocate a local IPv6 endpoint for this socket.
TracedCallback< SequenceNumber32, SequenceNumber32 > m_nextTxSequenceTrace
Callback pointer for next tx sequence chaining.
EventId m_delAckEvent
Delayed ACK timeout event.
received CE marked IP packet.
a unique identifier for an interface.
Definition: type-id.h:58
uint8_t m_sndWindShift
Window shift to apply to incoming segments.
bool m_shutdownSend
Send no longer allowed.
virtual Ptr< TcpSocketBase > Fork(void)
Call CopyObject<> to clone me.
int SetupEndpoint6(void)
Configure the endpoint v6 to a local address.
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}().
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.
void AddOptionWScale(TcpHeader &header)
Add the window scale option to the header.
A representation of an internet endpoint/connection.
virtual uint32_t GetDelAckMaxCount(void) const
Get the number of packet to fire an ACK before delay timeout.
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.
int SetupEndpoint(void)
Configure the endpoint to a local address.
virtual Time GetConnTimeout(void) const
Get the connection timeout.
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.
ECT set, but not CE marked.
virtual uint32_t AvailableWindow(void) const
Return unfilled portion of window.
Time m_persistTimeout
Time between sending 1-byte probes.
virtual uint32_t GetTxAvailable(void) const
Returns the number of bytes which can be sent in a single call to Send.
virtual uint32_t GetRxAvailable(void) const
Return number of bytes which can be returned from one or multiple calls to Recv.