[openwrt/openwrt] hostapd: fix a race condition on adding AP mode wds sta interfaces

LEDE Commits lede-commits at lists.infradead.org
Tue Nov 23 09:44:36 PST 2021


nbd pushed a commit to openwrt/openwrt.git, branch openwrt-21.02:
https://git.openwrt.org/9b660c63ad28b60ef6efc0283238635b64a9ca4a

commit 9b660c63ad28b60ef6efc0283238635b64a9ca4a
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Wed Oct 20 21:13:10 2021 +0200

    hostapd: fix a race condition on adding AP mode wds sta interfaces
    
    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 at nbd.name>
    (cherry-picked from commit da4be02fcd5d642954b1c9d9855d9e8d1e6205f4)
    (cherry-picked from commit 63c01ad025981eaa841353dc0fc27e5017febe21)
---
 package/network/services/hostapd/files/hostapd.sh  |  2 +-
 .../hostapd/patches/711-wds_bridge_force.patch     | 22 ++++++++++++++++++++++
 .../services/hostapd/patches/740-snoop_iface.patch |  6 +++---
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh
index b5388ee46c..f79155221d 100644
--- a/package/network/services/hostapd/files/hostapd.sh
+++ b/package/network/services/hostapd/files/hostapd.sh
@@ -729,7 +729,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
index 0000000000..d3f8864a74
--- /dev/null
+++ b/package/network/services/hostapd/patches/711-wds_bridge_force.patch
@@ -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, "vlan_bridge") == 0) {
+ 		os_strlcpy(bss->vlan_bridge, pos, sizeof(bss->vlan_bridge));
+ 	} else if (os_strcmp(buf, "wds_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);
+ }
diff --git a/package/network/services/hostapd/patches/740-snoop_iface.patch b/package/network/services/hostapd/patches/740-snoop_iface.patch
index 8d928f8505..d206ed7322 100644
--- a/package/network/services/hostapd/patches/740-snoop_iface.patch
+++ b/package/network/services/hostapd/patches/740-snoop_iface.patch
@@ -55,10 +55,10 @@
  			   "x_snoop: Failed to initialize L2 packet processing %s",
 --- 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) {
+@@ -2359,6 +2359,8 @@ static int hostapd_config_fill(struct ho
  		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) {



More information about the lede-commits mailing list