INET Framework for OMNeT++/OMNEST
inet::tcp::TcpNewReno Class Reference

Implements TCP NewReno. More...

#include <TcpNewReno.h>

Inheritance diagram for inet::tcp::TcpNewReno:
inet::tcp::TcpTahoeRenoFamily inet::tcp::TcpBaseAlg inet::tcp::TcpAlgorithm

Public Member Functions

 TcpNewReno ()
 Ctor. More...
 
virtual void receivedDataAck (uint32_t firstSeqAcked) override
 Redefine what should happen when data got acked, to add congestion window management. More...
 
virtual void receivedDuplicateAck () override
 Redefine what should happen when dupAck was received, to add congestion window management. More...
 
- Public Member Functions inherited from inet::tcp::TcpTahoeRenoFamily
 TcpTahoeRenoFamily ()
 Ctor. More...
 
void initialize () override
 Create timers, etc. More...
 
- Public Member Functions inherited from inet::tcp::TcpBaseAlg
 TcpBaseAlg ()
 Ctor. More...
 
virtual ~TcpBaseAlg ()
 Virtual dtor. More...
 
virtual void established (bool active) override
 Called when the connection is going to ESTABLISHED from SYN_SENT or SYN_RCVD. More...
 
virtual void connectionClosed () override
 Called when the connection closes, it should cancel all running timers. More...
 
virtual void processTimer (cMessage *timer, TcpEventCode &event) override
 Process REXMIT, PERSIST, DELAYED-ACK and KEEP-ALIVE timers. More...
 
virtual void sendCommandInvoked () override
 Called after user sent TCP_C_SEND command to us. More...
 
virtual void receivedOutOfOrderSegment () override
 Called after receiving data which are in the window, but not at its left edge (seq != rcv_nxt). More...
 
virtual void receiveSeqChanged () override
 Called after rcv_nxt got advanced, either because we received in-sequence data ("text" in RFC 793 lingo) or a FIN. More...
 
virtual void receivedAckForDataNotYetSent (uint32_t seq) override
 Called after we received an ACK for data not yet sent. More...
 
virtual void ackSent () override
 Called after we sent an ACK. More...
 
virtual void dataSent (uint32_t fromseq) override
 Called after we sent data. More...
 
virtual void segmentRetransmitted (uint32_t fromseq, uint32_t toseq) override
 Called after we retransmitted segment. More...
 
virtual void restartRexmitTimer () override
 Restart REXMIT timer. More...
 
virtual bool shouldMarkAck () override
 Called before sending ACK. More...
 
virtual void processEcnInEstablished () override
 Called before processing segment in established state. More...
 
- Public Member Functions inherited from inet::tcp::TcpAlgorithm
 TcpAlgorithm ()
 Ctor. More...
 
virtual ~TcpAlgorithm ()
 Virtual dtor. More...
 
void setConnection (TcpConnection *_conn)
 Assign this object to a TcpConnection. More...
 
TcpStateVariablesgetStateVariables ()
 Creates and returns the TCP state variables. More...
 

Protected Member Functions

virtual TcpStateVariablescreateStateVariables () override
 Create and return a TcpNewRenoStateVariables object. More...
 
virtual void recalculateSlowStartThreshold ()
 Utility function to recalculate ssthresh. More...
 
virtual void processRexmitTimer (TcpEventCode &event) override
 Redefine what should happen on retransmission. More...
 
- Protected Member Functions inherited from inet::tcp::TcpBaseAlg
virtual void processPersistTimer (TcpEventCode &event)
 
virtual void processDelayedAckTimer (TcpEventCode &event)
 
virtual void processKeepAliveTimer (TcpEventCode &event)
 
virtual void startRexmitTimer ()
 Start REXMIT timer and initialize retransmission variables. More...
 
virtual void rttMeasurementComplete (simtime_t tSent, simtime_t tAcked)
 Update state vars with new measured RTT value. More...
 
virtual void rttMeasurementCompleteUsingTS (uint32_t echoedTS) override
 Converting uint32_t echoedTS to simtime_t and calling rttMeasurementComplete() to update state vars with new measured RTT value. More...
 
virtual bool sendData (bool sendCommandInvoked)
 Send data, observing Nagle's algorithm and congestion window. More...
 
cMessage * cancelEvent (cMessage *msg)
 Utility function. More...
 

Protected Attributes

