interface: ensure NO_DEVICE error is always reported
[project/netifd.git] / interface.c
index 2a23984922a10c34fe237a837552fb023ce24d23..6be10e279b4dc8e16b2d98fa328efbc8ca408ac4 100644 (file)
@@ -387,26 +387,28 @@ static void
 interface_main_dev_cb(struct device_user *dep, enum device_event ev)
 {
        struct interface *iface;
-       bool new_state = false;
 
        iface = container_of(dep, struct interface, main_dev);
        switch (ev) {
        case DEV_EVENT_ADD:
-               new_state = true;
+               interface_set_available(iface, true);
+               break;
        case DEV_EVENT_REMOVE:
-               interface_set_available(iface, new_state);
-               if (!new_state && dep->dev && dep->dev->external)
+               interface_set_available(iface, false);
+               if (dep->dev && dep->dev->external)
                        interface_set_main_dev(iface, NULL);
                break;
        case DEV_EVENT_UP:
-               new_state = true;
+               interface_set_enabled(iface, true);
+               break;
        case DEV_EVENT_DOWN:
-               interface_set_enabled(iface, new_state);
+               interface_set_enabled(iface, false);
                break;
        case DEV_EVENT_LINK_UP:
-               new_state = true;
+               interface_set_link_state(iface, true);
+               break;
        case DEV_EVENT_LINK_DOWN:
-               interface_set_link_state(iface, new_state);
+               interface_set_link_state(iface, false);
                break;
        case DEV_EVENT_TOPO_CHANGE:
                interface_proto_event(iface->proto, PROTO_CMD_RENEW, false);
@@ -693,7 +695,7 @@ interface_handle_config_change(struct interface *iface)
                interface_do_free(iface);
                return;
        }
-       if (iface->autostart && iface->available)
+       if (iface->autostart)
                interface_set_up(iface);
        else if (iface->dynamic)
                set_config_state(iface, IFC_REMOVE);
@@ -1101,7 +1103,7 @@ interface_start_pending(void)
        struct interface *iface;
 
        vlist_for_each_element(&interfaces, iface, node) {
-               if (iface->available && iface->autostart)
+               if (iface->autostart)
                        interface_set_up(iface);
        }
 }
@@ -1275,6 +1277,7 @@ interface_update(struct vlist_tree *tree, struct vlist_node *node_new,
                set_config_state(if_old, IFC_REMOVE);
        } else if (node_new) {
                D(INTERFACE, "Create interface '%s'\n", if_new->name);
+               interface_event(if_new, IFEV_CREATE);
                proto_init_interface(if_new, if_new->config);
                interface_claim_device(if_new);
                netifd_ubus_add_interface(if_new);