]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
hostapd: skip dynamic reconfiguration while not in enabled state
authorFelix Fietkau <nbd@nbd.name>
Fri, 3 Oct 2025 13:32:25 +0000 (15:32 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sun, 5 Oct 2025 08:49:58 +0000 (10:49 +0200)
Interface might be down or scanning. Better do a full restart in order to avoid
messing up the runtime state.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/hostapd/files/hostapd.uc
package/network/services/hostapd/src/src/ap/ucode.c

index 4bd53d6efe1b37073fddfe1fa6edd94111e5c97e..17c34003e85a34a5ca37a28fbefd5d6be3f92f13 100644 (file)
@@ -538,6 +538,11 @@ function iface_reload_config(name, phydev, config, old_config)
                return false;
        }
 
+       if (iface.state() != "ENABLED") {
+               hostapd.printf(`Interface ${iface_name} is not fully configured`);
+               return false;
+       }
+
        let first_bss = get_config_bss(name, old_config, 0);
        if (!first_bss) {
                hostapd.printf(`Could not find bss of previous interface ${iface_name}`);
index cca487c3568b8d78b2cac5ddf120fd70382af1ba..435174ca5102ace51d701f7c172b7a143010e3eb 100644 (file)
@@ -380,6 +380,35 @@ uc_hostapd_bss_delete(uc_vm_t *vm, size_t nargs)
        return NULL;
 }
 
+static uc_value_t *
+uc_hostapd_iface_state(uc_vm_t *vm, size_t nargs)
+{
+#define hapd_state(name) [HAPD_IFACE_##name] = #name
+       static const char * const hapd_state_name[] = {
+               hapd_state(UNINITIALIZED),
+               hapd_state(DISABLED),
+               hapd_state(COUNTRY_UPDATE),
+               hapd_state(ACS),
+               hapd_state(HT_SCAN),
+               hapd_state(DFS),
+               hapd_state(NO_IR),
+               hapd_state(ENABLED),
+       };
+       struct hostapd_iface *iface = uc_fn_thisval("hostapd.iface");
+       const char *state = NULL;
+
+       if (!iface)
+               return NULL;
+
+       if (iface->state < ARRAY_SIZE(hapd_state_name))
+               state = hapd_state_name[iface->state];
+       if (!state)
+               state = "unknown";
+
+       return ucv_string_new(state);
+}
+
+
 static uc_value_t *
 uc_hostapd_iface_add_bss(uc_vm_t *vm, size_t nargs)
 {
@@ -930,6 +959,7 @@ int hostapd_ucode_init(struct hapd_interfaces *ifaces)
                { "delete", uc_hostapd_bss_delete },
        };
        static const uc_function_list_t iface_fns[] = {
+               { "state", uc_hostapd_iface_state },
                { "set_bss_order", uc_hostapd_iface_set_bss_order },
                { "add_bss", uc_hostapd_iface_add_bss },
                { "stop", uc_hostapd_iface_stop },