TcpNewRenoStateVariables *& state
 
- Protected Attributes inherited from inet::tcp::TcpTahoeRenoFamily
TcpTahoeRenoFamilyStateVariables *& state
 
- Protected Attributes inherited from inet::tcp::TcpBaseAlg
TcpBaseAlgStateVariables *& state
 
cMessage * rexmitTimer
 
cMessage * persistTimer
 
cMessage * delayedAckTimer
 
cMessage * keepAliveTimer
 
- Protected Attributes inherited from inet::tcp::TcpAlgorithm
TcpConnectionconn
 
TcpStateVariablesstate
 

Additional Inherited Members

- Static Protected Attributes inherited from inet::tcp::TcpBaseAlg
static simsignal_t cwndSignal = cComponent::registerSignal("cwnd")
 
static simsignal_t ssthreshSignal = cComponent::registerSignal("ssthresh")
 
static simsignal_t rttSignal = cComponent::registerSignal("rtt")
 
static simsignal_t srttSignal = cComponent::registerSignal("srtt")
 
static simsignal_t rttvarSignal = cComponent::registerSignal("rttvar")
 
static simsignal_t rtoSignal = cComponent::registerSignal("rto")
 
static simsignal_t numRtosSignal = cComponent::registerSignal("numRtos")
 

Detailed Description

Implements TCP NewReno.

Constructor & Destructor Documentation

◆ TcpNewReno()

inet::tcp::TcpNewReno::TcpNewReno ( )

Member Function Documentation

◆ createStateVariables()

virtual TcpStateVariables* inet::tcp::TcpNewReno::createStateVariables ( )
inlineoverrideprotectedvirtual

Create and return a TcpNewRenoStateVariables object.

Implements inet::tcp::TcpAlgorithm.

30  {
31  return new TcpNewRenoStateVariables();
32  }

◆ processRexmitTimer()

void inet::tcp::TcpNewReno::processRexmitTimer ( TcpEventCode event)
overrideprotectedvirtual

Redefine what should happen on retransmission.

Reimplemented from inet::tcp::TcpBaseAlg.

45 {
47 
48  if (event == TCP_E_ABORT)
49  return;
50 
51  // RFC 3782, page 6:
52  // "6) Retransmit timeouts:
53  // After a retransmit timeout, record the highest sequence number
54  // transmitted in the variable "recover" and exit the Fast Recovery
55  // procedure if applicable."
56  state->recover = (state->snd_max - 1);
57  EV_INFO << "recover=" << state->recover << "\n";
58  state->lossRecovery = false;
59  state->firstPartialACK = false;
60  EV_INFO << "Loss Recovery terminated.\n";
61 
62  // After REXMIT timeout TCP NewReno should start slow start with snd_cwnd = snd_mss.
63  //
64  // If calling "retransmitData();" there is no rexmit limitation (bytesToSend > snd_cwnd)
65  // therefore "sendData();" has been modified and is called to rexmit outstanding data.
66  //
67  // RFC 2581, page 5:
68  // "Furthermore, upon a timeout cwnd MUST be set to no more than the loss
69  // window, LW, which equals 1 full-sized segment (regardless of the
70  // value of IW). Therefore, after retransmitting the dropped segment
71  // the TCP sender uses the slow start algorithm to increase the window
72  // from 1 full-sized segment to the new value of ssthresh, at which
73  // point congestion avoidance again takes over."
74 
75  // begin Slow Start (RFC 2581)
78 
79  conn->emit(cwndSignal, state->snd_cwnd);
80 
81  EV_INFO << "Begin Slow Start: resetting cwnd to " << state->snd_cwnd
82  << ", ssthresh=" << state->ssthresh << "\n";
83  state->afterRto = true;
85 }

◆ recalculateSlowStartThreshold()

void inet::tcp::TcpNewReno::recalculateSlowStartThreshold ( )
protectedvirtual

Utility function to recalculate ssthresh.

24 {
25  // RFC 2581, page 4:
26  // "When a TCP sender detects segment loss using the retransmission
27  // timer, the value of ssthresh MUST be set to no more than the value
28  // given in equation 3:
29  //
30  // ssthresh = max (FlightSize / 2, 2*SMSS) (3)
31  //
32  // As discussed above, FlightSize is the amount of outstanding data in
33  // the network."
34 
35  // set ssthresh to flight size / 2, but at least 2 SMSS
36  // (the formula below practically amounts to ssthresh = cwnd / 2 most of the time)
37  uint32_t flight_size = std::min(state->snd_cwnd, state->snd_wnd); // FIXME - Does this formula computes the amount of outstanding data?
38 // uint32_t flight_size = state->snd_max - state->snd_una;
39  state->ssthresh = std::max(flight_size / 2, 2 * state->snd_mss);
40 
42 }

