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

#include <TCPVegas.h>

Inheritance diagram for inet::tcp::TCPVegas:
inet::tcp::TCPBaseAlg inet::tcp::TCPAlgorithm

Public Member Functions

 TCPVegas ()
 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...
 
virtual void dataSent (uint32 fromseq) override
 Called after we send data. More...
 
virtual void segmentRetransmitted (uint32 fromseq, uint32 toseq) override
 Called after we retransmitted segment. 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 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 TCPvegasStateVariables 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

TCPVegasStateVariables *& 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
 

Constructor & Destructor Documentation

inet::tcp::TCPVegas::TCPVegas ( )

Ctor.

73  : TCPBaseAlg(), state((TCPVegasStateVariables *&)TCPAlgorithm::state)
74 {
75 }
TCPStateVariables * state
Definition: TCPAlgorithm.h:41
TCPBaseAlg()
Ctor.
Definition: TCPBaseAlg.cc:98
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68

Member Function Documentation

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

Create and return a TCPvegasStateVariables object.

Implements inet::tcp::TCPAlgorithm.

72  {
73  return new TCPVegasStateVariables();
74  }
void inet::tcp::TCPVegas::dataSent ( uint32  fromseq)
overridevirtual

Called after we send data.

Reimplemented from inet::tcp::TCPBaseAlg.

368 {
369  TCPBaseAlg::dataSent(fromseq);
370 
371  // save time when packet is sent
372  // fromseq is the seq number of the 1st sent byte
373  // we need this value, based on iss=0 (to store it the right way on the vector),
374  // but iss is not a constant value (ej: iss=0), so it needs to be detemined each time
375  // (this is why it is used: fromseq-state->iss)
376 
378  state->regions.set(fromseq, state->snd_max, simTime());
379 }
virtual void dataSent(uint32 fromseq) override
Called after we sent data.
Definition: TCPBaseAlg.cc:649
TCPSegmentTransmitInfoList regions
Definition: TCPVegas.h:55
void clearTo(uint32_t endseg)
Definition: TCPSegmentTransmitInfoList.cc:87
void set(uint32_t beg, uint32_t end, simtime_t sentTime)
Definition: TCPSegmentTransmitInfoList.cc:28
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68
uint32 snd_una
Definition: TCPConnection.h:164
uint32 snd_max
Definition: TCPConnection.h:166
void inet::tcp::TCPVegas::processRexmitTimer ( TCPEventCode event)
overrideprotectedvirtual

Redefine what should happen on retransmission.

Reimplemented from inet::tcp::TCPBaseAlg.

101 {
103 
104  if (event == TCP_E_ABORT)
105  return;
106 
108  // Vegas: when rtx timeout: cwnd = 2*smss, instead of 1*smss (Reno)
109  state->snd_cwnd = 2 * state->snd_mss;
110 
111  if (cwndVector)
112  cwndVector->record(state->snd_cwnd);
113  EV_DETAIL << "RXT Timeout in Vegas: resetting cwnd to " << state->snd_cwnd << "\n"
114  << ", ssthresh=" << state->ssthresh << "\n";
115 
116  state->v_cwnd_changed = simTime(); // Save time when cwnd changes due to rtx
117 
118  state->afterRto = true;
119 
120  conn->retransmitOneSegment(true); //retransmit one segment from snd_una
121 }
virtual void recalculateSlowStartThreshold()
Utility function to recalculate ssthresh.
Definition: TCPVegas.cc:78
virtual void retransmitOneSegment(bool called_at_rto)
Utility: retransmit one segment from snd_una.
Definition: TCPConnectionUtil.cc:802
cOutVector * cwndVector
Definition: TCPBaseAlg.h:115
uint32 ssthresh
slow start threshold
Definition: TCPVegas.h:57
virtual void processRexmitTimer(TCPEventCode &event)
Definition: TCPBaseAlg.cc:231
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68
uint32 snd_mss
Definition: TCPConnection.h:159
Definition: TCPConnection.h:90
simtime_t v_cwnd_changed
Definition: TCPVegas.h:43
bool afterRto
Definition: TCPConnection.h:213
TCPConnection * conn
Definition: TCPAlgorithm.h:40
uint32 snd_cwnd
congestion window
Definition: TCPBaseAlg.h:54
void inet::tcp::TCPVegas::recalculateSlowStartThreshold ( )
protectedvirtual

