device: restore cleared flags on device down openwrt-23.05
authorErik Karlsson <erik.karlsson@genexis.eu>
Tue, 5 Dec 2023 23:22:58 +0000 (00:22 +0100)
committerFelix Fietkau <nbd@nbd.name>
Thu, 4 Jan 2024 12:35:43 +0000 (13:35 +0100)
In case flags have been cleared because settings failed to apply,
restore them when the device is brought down so that they will be
re-attempted the next time the device is brought up.

Signed-off-by: Erik Karlsson <erik.karlsson@genexis.eu>
device.c

index cb97b9ab30868ca707fe042e177495d7b6ef9c6c..b1213a0f30c9dc29fe6742bb7bc24a42018d3ad5 100644 (file)
--- a/device.c
+++ b/device.c
@@ -172,6 +172,11 @@ static int set_device_state(struct device *dev, bool state)
        } else {
                system_if_down(dev);
                system_if_apply_settings(dev, &dev->orig_settings, dev->orig_settings.flags);
+
+               /* Restore any settings present in UCI which may have
+                * failed to apply so that they will be re-attempted
+                * the next time the device is brought up */
+               dev->settings.flags |= dev->settings.valid_flags;
        }
 
        return 0;
@@ -571,6 +576,9 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
                s->flags |= DEV_OPT_EEE;
        }
 
+       /* Remember the settings present in UCI */
+       s->valid_flags = s->flags;
+
        cur = tb[DEV_ATTR_AUTH_VLAN];
        free(dev->config_auth_vlans);
        dev->config_auth_vlans = cur ? blob_memdup(cur) : NULL;