From 3285dcae22636e5df3c988b3d6eb86fc062e3ef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 17 Dec 2021 20:12:11 +0100 Subject: [PATCH] tcp: reset receive.low_water_mark when nothing to read anymore the socket interface module checks the receive.low_water_mark to automatically notify a read event. available_data will be zero, thus enabling the notification. fixes the test poll_nm in NSPR. Change-Id: I5354faec439df96671506550cdb144a45f6082b1 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4820 Reviewed-by: waddlesplash --- src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp | 5 ++++- src/add-ons/kernel/network/protocols/tcp/tcp.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 9881719088..0858cfc3ff 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -1011,6 +1011,9 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer) TRACE(" ReadData(): %" B_PRIuSIZE " bytes kept.", fReceiveQueue.Available()); + if (fReceiveQueue.Available() == 0 && fState == FINISH_RECEIVED) + socket->receive.low_water_mark = 0; + // if we are opening the window, check if we should send an ACK if (!clone) SendAcknowledge(false); @@ -1438,7 +1441,7 @@ TCPEndpoint::_ShouldReceive() const return false; return fState == ESTABLISHED || fState == FINISH_SENT - || fState == FINISH_ACKNOWLEDGED; + || fState == FINISH_ACKNOWLEDGED || fState == FINISH_RECEIVED; } diff --git a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp index 8d2645eddb..3425d1f6bd 100644 --- a/src/add-ons/kernel/network/protocols/tcp/tcp.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/tcp.cpp @@ -429,7 +429,7 @@ add_tcp_header(net_address_module_info* addressModule, optionsLength); } - TRACE(("add_tcp_header(): buffer %p, flags 0x%x, seq %lu, ack %lu, up %u, " + TRACE(("add_tcp_header(): buffer %p, flags 0x%x, seq %" B_PRIu32 ", ack %" B_PRIu32 ", up %u, " "win %u\n", buffer, segment.flags, segment.sequence, segment.acknowledge, segment.urgent_offset, segment.advertised_window));