hostapd: add interoperability workaround for 80+80 and 160 MHz channels
authorImre Kaloz <kaloz@openwrt.org>
Thu, 13 Oct 2016 10:44:08 +0000 (12:44 +0200)
committerImre Kaloz <kaloz@openwrt.org>
Thu, 13 Oct 2016 10:44:08 +0000 (12:44 +0200)
Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
package/network/services/hostapd/patches/700-160mhz_interop_workaround.patch [new file with mode: 0644]

diff --git a/package/network/services/hostapd/patches/700-160mhz_interop_workaround.patch b/package/network/services/hostapd/patches/700-160mhz_interop_workaround.patch
new file mode 100644 (file)
index 0000000..75ece9b
--- /dev/null
@@ -0,0 +1,48 @@
+VHT: Add an interoperability workaround for 80+80 and 160 MHz channels
+
+Number of deployed 80 MHz capable VHT stations that do not support 80+80
+and 160 MHz bandwidths seem to misbehave when trying to connect to an AP
+that advertises 80+80 or 160 MHz channel bandwidth in the VHT Operation
+element. To avoid such issues with deployed devices, modify the design
+based on newly proposed IEEE 802.11 standard changes.
+
+This allows poorly implemented VHT 80 MHz stations to connect with the
+AP in 80 MHz mode. 80+80 and 160 MHz capable stations need to support
+the new workaround mechanism to allow full bandwidth to be used.
+However, there are more or less no impacted station with 80+80/160
+capability deployed.
+
+Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
+
+diff --git a/src/ap/ieee802_11_vht.c b/src/ap/ieee802_11_vht.c
+index 3236016..e923094 100644
+--- a/src/ap/ieee802_11_vht.c
++++ b/src/ap/ieee802_11_vht.c
+@@ -82,6 +82,27 @@ u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid)
+       oper->vht_op_info_chwidth = hapd->iconf->vht_oper_chwidth;
++      if (hapd->iconf->vht_oper_chwidth == 2) {
++              /*
++               * Convert 160 MHz channel width to new style as interop
++               * workaround.
++               */
++              oper->vht_op_info_chwidth = 1;
++              oper->vht_op_info_chan_center_freq_seg1_idx =
++                      oper->vht_op_info_chan_center_freq_seg0_idx;
++              if (hapd->iconf->channel <
++                  hapd->iconf->vht_oper_centr_freq_seg0_idx)
++                              oper->vht_op_info_chan_center_freq_seg0_idx -= 8;
++                      else
++                              oper->vht_op_info_chan_center_freq_seg0_idx += 8;
++      } else if (hapd->iconf->vht_oper_chwidth == 3) {
++              /*
++               * Convert 80+80 MHz channel width to new style as interop
++               * workaround.
++               */
++              oper->vht_op_info_chwidth = 1;
++      }
++
+       /* VHT Basic MCS set comes from hw */
+       /* Hard code 1 stream, MCS0-7 is a min Basic VHT MCS rates */
+       oper->vht_basic_mcs_set = host_to_le16(0xfffc);