]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
HE: Add 6 GHz Band Capabilities element in Beacon and response frames
authorRajkumar Manoharan <rmanohar@codeaurora.org>
Fri, 24 Apr 2020 22:45:37 +0000 (15:45 -0700)
committerJouni Malinen <j@w1.fi>
Sun, 17 May 2020 13:47:18 +0000 (16:47 +0300)
Construct HE 6 GHz Band Capabilities element (IEEE 802.11ax/D6.0,
9.4.2.261) from HT and VHT capabilities and add it to Beacon, Probe
Response, and (Re)Association Response frames when operating on the 6
GHz band.

Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
src/ap/beacon.c
src/ap/ieee802_11.c
src/ap/ieee802_11.h
src/ap/ieee802_11_he.c

index 47ced9a166de7c0c5909dca915d0ac8502de8382..22e672c8d5b15a79e3fbcd11597df8d5e6238880 100644 (file)
@@ -463,6 +463,9 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
                        3 + sizeof(struct ieee80211_he_operation) +
                        3 + sizeof(struct ieee80211_he_mu_edca_parameter_set) +
                        3 + sizeof(struct ieee80211_spatial_reuse);
+               if (is_6ghz_op_class(hapd->iconf->op_class))
+                       buflen += sizeof(struct ieee80211_he_6ghz_oper_info) +
+                               3 + sizeof(struct ieee80211_he_6ghz_band_cap);
        }
 #endif /* CONFIG_IEEE80211AX */
 
@@ -570,6 +573,7 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
                pos = hostapd_eid_he_operation(hapd, pos);
                pos = hostapd_eid_spatial_reuse(hapd, pos);
                pos = hostapd_eid_he_mu_edca_parameter_set(hapd, pos);
+               pos = hostapd_eid_he_6ghz_band_cap(hapd, pos);
        }
 #endif /* CONFIG_IEEE80211AX */
 
@@ -1161,6 +1165,9 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
                        3 + sizeof(struct ieee80211_he_operation) +
                        3 + sizeof(struct ieee80211_he_mu_edca_parameter_set) +
                        3 + sizeof(struct ieee80211_spatial_reuse);
+               if (is_6ghz_op_class(hapd->iconf->op_class))
+                       tail_len += sizeof(struct ieee80211_he_6ghz_oper_info) +
+                               3 + sizeof(struct ieee80211_he_6ghz_band_cap);
        }
 #endif /* CONFIG_IEEE80211AX */
 
@@ -1288,6 +1295,7 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
                tailpos = hostapd_eid_he_operation(hapd, tailpos);
                tailpos = hostapd_eid_spatial_reuse(hapd, tailpos);
                tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos);
+               tailpos = hostapd_eid_he_6ghz_band_cap(hapd, tailpos);
        }
 #endif /* CONFIG_IEEE80211AX */
 
index 3e1896cf1c62c63828bba301824a1bd5b2975c53..3a7c9a2b91968c55e6e791b2ca140c59e7a52a84 100644 (file)
@@ -3786,6 +3786,7 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
                p = hostapd_eid_he_operation(hapd, p);
                p = hostapd_eid_spatial_reuse(hapd, p);
                p = hostapd_eid_he_mu_edca_parameter_set(hapd, p);
+               p = hostapd_eid_he_6ghz_band_cap(hapd, p);
        }
 #endif /* CONFIG_IEEE80211AX */
 
index c7bdb4b2b113099070c5d221978a0090900bf082..ba505628982d9842b857c4adc91507f50ce6dd6a 100644 (file)
@@ -63,6 +63,7 @@ u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid,
 u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid);
 u8 * hostapd_eid_spatial_reuse(struct hostapd_data *hapd, u8 *eid);
+u8 * hostapd_eid_he_6ghz_band_cap(struct hostapd_data *hapd, u8 *eid);
 
 int hostapd_ht_operation_update(struct hostapd_iface *iface);
 void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
index 57c6b18f4bf89c1e4362b0e0a05678486d21627b..3267a9d672d52c2b481eab04d232061980b93c15 100644 (file)
@@ -311,6 +311,54 @@ u8 * hostapd_eid_spatial_reuse(struct hostapd_data *hapd, u8 *eid)
 }
 
 
+u8 * hostapd_eid_he_6ghz_band_cap(struct hostapd_data *hapd, u8 *eid)
+{
+       struct hostapd_hw_modes *mode = hapd->iface->current_mode;
+       struct ieee80211_he_6ghz_band_cap *cap;
+       u32 vht_cap;
+       u8 ht_info;
+       u8 params;
+       u8 *pos;
+
+       if (!mode || !is_6ghz_op_class(hapd->iconf->op_class))
+               return eid;
+
+       vht_cap = hapd->iface->conf->vht_capab;
+       ht_info = mode->a_mpdu_params;
+
+       pos = eid;
+       *pos++ = WLAN_EID_EXTENSION;
+       *pos++ = 1 + sizeof(*cap);
+       *pos++ = WLAN_EID_EXT_HE_6GHZ_BAND_CAP;
+
+       /* Minimum MPDU Start Spacing B0..B2 */
+       params = (ht_info >> 2) & HE_6GHZ_BAND_CAP_MIN_MPDU_START_SPACE_MASK;
+
+       /* Maximum A-MPDU Length Exponent B3..B5 */
+       params |= ((((vht_cap & VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX) >>
+                    VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX_SHIFT) &
+                   HE_6GHZ_BAND_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) <<
+                  HE_6GHZ_BAND_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT);
+
+       /* Maximum MPDU Length B6..B7 */
+       params |= ((((vht_cap & VHT_CAP_MAX_MPDU_LENGTH_MASK) >>
+                    VHT_CAP_MAX_MPDU_LENGTH_MASK_SHIFT) &
+                   HE_6GHZ_BAND_CAP_MAX_MPDU_LENGTH_MASK) <<
+                  HE_6GHZ_BAND_CAP_MAX_MPDU_LENGTH_SHIFT);
+
+       cap = (struct ieee80211_he_6ghz_band_cap *) pos;
+       cap->a_mpdu_params = params;
+       cap->info = HE_6GHZ_BAND_CAP_SMPS_DISABLED;
+       if (vht_cap & VHT_CAP_RX_ANTENNA_PATTERN)
+               cap->info |= HE_6GHZ_BAND_CAP_RX_ANTENNA_PATTERN;
+       if (vht_cap & VHT_CAP_TX_ANTENNA_PATTERN)
+               cap->info |= HE_6GHZ_BAND_CAP_TX_ANTENNA_PATTERN;
+       pos += sizeof(*cap);
+
+       return pos;
+}
+
+
 void hostapd_get_he_capab(struct hostapd_data *hapd,
                          const struct ieee80211_he_capabilities *he_cap,
                          struct ieee80211_he_capabilities *neg_he_cap,