#ifdef CONFIG_IEEE80211AX
if (hapd->iconf->ieee80211ax) {
- buflen += 4 + sizeof (struct ieee80211_he_capabilities) +
- 4 + sizeof (struct ieee80211_he_operation);
+ buflen += 3 + sizeof(struct ieee80211_he_capabilities) +
+ 3 + sizeof(struct ieee80211_he_operation);
}
-#endif
+#endif /* CONFIG_IEEE80211AX */
buflen += hostapd_mbo_ie_len(hapd);
pos = hostapd_eid_fils_indic(hapd, pos, 0);
-#ifdef CONFIG_IEEE80211AC
- if (hapd->conf->vendor_vht)
- pos = hostapd_eid_vendor_vht(hapd, pos);
-#endif /* CONFIG_IEEE80211AC */
-
#ifdef CONFIG_IEEE80211AX
if (hapd->iconf->ieee80211ax) {
- pos = hostapd_eid_vendor_he_capab(hapd, pos);
- pos = hostapd_eid_vendor_he_operation(hapd, pos);
+ pos = hostapd_eid_he_capab(hapd, pos);
+ pos = hostapd_eid_he_operation(hapd, pos);
}
#endif /* CONFIG_IEEE80211AX */
+#ifdef CONFIG_IEEE80211AC
+ if (hapd->conf->vendor_vht)
+ pos = hostapd_eid_vendor_vht(hapd, pos);
+#endif /* CONFIG_IEEE80211AC */
+
/* Wi-Fi Alliance WMM */
pos = hostapd_eid_wmm(hapd, pos);
#ifdef CONFIG_IEEE80211AX
if (hapd->iconf->ieee80211ax) {
- tail_len += 4 + sizeof (struct ieee80211_he_capabilities) +
- 4 + sizeof (struct ieee80211_he_operation);
+ tail_len += 3 + sizeof(struct ieee80211_he_capabilities) +
+ 3 + sizeof(struct ieee80211_he_operation);
}
-#endif
+#endif /* CONFIG_IEEE80211AX */
tail_len += hostapd_mbo_ie_len(hapd);
tailpos = hostapd_eid_fils_indic(hapd, tailpos, 0);
-#ifdef CONFIG_IEEE80211AC
- if (hapd->conf->vendor_vht)
- tailpos = hostapd_eid_vendor_vht(hapd, tailpos);
-#endif /* CONFIG_IEEE80211AC */
-
#ifdef CONFIG_IEEE80211AX
if (hapd->iconf->ieee80211ax) {
- tailpos = hostapd_eid_vendor_he_capab(hapd, tailpos);
- tailpos = hostapd_eid_vendor_he_operation(hapd, tailpos);
+ tailpos = hostapd_eid_he_capab(hapd, tailpos);
+ tailpos = hostapd_eid_he_operation(hapd, tailpos);
}
#endif /* CONFIG_IEEE80211AX */
+#ifdef CONFIG_IEEE80211AC
+ if (hapd->conf->vendor_vht)
+ tailpos = hostapd_eid_vendor_vht(hapd, tailpos);
+#endif /* CONFIG_IEEE80211AC */
+
/* Wi-Fi Alliance WMM */
tailpos = hostapd_eid_wmm(hapd, tailpos);
u8 * hostapd_eid_vendor_vht(struct hostapd_data *hapd, u8 *eid);
u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid);
u8 * hostapd_eid_txpower_envelope(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_vendor_he_capab(struct hostapd_data *hapd, u8 *eid);
-u8 * hostapd_eid_vendor_he_operation(struct hostapd_data *hapd, u8 *eid);
+u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid);
+u8 * hostapd_eid_he_operation(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,
#include "utils/common.h"
#include "common/ieee802_11_defs.h"
-#include "common/qca-vendor.h"
#include "hostapd.h"
#include "ap_config.h"
#include "beacon.h"
#include "ieee802_11.h"
#include "dfs.h"
-u8 * hostapd_eid_vendor_he_capab(struct hostapd_data *hapd, u8 *eid)
+u8 * hostapd_eid_he_capab(struct hostapd_data *hapd, u8 *eid)
{
struct ieee80211_he_capabilities *cap;
u8 *pos = eid;
if (!hapd->iface->current_mode)
return eid;
- /* For now, use a vendor specific element since the P802.11ax draft is
- * still subject to changes and the contents of this element may change.
- * This can be replaced with the actual element once P802.11ax is
- * finalized. */
- /* Vendor HE Capabilities element */
- *pos++ = WLAN_EID_VENDOR_SPECIFIC;
- *pos++ = 4 /* The Vendor OUI, subtype */ +
- sizeof(struct ieee80211_he_capabilities);
-
- WPA_PUT_BE32(pos, (OUI_QCA << 8) | QCA_VENDOR_ELEM_HE_CAPAB);
- pos += 4;
+ *pos++ = WLAN_EID_EXTENSION;
+ *pos++ = 1 + sizeof(struct ieee80211_he_capabilities);
+ *pos++ = WLAN_EID_EXT_HE_CAPABILITIES;
+
cap = (struct ieee80211_he_capabilities *) pos;
os_memset(cap, 0, sizeof(*cap));
}
-u8 * hostapd_eid_vendor_he_operation(struct hostapd_data *hapd, u8 *eid)
+u8 * hostapd_eid_he_operation(struct hostapd_data *hapd, u8 *eid)
{
struct ieee80211_he_operation *oper;
u8 *pos = eid;
if (!hapd->iface->current_mode)
return eid;
- /* For now, use a vendor specific element since the P802.11ax draft is
- * still subject to changes and the contents of this element may change.
- * This can be replaced with the actual element once P802.11ax is
- * finalized. */
- /* Vendor HE Operation element */
- *pos++ = WLAN_EID_VENDOR_SPECIFIC;
- *pos++ = 4 /* The Vendor OUI, subtype */ +
- sizeof(struct ieee80211_he_operation);
-
- WPA_PUT_BE32(pos, (OUI_QCA << 8) | QCA_VENDOR_ELEM_HE_OPER);
- pos += 4;
+ *pos++ = WLAN_EID_EXTENSION;
+ *pos++ = 1 + sizeof(struct ieee80211_he_operation);
+ *pos++ = WLAN_EID_EXT_HE_OPERATION;
+
oper = (struct ieee80211_he_operation *) pos;
os_memset(oper, 0, sizeof(*oper));
(hapd->iface->conf->he_op.he_rts_threshold <<
HE_OPERATION_RTS_THRESHOLD_OFFSET);
+ /* TODO: conditional MaxBSSID Indicator subfield */
+
pos += sizeof(*oper);
return pos;
#define WLAN_EID_EXT_FILS_NONCE 13
#define WLAN_EID_EXT_FUTURE_CHANNEL_GUIDANCE 14
#define WLAN_EID_EXT_OWE_DH_PARAM 32
+#define WLAN_EID_EXT_HE_CAPABILITIES 35
+#define WLAN_EID_EXT_HE_OPERATION 36
/* Action frame categories (IEEE Std 802.11-2016, 9.4.1.11, Table 9-76) */
struct ieee80211_he_capabilities {
u8 he_mac_capab_info[5];
u8 he_phy_capab_info[9];
- u16 he_txrx_mcs_support;
- /* possibly followed by Tx Rx MCS NSS descriptor */
- u8 variable[];
+ u8 he_txrx_mcs_support[12]; /* TODO: 4, 8, or 12 octets */
/* PPE Thresholds (optional) */
} STRUCT_PACKED;
struct ieee80211_he_operation {
u32 he_oper_params;
- u8 he_mcs_nss_set[3];
+ u8 he_mcs_nss_set[2];
u8 vht_op_info_chwidth;
u8 vht_op_info_chan_center_freq_seg0_idx;
u8 vht_op_info_chan_center_freq_seg1_idx;
+ /* Followed by conditional MaxBSSID Indicator subfield (u8) */
} STRUCT_PACKED;
/* HE Capabilities Information defines */