Referenced by processRexmitTimer(), and receivedDuplicateAck().

◆ receivedDataAck()

void inet::tcp::TcpNewReno::receivedDataAck ( uint32_t  firstSeqAcked)
overridevirtual

Redefine what should happen when data got acked, to add congestion window management.

Reimplemented from inet::tcp::TcpBaseAlg.

88 {
90 
91  // RFC 3782, page 5:
92  // "5) When an ACK arrives that acknowledges new data, this ACK could be
93  // the acknowledgment elicited by the retransmission from step 2, or
94  // elicited by a later retransmission.
95  //
96  // Full acknowledgements:
97  // If this ACK acknowledges all of the data up to and including
98  // "recover", then the ACK acknowledges all the intermediate
99  // segments sent between the original transmission of the lost
100  // segment and the receipt of the third duplicate ACK. Set cwnd to
101  // either (1) min (ssthresh, FlightSize + SMSS) or (2) ssthresh,
102  // where ssthresh is the value set in step 1; this is termed
103  // "deflating" the window. (We note that "FlightSize" in step 1
104  // referred to the amount of data outstanding in step 1, when Fast
105  // Recovery was entered, while "FlightSize" in step 5 refers to the
106  // amount of data outstanding in step 5, when Fast Recovery is
107  // exited.) If the second option is selected, the implementation is
108  // encouraged to take measures to avoid a possible burst of data, in
109  // case the amount of data outstanding in the network is much less
110  // than the new congestion window allows. A simple mechanism is to
111  // limit the number of data packets that can be sent in response to
112  // a single acknowledgement; this is known as "maxburst_" in the NS
113  // simulator. Exit the Fast Recovery procedure."
114  if (state->lossRecovery) {
115  if (seqGE(state->snd_una - 1, state->recover)) {
116  // Exit Fast Recovery: deflating cwnd
117  //
118  // option (1): set cwnd to min (ssthresh, FlightSize + SMSS)
119  uint32_t flight_size = state->snd_max - state->snd_una;
120  state->snd_cwnd = std::min(state->ssthresh, flight_size + state->snd_mss);
121  EV_INFO << "Fast Recovery - Full ACK received: Exit Fast Recovery, setting cwnd to " << state->snd_cwnd << "\n";
122  // option (2): set cwnd to ssthresh
123 // state->snd_cwnd = state->ssthresh;
124 // tcpEV << "Fast Recovery - Full ACK received: Exit Fast Recovery, setting cwnd to ssthresh=" << state->ssthresh << "\n";
125  // TODO - If the second option (2) is selected, take measures to avoid a possible burst of data (maxburst)!
126  conn->emit(cwndSignal, state->snd_cwnd);
127 
128  state->lossRecovery = false;
129  state->firstPartialACK = false;
130  EV_INFO << "Loss Recovery terminated.\n";
131  }
132  else {
133  // RFC 3782, page 5:
134  // "Partial acknowledgements:
135  // If this ACK does *not* acknowledge all of the data up to and
136  // including "recover", then this is a partial ACK. In this case,
137  // retransmit the first unacknowledged segment. Deflate the
138  // congestion window by the amount of new data acknowledged by the
139  // cumulative acknowledgement field. If the partial ACK
140  // acknowledges at least one SMSS of new data, then add back SMSS
141  // bytes to the congestion window. As in Step 3, this artificially
142  // inflates the congestion window in order to reflect the additional
143  // segment that has left the network. Send a new segment if
144  // permitted by the new value of cwnd. This "partial window
145  // deflation" attempts to ensure that, when Fast Recovery eventually
146  // ends, approximately ssthresh amount of data will be outstanding
147  // in the network. Do not exit the Fast Recovery procedure (i.e.,
148  // if any duplicate ACKs subsequently arrive, execute Steps 3 and 4
149  // above).
150  //
151  // For the first partial ACK that arrives during Fast Recovery, also
152  // reset the retransmit timer. Timer management is discussed in
153  // more detail in Section 4."
154 
155  EV_INFO << "Fast Recovery - Partial ACK received: retransmitting the first unacknowledged segment\n";
156  // retransmit first unacknowledged segment
157  conn->retransmitOneSegment(false);
158 
159  // deflate cwnd by amount of new data acknowledged by cumulative acknowledgement field
160  state->snd_cwnd -= state->snd_una - firstSeqAcked;
161 
162  conn->emit(cwndSignal, state->snd_cwnd);
163 
164  EV_INFO << "Fast Recovery: deflating cwnd by amount of new data acknowledged, new cwnd=" << state->snd_cwnd << "\n";
165 
166  // if the partial ACK acknowledges at least one SMSS of new data, then add back SMSS bytes to the cwnd
167  if (state->snd_una - firstSeqAcked >= state->snd_mss) {
169 
170  conn->emit(cwndSignal, state->snd_cwnd);
171 
172  EV_DETAIL << "Fast Recovery: inflating cwnd by SMSS, new cwnd=" << state->snd_cwnd << "\n";
173  }
174 
175  // try to send a new segment if permitted by the new value of cwnd
176  sendData(false);
177 
178  // reset REXMIT timer for the first partial ACK that arrives during Fast Recovery
179  if (state->lossRecovery) {
180  if (!state->firstPartialACK) {
181  state->firstPartialACK = true;
182  EV_DETAIL << "First partial ACK arrived during recovery, restarting REXMIT timer.\n";
184  }
185  }
186  }
187  }
188  else {
189  //
190  // Perform slow start and congestion avoidance.
191  //
192  if (state->snd_cwnd < state->ssthresh) {
193  EV_DETAIL << "cwnd <= ssthresh: Slow Start: increasing cwnd by SMSS bytes to ";
194 
195  // perform Slow Start. RFC 2581: "During slow start, a TCP increments cwnd
196  // by at most SMSS bytes for each ACK received that acknowledges new data."
198 
199  // Note: we could increase cwnd based on the number of bytes being
200  // acknowledged by each arriving ACK, rather than by the number of ACKs
201  // that arrive. This is called "Appropriate Byte Counting" (ABC) and is
202  // described in RFC 3465. This RFC is experimental and probably not
203  // implemented in real-life TCPs, hence it's commented out. Also, the ABC
204  // RFC would require other modifications as well in addition to the
205  // two lines below.
206  //
207 // int bytesAcked = state->snd_una - firstSeqAcked;
208 // state->snd_cwnd += bytesAcked * state->snd_mss;
209 
210  conn->emit(cwndSignal, state->snd_cwnd);
211 
212  EV_DETAIL << "cwnd=" << state->snd_cwnd << "\n";
213  }
214  else {
215  // perform Congestion Avoidance (RFC 2581)
216  uint32_t incr = state->snd_mss * state->snd_mss / state->snd_cwnd;
217 
218  if (incr == 0)
219  incr = 1;
220 
221  state->snd_cwnd += incr;
222 
223  conn->emit(cwndSignal, state->snd_cwnd);
224 
225  //
226  // Note: some implementations use extra additive constant mss / 8 here
227  // which is known to be incorrect (RFC 2581 p5)
228  //
229  // Note 2: RFC 3465 (experimental) "Appropriate Byte Counting" (ABC)
230  // would require maintaining a bytes_acked variable here which we don't do
231  //
232 
233  EV_DETAIL << "cwnd > ssthresh: Congestion Avoidance: increasing cwnd linearly, to " << state->snd_cwnd << "\n";
234  }
235 
236  // RFC 3782, page 13:
237  // "When not in Fast Recovery, the value of the state variable "recover"
238  // should be pulled along with the value of the state variable for
239  // acknowledgments (typically, "snd_una") so that, when large amounts of
240  // data have been sent and acked, the sequence space does not wrap and
241  // falsely indicate that Fast Recovery should not be entered (Section 3,
242  // step 1, last paragraph)."
243  state->recover = (state->snd_una - 2);
244  }
245 
246  sendData(false);
247 }

