From 388fdd6a789bd81fda00e2d7b02b789c206ff676 Mon Sep 17 00:00:00 2001
From: A-star-ayush <myselfthebest@yahoo.com>
Date: Wed, 26 Jul 2017 01:44:27 +0530
Subject: [PATCH] tcp: rfc 5681: implemented ideal timer
---
.../kernel/network/protocols/tcp/TCPEndpoint.cpp | 51 +++++++++++++++++-----
src/add-ons/kernel/network/protocols/tcp/tcp.h | 2 +
2 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
index 0a7c5fa..a987b94 100644
a
|
b
|
TCPEndpoint::_AddData(tcp_segment_header& segment, net_buffer* buffer)
|
1357 | 1357 | if ((segment.flags & TCP_FLAG_PUSH) != 0) |
1358 | 1358 | fReceiveQueue.SetPushPointer(); |
1359 | 1359 | |
| 1360 | if (fSendUnacknowledged == fSendMax) { |
| 1361 | TRACE("data received, resetting ideal timer to: %" |
| 1362 | B_PRIdBIGTIME, fRetransmitTimeout); |
| 1363 | gStackModule->set_timer(&fRetransmitTimer, fRetransmitTimeout); |
| 1364 | T(TimerSet(this, "ideal", fRetransmitTimeout)); |
| 1365 | } |
| 1366 | |
1360 | 1367 | return fReceiveQueue.Available() > 0; |
1361 | 1368 | } |
1362 | 1369 | |
… |
… |
TCPEndpoint::_Acknowledged(tcp_segment_header& segment)
|
2221 | 2228 | } |
2222 | 2229 | |
2223 | 2230 | if (fSendUnacknowledged == fSendMax) { |
2224 | | TRACE("all acknowledged, cancelling retransmission timer"); |
2225 | | gStackModule->cancel_timer(&fRetransmitTimer); |
2226 | | T(TimerSet(this, "retransmit", -1)); |
| 2231 | TRACE("all acknowledged, cancelling retransmission timer. Using it as ideal timer for: %" |
| 2232 | B_PRIdBIGTIME, fRetransmitTimeout); |
| 2233 | gStackModule->set_timer(&fRetransmitTimer, fRetransmitTimeout); |
| 2234 | T(TimerSet(this, "ideal", fRetransmitTimeout)); |
2227 | 2235 | } else { |
2228 | 2236 | TRACE("data acknowledged, resetting retransmission timer to: %" |
2229 | 2237 | B_PRIdBIGTIME, fRetransmitTimeout); |
… |
… |
TCPEndpoint::_Acknowledged(tcp_segment_header& segment)
|
2261 | 2269 | void |
2262 | 2270 | TCPEndpoint::_Retransmit() |
2263 | 2271 | { |
2264 | | TRACE("Retransmit()"); |
| 2272 | if (fState < ESTABLISHED) { |
| 2273 | fRetransmitTimeout = TCP_SYN_RETRANSMIT_TIMEOUT; |
| 2274 | fCongestionWindow = fSendMaxSegmentSize; |
| 2275 | |
| 2276 | } else if (fSendUnacknowledged == fSendMax) { |
| 2277 | TRACE("Ideal timeout"); |
| 2278 | // idle period time out - did not receive any segment for a time equal |
| 2279 | // to the retransmission timeout |
| 2280 | uint32 initialWindow; |
| 2281 | if (fSendMaxSegmentSize > 2190) |
| 2282 | initialWindow = 2 * fSendMaxSegmentSize; |
| 2283 | else if (fSendMaxSegmentSize > 1095) |
| 2284 | initialWindow = 3 * fSendMaxSegmentSize; |
| 2285 | else |
| 2286 | initialWindow = 4 * fSendMaxSegmentSize; |
2265 | 2287 | |
2266 | | _ResetSlowStart(); |
2267 | | fSendNext = fSendUnacknowledged; |
| 2288 | fCongestionWindow = min_c(initialWindow, fCongestionWindow); |
| 2289 | return; |
2268 | 2290 | |
2269 | | // Do exponential back off of the retransmit timeout |
2270 | | fRetransmitTimeout *= 2; |
2271 | | if (fRetransmitTimeout > TCP_MAX_RETRANSMIT_TIMEOUT) |
2272 | | fRetransmitTimeout = TCP_MAX_RETRANSMIT_TIMEOUT; |
| 2291 | } else { |
| 2292 | _ResetSlowStart(); |
| 2293 | |
| 2294 | // Do exponential back off of the retransmit timeout |
| 2295 | fRetransmitTimeout *= 2; |
| 2296 | if (fRetransmitTimeout > TCP_MAX_RETRANSMIT_TIMEOUT) |
| 2297 | fRetransmitTimeout = TCP_MAX_RETRANSMIT_TIMEOUT; |
| 2298 | } |
2273 | 2299 | |
| 2300 | TRACE("Retransmit()"); |
| 2301 | |
| 2302 | fSendNext = fSendUnacknowledged; |
2274 | 2303 | _SendQueued(); |
2275 | 2304 | } |
2276 | 2305 | |
… |
… |
TCPEndpoint::_RetransmitTimer(net_timer* timer, void* _endpoint)
|
2317 | 2346 | T(TimerTriggered(endpoint, "retransmit")); |
2318 | 2347 | |
2319 | 2348 | MutexLocker locker(endpoint->fLock); |
2320 | | if (!locker.IsLocked()) |
| 2349 | if (!locker.IsLocked() || gStackModule->is_timer_active(timer)) |
2321 | 2350 | return; |
2322 | 2351 | |
2323 | 2352 | endpoint->_Retransmit(); |
diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.h b/src/add-ons/kernel/network/protocols/tcp/tcp.h
index 6f30ec2..24890a3 100644
a
|
b
|
operator==(tcp_sequence a, tcp_sequence b)
|
193 | 193 | #define TCP_MIN_RETRANSMIT_TIMEOUT 200000 // 200 msecs |
194 | 194 | // Maximum retransmit timeout (per RFC6298) |
195 | 195 | #define TCP_MAX_RETRANSMIT_TIMEOUT 60000000 // 60 secs |
| 196 | // New value for timeout in case of lost SYN (RFC 6298) |
| 197 | #define TCP_SYN_RETRANSMIT_TIMEOUT 3000000 // 3 secs |
196 | 198 | |
197 | 199 | struct tcp_sack { |
198 | 200 | uint32 left_edge; |