wireless: allow set_retry ubus notify command to trigger a wdev restart
[project/netifd.git] / wireless.c
index 07cc3217fb727c26a3542327beced899128fece1..118f5a7cf135b836210a30ca4d8e3ffcc06df21d 100644 (file)
@@ -328,9 +328,10 @@ static void wireless_interface_handle_link(struct wireless_interface *vif, const
        if (!ifname)
                ifname = vif->ifname;
 
-       if (up && !strcmp(ifname, vif->ifname)) {
-               struct device *dev = device_get(ifname, 2);
-               if (dev) {
+       if (up) {
+               struct device *dev = __device_get(ifname, 2, false);
+
+               if (dev && !strcmp(ifname, vif->ifname)) {
                        dev->wireless_isolate = vif->isolate;
                        dev->wireless_proxyarp = vif->proxyarp;
                        dev->wireless = true;
@@ -803,20 +804,13 @@ wireless_interface_init_config(struct wireless_interface *vif)
                vif->network = cur;
 
        cur = tb[VIF_ATTR_MODE];
-       if (cur)
-               vif->ap_mode = !strcmp(blobmsg_get_string(cur), "ap");
-
-       if (!vif->ap_mode)
-               return;
+       vif->ap_mode = cur && !strcmp(blobmsg_get_string(cur), "ap");
 
        cur = tb[VIF_ATTR_ISOLATE];
-       if (cur)
-               vif->isolate = blobmsg_get_bool(cur);
+       vif->isolate = vif->ap_mode && cur && blobmsg_get_bool(cur);
 
        cur = tb[VIF_ATTR_PROXYARP];
-       if (cur)
-               vif->proxyarp = blobmsg_get_bool(cur);
-
+       vif->proxyarp = vif->ap_mode && cur && blobmsg_get_bool(cur);
 }
 
 /* vlist update call for wireless interface list */
@@ -845,8 +839,6 @@ vif_update(struct vlist_tree *tree, struct vlist_node *node_new,
                wireless_interface_handle_link(vif_old, NULL, false);
                free(vif_old->config);
                vif_old->config = blob_memdup(vif_new->config);
-               vif_old->isolate = vif_new->isolate;
-               vif_old->ap_mode = vif_new->ap_mode;
                wireless_interface_init_config(vif_old);
                free(vif_new);
        } else if (vif_new) {
@@ -1411,10 +1403,11 @@ wireless_device_set_retry(struct wireless_device *wdev, struct blob_attr *data)
        struct blob_attr *val;
 
        blobmsg_parse(&retry_policy, 1, &val, blobmsg_data(data), blobmsg_data_len(data));
-       if (!val)
-               return UBUS_STATUS_INVALID_ARGUMENT;
-
-       wdev->retry = blobmsg_get_u32(val);
+       if (val)
+               wdev->retry = blobmsg_get_u32(val);
+       else
+               wdev->retry = WIRELESS_SETUP_RETRY;
+       __wireless_device_set_up(wdev, 0);
        netifd_log_message(L_NOTICE, "Wireless device '%s' set retry=%d\n", wdev->name, wdev->retry);
        return 0;
 }