◆ receivedDuplicateAck()

void inet::tcp::TcpNewReno::receivedDuplicateAck ( )
overridevirtual

Redefine what should happen when dupAck was received, to add congestion window management.

Reimplemented from inet::tcp::TcpBaseAlg.

250 {
252 
253  if (state->dupacks == state->dupthresh) {
254  if (!state->lossRecovery) {
255  // RFC 3782, page 4:
256  // "1) Three duplicate ACKs:
257  // When the third duplicate ACK is received and the sender is not
258  // already in the Fast Recovery procedure, check to see if the
259  // Cumulative Acknowledgement field covers more than "recover". If
260  // so, go to Step 1A. Otherwise, go to Step 1B."
261  //
262  // RFC 3782, page 6:
263  // "Step 1 specifies a check that the Cumulative Acknowledgement field
264  // covers more than "recover". Because the acknowledgement field
265  // contains the sequence number that the sender next expects to receive,
266  // the acknowledgement "ack_number" covers more than "recover" when:
267  // ack_number - 1 > recover;"
268  if (state->snd_una - 1 > state->recover) {
269  EV_INFO << "NewReno on dupAcks == DUPTHRESH(=" << state->dupthresh << ": perform Fast Retransmit, and enter Fast Recovery:";
270 
271  // RFC 3782, page 4:
272  // "1A) Invoking Fast Retransmit:
273  // If so, then set ssthresh to no more than the value given in
274  // equation 1 below. (This is equation 3 from [RFC2581]).
275  // ssthresh = max (FlightSize / 2, 2*SMSS) (1)
276  // In addition, record the highest sequence number transmitted in
277  // the variable "recover", and go to Step 2."
279  state->recover = (state->snd_max - 1);
280  state->firstPartialACK = false;
281  state->lossRecovery = true;
282  EV_INFO << " set recover=" << state->recover;
283 
284  // RFC 3782, page 4:
285  // "2) Entering Fast Retransmit:
286  // Retransmit the lost segment and set cwnd to ssthresh plus 3 * SMSS.
287  // This artificially "inflates" the congestion window by the number
288  // of segments (three) that have left the network and the receiver
289  // has buffered."
291 
292  conn->emit(cwndSignal, state->snd_cwnd);
293 
294  EV_DETAIL << " , cwnd=" << state->snd_cwnd << ", ssthresh=" << state->ssthresh << "\n";
295  conn->retransmitOneSegment(false);
296 
297  // RFC 3782, page 5:
298  // "4) Fast Recovery, continued:
299  // Transmit a segment, if allowed by the new value of cwnd and the
300  // receiver's advertised window."
301  sendData(false);
302  }
303  else {
304  EV_INFO << "NewReno on dupAcks == DUPTHRESH(=" << state->dupthresh << ": not invoking Fast Retransmit and Fast Recovery\n";
305 
306  // RFC 3782, page 4:
307  // "1B) Not invoking Fast Retransmit:
308  // Do not enter the Fast Retransmit and Fast Recovery procedure. In
309  // particular, do not change ssthresh, do not go to Step 2 to
310  // retransmit the "lost" segment, and do not execute Step 3 upon
311  // subsequent duplicate ACKs."
312  }
313  }
314  EV_INFO << "NewReno on dupAcks == DUPTHRESH(=" << state->dupthresh << ": TCP is already in Fast Recovery procedure\n";
315  }
316  else if (state->dupacks > state->dupthresh) {
317  if (state->lossRecovery) {
318  // RFC 3782, page 4:
319  // "3) Fast Recovery:
320  // For each additional duplicate ACK received while in Fast
321  // Recovery, increment cwnd by SMSS. This artificially inflates the
322  // congestion window in order to reflect the additional segment that
323  // has left the network."
325 
326  conn->emit(cwndSignal, state->snd_cwnd);
327 
328  EV_DETAIL << "NewReno on dupAcks > DUPTHRESH(=" << state->dupthresh << ": Fast Recovery: inflating cwnd by SMSS, new cwnd=" << state->snd_cwnd << "\n";
329 
330  // RFC 3782, page 5:
331  // "4) Fast Recovery, continued:
332  // Transmit a segment, if allowed by the new value of cwnd and the
333  // receiver's advertised window."
334  sendData(false);
335  }
336  }
337 }

