diff --git a/src/add-ons/kernel/network/stack/datalink.cpp b/src/add-ons/kernel/network/stack/datalink.cpp index 06dcc24eda..e2670390c9 100644 --- a/src/add-ons/kernel/network/stack/datalink.cpp +++ b/src/add-ons/kernel/network/stack/datalink.cpp @@ -539,7 +539,6 @@ interface_protocol_down(net_datalink_protocol *_protocol) interface_protocol *protocol = (interface_protocol *)_protocol; net_device_interface *deviceInterface = ((net_interface_private *)protocol->interface)->device_interface; - net_device *device = protocol->device; // TODO: locking! if (deviceInterface->up_count == 0) @@ -550,12 +549,7 @@ interface_protocol_down(net_datalink_protocol *_protocol) if (deviceInterface->up_count > 0) return; - device->flags &= ~IFF_UP; - protocol->device_module->down(protocol->device); - - // make sure the reader thread is gone before shutting down the interface - status_t status; - wait_for_thread(deviceInterface->reader_thread, &status); + down_device_interface(deviceInterface); } diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 08e473d4e6..11537a9f20 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -160,7 +160,7 @@ delete_interface(net_interface_private *interface) if ((interface->flags & IFF_UP) != 0) { // the interface is still up - we need to change that before deleting it interface->flags &= ~IFF_UP; - interface->device_interface->module->down(interface->device_interface->device); + down_device_interface(interface->device_interface); } put_device_interface(interface->device_interface); @@ -398,6 +398,20 @@ get_device_interface(const char *name) } +void +down_device_interface(net_device_interface *interface) +{ + net_device *device = interface->device; + + device->flags &= ~IFF_UP; + interface->module->down(device); + + // make sure the reader thread is gone before shutting down the interface + status_t status; + wait_for_thread(interface->reader_thread, &status); +} + + // #pragma mark - devices diff --git a/src/add-ons/kernel/network/stack/interfaces.h b/src/add-ons/kernel/network/stack/interfaces.h index f63f0e5328..d780549357 100644 --- a/src/add-ons/kernel/network/stack/interfaces.h +++ b/src/add-ons/kernel/network/stack/interfaces.h @@ -76,6 +76,7 @@ status_t list_device_interfaces(void *buffer, size_t size); void put_device_interface(struct net_device_interface *interface); struct net_device_interface *get_device_interface(uint32 index); struct net_device_interface *get_device_interface(const char *name); +void down_device_interface(net_device_interface *interface); // devices status_t unregister_device_deframer(net_device *device);