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 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...
 
- Public Member Functions inherited from inet::tcp::TCPBaseAlg
 TCPBaseAlg ()
 Ctor. More...
 
virtual ~TCPBaseAlg ()
 Virtual dtor. More...
 
virtual void initialize () override
 Create timers, etc. 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 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 fromseq) override
 Called after we sent data. More...
 
virtual void segmentRetransmitted (uint32 fromseq, uint32 toseq) override
 Called after we retransmitted segment. More...
 
virtual void restartRexmitTimer () override
 Restart REXMIT timer. 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 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 echoedTS) override
 Converting uint32 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...
 
virtual void processPersistTimer (TCPEventCode &event)
 
virtual void processDelayedAckTimer (TCPEventCode &event)
 
virtual void processKeepAliveTimer (TCPEventCode &event)
 

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
 
cOutVector * cwndVector
 
cOutVector * ssthreshVector
 
cOutVector * rttVector
 
cOutVector * srttVector
 
cOutVector * rttvarVector
 
cOutVector * rtoVector
 
cOutVector * numRtosVector
 
- Protected Attributes inherited from inet::tcp::TCPAlgorithm
TCPConnectionconn
 
TCPStateVariablesstate
 

Detailed Description

Implements TCP NewReno.

Constructor & Destructor Documentation

inet::tcp::TCPNewReno::TCPNewReno ( )

Ctor.

30 {
31 }
TCPStateVariables * state
Definition: TCPAlgorithm.h:41
TCPNewRenoStateVariables *& state
Definition: TCPNewReno.h:40
TCPTahoeRenoFamily()
Ctor.
Definition: TCPTahoeRenoFamily.cc:58
TCPTahoeRenoFamilyStateVariables TCPNewRenoStateVariables
State variables for TCPNewReno.
Definition: TCPNewReno.h:32

Member Function Documentation

virtual TCPStateVariables* inet::tcp::TCPNewReno::createStateVariables ( )
inlineoverrideprotectedvirtual

Create and return a TCPNewRenoStateVariables object.

Implements inet::tcp::TCPAlgorithm.

44  {
45  return new TCPNewRenoStateVariables();
46  }
TCPTahoeRenoFamilyStateVariables TCPNewRenoStateVariables
State variables for TCPNewReno.
Definition: TCPNewReno.h:32
void inet::tcp::TCPNewReno::processRexmitTimer ( TCPEventCode event)
overrideprotectedvirtual

Redefine what should happen on retransmission.

Reimplemented from inet::tcp::TCPBaseAlg.

56 {
58 
59  if (event == TCP_E_ABORT)
60  return;
61 
62  // RFC 3782, page 6:
63  // "6) Retransmit timeouts:
64  // After a retransmit timeout, record the highest sequence number
65  // transmitted in the variable "recover" and exit the Fast Recovery
66  // procedure if applicable."
67  state->recover = (state->snd_max - 1);
68  EV_INFO << "recover=" << state->recover << "\n";
69  state->lossRecovery = false;
70  state->firstPartialACK = false;
71  EV_INFO << "Loss Recovery terminated.\n";
72 
73  // After REXMIT timeout TCP NewReno should start slow start with snd_cwnd = snd_mss.
74  //
75  // If calling "retransmitData();" there is no rexmit limitation (bytesToSend > snd_cwnd)
76  // therefore "sendData();" has been modified and is called to rexmit outstanding data.
77  //
78  // RFC 2581, page 5:
79  // "Furthermore, upon a timeout cwnd MUST be set to no more than the loss
80  // window, LW, which equals 1 full-sized segment (regardless of the
81  // value of IW). Therefore, after retransmitting the dropped segment
82  // the TCP sender uses the slow start algorithm to increase the window
83  // from 1 full-sized segment to the new value of ssthresh, at which
84  // point congestion avoidance again takes over."
85 
86  // begin Slow Start (RFC 2581)
89 
90  if (cwndVector)
91  cwndVector->record(state->snd_cwnd);
92 
93  EV_INFO << "Begin Slow Start: resetting cwnd to " << state->snd_cwnd
94  << ", ssthresh=" << state->ssthresh << "\n";
95  state->afterRto = true;
97 }
virtual void retransmitOneSegment(bool called_at_rto)
Utility: retransmit one segment from snd_una.
Definition: TCPConnectionUtil.cc:802
cOutVector * cwndVector
Definition: TCPBaseAlg.h:115
virtual void processRexmitTimer(TCPEventCode &event)
Definition: TCPBaseAlg.cc:231
TCPNewRenoStateVariables *& state
Definition: TCPNewReno.h:40
bool firstPartialACK
first partial acknowledgement (RFC 3782)
Definition: TCPBaseAlg.h:77
uint32 snd_mss
Definition: TCPConnection.h:159
Definition: TCPConnection.h:90
uint32 recover
RFC 3782 variables.
Definition: TCPBaseAlg.h:76
bool afterRto
Definition: TCPConnection.h:213
virtual void recalculateSlowStartThreshold()
Utility function to recalculate ssthresh.
Definition: TCPNewReno.cc:33
TCPConnection * conn
Definition: TCPAlgorithm.h:40
bool lossRecovery
Definition: TCPConnection.h:248
uint32 ssthresh
slow start threshold
Definition: TCPTahoeRenoFamily.h:40
uint32 snd_max
Definition: TCPConnection.h:166
uint32 snd_cwnd
congestion window
Definition: TCPBaseAlg.h:54
void inet::tcp::TCPNewReno::recalculateSlowStartThreshold ( )
protectedvirtual

