[haiku-commits] r37897 - in haiku/trunk/src/add-ons/kernel/network: devices/ethernet stack

  • From: philippe.houdoin@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 4 Aug 2010 13:11:56 +0200 (CEST)

Author: phoudoin
Date: 2010-08-04 13:11:56 +0200 (Wed, 04 Aug 2010)
New Revision: 37897
Changeset: http://dev.haiku-os.org/changeset/37897

Modified:
   haiku/trunk/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp
   haiku/trunk/src/add-ons/kernel/network/stack/device_interfaces.cpp
Log:
Report the actual error when read() or write() a network device failed.
This enable to actually detect and handle device removal (USB...).


Modified: haiku/trunk/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp        
2010-08-04 10:35:40 UTC (rev 37896)
+++ haiku/trunk/src/add-ons/kernel/network/devices/ethernet/ethernet.cpp        
2010-08-04 11:11:56 UTC (rev 37897)
@@ -278,7 +278,7 @@
                device->stats.send.errors++;
                if (allocated)
                        gBufferModule->free(allocated);
-               return bytesWritten;
+               return errno;
        }
 
        device->stats.send.packets++;
@@ -323,7 +323,7 @@
        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: ");

Modified: haiku/trunk/src/add-ons/kernel/network/stack/device_interfaces.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/device_interfaces.cpp  
2010-08-04 10:35:40 UTC (rev 37896)
+++ haiku/trunk/src/add-ons/kernel/network/stack/device_interfaces.cpp  
2010-08-04 11:11:56 UTC (rev 37897)
@@ -66,6 +66,8 @@
                        }
 
                        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.


Other related posts: