hostapd: configure inter-AP communication interface for 802.11r
authorFelix Fietkau <nbd@nbd.name>
Fri, 4 Jun 2021 07:12:07 +0000 (09:12 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sat, 5 Jun 2021 04:53:29 +0000 (06:53 +0200)
In setups using VLAN bridge filtering, hostapd may need to communicate using
a VLAN interface on top of the bridge, instead of using the bridge directly

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

index 1fa22cb69e060ca0eeb494d3158e1efe35374432..cf85019d564667a140761d7726c75e4cdd5cde2d 100644 (file)
@@ -805,6 +805,7 @@ hostapd_set_bss_options() {
                                ;;
                        esac
 
+                       [ -n "$network_ifname" ] && append bss_conf "ft_iface=$network_ifname" "$N"
                        append bss_conf "mobility_domain=$mobility_domain" "$N"
                        append bss_conf "ft_psk_generate_local=$ft_psk_generate_local" "$N"
                        append bss_conf "ft_over_ds=$ft_over_ds" "$N"
diff --git a/package/network/services/hostapd/patches/730-ft_iface.patch b/package/network/services/hostapd/patches/730-ft_iface.patch
new file mode 100644 (file)
index 0000000..793e8e0
--- /dev/null
@@ -0,0 +1,38 @@
+--- a/hostapd/config_file.c
++++ b/hostapd/config_file.c
+@@ -3031,6 +3031,8 @@ static int hostapd_config_fill(struct ho
+               wpa_printf(MSG_INFO,
+                          "Line %d: Obsolete peerkey parameter ignored", line);
+ #ifdef CONFIG_IEEE80211R_AP
++      } else if (os_strcmp(buf, "ft_iface") == 0) {
++              os_strlcpy(bss->ft_iface, pos, sizeof(bss->ft_iface));
+       } else if (os_strcmp(buf, "mobility_domain") == 0) {
+               if (os_strlen(pos) != 2 * MOBILITY_DOMAIN_ID_LEN ||
+                   hexstr2bin(pos, bss->mobility_domain,
+--- a/src/ap/ap_config.h
++++ b/src/ap/ap_config.h
+@@ -277,6 +277,7 @@ struct airtime_sta_weight {
+ struct hostapd_bss_config {
+       char iface[IFNAMSIZ + 1];
+       char bridge[IFNAMSIZ + 1];
++      char ft_iface[IFNAMSIZ + 1];
+       char vlan_bridge[IFNAMSIZ + 1];
+       char wds_bridge[IFNAMSIZ + 1];
+--- a/src/ap/wpa_auth_glue.c
++++ b/src/ap/wpa_auth_glue.c
+@@ -1565,8 +1565,12 @@ int hostapd_setup_wpa(struct hostapd_dat
+           wpa_key_mgmt_ft(hapd->conf->wpa_key_mgmt)) {
+               const char *ft_iface;
+-              ft_iface = hapd->conf->bridge[0] ? hapd->conf->bridge :
+-                         hapd->conf->iface;
++              if (hapd->conf->ft_iface[0])
++                      ft_iface = hapd->conf->ft_iface;
++              else if (hapd->conf->bridge[0])
++                      ft_iface = hapd->conf->bridge;
++              else
++                      ft_iface = hapd->conf->iface;
+               hapd->l2 = l2_packet_init(ft_iface, NULL, ETH_P_RRB,
+                                         hostapd_rrb_receive, hapd, 1);
+               if (!hapd->l2) {