From 7b2c9f6799fd9b876e8e1440d3ff0d650c41a965 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 3 Oct 2025 15:32:25 +0200 Subject: [PATCH] hostapd: skip dynamic reconfiguration while not in enabled state 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 --- .../network/services/hostapd/files/hostapd.uc | 5 ++++ .../services/hostapd/src/src/ap/ucode.c | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc index 4bd53d6efe1..17c34003e85 100644 --- a/package/network/services/hostapd/files/hostapd.uc +++ b/package/network/services/hostapd/files/hostapd.uc @@ -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}`); diff --git a/package/network/services/hostapd/src/src/ap/ucode.c b/package/network/services/hostapd/src/src/ap/ucode.c index cca487c3568..435174ca510 100644 --- a/package/network/services/hostapd/src/src/ap/ucode.c +++ b/package/network/services/hostapd/src/src/ap/ucode.c @@ -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 }, -- 2.47.3