hostapd: Add IEEE 802.11ax HE IEs into Beacon/Probe Response frames
IEEE 802.11ax HE changes to include HE IEs in Beacon and Probe Response frames. These elements are using vendor specific forms for now since the IEEE 802.11ax draft is not yet finalized and the element contents is subject to change. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
94380cb40a
commit
d512f406fc
7 changed files with 142 additions and 0 deletions
|
@ -917,6 +917,10 @@ ifdef CONFIG_IEEE80211AC
|
|||
OBJS += src/ap/ieee802_11_vht.c
|
||||
endif
|
||||
|
||||
ifdef CONFIG_IEEE80211AX
|
||||
OBJS += src/ap/ieee802_11_he.c
|
||||
endif
|
||||
|
||||
ifdef CONFIG_P2P_MANAGER
|
||||
L_CFLAGS += -DCONFIG_P2P_MANAGER
|
||||
OBJS += src/ap/p2p_hostapd.c
|
||||
|
|
|
@ -327,6 +327,7 @@ endif
|
|||
|
||||
ifdef CONFIG_IEEE80211AX
|
||||
CFLAGS += -DCONFIG_IEEE80211AX
|
||||
OBJS += ../src/ap/ieee802_11_he.o
|
||||
endif
|
||||
|
||||
ifdef CONFIG_MBO
|
||||
|
|
|
@ -392,6 +392,13 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
|
|||
2 + sizeof(struct ieee80211_vht_operation);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IEEE80211AX
|
||||
if (hapd->iconf->ieee80211ax) {
|
||||
buflen += 4 + sizeof (struct ieee80211_he_capabilities) +
|
||||
4 + sizeof (struct ieee80211_he_operation);
|
||||
}
|
||||
#endif
|
||||
|
||||
buflen += hostapd_mbo_ie_len(hapd);
|
||||
|
||||
resp = os_zalloc(buflen);
|
||||
|
@ -500,6 +507,13 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
|
|||
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);
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211AX */
|
||||
|
||||
/* Wi-Fi Alliance WMM */
|
||||
pos = hostapd_eid_wmm(hapd, pos);
|
||||
|
||||
|
@ -1040,6 +1054,13 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
|
|||
}
|
||||
#endif /* CONFIG_IEEE80211AC */
|
||||
|
||||
#ifdef CONFIG_IEEE80211AX
|
||||
if (hapd->iconf->ieee80211ax) {
|
||||
tail_len += 4 + sizeof (struct ieee80211_he_capabilities) +
|
||||
4 + sizeof (struct ieee80211_he_operation);
|
||||
}
|
||||
#endif
|
||||
|
||||
tail_len += hostapd_mbo_ie_len(hapd);
|
||||
|
||||
tailpos = tail = os_malloc(tail_len);
|
||||
|
@ -1171,6 +1192,13 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd,
|
|||
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);
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211AX */
|
||||
|
||||
/* Wi-Fi Alliance WMM */
|
||||
tailpos = hostapd_eid_wmm(hapd, tailpos);
|
||||
|
||||
|
|
|
@ -55,6 +55,8 @@ u8 * hostapd_eid_vht_operation(struct hostapd_data *hapd, u8 *eid);
|
|||
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);
|
||||
|
||||
int hostapd_ht_operation_update(struct hostapd_iface *iface);
|
||||
void ieee802_11_send_sa_query_req(struct hostapd_data *hapd,
|
||||
|
|
101
src/ap/ieee802_11_he.c
Normal file
101
src/ap/ieee802_11_he.c
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* hostapd / IEEE 802.11ax HE
|
||||
* Copyright (c) 2016-2017, Qualcomm Atheros, Inc.
|
||||
*
|
||||
* This software may be distributed under the terms of the BSD license.
|
||||
* See README for more details.
|
||||
*/
|
||||
|
||||
#include "utils/includes.h"
|
||||
|
||||
#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)
|
||||
{
|
||||
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;
|
||||
cap = (struct ieee80211_he_capabilities *) pos;
|
||||
os_memset(cap, 0, sizeof(*cap));
|
||||
|
||||
if (hapd->iface->conf->he_phy_capab.he_su_beamformer)
|
||||
cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMER_CAPAB_IDX] |=
|
||||
HE_PHYCAP_SU_BEAMFORMER_CAPAB;
|
||||
|
||||
if (hapd->iface->conf->he_phy_capab.he_su_beamformee)
|
||||
cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMEE_CAPAB_IDX] |=
|
||||
HE_PHYCAP_SU_BEAMFORMEE_CAPAB;
|
||||
|
||||
if (hapd->iface->conf->he_phy_capab.he_mu_beamformer)
|
||||
cap->he_phy_capab_info[HE_PHYCAP_MU_BEAMFORMER_CAPAB_IDX] |=
|
||||
HE_PHYCAP_MU_BEAMFORMER_CAPAB;
|
||||
|
||||
pos += sizeof(*cap);
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
|
||||
u8 * hostapd_eid_vendor_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;
|
||||
oper = (struct ieee80211_he_operation *) pos;
|
||||
os_memset(oper, 0, sizeof(*oper));
|
||||
|
||||
if (hapd->iface->conf->he_op.he_bss_color)
|
||||
oper->he_oper_params |= hapd->iface->conf->he_op.he_bss_color;
|
||||
|
||||
if (hapd->iface->conf->he_op.he_default_pe_duration)
|
||||
oper->he_oper_params |=
|
||||
(hapd->iface->conf->he_op.he_default_pe_duration <<
|
||||
HE_OPERATION_DFLT_PE_DURATION_OFFSET);
|
||||
|
||||
if (hapd->iface->conf->he_op.he_twt_required)
|
||||
oper->he_oper_params |= HE_OPERATION_TWT_REQUIRED;
|
||||
|
||||
if (hapd->iface->conf->he_op.he_rts_threshold)
|
||||
oper->he_oper_params |=
|
||||
(hapd->iface->conf->he_op.he_rts_threshold <<
|
||||
HE_OPERATION_RTS_THRESHOLD_OFFSET);
|
||||
|
||||
pos += sizeof(*oper);
|
||||
|
||||
return pos;
|
||||
}
|
|
@ -827,6 +827,9 @@ OBJS += src/ap/ieee802_11_ht.c
|
|||
ifdef CONFIG_IEEE80211AC
|
||||
OBJS += src/ap/ieee802_11_vht.c
|
||||
endif
|
||||
ifdef CONFIG_IEEE80211AX
|
||||
OBJS += src/ap/ieee802_11_he.c
|
||||
endif
|
||||
endif
|
||||
ifdef CONFIG_WNM
|
||||
OBJS += src/ap/wnm_ap.c
|
||||
|
|
|
@ -868,6 +868,9 @@ OBJS += ../src/ap/ieee802_11_ht.o
|
|||
ifdef CONFIG_IEEE80211AC
|
||||
OBJS += ../src/ap/ieee802_11_vht.o
|
||||
endif
|
||||
ifdef CONFIG_IEEE80211AX
|
||||
OBJS += ../src/ap/ieee802_11_he.o
|
||||
endif
|
||||
endif
|
||||
ifdef CONFIG_WNM
|
||||
OBJS += ../src/ap/wnm_ap.o
|
||||
|
|
Loading…
Reference in a new issue