Member Data Documentation

◆ state


The documentation for this class was generated from the following files:
inet::tcp::TcpBaseAlg::cwndSignal
static simsignal_t cwndSignal
Definition: TcpBaseAlg.h:101
inet::tcp::TcpBaseAlg::processRexmitTimer
virtual void processRexmitTimer(TcpEventCode &event)
Definition: TcpBaseAlg.cc:208
inet::tcp::TcpTahoeRenoFamilyStateVariables::ssthresh
uint32_t ssthresh
slow start threshold
Definition: TcpTahoeRenoFamily.h:27
inet::tcp::TcpBaseAlgStateVariables::snd_cwnd
uint32_t snd_cwnd
congestion window
Definition: TcpBaseAlg.h:40
inet::tcp::TcpBaseAlgStateVariables::firstPartialACK
bool firstPartialACK
first partial acknowledgement (RFC 3782)
Definition: TcpBaseAlg.h:63
inet::sctp::min
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SctpAssociation.h:261
inet::tcp::TcpStateVariables::dupacks
uint32_t dupacks
Definition: TcpConnection.h:236
inet::tcp::TcpStateVariables::dupthresh
uint32_t dupthresh
Definition: TcpConnection.h:261
inet::tcp::TcpStateVariables::snd_wnd
uint32_t snd_wnd
Definition: TcpConnection.h:150
inet::tcp::TcpBaseAlg::receivedDuplicateAck
virtual void receivedDuplicateAck() override
Called after we received a duplicate ACK (that is: ackNo == snd_una, no data in segment,...
Definition: TcpBaseAlg.cc:565
inet::tcp::TcpStateVariables::lossRecovery
bool lossRecovery
Definition: TcpConnection.h:229
inet::tcp::TcpAlgorithm::conn
TcpConnection * conn
Definition: TcpAlgorithm.h:26
inet::tcp::TcpBaseAlg::receivedDataAck
virtual void receivedDataAck(uint32_t firstSeqAcked) override
Called after we received an ACK which acked some data (that is, we could advance snd_una).
Definition: TcpBaseAlg.cc:483
inet::tcp::TcpStateVariables::afterRto
bool afterRto
Definition: TcpConnection.h:194
inet::tcp::seqGE
bool seqGE(uint32_t a, uint32_t b)
Definition: TcpHeader.h:24
inet::sctp::max
double max(const double a, const double b)
Returns the maximum of a and b.
Definition: SctpAssociation.h:266
inet::tcp::TcpNewRenoStateVariables
TcpTahoeRenoFamilyStateVariables TcpNewRenoStateVariables
State variables for TcpNewReno.
Definition: TcpNewReno.h:18
inet::tcp::TcpStateVariables::snd_mss
uint32_t snd_mss
Definition: TcpConnection.h:142
inet::tcp::TcpBaseAlgStateVariables::recover
uint32_t recover
RFC 3782 variables.
Definition: TcpBaseAlg.h:62
inet::tcp::TCP_E_ABORT
@ TCP_E_ABORT
Definition: TcpConnection.h:75
inet::tcp::TcpBaseAlg::restartRexmitTimer
virtual void restartRexmitTimer() override
Restart REXMIT timer.
Definition: TcpBaseAlg.cc:628
inet::tcp::TcpBaseAlg::sendData
virtual bool sendData(bool sendCommandInvoked)
Send data, observing Nagle's algorithm and congestion window.
Definition: TcpBaseAlg.cc:398
inet::tcp::TcpConnection::retransmitOneSegment
virtual void retransmitOneSegment(bool called_at_rto)
Utility: retransmit one segment from snd_una.
Definition: TcpConnectionUtil.cc:960
inet::tcp::TcpNewReno::state
TcpNewRenoStateVariables *& state
Definition: TcpNewReno.h:26
inet::tcp::TcpNewReno::recalculateSlowStartThreshold
virtual void recalculateSlowStartThreshold()
Utility function to recalculate ssthresh.
Definition: TcpNewReno.cc:23
inet::tcp::TcpStateVariables::snd_una
uint32_t snd_una
Definition: TcpConnection.h:147
inet::tcp::TcpAlgorithm::state
TcpStateVariables * state
Definition: TcpAlgorithm.h:27
inet::tcp::TcpBaseAlg::ssthreshSignal
static simsignal_t ssthreshSignal
Definition: TcpBaseAlg.h:102
inet::tcp::TcpTahoeRenoFamily::TcpTahoeRenoFamily
TcpTahoeRenoFamily()
Ctor.
Definition: TcpTahoeRenoFamily.cc:45
inet::tcp::TcpStateVariables::snd_max
uint32_t snd_max
Definition: TcpConnection.h:149