Utility function to recalculate ssthresh.

Referenced by processRexmitTimer(), and receivedDuplicateAck().

34 {
35  // RFC 2581, page 4:
36  // "When a TCP sender detects segment loss using the retransmission
37  // timer, the value of ssthresh MUST be set to no more than the value
38  // given in equation 3:
39  //
40  // ssthresh = max (FlightSize / 2, 2*SMSS) (3)
41  //
42  // As discussed above, FlightSize is the amount of outstanding data in
43  // the network."
44 
45  // set ssthresh to flight size / 2, but at least 2 SMSS
46  // (the formula below practically amounts to ssthresh = cwnd / 2 most of the time)
47  uint32 flight_size = std::min(state->snd_cwnd, state->snd_wnd); // FIXME TODO - Does this formula computes the amount of outstanding data?
48  // uint32 flight_size = state->snd_max - state->snd_una;
49  state->ssthresh = std::max(flight_size / 2, 2 * state->snd_mss);
50 
51  if (ssthreshVector)
52  ssthreshVector->record(state->ssthresh);
53 }
TCPNewRenoStateVariables *& state
Definition: TCPNewReno.h:40
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SCTPAssociation.h:270
double max(double a, double b)
Returns the greater of the given parameters.
Definition: INETMath.h:161
uint32 snd_wnd
Definition: TCPConnection.h:167
uint32 snd_mss
Definition: TCPConnection.h:159
uint32_t uint32
Definition: Compat.h:30
cOutVector * ssthreshVector
Definition: TCPBaseAlg.h:116
uint32 ssthresh
slow start threshold
Definition: TCPTahoeRenoFamily.h:40
uint32 snd_cwnd
congestion window
Definition: TCPBaseAlg.h:54
void inet::tcp::TCPNewReno::receivedDataAck ( uint32  firstSeqAcked)
overridevirtual

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

Reimplemented from inet::tcp::TCPBaseAlg.

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

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

Reimplemented from inet::tcp::TCPBaseAlg.

