diff --git a/src/add-ons/kernel/network/stack/datalink.cpp b/src/add-ons/kernel/network/stack/datalink.cpp index 73399a8c14..981c040992 100644 --- a/src/add-ons/kernel/network/stack/datalink.cpp +++ b/src/add-ons/kernel/network/stack/datalink.cpp @@ -246,14 +246,14 @@ datalink_control(net_domain* _domain, int32 option, void* value, if (interface == NULL) return B_BAD_VALUE; - status_t status; + status_t status = B_OK; if (request.ifr_addr.sa_family != AF_UNSPEC && request.ifr_addr.sa_len != 0) { status = interface->Control(domain, SIOCDIFADDR, request, (ifreq*)value, *_length); } else - status = remove_interface(interface); + remove_interface(interface); interface->ReleaseReference(); diff --git a/src/add-ons/kernel/network/stack/device_interfaces.cpp b/src/add-ons/kernel/network/stack/device_interfaces.cpp index 2f11671d36..c1f30f9482 100644 --- a/src/add-ons/kernel/network/stack/device_interfaces.cpp +++ b/src/add-ons/kernel/network/stack/device_interfaces.cpp @@ -754,12 +754,8 @@ device_removed(net_device* device) return B_DEVICE_NOT_FOUND; // Propagate the loss of the device throughout the stack. - // This is very complex, refer to remove_interface() for - // further details. - - // TODO! - //domain_removed_device_interface(interface); + interface_removed_device_interface(interface); notify_device_monitors(interface, B_DEVICE_BEING_REMOVED); // By now all of the monitors must have removed themselves. If they diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 0aadbaa13d..edd43f3c36 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -1058,7 +1058,7 @@ add_interface(const char* name, net_domain_private* domain, /*! Removes the interface from the list, and puts the stack's reference to it. */ -status_t +void remove_interface(Interface* interface) { interface->SetDown(); @@ -1071,7 +1071,20 @@ remove_interface(Interface* interface) notify_interface_removed(interface); interface->ReleaseReference(); - return B_OK; +} + + +/*! This is called whenever a device interface is being removed. We will get + the corresponding Interface, and remove it. +*/ +void +interface_removed_device_interface(net_device_interface* deviceInterface) +{ + MutexLocker locker(sLock); + + Interface* interface = find_interface(deviceInterface->device->name); + if (interface != NULL) + remove_interface(interface); } diff --git a/src/add-ons/kernel/network/stack/interfaces.h b/src/add-ons/kernel/network/stack/interfaces.h index 749a9b0f69..5eaeccd3aa 100644 --- a/src/add-ons/kernel/network/stack/interfaces.h +++ b/src/add-ons/kernel/network/stack/interfaces.h @@ -175,8 +175,8 @@ status_t uninit_interfaces(); // interfaces status_t add_interface(const char* name, net_domain_private* domain, const ifaliasreq& request, net_device_interface* deviceInterface); -status_t remove_interface(Interface* interface); -void interface_went_down(Interface* interface); +void remove_interface(Interface* interface); +void interface_removed_device_interface(net_device_interface* deviceInterface); status_t add_interface_address(Interface* interface, net_domain_private* domain, const ifaliasreq& request);