[haiku-commits] haiku: hrev51419 - src/add-ons/kernel/network/protocols/tcp

  • From: waddlesplash@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 12 Sep 2017 20:18:29 +0200 (CEST)

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;


Other related posts:

  • » [haiku-commits] haiku: hrev51419 - src/add-ons/kernel/network/protocols/tcp - waddlesplash