interface, ubus: rework netns up/down
[project/netifd.git] / wireless.c
index fbd42ed3faaa02b9567188e18dd28bdbff2464af..07cc3217fb727c26a3542327beced899128fece1 100644 (file)
@@ -328,7 +328,7 @@ static void wireless_interface_handle_link(struct wireless_interface *vif, const
        if (!ifname)
                ifname = vif->ifname;
 
-       if (up && ifname != vif->ifname) {
+       if (up && !strcmp(ifname, vif->ifname)) {
                struct device *dev = device_get(ifname, 2);
                if (dev) {
                        dev->wireless_isolate = vif->isolate;
@@ -431,6 +431,9 @@ wireless_device_run_handler(struct wireless_device *wdev, bool up)
        argv[i] = NULL;
 
        if (up && pipe(fds) == 0) {
+               if (wdev->script_proc_fd.fd >= 0)
+                       wireless_close_script_proc_fd(wdev);
+
                wdev->script_proc_fd.fd = fds[0];
                uloop_fd_add(&wdev->script_proc_fd,
                             ULOOP_READ | ULOOP_EDGE_TRIGGER);
@@ -499,8 +502,11 @@ wdev_handle_config_change(struct wireless_device *wdev)
        enum interface_config_state state = wdev->config_state;
 
        switch(state) {
-       case IFC_NORMAL:
        case IFC_RELOAD:
+               wdev->retry = WIRELESS_SETUP_RETRY;
+               wdev->retry_setup_failed = false;
+               fallthrough;
+       case IFC_NORMAL:
                __wireless_device_set_up(wdev, 0);
 
                wdev->config_state = IFC_NORMAL;
@@ -517,7 +523,7 @@ wireless_device_mark_down(struct wireless_device *wdev)
        struct wireless_interface *vif;
        struct wireless_vlan *vlan;
 
-       D(WIRELESS, "Wireless device '%s' is now down\n", wdev->name);
+       netifd_log_message(L_NOTICE, "Wireless device '%s' is now down\n", wdev->name);
 
        vlist_for_each_element(&wdev->vlans, vlan, node)
                wireless_vlan_handle_link(vlan, false);
@@ -592,7 +598,8 @@ wireless_device_mark_up(struct wireless_device *wdev)
                return;
        }
 
-       D(WIRELESS, "Wireless device '%s' is now up\n", wdev->name);
+       netifd_log_message(L_NOTICE, "Wireless device '%s' is now up\n", wdev->name);
+       wdev->retry = WIRELESS_SETUP_RETRY;
        wdev->state = IFS_UP;
        vlist_for_each_element(&wdev->interfaces, vif, node)
                wireless_interface_handle_link(vif, NULL, true);
@@ -606,6 +613,9 @@ wireless_device_retry_setup(struct wireless_device *wdev)
        if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN || wdev->cancel)
                return;
 
+       netifd_log_message(wdev->retry ? L_WARNING : L_CRIT,
+                          "Wireless device '%s' setup failed, retry=%d\n",
+                          wdev->name, wdev->retry);
        if (--wdev->retry < 0)
                wdev->retry_setup_failed = true;
 
@@ -681,7 +691,6 @@ wdev_change_config(struct wireless_device *wdev, struct wireless_device *wd_new)
        free(wdev->config);
        wdev->config = blob_memdup(new_config);
        wdev->disabled = disabled;
-       wdev->retry_setup_failed = false;
        wdev_set_config_state(wdev, IFC_RELOAD);
 }
 
@@ -1080,7 +1089,7 @@ wireless_station_create(struct wireless_device *wdev, char *vif, struct blob_att
        if (cur && blobmsg_get_bool(cur))
                return;
 
-       sprintf(name, "%d", wdev->vlan_idx++);
+       sprintf(name, "%d", wdev->sta_idx++);
 
        sta = calloc_a(sizeof(*sta),
                       &name_buf, strlen(name) + 1,
@@ -1406,6 +1415,7 @@ wireless_device_set_retry(struct wireless_device *wdev, struct blob_attr *data)
                return UBUS_STATUS_INVALID_ARGUMENT;
 
        wdev->retry = blobmsg_get_u32(val);
+       netifd_log_message(L_NOTICE, "Wireless device '%s' set retry=%d\n", wdev->name, wdev->retry);
        return 0;
 }