netifd: Check interface state only when main device is set during interface_change_config
[project/netifd.git] / wireless.c
index 9a68e01..f3c9549 100644 (file)
@@ -417,7 +417,7 @@ wdev_change_config(struct wireless_device *wdev, struct wireless_device *wd_new)
 
        free(wd_new);
 
-       if (blob_attr_equal(wdev->config, new_config) || wdev->disabled == disabled)
+       if (blob_attr_equal(wdev->config, new_config) && wdev->disabled == disabled)
                return;
 
        D(WIRELESS, "Update configuration of wireless device '%s'\n", wdev->name);
@@ -491,8 +491,7 @@ wireless_add_handler(const char *script, const char *name, json_object *obj)
        D(WIRELESS, "Add handler for script %s: %s\n", script, name);
 }
 
-static void __init
-wireless_init_list(void)
+void wireless_init(void)
 {
        vlist_init(&wireless_devices, avl_strcmp, wdev_update);
        wireless_devices.keep_old = true;
@@ -630,7 +629,6 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo
        INIT_LIST_HEAD(&wdev->script_proc);
        vlist_init(&wdev->interfaces, avl_strcmp, vif_update);
        wdev->interfaces.keep_old = true;
-       vlist_add(&wireless_devices, &wdev->node, wdev->name);
 
        wdev->timeout.cb = wireless_device_setup_timeout;
        wdev->script_task.cb = wireless_device_script_task_cb;
@@ -641,6 +639,8 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo
        wdev->script_proc_fd.cb = wireless_proc_poll_fd;
 
        wdev->script_check.cb = wireless_device_check_script_tasks;
+
+       vlist_add(&wireless_devices, &wdev->node, wdev->name);
 }
 
 void wireless_interface_create(struct wireless_device *wdev, struct blob_attr *data, const char *section)
@@ -701,6 +701,30 @@ wireless_device_status(struct wireless_device *wdev, struct blob_buf *b)
        blobmsg_close_table(b, c);
 }
 
+void
+wireless_device_get_validate(struct wireless_device *wdev, struct blob_buf *b)
+{
+       struct uci_blob_param_list *p;
+       void *c, *d;
+       int i;
+
+       c = blobmsg_open_table(b, wdev->name);
+
+       d = blobmsg_open_table(b, "device");
+       p = wdev->drv->device.config;
+       for (i = 0; i < p->n_params; i++)
+               blobmsg_add_string(b, p->params[i].name, uci_get_validate_string(p, i));
+       blobmsg_close_table(b, d);
+
+       d = blobmsg_open_table(b, "interface");
+       p = wdev->drv->interface.config;
+       for (i = 0; i < p->n_params; i++)
+               blobmsg_add_string(b, p->params[i].name, uci_get_validate_string(p, i));
+       blobmsg_close_table(b, d);
+
+       blobmsg_close_table(b, c);
+}
+
 static void
 wireless_interface_set_data(struct wireless_interface *vif)
 {