boot_net: Prepare socket-specific TCP window size

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


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38530 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Andreas Färber
2010-09-04 22:36:35 +00:00
parent 7d415c01cc
commit 040b33980c
2 changed files with 19 additions and 9 deletions
+3 -1
View File
@@ -65,6 +65,7 @@ public:
ip_addr_t Address() const { return fAddress; } ip_addr_t Address() const { return fAddress; }
uint16 Port() const { return fPort; } uint16 Port() const { return fPort; }
uint16 WindowSize() const;
status_t Connect(ip_addr_t address, uint16 port); status_t Connect(ip_addr_t address, uint16 port);
status_t Close(); status_t Close();
@@ -114,7 +115,8 @@ public:
status_t Send(uint16 sourcePort, ip_addr_t destinationAddress, status_t Send(uint16 sourcePort, ip_addr_t destinationAddress,
uint16 destinationPort, uint32 sequenceNumber, uint16 destinationPort, uint32 sequenceNumber,
uint32 acknowledgmentNumber, uint8 flags, ChainBuffer* buffer); uint32 acknowledgmentNumber, uint8 flags, uint16 windowSize,
ChainBuffer* buffer);
void ProcessIncomingPackets(); void ProcessIncomingPackets();
+16 -8
View File
@@ -50,7 +50,7 @@ _rand32(void)
if (next == 0) if (next == 0)
next = real_time_clock_usecs() / 1000000; 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 // characteristic polynomial: x^32 + x^31 + x^29 + x + 1
return next; return next;
} }
@@ -197,6 +197,15 @@ TCPSocket::~TCPSocket()
} }
uint16
TCPSocket::WindowSize() const
{
size_t windowSize = 2048;
// TODO Implement dynamic window size.
return windowSize;
}
status_t status_t
TCPSocket::Connect(ip_addr_t address, uint16 port) TCPSocket::Connect(ip_addr_t address, uint16 port)
{ {
@@ -422,7 +431,7 @@ TCPSocket::ProcessPacket(TCPPacket* packet)
// acknowledged. "If it's important, they'll send it again." // acknowledged. "If it's important, they'll send it again."
// TODO PAWS // TODO PAWS
if (packet->SequenceNumber() < fNextSequence) { 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; delete packet;
return; return;
} }
@@ -528,7 +537,7 @@ TCPSocket::_Send(TCPPacket* packet, bool enqueue)
ChainBuffer buffer((void*)packet->Data(), packet->DataSize()); ChainBuffer buffer((void*)packet->Data(), packet->DataSize());
status_t error = fTCPService->Send(fPort, fRemoteAddress, fRemotePort, status_t error = fTCPService->Send(fPort, fRemoteAddress, fRemotePort,
packet->SequenceNumber(), fAcknowledgeNumber, packet->Flags(), packet->SequenceNumber(), fAcknowledgeNumber, packet->Flags(),
&buffer); WindowSize(), &buffer);
if (error != B_OK) if (error != B_OK)
return error; return error;
if (packet->SequenceNumber() == fSequenceNumber) if (packet->SequenceNumber() == fSequenceNumber)
@@ -548,7 +557,7 @@ TCPSocket::_ResendQueue()
ChainBuffer buffer((void*)packet->Data(), packet->DataSize()); ChainBuffer buffer((void*)packet->Data(), packet->DataSize());
status_t error = fTCPService->Send(fPort, fRemoteAddress, fRemotePort, status_t error = fTCPService->Send(fPort, fRemoteAddress, fRemotePort,
packet->SequenceNumber(), fAcknowledgeNumber, packet->Flags(), packet->SequenceNumber(), fAcknowledgeNumber, packet->Flags(),
&buffer); WindowSize(), &buffer);
if (error != B_OK) if (error != B_OK)
return error; return error;
} }
@@ -730,7 +739,8 @@ TCPService::HandleIPPacket(IPService* ipService, ip_addr_t sourceIP,
status_t status_t
TCPService::Send(uint16 sourcePort, ip_addr_t destinationAddress, TCPService::Send(uint16 sourcePort, ip_addr_t destinationAddress,
uint16 destinationPort, uint32 sequenceNumber, 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", TRACE("TCPService::Send(): seq = %lu, ack = %lu\n",
sequenceNumber, acknowledgmentNumber); sequenceNumber, acknowledgmentNumber);
@@ -748,9 +758,7 @@ TCPService::Send(uint16 sourcePort, ip_addr_t destinationAddress,
header.ackNumber = htonl(acknowledgmentNumber); header.ackNumber = htonl(acknowledgmentNumber);
header.dataOffset = 5; header.dataOffset = 5;
header.flags = flags; header.flags = flags;
header.window = htons(4096); header.window = htons(windowSize);
// We throttle packet reception a little here.
// TODO Implement socket-based dynamic window size.
header.checksum = 0; header.checksum = 0;
header.checksum = htons(_ChecksumBuffer(&headerBuffer, header.checksum = htons(_ChecksumBuffer(&headerBuffer,