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.)
This commit is contained in:
Augustin Cavalier 2017-09-12 13:33:14 -04:00
parent ccd42320c4
commit e736356cfa
3 changed files with 22 additions and 84 deletions

View File

@ -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;

View File

@ -145,7 +145,6 @@ private:
uint32 fSendWindow;
uint32 fSendMaxWindow;
uint32 fSendMaxSegmentSize;
uint32 fSendMaxSegments;
BufferQueue fSendQueue;
tcp_sequence fLastAcknowledgeSent;
tcp_sequence fInitialSendSequence;

View File

@ -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;