hrev51419 adds 1 changeset to branch 'master'
old head: ccd42320c45658052d620804bb8e05e5bc327706
new head: e736356cfa39c362a5d668d5f72dee68748d2701
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=e736356cfa39+%5Eccd42320c456
----------------------------------------------------------------------------
e736356cfa39: Revert "tcp: slow start@rfc5681 : updated rules for congestion
window"
This reverts commit 05743f6a13319a9dc332603eb5d98ba4c5374b25
(and the portions of following commits that were layered on top of it.)
[ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev51419
Commit: e736356cfa39c362a5d668d5f72dee68748d2701
URL: http://cgit.haiku-os.org/haiku/commit/?id=e736356cfa39
Author: Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date: Tue Sep 12 17:33:14 2017 UTC
----------------------------------------------------------------------------
3 files changed, 22 insertions(+), 84 deletions(-)
.../kernel/network/protocols/tcp/TCPEndpoint.cpp | 103 ++++---------------
.../kernel/network/protocols/tcp/TCPEndpoint.h | 1 -
src/add-ons/kernel/network/protocols/tcp/tcp.h | 2 -
----------------------------------------------------------------------------
diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
index 2e7ca44..aa28df9 100644
--- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
+++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
@@ -18,7 +18,6 @@
#include <signal.h>
#include <stdlib.h>
#include <string.h>
-#include <stdint.h>
#include <KernelExport.h>
#include <Select.h>
@@ -430,7 +429,6 @@ TCPEndpoint::TCPEndpoint(net_socket* socket)
fSendWindow(0),
fSendMaxWindow(0),
fSendMaxSegmentSize(TCP_DEFAULT_MAX_SEGMENT_SIZE),
- fSendMaxSegments(0),
fSendQueue(socket->send.buffer_size),
fInitialSendSequence(0),
fPreviousHighestAcknowledge(0),
@@ -1432,14 +1430,7 @@ TCPEndpoint::_PrepareReceivePath(tcp_segment_header&
segment)
fFlags &= ~FLAG_OPTION_SACK_PERMITTED;
}
- if (fSendMaxSegmentSize > 2190)
- fCongestionWindow = 2 * fSendMaxSegmentSize;
- else if (fSendMaxSegmentSize > 1095)
- fCongestionWindow = 3 * fSendMaxSegmentSize;
- else
- fCongestionWindow = 4 * fSendMaxSegmentSize;
-
- fSendMaxSegments = fCongestionWindow / fSendMaxSegmentSize;
+ fCongestionWindow = 2 * fSendMaxSegmentSize;
fSlowStartThreshold = (uint32)segment.advertised_window <<
fSendWindowShift;
}
@@ -1959,9 +1950,6 @@ inline bool
TCPEndpoint::_ShouldSendSegment(tcp_segment_header& segment, uint32 length,
uint32 segmentMaxSize, uint32 flightSize)
{
- if (fState == ESTABLISHED && fSendMaxSegments == 0)
- return false;
-
if (length > 0) {
// Avoid the silly window syndrome - we only send a segment in
case:
// - we have a full segment to send, or
@@ -2198,9 +2186,6 @@ TCPEndpoint::_SendQueued(bool force, uint32 sendWindow)
fReceiveMaxAdvertised = fReceiveNext
+ ((uint32)segment.advertised_window <<
fReceiveWindowShift);
- if (segmentLength != 0 && fState == ESTABLISHED)
- --fSendMaxSegments;
-
status = next->module->send_routed_data(next, fRoute, buffer);
if (status < B_OK) {
gBufferModule->free(buffer);
@@ -2298,45 +2283,7 @@ TCPEndpoint::_Acknowledged(tcp_segment_header& segment)
if (fSendUnacknowledged < segment.acknowledge) {
fSendQueue.RemoveUntil(segment.acknowledge);
- uint32 bytesAcknowledged = segment.acknowledge -
fSendUnacknowledged.Number();
- fPreviousHighestAcknowledge = fSendUnacknowledged;
fSendUnacknowledged = segment.acknowledge;
-
- if (fPreviousHighestAcknowledge > fSendUnacknowledged) {
- // need to update the recover variable upon a sequence
wraparound
- fRecover = segment.acknowledge - 1;
- }
-
- // the acknowledgment of the SYN/ACK MUST NOT increase the size
of the congestion window
- if (fSendUnacknowledged != fInitialSendSequence) {
- if (fCongestionWindow < fSlowStartThreshold)
- fCongestionWindow += min_c(bytesAcknowledged,
fSendMaxSegmentSize);
- else {
- uint32 increment = fSendMaxSegmentSize *
fSendMaxSegmentSize;
-
- if (increment < fCongestionWindow)
- increment = 1;
- else
- increment /= fCongestionWindow;
-
- fCongestionWindow += increment;
- }
-
- fSendMaxSegments = UINT32_MAX;
- }
-
- if ((fFlags & FLAG_RECOVERY) != 0) {
- fSendNext = fSendUnacknowledged;
- _SendQueued();
- fCongestionWindow -= bytesAcknowledged;
-
- if (bytesAcknowledged > fSendMaxSegmentSize)
- fCongestionWindow += fSendMaxSegmentSize;
-
- fSendNext = fSendMax;
- } else
- fDuplicateAcknowledgeCount = 0;
-
if (fSendNext < fSendUnacknowledged)
fSendNext = fSendUnacknowledged;
@@ -2370,6 +2317,20 @@ TCPEndpoint::_Acknowledged(tcp_segment_header& segment)
fSendCondition.NotifyAll();
gSocketModule->notify(socket, B_SELECT_WRITE,
fSendQueue.Free());
}
+
+ if (fCongestionWindow < fSlowStartThreshold)
+ fCongestionWindow += fSendMaxSegmentSize;
+ }
+
+ if (fCongestionWindow >= fSlowStartThreshold) {
+ uint32 increment = fSendMaxSegmentSize * fSendMaxSegmentSize;
+
+ if (increment < fCongestionWindow)
+ increment = 1;
+ else
+ increment /= fCongestionWindow;
+
+ fCongestionWindow += increment;
}
// if there is data left to be sent, send it now
@@ -2381,36 +2342,16 @@ TCPEndpoint::_Acknowledged(tcp_segment_header& segment)
void
TCPEndpoint::_Retransmit()
{
- if (fState < ESTABLISHED) {
- fRetransmitTimeout = TCP_SYN_RETRANSMIT_TIMEOUT;
- fCongestionWindow = fSendMaxSegmentSize;
- } else if (fSendUnacknowledged == fSendMax) {
- TRACE("Ideal timeout");
- // idle period time out - did not receive any segment for a
time equal
- // to the retransmission timeout
-
- uint32 initialWindow;
- if (fSendMaxSegmentSize > 2190)
- initialWindow = 2 * fSendMaxSegmentSize;
- else if (fSendMaxSegmentSize > 1095)
- initialWindow = 3 * fSendMaxSegmentSize;
- else
- initialWindow = 4 * fSendMaxSegmentSize;
-
- fCongestionWindow = min_c(initialWindow, fCongestionWindow);
- return;
- } else {
- _ResetSlowStart();
- fDuplicateAcknowledgeCount = 0;
- // Do exponential back off of the retransmit timeout
- fRetransmitTimeout *= 2;
- if (fRetransmitTimeout > TCP_MAX_RETRANSMIT_TIMEOUT)
- fRetransmitTimeout = TCP_MAX_RETRANSMIT_TIMEOUT;
- }
-
TRACE("Retransmit()");
+ _ResetSlowStart();
fSendNext = fSendUnacknowledged;
+
+ // Do exponential back off of the retransmit timeout
+ fRetransmitTimeout *= 2;
+ if (fRetransmitTimeout > TCP_MAX_RETRANSMIT_TIMEOUT)
+ fRetransmitTimeout = TCP_MAX_RETRANSMIT_TIMEOUT;
+
_SendQueued();
fRecover = fSendNext.Number() - 1;
diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h
b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h
index 6a62e07..22bf859 100644
--- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h
+++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h
@@ -145,7 +145,6 @@ private:
uint32 fSendWindow;
uint32 fSendMaxWindow;
uint32 fSendMaxSegmentSize;
- uint32 fSendMaxSegments;
BufferQueue fSendQueue;
tcp_sequence fLastAcknowledgeSent;
tcp_sequence fInitialSendSequence;
diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.h
b/src/add-ons/kernel/network/protocols/tcp/tcp.h
index 3b2100b..9b7f568 100644
--- a/src/add-ons/kernel/network/protocols/tcp/tcp.h
+++ b/src/add-ons/kernel/network/protocols/tcp/tcp.h
@@ -193,8 +193,6 @@ operator==(tcp_sequence a, tcp_sequence b)
#define TCP_MIN_RETRANSMIT_TIMEOUT 200000 // 200 msecs
// Maximum retransmit timeout (per RFC6298)
#define TCP_MAX_RETRANSMIT_TIMEOUT 60000000 // 60 secs
-// New value for timeout in case of lost SYN (RFC 6298)
-#define TCP_SYN_RETRANSMIT_TIMEOUT 3000000 // 3 secs
struct tcp_sack {
uint32 left_edge;