network/stack: packet writes should reach the protocol at least once
notifications on packet protocols shouldn't ignored (for instance zero length packets). Change-Id: I5ccf1ad492c32c50d59b9f9792456d70b29dbf32 Reviewed-on: https://review.haiku-os.org/c/haiku/+/9781 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]> Reviewed-by: Jérôme Duval <[email protected]>
This commit is contained in:
@@ -853,17 +853,21 @@ socket_notify(net_socket* _socket, uint8 event, int32 value)
|
||||
{
|
||||
net_socket_private* socket = (net_socket_private*)_socket;
|
||||
bool notify = true;
|
||||
bool atomic = (socket->first_info->flags & NET_PROTOCOL_ATOMIC_MESSAGES) != 0;
|
||||
|
||||
switch (event) {
|
||||
case B_SELECT_READ:
|
||||
if ((ssize_t)socket->receive.low_water_mark > value
|
||||
&& value >= B_OK)
|
||||
&& value >= B_OK && !atomic) {
|
||||
notify = false;
|
||||
}
|
||||
break;
|
||||
|
||||
case B_SELECT_WRITE:
|
||||
if ((ssize_t)socket->send.low_water_mark > value && value >= B_OK)
|
||||
if ((ssize_t)socket->send.low_water_mark > value
|
||||
&& value >= B_OK && !atomic) {
|
||||
notify = false;
|
||||
}
|
||||
break;
|
||||
|
||||
case B_SELECT_ERROR:
|
||||
@@ -1308,8 +1312,8 @@ socket_send(net_socket* socket, msghdr* header, const void* data, size_t length,
|
||||
return EDESTADDRREQ;
|
||||
}
|
||||
|
||||
if ((socket->first_info->flags & NET_PROTOCOL_ATOMIC_MESSAGES) != 0
|
||||
&& bytesLeft > socket->send.buffer_size)
|
||||
bool atomic = (socket->first_info->flags & NET_PROTOCOL_ATOMIC_MESSAGES) != 0;
|
||||
if (atomic && bytesLeft > socket->send.buffer_size)
|
||||
return EMSGSIZE;
|
||||
|
||||
if (socket->address.ss_len == 0) {
|
||||
@@ -1354,7 +1358,7 @@ socket_send(net_socket* socket, msghdr* header, const void* data, size_t length,
|
||||
size_t vecOffset = 0;
|
||||
uint32 vecIndex = 0;
|
||||
|
||||
while (bytesLeft > 0) {
|
||||
while (bytesLeft > 0 || atomic) {
|
||||
// TODO: useful, maybe even computed header space!
|
||||
net_buffer* buffer = gNetBufferModule.create(256);
|
||||
if (buffer == NULL)
|
||||
@@ -1425,6 +1429,7 @@ socket_send(net_socket* socket, msghdr* header, const void* data, size_t length,
|
||||
|
||||
bytesLeft -= bufferSize;
|
||||
bytesSent += bufferSize;
|
||||
atomic = false;
|
||||
}
|
||||
|
||||
return bytesSent;
|
||||
|
||||
Reference in New Issue
Block a user