|
279 |
Time RttMeanDeviation::RetransmitTimeout () |
279 |
Time RttMeanDeviation::RetransmitTimeout () |
280 |
{ |
280 |
{ |
281 |
NS_LOG_FUNCTION (this); |
281 |
NS_LOG_FUNCTION (this); |
282 |
// If not enough samples, just return 2 times estimate |
282 |
|
283 |
//if (nSamples < 2) return est * 2; |
283 |
// the default is 1 second, if there is not enough samples or the rtt is smaller than 1. |
284 |
Time retval (Seconds (0)); |
284 |
Time retval = Time::FromInteger (1, Time::S); |
285 |
double var = m_variance.ToDouble (Time::S); |
285 |
|
286 |
NS_LOG_DEBUG ("RetransmitTimeout: var " << var << " est " << m_currentEstimatedRtt.ToDouble (Time::S) << " multiplier " << m_multiplier); |
286 |
// if not enough samples returns 1, as especified at (2.1) -> RFC 6298 |
287 |
if (var < (m_currentEstimatedRtt.ToDouble (Time::S) / 4.0) ) |
287 |
if (m_nSamples != 0) |
288 |
{ |
288 |
{ |
289 |
for (uint16_t i = 0; i < 2* m_multiplier; i++) |
289 |
if (m_nSamples == 1) // (2.2) -> RFC 6298 |
290 |
{ |
290 |
{ |
291 |
retval += m_currentEstimatedRtt; |
291 |
m_srtt = m_currentEstimatedRtt.ToDouble (Time::S); |
|
|
292 |
m_rttVar = m_srtt/2; |
293 |
retval = (retval.ToDouble (Time::S) > 4*m_rttVar) ? retval : Time::FromDouble (4*m_rttVar, Time::S); |
294 |
retval = Time::FromDouble (m_rttVar, Time::S) + retval; |
292 |
} |
295 |
} |
|
|
296 |
else |
297 |
{ // (2.3) -> RFC 6298 |
298 |
m_rttVar = 0.75 * m_rttVar + 0.25 * abs(m_srtt - m_currentEstimatedRtt.ToDouble (Time::S)); |
299 |
m_srtt = 0.875 * m_srtt + (0.125 * m_currentEstimatedRtt.ToDouble (Time::S)); |
300 |
retval = (retval.ToDouble (Time::S) > 4*m_rttVar) ? retval : Time::FromDouble (4*m_rttVar, Time::S); |
301 |
retval = Time::FromDouble (m_srtt, Time::S) + retval; |
302 |
} |
293 |
} |
303 |
} |
294 |
else |
304 |
return (retval > m_minRto ? retval : m_minRto); // (2.4) -> RFC 6298 |
295 |
{ |
|
|
296 |
int64_t temp = m_currentEstimatedRtt.ToInteger (Time::S) + 4 * m_variance.ToInteger (Time::S); |
297 |
retval = Time::FromInteger (temp, Time::S); |
298 |
} |
299 |
NS_LOG_DEBUG ("RetransmitTimeout: return " << (retval > m_minRto ? retval.GetSeconds () : m_minRto.GetSeconds ())); |
300 |
return (retval > m_minRto ? retval : m_minRto); // return maximum |
301 |
} |
305 |
} |
302 |
|
306 |
|
303 |
Ptr<RttEstimator> RttMeanDeviation::Copy () const |
307 |
Ptr<RttEstimator> RttMeanDeviation::Copy () const |