Utility function to recalculate ssthresh.

Referenced by processRexmitTimer(), and receivedDataAck().

79 {
80  // RFC 2581, page 4:
81  // "When a TCP sender detects segment loss using the retransmission
82  // timer, the value of ssthresh MUST be set to no more than the value
83  // given in equation 3:
84  //
85  // ssthresh = max (FlightSize / 2, 2*SMSS) (3)
86  //
87  // As discussed above, FlightSize is the amount of outstanding data in
88  // the network."
89 
90  // set ssthresh to flight size/2, but at least 2 SMSS
91  // (the formula below practically amounts to ssthresh=cwnd/2 most of the time)
92  uint32 flight_size = std::min(state->snd_cwnd, state->snd_wnd); // FIXME TODO - Does this formula computes the amount of outstanding data?
93  // uint32 flight_size = state->snd_max - state->snd_una;
94  state->ssthresh = std::max(flight_size / 2, 2 * state->snd_mss);
95  if (ssthreshVector)
96  ssthreshVector->record(state->ssthresh);
97 }
uint32 ssthresh
slow start threshold
Definition: TCPVegas.h:57
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
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68
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 snd_cwnd
congestion window
Definition: TCPBaseAlg.h:54
void inet::tcp::TCPVegas::receivedDataAck ( uint32  firstSeqAcked)
overridevirtual

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

Reimplemented from inet::tcp::TCPBaseAlg.