267 {
269 
270  if (state->dupacks == DUPTHRESH) { // DUPTHRESH = 3
271  if (!state->lossRecovery) {
272  // RFC 3782, page 4:
273  // "1) Three duplicate ACKs:
274  // When the third duplicate ACK is received and the sender is not
275  // already in the Fast Recovery procedure, check to see if the
276  // Cumulative Acknowledgement field covers more than "recover". If
277  // so, go to Step 1A. Otherwise, go to Step 1B."
278  //
279  // RFC 3782, page 6:
280  // "Step 1 specifies a check that the Cumulative Acknowledgement field
281  // covers more than "recover". Because the acknowledgement field
282  // contains the sequence number that the sender next expects to receive,
283  // the acknowledgement "ack_number" covers more than "recover" when:
284  // ack_number - 1 > recover;"
285  if (state->snd_una - 1 > state->recover) {
286  EV_INFO << "NewReno on dupAcks == DUPTHRESH(=3): perform Fast Retransmit, and enter Fast Recovery:";
287 
288  // RFC 3782, page 4:
289  // "1A) Invoking Fast Retransmit:
290  // If so, then set ssthresh to no more than the value given in
291  // equation 1 below. (This is equation 3 from [RFC2581]).
292  // ssthresh = max (FlightSize / 2, 2*SMSS) (1)
293  // In addition, record the highest sequence number transmitted in
294  // the variable "recover", and go to Step 2."
296  state->recover = (state->snd_max - 1);
297  state->firstPartialACK = false;
298  state->lossRecovery = true;
299  EV_INFO << " set recover=" << state->recover;
300 
301  // RFC 3782, page 4:
302  // "2) Entering Fast Retransmit:
303  // Retransmit the lost segment and set cwnd to ssthresh plus 3 * SMSS.
304  // This artificially "inflates" the congestion window by the number
305  // of segments (three) that have left the network and the receiver
306  // has buffered."
308 
309  if (cwndVector)
310  cwndVector->record(state->snd_cwnd);
311 
312  EV_DETAIL << " , cwnd=" << state->snd_cwnd << ", ssthresh=" << state->ssthresh << "\n";
313  conn->retransmitOneSegment(false);
314 
315  // RFC 3782, page 5:
316  // "4) Fast Recovery, continued:
317  // Transmit a segment, if allowed by the new value of cwnd and the
318  // receiver's advertised window."
319  sendData(false);
320  }
321  else {
322  EV_INFO << "NewReno on dupAcks == DUPTHRESH(=3): not invoking Fast Retransmit and Fast Recovery\n";
323 
324  // RFC 3782, page 4:
325  // "1B) Not invoking Fast Retransmit:
326  // Do not enter the Fast Retransmit and Fast Recovery procedure. In
327  // particular, do not change ssthresh, do not go to Step 2 to
328  // retransmit the "lost" segment, and do not execute Step 3 upon
329  // subsequent duplicate ACKs."
330  }
331  }
332  EV_INFO << "NewReno on dupAcks == DUPTHRESH(=3): TCP is already in Fast Recovery procedure\n";
333  }
334  else if (state->dupacks > DUPTHRESH) { // DUPTHRESH = 3
335  if (state->lossRecovery) {
336  // RFC 3782, page 4:
337  // "3) Fast Recovery:
338  // For each additional duplicate ACK received while in Fast
339  // Recovery, increment cwnd by SMSS. This artificially inflates the
340  // congestion window in order to reflect the additional segment that
341  // has left the network."
343 
344  if (cwndVector)
345  cwndVector->record(state->snd_cwnd);
346 
347  EV_DETAIL << "NewReno on dupAcks > DUPTHRESH(=3): Fast Recovery: inflating cwnd by SMSS, new cwnd=" << state->snd_cwnd << "\n";
348 
349  // RFC 3782, page 5:
350  // "4) Fast Recovery, continued:
351  // Transmit a segment, if allowed by the new value of cwnd and the
352  // receiver's advertised window."
353  sendData(false);
354  }
355  }
356 }
virtual void retransmitOneSegment(bool called_at_rto)
Utility: retransmit one segment from snd_una.
Definition: TCPConnectionUtil.cc:802
cOutVector * cwndVector
Definition: TCPBaseAlg.h:115
TCPNewRenoStateVariables *& state
Definition: TCPNewReno.h:40
bool firstPartialACK
first partial acknowledgement (RFC 3782)
Definition: TCPBaseAlg.h:77
uint32 snd_mss
Definition: TCPConnection.h:159
uint32 dupacks
Definition: TCPConnection.h:255
#define DUPTHRESH
Definition: TCPConnection.h:126
uint32 snd_una
Definition: TCPConnection.h:164
uint32 recover
RFC 3782 variables.
Definition: TCPBaseAlg.h:76
virtual void recalculateSlowStartThreshold()
Utility function to recalculate ssthresh.
Definition: TCPNewReno.cc:33
virtual void receivedDuplicateAck() override
Called after we received a duplicate ACK (that is: ackNo == snd_una, no data in segment, segment doesn&#39;t carry window update, and also, we have unacked data).
Definition: TCPBaseAlg.cc:611
TCPConnection * conn
Definition: TCPAlgorithm.h:40
bool lossRecovery
Definition: TCPConnection.h:248
uint32 ssthresh
slow start threshold
Definition: TCPTahoeRenoFamily.h:40
uint32 snd_max
Definition: TCPConnection.h:166
uint32 snd_cwnd
congestion window
Definition: TCPBaseAlg.h:54
virtual bool sendData(bool sendCommandInvoked)
Send data, observing Nagle&#39;s algorithm and congestion window.
Definition: TCPBaseAlg.cc:429

Member Data Documentation


The documentation for this class was generated from the following files: