summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2024-10-06 16:52:48 +0000
committerFelix Fietkau2024-10-06 18:09:19 +0000
commit12c1a56ec047d9b70cfb4f3c376c05b523b5537f (patch)
tree6f3c50385bae2a2d0fecddd01bff30e872f0bbfe
parentcffc52bb9adf8e84e4611c88c8ec4ff2d4111a0c (diff)
downloadopenwrt-12c1a56ec047d9b70cfb4f3c376c05b523b5537f.tar.gz
hostapd: reload bss if a relevant ifindex changes
This can happen if the bridge or a stacked vlan device gets recreated. Ensure that hostapd sees the change and handles it gracefully. Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--package/network/services/hostapd/files/hostapd.uc25
1 files changed, 24 insertions, 1 deletions
diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc
index 6774fbf3ba..6bcb32131d 100644
--- a/package/network/services/hostapd/files/hostapd.uc
+++ b/package/network/services/hostapd/files/hostapd.uc
@@ -22,6 +22,14 @@ hostapd.data.file_fields = {
eap_sim_db: true,
};
+hostapd.data.iface_fields = {
+ ft_iface: true,
+ upnp_iface: true,
+ snoop_iface: true,
+ bridge: true,
+ iapp_interface: true,
+};
+
function iface_remove(cfg)
{
if (!cfg || !cfg.bss || !cfg.bss[0] || !cfg.bss[0].ifname)
@@ -324,9 +332,24 @@ function bss_remove_file_fields(config)
return new_cfg;
}
+function bss_ifindex_list(config)
+{
+ config = filter(config, (line) => !!hostapd.data.iface_fields[split(line, "=")[0]]);
+
+ return join(",", map(config, (line) => {
+ try {
+ let file = "/sys/class/net/" + split(line, "=")[1] + "/ifindex";
+ let val = trim(readfile(file));
+ return val;
+ } catch (e) {
+ return "";
+ }
+ }));
+}
+
function bss_config_hash(config)
{
- return hostapd.sha1(remove_file_fields(config) + "");
+ return hostapd.sha1(remove_file_fields(config) + bss_ifindex_list(config));
}
function bss_find_existing(config, prev_config, prev_hash)