hostapd: reload bss if a relevant ifindex changes
authorFelix Fietkau <nbd@nbd.name>
Sun, 6 Oct 2024 16:52:48 +0000 (18:52 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sun, 6 Oct 2024 18:09:19 +0000 (20:09 +0200)
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>
package/network/services/hostapd/files/hostapd.uc

index 6774fbf3ba8ecf72b23a6411e821ea2b17f28871..6bcb32131d966a50693fef8394b03afee882a589 100644 (file)
@@ -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)