add mac address to device info
[project/netifd.git] / interface.c
index d0eec4a..257eaca 100644 (file)
@@ -100,6 +100,8 @@ interface_flush_state(struct interface *iface)
 static void
 mark_interface_down(struct interface *iface)
 {
+       if (iface->state == IFS_UP)
+               interface_event(iface, IFEV_DOWN);
        interface_flush_state(iface);
        iface->state = IFS_DOWN;
 }
@@ -113,8 +115,9 @@ __interface_set_down(struct interface *iface, bool force)
                iface->state == IFS_TEARDOWN)
                return;
 
+       if (iface->state == IFS_UP)
+               interface_event(iface, IFEV_DOWN);
        iface->state = IFS_TEARDOWN;
-       interface_event(iface, IFEV_DOWN);
        interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, force);
        if (force)
                interface_flush_state(iface);
@@ -184,6 +187,8 @@ interface_claim_device(struct interface *iface)
                if (dev)
                        device_add_user(&iface->main_dev, dev);
        }
+       if (iface->proto_handler->flags & PROTO_FLAG_INIT_AVAILABLE)
+               interface_set_available(iface, true);
 }
 
 
@@ -272,8 +277,9 @@ interface_proto_cb(struct interface_proto_state *state, enum interface_proto_eve
                        return;
 
                netifd_log_message(L_NOTICE, "Interface '%s' has lost the connection\n", iface->name);
+               if (iface->state == IFS_UP)
+                       interface_event(iface, IFEV_DOWN);
                iface->state = IFS_SETUP;
-               interface_event(iface, IFEV_DOWN);
                break;
        }
 }
@@ -475,8 +481,9 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
        if_old->ifname = if_new->ifname;
        if_old->proto_handler = if_new->proto_handler;
 
-       if (strcmp(old_ifname, if_new->ifname) != 0 ||
-               proto != if_new->proto_handler) {
+       if ((!!old_ifname != !!if_new->ifname) ||
+           (old_ifname && strcmp(old_ifname, if_new->ifname) != 0) ||
+           proto != if_new->proto_handler) {
                D(INTERFACE, "Reload interface '%s' because of ifname/proto change\n",
                  if_old->name);
                goto reload;
@@ -516,8 +523,8 @@ 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_claim_device(if_new);
                proto_init_interface(if_new, if_new->config);
+               interface_claim_device(if_new);
                netifd_ubus_add_interface(if_new);
        }
 }