hostapd: fix a race condition on adding AP mode wds sta interfaces
authorFelix Fietkau <nbd@nbd.name>
Wed, 20 Oct 2021 19:13:10 +0000 (21:13 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 21 Oct 2021 09:31:53 +0000 (11:31 +0200)
Both hostapd and netifd attempt to add a VLAN device to a bridge.
Depending on which one wins the race, bridge vlan settings might be incomplete,
or hostapd might run into an error and refuse to service the client.
Fix this by preventing hostapd from adding interfaces to the bridge and
instead rely entirely on netifd handling this properly

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/network/services/hostapd/files/hostapd.sh
package/network/services/hostapd/patches/711-wds_bridge_force.patch [new file with mode: 0644]

index 4f306317c733882fccc8c3bce5816dd34bf23034..443511f75be9b182e1434744683ff73045c8bbd2 100644 (file)
@@ -753,7 +753,7 @@ hostapd_set_bss_options() {
        }
 
        append bss_conf "ssid=$ssid" "$N"
-       [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge" "$N"
+       [ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=" "$N"
        [ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N"
        [ -n "$iapp_interface" ] && {
                local ifname
diff --git a/package/network/services/hostapd/patches/711-wds_bridge_force.patch b/package/network/services/hostapd/patches/711-wds_bridge_force.patch
new file mode 100644 (file)
index 0000000..1d48489
--- /dev/null
@@ -0,0 +1,22 @@
+--- a/hostapd/config_file.c
++++ b/hostapd/config_file.c
+@@ -2357,6 +2357,8 @@ static int hostapd_config_fill(struct ho
+                          sizeof(conf->bss[0]->iface));
+       } else if (os_strcmp(buf, "bridge") == 0) {
+               os_strlcpy(bss->bridge, pos, sizeof(bss->bridge));
++              if (!bss->wds_bridge[0])
++                      os_strlcpy(bss->wds_bridge, pos, sizeof(bss->wds_bridge));
+       } else if (os_strcmp(buf, "snoop_iface") == 0) {
+               os_strlcpy(bss->snoop_iface, pos, sizeof(bss->snoop_iface));
+       } else if (os_strcmp(buf, "vlan_bridge") == 0) {
+--- a/src/ap/ap_drv_ops.c
++++ b/src/ap/ap_drv_ops.c
+@@ -340,8 +340,6 @@ int hostapd_set_wds_sta(struct hostapd_d
+               return -1;
+       if (hapd->conf->wds_bridge[0])
+               bridge = hapd->conf->wds_bridge;
+-      else if (hapd->conf->bridge[0])
+-              bridge = hapd->conf->bridge;
+       return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val,
+                                        bridge, ifname_wds);
+ }