X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface.c;h=ea252083ae1ea48c404cea7280660175994c134c;hp=f474246e155df405162ab60e67e77c66ec0c2839;hb=77206574a21d406f6098b604c6e0774116afdb91;hpb=7233afd94910cb4583c9555840a990287fd5d642 diff --git a/interface.c b/interface.c index f474246..ea25208 100644 --- a/interface.c +++ b/interface.c @@ -319,7 +319,7 @@ interface_cb(struct device_user *dep, enum device_event ev) 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: @@ -329,7 +329,7 @@ interface_cb(struct device_user *dep, enum device_event ev) break; case DEV_EVENT_LINK_UP: new_state = true; - case DEV_EVENT_LINK_DOWN: + case DEV_EVENT_LINK_DOWN: interface_set_link_state(iface, new_state); break; case DEV_EVENT_TOPO_CHANGE: @@ -509,8 +509,8 @@ interface_cleanup_state(struct interface *iface) interface_clear_errors(iface); interface_set_proto_state(iface, NULL); - if (iface->main_dev.dev) - interface_set_main_dev(iface, NULL); + interface_set_main_dev(iface, NULL); + interface_set_l3_dev(iface, NULL); } static void @@ -766,8 +766,10 @@ interface_set_l3_dev(struct interface *iface, struct device *dev) 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); } } @@ -780,14 +782,17 @@ interface_set_main_dev(struct interface *iface, struct device *dev) if (iface->main_dev.dev == dev) return; + 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); @@ -807,7 +812,7 @@ interface_remove_link(struct interface *iface, struct device *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; } @@ -1019,7 +1024,8 @@ interface_change_config(struct interface *if_old, struct interface *if_new) } 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;