A Discrete-Event Network Simulator
API
tcp-socket-state.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2018 Natale Patriciello <natale.patriciello@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  */
18 #ifndef TCP_SOCKET_STATE_H
19 #define TCP_SOCKET_STATE_H
20 
21 #include "ns3/object.h"
22 #include "ns3/data-rate.h"
23 #include "ns3/traced-value.h"
24 #include "ns3/sequence-number.h"
25 #include "tcp-rx-buffer.h"
26 
27 namespace ns3 {
28 
41 class TcpSocketState : public Object
42 {
43 public:
49  static TypeId GetTypeId (void);
50 
54  TcpSocketState () : Object () { }
55 
60  TcpSocketState (const TcpSocketState &other);
61 
76  typedef enum
77  {
89 
90  // Note: "not triggered" events are currently not triggered by the code.
94  typedef enum
95  {
104  } TcpCAEvent_t;
105 
112  typedef enum
113  {
114  Off = 0,
115  On = 1,
117  } UseEcn_t;
118 
122  typedef enum
123  {
124  NotECT = 0,
125  Ect1 = 1,
126  Ect0 = 2,
127  CongExp = 3,
128  } EcnCodePoint_t;
129 
133  typedef enum
134  {
137  } EcnMode_t;
138 
143  typedef enum
144  {
152  } EcnState_t;
153 
158 
162  static const char* const EcnStateName[TcpSocketState::ECN_CWR_SENT + 1];
163 
164  // Congestion control
168  uint32_t m_initialCWnd {0};
169  uint32_t m_initialSsThresh {0};
170 
171  // Recovery
172  // This variable is used for implementing following flag of Linux: FLAG_RETRANS_DATA_ACKED
173  // and is used only during a recovery phase to keep track of acknowledgement of retransmitted packet.
174  bool m_isRetransDataAcked {false};
175 
176  // Segment
177  uint32_t m_segmentSize {0};
179 
181 
183 
186 
187  uint32_t m_rcvTimestampValue {0};
188  uint32_t m_rcvTimestampEchoReply {0};
189 
190  // Pacing related variables
191  bool m_pacing {false};
194  uint16_t m_pacingSsRatio {0};
195  uint16_t m_pacingCaRatio {0};
196  bool m_paceInitialWindow {false};
197 
199 
202 
204 
207 
209 
215  uint32_t GetCwndInSegments () const
216  {
217  return m_cWnd / m_segmentSize;
218  }
219 
225  uint32_t GetSsThreshInSegments () const
226  {
227  return m_ssThresh / m_segmentSize;
228  }
229 
234 };
235 
236 namespace TracedValueCallback {
237 
245  typedef void (* TcpCongState)(const TcpSocketState::TcpCongState_t oldValue,
246  const TcpSocketState::TcpCongState_t newValue);
247 
255  typedef void (* EcnState)(const TcpSocketState::EcnState_t oldValue,
256  const TcpSocketState::EcnState_t newValue);
257 
258 } // namespace TracedValueCallback
259 
260 } //namespace ns3
261 
262 #endif /* TCP_SOCKET_STATE_H */
uint32_t m_rcvTimestampValue
Receiver Timestamp value.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
UseEcn_t
Parameter value related to ECN enable/disable functionality similar to sysctl for tcp_ecn...
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
Last ACK received had ECE bit set in TCP header.
Normal state, no dubious events.
CWND was reduced, we are fast-retransmitting.
In all the respects it is "Open", but requires a bit more attention.
bool m_pacing
Pacing status.
TcpCAEvent_t
Congestion avoidance events.
uint32_t m_initialSsThresh
Initial Slow Start Threshold value.
uint32_t m_rcvTimestampEchoReply
Sender Timestamp echoed by the receiver.
static const char *const EcnStateName[TcpSocketState::ECN_CWR_SENT+1]
Literal names of ECN states for use in log messages.
static const char *const TcpCongStateName[TcpSocketState::CA_LAST_STATE]
Literal names of TCP states for use in log messages.
TracedValue< EcnState_t > m_ecnState
Current ECN State, represented as combination of EcnState values.
uint32_t m_segmentSize
Segment size.
TcpSocketState()
TcpSocketState Constructor.
uint32_t m_initialCWnd
Initial cWnd value.
Ptr< TcpRxBuffer > m_rxBuffer
Rx buffer (reordering buffer)
Data structure that records the congestion state of a connection.
bool m_isRetransDataAcked
Retransmitted data is ACKed if true.
bool m_paceInitialWindow
Enable/Disable pacing for the initial window.
Receiver sends an ACK with ECE bit set in TCP header.
Class for representing data rates.
Definition: data-rate.h:88
Last packet received had CE bit set in IP header.
static Time Max()
Maximum representable Time Not to be confused with Max(Time,Time).
Definition: nstime.h:283
Callback< void, uint8_t > m_sendEmptyPacketCallback
Callback to send an empty packet.
TracedValue< uint32_t > m_cWndInfl
Inflated congestion window trace (used only for backward compatibility purpose)
cWnd was reduced due to some congestion notification event, such as ECN, ICMP source quench...
TracedValue< DataRate > m_pacingRate
Current Pacing rate.
EcnMode_t m_ecnMode
ECN mode.
SequenceNumber32 m_lastAckedSeq
Last sequence ACKed.
ECN is enabled but currently there is no action pertaining to ECE or CWR to be taken.
UseEcn_t m_useEcn
Socket ECN capability.
TracedValue< uint32_t > m_bytesInFlight
Bytes in flight.
TracedValue< uint32_t > m_ssThresh
Slow start threshold.
TcpCongState_t
Definition of the Congestion state machine.
ECN functionality as described in RFC 8257.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Used only in debug messages.
TracedValue< TcpCongState_t > m_congState
State in the Congestion state machine.
void(* EcnState)(const TcpSocketState::EcnState_t oldValue, const TcpSocketState::EcnState_t newValue)
TracedValue Callback signature for EcnState_t.
uint32_t GetSsThreshInSegments() const
Get slow start thresh in segments rather than bytes.
static TypeId GetTypeId(void)
Get the type ID.
TracedValue< uint32_t > m_cWnd
Congestion window.
EcnCodePoint_t m_ectCodePoint
ECT code point to use.
Sender has reduced the congestion window, and sent a packet with CWR bit set in TCP header...
EcnCodePoint_t
ECN code points.
uint16_t m_pacingSsRatio
SS pacing ratio.
TracedValue< Time > m_lastRtt
Last RTT sample collected.
CWND was reduced due to RTO timeout or SACK reneging.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
Time m_minRtt
Minimum RTT observed throughout the connection.
uint16_t m_pacingCaRatio
CA pacing ratio.
Enable only when the peer endpoint is ECN capable.
TracedValue< SequenceNumber32 > m_highTxMark
Highest seqno ever sent, regardless of ReTx.
first transmit when no packets in flight
void(* TcpCongState)(const TcpSocketState::TcpCongState_t oldValue, const TcpSocketState::TcpCongState_t newValue)
TracedValue Callback signature for TcpCongState_t.
A base class which provides memory management and object aggregation.
Definition: object.h:87
DataRate m_maxPacingRate
Max Pacing rate.
received CE marked IP packet.
a unique identifier for an interface.
Definition: type-id.h:58
ECN functionality as described in RFC 3168.
uint32_t GetCwndInSegments() const
Get cwnd in segments rather than bytes.
TracedValue< SequenceNumber32 > m_nextTxSequence
Next seqnum to be sent (SND.NXT), ReTx pushes it back.
EcnState_t
Definition of the Ecn state machine.