[haiku-commits] r38530 - in haiku/trunk: headers/private/kernel/boot/net src/system/boot/loader/net

  • From: andreas.faerber@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 5 Sep 2010 00:36:35 +0200 (CEST)

Author: andreasf
Date: 2010-09-05 00:36:35 +0200 (Sun, 05 Sep 2010)
New Revision: 38530
Changeset: http://dev.haiku-os.org/changeset/38530

Modified:
   haiku/trunk/headers/private/kernel/boot/net/TCP.h
   haiku/trunk/src/system/boot/loader/net/TCP.cpp
Log:
boot_net: Prepare socket-specific TCP window size

Pass the desired window size from the socket to the service.


Modified: haiku/trunk/headers/private/kernel/boot/net/TCP.h
===================================================================
--- haiku/trunk/headers/private/kernel/boot/net/TCP.h   2010-09-04 22:14:20 UTC 
(rev 38529)
+++ haiku/trunk/headers/private/kernel/boot/net/TCP.h   2010-09-04 22:36:35 UTC 
(rev 38530)
@@ -65,6 +65,7 @@
 
        ip_addr_t Address() const       { return fAddress; }
        uint16 Port() const                     { return fPort; }
+       uint16 WindowSize() const;
 
        status_t Connect(ip_addr_t address, uint16 port);
        status_t Close();
@@ -114,7 +115,8 @@
 
        status_t Send(uint16 sourcePort, ip_addr_t destinationAddress,
                uint16 destinationPort, uint32 sequenceNumber,
-               uint32 acknowledgmentNumber, uint8 flags, ChainBuffer* buffer);
+               uint32 acknowledgmentNumber, uint8 flags, uint16 windowSize,
+               ChainBuffer* buffer);
 
        void ProcessIncomingPackets();
 

Modified: haiku/trunk/src/system/boot/loader/net/TCP.cpp
===================================================================
--- haiku/trunk/src/system/boot/loader/net/TCP.cpp      2010-09-04 22:14:20 UTC 
(rev 38529)
+++ haiku/trunk/src/system/boot/loader/net/TCP.cpp      2010-09-04 22:36:35 UTC 
(rev 38530)
@@ -50,7 +50,7 @@
        if (next == 0)
                next = real_time_clock_usecs() / 1000000;
 
-       next = (next >> 1) ^ (unsigned int)(-(next & 1U) & 0xd0000001U);
+       next = (next >> 1) ^ (unsigned int)((0 - (next & 1U)) & 0xd0000001U);
                // characteristic polynomial: x^32 + x^31 + x^29 + x + 1
        return next;
 }
@@ -197,6 +197,15 @@
 }
 
 
+uint16
+TCPSocket::WindowSize() const
+{
+       size_t windowSize = 2048;
+               // TODO Implement dynamic window size.
+       return windowSize;
+}
+
+
 status_t
 TCPSocket::Connect(ip_addr_t address, uint16 port)
 {
@@ -422,7 +431,7 @@
        // acknowledged. "If it's important, they'll send it again."
        // TODO PAWS
        if (packet->SequenceNumber() < fNextSequence) {
-               TRACE("TCPSocket::ProcessPacket(): not queuing due to seq 
number\n");
+               TRACE("TCPSocket::ProcessPacket(): not queuing due to 
wraparound\n");
                delete packet;
                return;
        }
@@ -528,7 +537,7 @@
        ChainBuffer buffer((void*)packet->Data(), packet->DataSize());
        status_t error = fTCPService->Send(fPort, fRemoteAddress, fRemotePort,
                packet->SequenceNumber(), fAcknowledgeNumber, packet->Flags(),
-               &buffer);
+               WindowSize(), &buffer);
        if (error != B_OK)
                return error;
        if (packet->SequenceNumber() == fSequenceNumber)
@@ -548,7 +557,7 @@
                ChainBuffer buffer((void*)packet->Data(), packet->DataSize());
                status_t error = fTCPService->Send(fPort, fRemoteAddress, 
fRemotePort,
                        packet->SequenceNumber(), fAcknowledgeNumber, 
packet->Flags(),
-                       &buffer);
+                       WindowSize(), &buffer);
                if (error != B_OK)
                        return error;
        }
@@ -730,7 +739,8 @@
 status_t
 TCPService::Send(uint16 sourcePort, ip_addr_t destinationAddress,
        uint16 destinationPort, uint32 sequenceNumber,
-       uint32 acknowledgmentNumber, uint8 flags, ChainBuffer* buffer)
+       uint32 acknowledgmentNumber, uint8 flags, uint16 windowSize,
+       ChainBuffer* buffer)
 {
        TRACE("TCPService::Send(): seq = %lu, ack = %lu\n",
                sequenceNumber, acknowledgmentNumber);
@@ -748,9 +758,7 @@
        header.ackNumber = htonl(acknowledgmentNumber);
        header.dataOffset = 5;
        header.flags = flags;
-       header.window = htons(4096);
-               // We throttle packet reception a little here.
-               // TODO Implement socket-based dynamic window size.
+       header.window = htons(windowSize);
 
        header.checksum = 0;
        header.checksum = htons(_ChecksumBuffer(&headerBuffer,


Other related posts:

  • » [haiku-commits] r38530 - in haiku/trunk: headers/private/kernel/boot/net src/system/boot/loader/net - andreas . faerber