netifd: Add mldversion config support
[project/netifd.git] / interface.c
index 35f20b0..83d7f94 100644 (file)
@@ -271,6 +271,7 @@ interface_check_state(struct interface *iface)
 
        switch (iface->state) {
        case IFS_UP:
+       case IFS_SETUP:
                if (!iface->enabled || !link_state) {
                        interface_proto_event(iface->proto, PROTO_CMD_TEARDOWN, false);
                        mark_interface_down(iface);
@@ -501,6 +502,8 @@ interface_claim_device(struct interface *iface)
        } else if (iface->ifname &&
                !(iface->proto_handler->flags & PROTO_FLAG_NODEV)) {
                dev = device_get(iface->ifname, true);
+               if (dev && dev->default_config && iface->device_config)
+                       device_set_config(dev, dev->type, iface->config);
        } else {
                dev = iface->ext_dev.dev;
        }
@@ -881,8 +884,8 @@ interface_handle_link(struct interface *iface, const char *name, bool add, bool
 
        if (add) {
                device_set_present(dev, true);
-               if (iface->device_config)
-                       device_set_config(dev, &simple_device_type, iface->config);
+               if (iface->device_config && dev->default_config)
+                       device_set_config(dev, dev->type, iface->config);
 
                system_if_apply_settings(dev, &dev->settings, dev->settings.flags);
                ret = interface_add_link(iface, dev, link_ext);
@@ -1013,8 +1016,12 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
        })
 
        if_old->config = if_new->config;
-       if (!if_old->config_autostart && if_new->config_autostart)
-               if_old->autostart = true;
+       if (if_old->config_autostart != if_new->config_autostart) {
+               if (if_old->config_autostart)
+                       reload = true;
+
+               if_old->autostart = if_new->config_autostart;
+       }
 
        if_old->device_config = if_new->device_config;
        if_old->config_autostart = if_new->config_autostart;
@@ -1043,10 +1050,13 @@ interface_change_config(struct interface *if_old, struct interface *if_new)
        }
 
        if (reload_ip) {
+               bool config_ip_enabled = if_old->config_ip.enabled;
+               bool proto_ip_enabled = if_old->proto_ip.enabled;
+
                interface_ip_set_enabled(&if_old->config_ip, false);
                interface_ip_set_enabled(&if_old->proto_ip, false);
-               interface_ip_set_enabled(&if_old->proto_ip, if_new->proto_ip.enabled);
-               interface_ip_set_enabled(&if_old->config_ip, if_new->config_ip.enabled);
+               interface_ip_set_enabled(&if_old->proto_ip, proto_ip_enabled);
+               interface_ip_set_enabled(&if_old->config_ip, config_ip_enabled);
        }
 
        interface_write_resolv_conf();