Ticket #13676: 0007-tcp-rfc-6582-implemented-NewReno-modification.patch

File 0007-tcp-rfc-6582-implemented-NewReno-modification.patch, 5.7 KB (added by a-star, 7 years ago)
  • src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp

    From e72ac8e3718807e66018d71f0d550ff041d5c994 Mon Sep 17 00:00:00 2001
    From: A-star-ayush <myselfthebest@yahoo.com>
    Date: Sat, 19 Aug 2017 02:15:51 +0530
    Subject: [PATCH] tcp: rfc 6582: implemented NewReno modification
    
    ---
     .../kernel/network/protocols/tcp/TCPEndpoint.cpp   | 59 +++++++++++++++++-----
     .../kernel/network/protocols/tcp/TCPEndpoint.h     |  2 +
     2 files changed, 49 insertions(+), 12 deletions(-)
    
    diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp
    index bca88ac..1d02161 100644
    a b enum {  
    318318    FLAG_NO_RECEIVE             = 0x04,
    319319    FLAG_CLOSED                 = 0x08,
    320320    FLAG_DELETE_ON_CLOSE        = 0x10,
    321     FLAG_LOCAL                  = 0x20
     321    FLAG_LOCAL                  = 0x20,
     322    FLAG_RECOVERY               = 0x40
    322323};
    323324
    324325
    TCPEndpoint::TCPEndpoint(net_socket* socket)  
    431432    fSendMaxSegments(0),
    432433    fSendQueue(socket->send.buffer_size),
    433434    fInitialSendSequence(0),
     435    fPreviousHighestAcknowledge(0),
    434436    fDuplicateAcknowledgeCount(0),
    435437    fPreviousFlightSize(0),
     438    fRecover(0),
    436439    fRoute(NULL),
    437440    fReceiveNext(0),
    438441    fReceiveMaxAdvertised(0),
    TCPEndpoint::_DuplicateAcknowledge(tcp_segment_header &segment)  
    12931296    }
    12941297
    12951298    if (fDuplicateAcknowledgeCount == 3) {
    1296         fSlowStartThreshold = max_c(fPreviousFlightSize / 2, 2 * fSendMaxSegmentSize);
    1297         fCongestionWindow = fSlowStartThreshold + 3 * fSendMaxSegmentSize;
    1298         fSendNext = segment.acknowledge;
    1299         _SendQueued();
    1300         TRACE("_DuplicateAcknowledge(): packet sent under fast restransmit on the receipt of 3rd dup ack");
    1301 
     1299        if ((segment.acknowledge - 1) > fRecover || (fCongestionWindow > fSendMaxSegmentSize &&
     1300            (fSendUnacknowledged - fPreviousHighestAcknowledge) <= 4 * fSendMaxSegmentSize)) {
     1301            fFlags |= FLAG_RECOVERY;
     1302            fRecover = fSendMax.Number() - 1;
     1303            fSlowStartThreshold = max_c(fPreviousFlightSize / 2, 2 * fSendMaxSegmentSize);
     1304            fCongestionWindow = fSlowStartThreshold + 3 * fSendMaxSegmentSize;
     1305            fSendNext = segment.acknowledge;
     1306            _SendQueued();
     1307            TRACE("_DuplicateAcknowledge(): packet sent under fast restransmit on the receipt of 3rd dup ack");
     1308        }
    13021309    } else if (fDuplicateAcknowledgeCount > 3) {
    13031310        uint32 flightSize = (fSendMax - fSendUnacknowledged).Number();
    13041311        if ((fDuplicateAcknowledgeCount - 3) * fSendMaxSegmentSize <= flightSize)
    TCPEndpoint::_Receive(tcp_segment_header& segment, net_buffer* buffer)  
    17381745
    17391746            if (fDuplicateAcknowledgeCount >= 3) {
    17401747                // deflate the window.
    1741                 fCongestionWindow = fSlowStartThreshold;
     1748                if (segment.acknowledge > fRecover) {
     1749                    uint32 flightSize = (fSendMax - fSendUnacknowledged).Number();
     1750                    fCongestionWindow = min_c(fSlowStartThreshold,
     1751                        max_c(flightSize, fSendMaxSegmentSize) + fSendMaxSegmentSize);
     1752                    fFlags &= ~FLAG_RECOVERY;
     1753                }
    17421754            }
    17431755
    17441756            if (fSendMax == segment.acknowledge)
    TCPEndpoint::_PrepareSendPath(const sockaddr* peer)  
    22382250    fSendUnacknowledged = fInitialSendSequence;
    22392251    fSendMax = fInitialSendSequence;
    22402252    fSendUrgentOffset = fInitialSendSequence;
     2253    fRecover = fInitialSendSequence.Number();
    22412254
    22422255    // we are counting the SYN here
    22432256    fSendQueue.SetInitialSequence(fSendNext + 1);
    TCPEndpoint::_Acknowledged(tcp_segment_header& segment)  
    22662279    ASSERT(fSendUnacknowledged <= segment.acknowledge);
    22672280
    22682281    if (fSendUnacknowledged < segment.acknowledge) {
    2269         fDuplicateAcknowledgeCount = 0;
     2282
    22702283        fSendQueue.RemoveUntil(segment.acknowledge);
     2284        uint32 bytesAcknowledged = segment.acknowledge - fSendUnacknowledged.Number();
     2285        fPreviousHighestAcknowledge = fSendUnacknowledged;
     2286        fSendUnacknowledged = segment.acknowledge;
     2287
     2288        if (fPreviousHighestAcknowledge > fSendUnacknowledged) {
     2289            // need to update the recover variable upon a sequence wraparound
     2290            fRecover = segment.acknowledge - 1;
     2291        }
    22712292
    22722293        // the acknowledgment of the SYN/ACK MUST NOT increase the size of the congestion window
    22732294        if (fSendUnacknowledged != fInitialSendSequence) {
    22742295            if (fCongestionWindow < fSlowStartThreshold)
    2275                 fCongestionWindow += min_c(segment.acknowledge - fSendUnacknowledged.Number(),
    2276                     fSendMaxSegmentSize);
     2296                fCongestionWindow += min_c(bytesAcknowledged, fSendMaxSegmentSize);
    22772297            else {
    22782298                uint32 increment = fSendMaxSegmentSize * fSendMaxSegmentSize;
    22792299
    TCPEndpoint::_Acknowledged(tcp_segment_header& segment)  
    22882308            fSendMaxSegments = UINT32_MAX;
    22892309        }
    22902310
    2291         fSendUnacknowledged = segment.acknowledge;
     2311        if ((fFlags & FLAG_RECOVERY) != 0) {
     2312            fSendNext = fSendUnacknowledged;
     2313            _SendQueued();
     2314            fCongestionWindow -= bytesAcknowledged;
     2315
     2316            if (bytesAcknowledged > fSendMaxSegmentSize)
     2317                fCongestionWindow += fSendMaxSegmentSize;
     2318
     2319            fSendNext = fSendMax;
     2320        } else
     2321            fDuplicateAcknowledgeCount = 0;
     2322
    22922323        if (fSendNext < fSendUnacknowledged)
    22932324            fSendNext = fSendUnacknowledged;
    22942325
    TCPEndpoint::_Retransmit()  
    23662397
    23672398    fSendNext = fSendUnacknowledged;
    23682399    _SendQueued();
     2400
     2401    fRecover = fSendNext.Number() - 1;
     2402    if ((fFlags & FLAG_RECOVERY) != 0)
     2403        fFlags &= ~FLAG_RECOVERY;
    23692404}
    23702405
    23712406
  • src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h

    diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h
    index ff6739e..6a62e07 100644
    a b private:  
    149149    BufferQueue     fSendQueue;
    150150    tcp_sequence    fLastAcknowledgeSent;
    151151    tcp_sequence    fInitialSendSequence;
     152    tcp_sequence    fPreviousHighestAcknowledge;
    152153    uint32          fDuplicateAcknowledgeCount;
    153154    uint32          fPreviousFlightSize;
     155    uint32          fRecover;
    154156
    155157    net_route       *fRoute;
    156158        // TODO: don't use a net_route, but a net_route_info!!!