124 {
125  TCPBaseAlg::receivedDataAck(firstSeqAcked);
126 
127  const TCPSegmentTransmitInfoList::Item *found = state->regions.get(firstSeqAcked);
128  if (found) {
129  simtime_t currentTime = simTime();
130  simtime_t tSent = found->getFirstSentTime();
131  int num_transmits = found->getTransmitCount();
132 
133  //TODO: When should do it: when received first ACK, or when received ACK of 1st sent packet???
134  if (firstSeqAcked == state->iss + 1) { // Initialization
135  state->v_baseRTT = currentTime - tSent;
136  state->v_sa = state->v_baseRTT * 8;
138  state->v_rtt_timeout = ((state->v_sa / 4.0) + state->v_sd) / 2.0;
139  EV_DETAIL << "Vegas: initialization" << "\n";
140  }
141 
142  // Once per RTT
144  simtime_t newRTT;
145  if (state->v_cntRTT > 0) {
146  newRTT = state->v_sumRTT / state->v_cntRTT;
147  EV_DETAIL << "Vegas: newRTT (state->v_sumRTT / state->v_cntRTT) calculated: " << state->v_sumRTT / state->v_cntRTT << "\n";
148  }
149  else {
150  newRTT = currentTime - state->v_begtime;
151  EV_DETAIL << "Vegas: newRTT calculated: " << newRTT << "\n";
152  }
153  state->v_sumRTT = 0.0;
154  state->v_cntRTT = 0;
155 
156  // decide if incr/decr cwnd
157  if (newRTT > 0) {
158  // rttLen: bytes transmitted since a segment is sent and its ACK is received
159  uint32 rttLen = state->snd_nxt - state->v_begseq;
160 
161  // If only one packet in transit: update baseRTT
162  if (rttLen <= state->snd_mss)
163  state->v_baseRTT = newRTT;
164 
165  // actual = rttLen/(current_rtt)
166  uint32 actual = rttLen / newRTT;
167 
168  // expected = (current window size)/baseRTT
169  uint32 expected;
170  uint32 acked = state->snd_una - firstSeqAcked;
171  expected = (uint32)((state->snd_nxt - firstSeqAcked) + std::min(state->snd_mss - acked, (uint32)0)) / state->v_baseRTT;
172 
173  // diff = expected - actual
174  uint32 diff = (uint32)((expected - actual) * SIMTIME_DBL(state->v_baseRTT) + 0.5);
175 
176  EV_DETAIL << "Vegas: expected: " << expected << "\n"
177  << ", actual =" << actual << "\n"
178  << ", diff =" << diff << "\n";
179 
180  // Slow start
181  state->v_incr_ss = false; // reset
182  if (state->snd_cwnd < state->ssthresh) { //Slow start
183  EV_DETAIL << "Vegas: Slow Start: " << "\n";
184 
185  // cwnd modification during slow-start only every 2 rtt
187  if (!state->v_inc_flag) {
188  state->v_incr = 0;
189  }
190  else {
191  if (diff > 1 * state->snd_mss) { // gamma
192  /* When actual rate falls below expected rate a certain value (gamma threshold)
193  Vegas changes from slow start to linear incr/decr */
194 
195  recalculateSlowStartThreshold(); // to enter again in cong. avoidance
196  state->snd_cwnd -= (state->snd_cwnd / 8);
197 
198  if (state->snd_cwnd < 2 * state->snd_mss)
199  state->snd_cwnd = 2 * state->snd_mss;
200 
201  state->v_incr = 0;
202 
203  if (cwndVector)
204  cwndVector->record(state->snd_cwnd);
205  }
206  else {
207  state->v_incr = state->snd_mss; //incr 1 segment
208  state->v_incr_ss = true;
209  }
210  }
211  } // end slow start
212  else {
213  // Cong. avoidance
214  EV_DETAIL << "Vegas: Congestion avoidance: " << "\n";
215 
216  if (diff > 4 * state->snd_mss) { // beta
217  state->v_incr = -state->snd_mss;
218  }
219  else if (diff < 2 * state->snd_mss) { // alpha
221  }
222  else
223  state->v_incr = 0;
224  } // end cong. avoidance
225  }
226  // register beqseq and begtime values for next rtt
227  state->v_begtime = currentTime;
229  } // end 'once per rtt' section
230 
231  // if cwnd > ssthresh, no incr
232  if (state->v_incr_ss && state->snd_cwnd >= state->ssthresh) {
233  state->v_incr = 0;
234  EV_DETAIL << "Vegas: surpass ssthresh during slow-start: no cwnd incr. " << "\n";
235  }
236 
237  //incr/decr cwnd
238  if (state->v_incr > 0) {
239  state->snd_cwnd += state->v_incr;
240 
241  if (cwndVector)
242  cwndVector->record(state->snd_cwnd);
243  EV_DETAIL << "Vegas: incr cwnd linearly, to " << state->snd_cwnd << "\n";
244  }
245  else if (state->v_incr < 0) {
246  state->snd_cwnd += state->v_incr;
247  if (state->snd_cwnd < 2 * state->snd_mss)
248  state->snd_cwnd = 2 * state->snd_mss;
249 
250  if (cwndVector)
251  cwndVector->record(state->snd_cwnd);
252  EV_DETAIL << "Vegas: decr cwnd linearly, to " << state->snd_cwnd << "\n";
253  }
254 
255  // update vegas fine-grained timeout value (retransmitted packets do not count)
256  if (tSent != 0 && num_transmits == 1) {
257  simtime_t newRTT = currentTime - tSent;
258  state->v_sumRTT += newRTT;
259  ++state->v_cntRTT;
260 
261  if (newRTT > 0) {
262  if (newRTT < state->v_baseRTT)
263  state->v_baseRTT = newRTT;
264 
265  simtime_t n = newRTT - state->v_sa / 8;
266  state->v_sa += n;
267  n = n < 0 ? -n : n;
268  n -= state->v_sd / 4;
269  state->v_sd += n;
270  state->v_rtt_timeout = ((state->v_sa / 4) + state->v_sd) / 2;
272  EV_DETAIL << "Vegas: new v_rtt_timeout = " << state->v_rtt_timeout << "\n";
273  }
274  }
275 
276  // check 1st and 2nd ack after a rtx
277  if (state->v_worried > 0) {
279  const TCPSegmentTransmitInfoList::Item *unaFound = state->regions.get(state->snd_una);
280  //bool expired = unaFound && ((currentTime - unaFound->getLastSentTime()) >= state->v_rtt_timeout);
281  bool expired = unaFound && ((currentTime - unaFound->getFirstSentTime()) >= state->v_rtt_timeout);
282 
283  // added comprobation to check that received ACK do not acks all outstanding data. If not,
284  // TCPConnection::retransmitOneSegment will fail: ASSERT(bytes!=0), line 839), because bytes = snd_max-snd_una
285  if (expired && (state->snd_max - state->snd_una > 0)) {
287  EV_DETAIL << "Vegas: retransmission (v_rtt_timeout) " << "\n";
288  conn->retransmitOneSegment(false); //retransmit one segment from snd_una
289  }
290  else
291  state->v_worried = 0;
292  }
293  } // Closes if v_sendtime != nullptr
294 
296 
297  //Try to send more data
298  sendData(false);
299 }
virtual void recalculateSlowStartThreshold()
Utility function to recalculate ssthresh.
Definition: TCPVegas.cc:78
virtual void retransmitOneSegment(bool called_at_rto)
Utility: retransmit one segment from snd_una.
Definition: TCPConnectionUtil.cc:802
simtime_t v_sumRTT
Definition: TCPVegas.h:46
cOutVector * cwndVector
Definition: TCPBaseAlg.h:115
uint32 ssthresh
slow start threshold
Definition: TCPVegas.h:57
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SCTPAssociation.h:270
TCPSegmentTransmitInfoList regions
Definition: TCPVegas.h:55
void clearTo(uint32_t endseg)
Definition: TCPSegmentTransmitInfoList.cc:87
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
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68
uint32 snd_mss
Definition: TCPConnection.h:159
uint32 snd_nxt
Definition: TCPConnection.h:165
bool v_inc_flag
Definition: TCPVegas.h:59
int32 v_incr
Definition: TCPVegas.h:61
uint32 dupacks
Definition: TCPConnection.h:255
uint32 v_begseq
Definition: TCPVegas.h:48
#define DUPTHRESH
Definition: TCPConnection.h:126
simtime_t v_begtime
Definition: TCPVegas.h:49
uint32 snd_una
Definition: TCPConnection.h:164
simtime_t v_sd
Definition: TCPVegas.h:53
uint32_t uint32
Definition: Compat.h:30
bool v_incr_ss
Definition: TCPVegas.h:60
uint32 iss
Definition: TCPConnection.h:171
simtime_t v_sa
Definition: TCPVegas.h:52
bool seqGreater(uint32 a, uint32 b)
Definition: TCPSegment.h:34
const Item * get(uint32_t seq) const
returns pointer to Item, or nullptr if not found
Definition: TCPSegmentTransmitInfoList.cc:76
uint32 v_worried
Definition: TCPVegas.h:62
int v_cntRTT
Definition: TCPVegas.h:47
TCPConnection * conn
Definition: TCPAlgorithm.h:40
simtime_t v_rtt_timeout
Definition: TCPVegas.h:51
uint32 snd_max
Definition: TCPConnection.h:166
simtime_t v_baseRTT
Definition: TCPVegas.h:45
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::TCPVegas::receivedDuplicateAck ( )
overridevirtual

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

