summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2023-06-29 10:27:02 +0000
committerFelix Fietkau2023-06-29 10:27:04 +0000
commit1ab992a74b43c7b92667ec2b8480de8fa40df689 (patch)
tree0e7c61c23628b7ded6d7a15d7a198084feb2ff67
parent255b4d5c472ee3e04ed5fc8ded2a15b3737821ba (diff)
downloadnetifd-1ab992a74b43c7b92667ec2b8480de8fa40df689.tar.gz
wireless: fix another reconf issue
Defer handling wdev config updates until the entire config has been processed. Fixes an issue where only the changes of the first modified vif would be accepted Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--wireless.c16
-rw-r--r--wireless.h1
2 files changed, 11 insertions, 6 deletions
diff --git a/wireless.c b/wireless.c
index 58f096d..42eb187 100644
--- a/wireless.c
+++ b/wireless.c
@@ -496,7 +496,7 @@ __wireless_device_set_up(struct wireless_device *wdev, int force)
if (!wdev->autostart)
return;
- if (!force && (wdev->state != IFS_DOWN || config_init))
+ if ((!force && wdev->state != IFS_DOWN) || config_init)
return;
free(wdev->prev_config);
@@ -680,6 +680,7 @@ wdev_set_config_state(struct wireless_device *wdev, enum interface_config_state
if (wdev->config_state != IFC_NORMAL)
return;
+ wdev->config_update = false;
if (s == IFC_RELOAD && wdev->reconf && wdev->state == IFS_UP) {
wireless_device_reconf(wdev);
return;
@@ -720,7 +721,7 @@ 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_set_config_state(wdev, IFC_RELOAD);
+ wdev->config_update = true;
}
static void
@@ -888,7 +889,7 @@ vif_update(struct vlist_tree *tree, struct vlist_node *node_new,
free(vif_old);
}
- wdev_set_config_state(wdev, IFC_RELOAD);
+ wdev->config_update = true;
}
/* parse blob config into the vlan object */
@@ -957,7 +958,7 @@ vlan_update(struct vlist_tree *tree, struct vlist_node *node_new,
free(vlan_old);
}
- wdev_set_config_state(wdev, IFC_RELOAD);
+ wdev->config_update = true;
}
/* vlist update call for station list */
@@ -997,7 +998,7 @@ station_update(struct vlist_tree *tree, struct vlist_node *node_new,
free(sta_old);
}
- wdev_set_config_state(wdev, IFC_RELOAD);
+ wdev->config_update = true;
}
static void
@@ -1550,8 +1551,11 @@ wireless_start_pending(void)
{
struct wireless_device *wdev;
- vlist_for_each_element(&wireless_devices, wdev, node)
+ vlist_for_each_element(&wireless_devices, wdev, node) {
+ if (wdev->config_update)
+ wdev_set_config_state(wdev, IFC_RELOAD);
__wireless_device_set_up(wdev, 0);
+ }
}
void wireless_device_hotplug_event(const char *name, bool add)
diff --git a/wireless.h b/wireless.h
index e9cfc92..4539bbc 100644
--- a/wireless.h
+++ b/wireless.h
@@ -40,6 +40,7 @@ struct wireless_device {
bool handler_action;
bool handler_pending;
bool serialize;
+ bool config_update;
struct wireless_driver *drv;
struct vlist_tree interfaces;