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 <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
18e885db51
commit
3285dcae22
@@ -1011,6 +1011,9 @@ TCPEndpoint::ReadData(size_t numBytes, uint32 flags, net_buffer** _buffer)
|
|||||||
TRACE(" ReadData(): %" B_PRIuSIZE " bytes kept.",
|
TRACE(" ReadData(): %" B_PRIuSIZE " bytes kept.",
|
||||||
fReceiveQueue.Available());
|
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 we are opening the window, check if we should send an ACK
|
||||||
if (!clone)
|
if (!clone)
|
||||||
SendAcknowledge(false);
|
SendAcknowledge(false);
|
||||||
@@ -1438,7 +1441,7 @@ TCPEndpoint::_ShouldReceive() const
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
return fState == ESTABLISHED || fState == FINISH_SENT
|
return fState == ESTABLISHED || fState == FINISH_SENT
|
||||||
|| fState == FINISH_ACKNOWLEDGED;
|
|| fState == FINISH_ACKNOWLEDGED || fState == FINISH_RECEIVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -429,7 +429,7 @@ add_tcp_header(net_address_module_info* addressModule,
|
|||||||
optionsLength);
|
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,
|
"win %u\n", buffer, segment.flags, segment.sequence,
|
||||||
segment.acknowledge, segment.urgent_offset, segment.advertised_window));
|
segment.acknowledge, segment.urgent_offset, segment.advertised_window));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user