Reimplemented from inet::tcp::TCPBaseAlg.

302 {
304 
305  simtime_t currentTime = simTime();
306  simtime_t tSent = 0;
307  int num_transmits = 0;
308  const TCPSegmentTransmitInfoList::Item *found = state->regions.get(state->snd_una);
309  if (found) {
310  tSent = found->getFirstSentTime();
311  num_transmits = found->getTransmitCount();
312  }
314 
315  // check Vegas timeout
316  bool expired = found && ((currentTime - tSent) >= state->v_rtt_timeout);
317 
318  // rtx if Vegas timeout || 3 dupacks
319  if (expired || state->dupacks == DUPTHRESH) { //DUPTHRESH = 3
322 
323  if (found) {
324  if (num_transmits > 1)
325  state->v_rtt_timeout *= 2; // exp. Backoff
326  else
327  state->v_rtt_timeout += (state->v_rtt_timeout / 8.0);
328 
329  // Vegas reduces cwnd if retransmitted segment rtx. was sent after last cwnd reduction
330  if (state->v_cwnd_changed < tSent) {
331  win = win / state->snd_mss;
332  if (win <= 3)
333  win = 2;
334  else if (num_transmits > 1)
335  win = win / 2; //win <<= 1
336  else
337  win -= win / 4; // win -= (win >>2)
338 
339  state->snd_cwnd = win * state->snd_mss + 3 * state->snd_mss;
340  state->v_cwnd_changed = currentTime;
341 
342  if (cwndVector)
343  cwndVector->record(state->snd_cwnd);
344 
345  // reset rtx. timer
347  }
348  }
349 
350  // retransmit one segment from snd_una
351  conn->retransmitOneSegment(false);
352 
353  if (found && num_transmits == 1)
355  }
356  //else if dupacks > duphtresh, cwnd+1
357  else if (state->dupacks > DUPTHRESH) { // DUPTHRESH = 3
359  if (cwndVector)
360  cwndVector->record(state->snd_cwnd);
361  }
362 
363  // try to send more data
364  sendData(false);
365 }
virtual void retransmitOneSegment(bool called_at_rto)
Utility: retransmit one segment from snd_una.
Definition: TCPConnectionUtil.cc:802
cOutVector * cwndVector
Definition: TCPBaseAlg.h:115
double min(const double a, const double b)
Returns the minimum of a and b.
Definition: SCTPAssociation.h:270
TCPSegmentTransmitInfoList regions
Definition: TCPVegas.h:55
void clearTo(uint32_t endseg)
Definition: TCPSegmentTransmitInfoList.cc:87
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68
uint32 snd_wnd
Definition: TCPConnection.h:167
uint32 snd_mss
Definition: TCPConnection.h:159
uint32 snd_nxt
Definition: TCPConnection.h:165
uint32 dupacks
Definition: TCPConnection.h:255
#define DUPTHRESH
Definition: TCPConnection.h:126
virtual void restartRexmitTimer() override
Restart REXMIT timer.
Definition: TCPBaseAlg.cc:674
simtime_t v_cwnd_changed
Definition: TCPVegas.h:43
uint32 snd_una
Definition: TCPConnection.h:164
uint32_t uint32
Definition: Compat.h:30
const Item * get(uint32_t seq) const
returns pointer to Item, or nullptr if not found
Definition: TCPSegmentTransmitInfoList.cc:76
uint32 v_worried
Definition: TCPVegas.h:62
simtime_t getFirstSentTime() const
Definition: TCPSegmentTransmitInfoList.h:47
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
simtime_t v_rtt_timeout
Definition: TCPVegas.h:51
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::TCPVegas::segmentRetransmitted ( uint32  fromseq,
uint32  toseq 
)
overridevirtual

Called after we retransmitted segment.

The argument fromseq is the seqno of the first byte sent. The argument toseq is the seqno of the last byte sent+1.

Reimplemented from inet::tcp::TCPBaseAlg.

382 {
383  TCPBaseAlg::segmentRetransmitted(fromseq, toseq);
384 
385  state->regions.set(fromseq, toseq, simTime());
386 }
TCPSegmentTransmitInfoList regions
Definition: TCPVegas.h:55
void set(uint32_t beg, uint32_t end, simtime_t sentTime)
Definition: TCPSegmentTransmitInfoList.cc:28
TCPVegasStateVariables *& state
Definition: TCPVegas.h:68
virtual void segmentRetransmitted(uint32 fromseq, uint32 toseq) override
Called after we retransmitted segment.
Definition: TCPBaseAlg.cc:670

Member Data Documentation


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