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.
91  typedef enum
92  {
101  } TcpCAEvent_t;
102 
109  typedef enum
110  {
111  Off = 0,
112  On = 1,
114  } UseEcn_t;
115 
119  typedef enum
120  {
121  NotECT = 0,
122  Ect1 = 1,
123  Ect0 = 2,
124  CongExp = 3,
125  } EcnCodePoint_t;
126 
130  typedef enum
131  {
134  } EcnMode_t;
135 
140  typedef enum
141  {
149  } EcnState_t;
150 
155 
159  static const char* const EcnStateName[TcpSocketState::ECN_CWR_SENT + 1];
160 
161  // Congestion control
165  uint32_t m_initialCWnd {0};
166  uint32_t m_initialSsThresh {0};
167 
168  // Recovery
169  // This variable is used for implementing following flag of Linux: FLAG_RETRANS_DATA_ACKED
170  // and is used only during a recovery phase to keep track of acknowledgement of retransmitted packet.
171  bool m_isRetransDataAcked {false};
172 
173  // Segment
174  uint32_t m_segmentSize {0};
176 
178 
180 
183 
184  uint32_t m_rcvTimestampValue {0};
185  uint32_t m_rcvTimestampEchoReply {0};
186 
187  // Pacing related variables
188  bool m_pacing {false};
191  uint16_t m_pacingSsRatio {0};
192  uint16_t m_pacingCaRatio {0};
193  bool m_paceInitialWindow {false};
194 
196 
199 
201 
204 
206 
212  uint32_t GetCwndInSegments () const
213  {
214  return m_cWnd / m_segmentSize;
215  }
216 
222  uint32_t GetSsThreshInSegments () const
223  {
224  return m_ssThresh / m_segmentSize;
225  }
226 
228 };
229 
230 namespace TracedValueCallback {
231 
239  typedef void (* TcpCongState)(const TcpSocketState::TcpCongState_t oldValue,
240  const TcpSocketState::TcpCongState_t newValue);
241 
249  typedef void (* EcnState)(const TcpSocketState::EcnState_t oldValue,
250  const TcpSocketState::EcnState_t newValue);
251 
252 } // namespace TracedValueCallback
253 
254 } //namespace ns3
255 
256 #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.
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:282
Callback< void, uint8_t > m_sendEmptyPacketCallback
TracedValue< uint32_t > m_cWndInfl
Inflated congestion window trace (used only for backward compatibility purpose)
cWnd was reduced due to some Congestion Notification event.
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:1278
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.
ECT set, but not CE marked.