From: Felix Fietkau Date: Thu, 29 Jun 2023 10:27:02 +0000 (+0200) Subject: wireless: fix another reconf issue X-Git-Url: http://git.openwrt.org/?p=project%2Fnetifd.git;a=commitdiff_plain;h=1ab992a74b43c7b92667ec2b8480de8fa40df689 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 --- 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;