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,