]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
wifi-scripts: fix spurious teardown on config_change during setup
authorFelix Fietkau <nbd@nbd.name>
Sun, 8 Feb 2026 18:46:07 +0000 (18:46 +0000)
committerFelix Fietkau <nbd@nbd.name>
Sun, 8 Feb 2026 18:46:45 +0000 (19:46 +0100)
When config_change is set during an active setup (e.g. by a concurrent
reconf call), wdev_mark_up() attempted to call setup() while still in
"setup" state. Since setup() requires state "up" or "down", it silently
returned, leaving the state as "setup". The subsequent wdev_setup_cb()
then treated this as a setup failure, triggering an unnecessary
teardown+restart cycle.

Fix this by removing the config_change handling from wdev_mark_up() and
moving it to wdev_setup_cb() instead. wdev_mark_up() now always
transitions to "up" state. When wdev_setup_cb() runs afterwards and
finds the device already "up" with config_change set, it initiates a
clean re-setup from the "up" state where setup() can run.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/config/wifi-scripts/files/lib/netifd/wireless-device.uc

index 8168e291eb8cdc4d2b7d9eb788493b2382978931..768a421480c1e30a0ed148a26fa089c0f574bbba 100644 (file)
@@ -142,8 +142,13 @@ function wdev_config_init(wdev)
 
 function wdev_setup_cb(wdev)
 {
-       if (wdev.state != "setup")
+       if (wdev.state != "setup") {
+               if (wdev.state == "up" && wdev.config_change) {
+                       wdev_config_init(wdev);
+                       wdev.setup();
+               }
                return;
+       }
 
        if (wdev.retry > 0)
                wdev.retry--;
@@ -448,11 +453,6 @@ function wdev_mark_up(wdev)
        if (wdev.state != "setup")
                return;
 
-       if (wdev.config_change) {
-               wdev.setup();
-               return;
-       }
-
        for (let section, data in wdev.handler_data) {
                if (data.ifname)
                        handle_link(data.ifname, data, true);