new_state = true;
case DEV_EVENT_REMOVE:
interface_set_available(iface, new_state);
- if (!new_state && dep->dev->external)
+ if (!new_state && dep->dev && dep->dev->external)
interface_set_main_dev(iface, NULL);
break;
case DEV_EVENT_UP:
device_add_user(&iface->l3_dev, dev);
if (dev) {
- if (claimed)
- device_claim(&iface->l3_dev);
+ if (claimed) {
+ if (device_claim(&iface->l3_dev) < 0)
+ return;
+ }
interface_ip_set_enabled(&iface->config_ip, enabled);
}
}
void
interface_set_main_dev(struct interface *iface, struct device *dev)
{
- bool set_l3 = (!dev || iface->main_dev.dev == iface->l3_dev.dev);
bool claimed = iface->l3_dev.claimed;
if (iface->main_dev.dev == dev)
return;
- if (set_l3)
- interface_set_l3_dev(iface, dev);
-
+ interface_set_available(iface, false);
device_add_user(&iface->main_dev, dev);
if (!dev) {
interface_set_link_state(iface, false);
return;
}
- if (claimed)
- device_claim(&iface->l3_dev);
+ if (claimed) {
+ if (device_claim(&iface->l3_dev) < 0)
+ return;
+ }
if (!iface->l3_dev.dev)
interface_set_l3_dev(iface, dev);
if (dev != iface->main_dev.dev)
return UBUS_STATUS_INVALID_ARGUMENT;
- device_remove_user(&iface->main_dev);
+ interface_set_main_dev(iface, NULL);
return 0;
}
}
interface_write_resolv_conf();
- interface_check_state(if_old);
+ if (if_old->main_dev.dev)
+ interface_check_state(if_old);
out:
if_new->config = NULL;