From cc8eceb0af9ece5bcea51b106fa73e83b6b750a8 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Wed, 4 Aug 2010 11:11:56 +0000 Subject: [PATCH] Report the actual error when read() or write() a network device failed. This enable to actually detect and handle device removal (USB...). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37897 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/network/devices/ethernet/ethernet.cpp | 4 ++-- src/add-ons/kernel/network/stack/device_interfaces.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp b/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp index 1a6c6216d8..8e34bdc87b 100644 --- a/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp +++ b/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp @@ -278,7 +278,7 @@ ethernet_send_data(net_device *_device, net_buffer *buffer) device->stats.send.errors++; if (allocated) gBufferModule->free(allocated); - return bytesWritten; + return errno; } device->stats.send.packets++; @@ -323,7 +323,7 @@ ethernet_receive_data(net_device *_device, net_buffer **_buffer) bytesRead = read(device->fd, data, device->frame_size); if (bytesRead < 0) { device->stats.receive.errors++; - status = bytesRead; + status = errno; goto err; } //dump_block((const char *)data, bytesRead, "rcv: "); diff --git a/src/add-ons/kernel/network/stack/device_interfaces.cpp b/src/add-ons/kernel/network/stack/device_interfaces.cpp index c1f30f9482..174e703ecf 100644 --- a/src/add-ons/kernel/network/stack/device_interfaces.cpp +++ b/src/add-ons/kernel/network/stack/device_interfaces.cpp @@ -66,6 +66,8 @@ device_reader_thread(void* _interface) } fifo_enqueue_buffer(&interface->receive_queue, buffer); + } else if (status == B_DEVICE_NOT_FOUND) { + device_removed(device); } else { // In case of error, give the other threads some // time to run since this is a high priority time thread.