void device_add_user(struct device_user *dep, struct device *dev)
{
+ if (dep->dev)
+ device_remove_user(dep);
+
dep->dev = dev;
list_add_tail(&dep->list, &dev->users);
if (dep->cb && dev->present) {
static void
-interface_cleanup(struct interface *iface)
+interface_cleanup(struct interface *iface, bool reload)
{
struct interface_user *dep, *tmp;
interface_ip_flush(&iface->config_ip);
interface_flush_state(iface);
interface_clear_errors(iface);
- if (iface->main_dev.dev)
+ if (iface->main_dev.dev &&
+ (!reload || !iface->main_dev.hotplug))
device_remove_user(&iface->main_dev);
iface->l3_dev = &iface->main_dev;
interface_set_proto_state(iface, NULL);
static void
interface_do_free(struct interface *iface)
{
- interface_cleanup(iface);
+ interface_cleanup(iface, false);
free(iface->config);
netifd_ubus_remove_interface(iface);
avl_delete(&interfaces.avl, &iface->node.avl);
static void
interface_do_reload(struct interface *iface)
{
- interface_cleanup(iface);
+ interface_cleanup(iface, true);
proto_init_interface(iface, iface->config);
interface_claim_device(iface);
}