1/* 2 * hostapd / IEEE 802.11ax HE 3 * Copyright (c) 2016-2017, Qualcomm Atheros, Inc. 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9#include "utils/includes.h" 10 11#include "utils/common.h" 12#include "common/ieee802_11_defs.h" 13#include "common/qca-vendor.h" 14#include "hostapd.h" 15#include "ap_config.h" 16#include "beacon.h" 17#include "ieee802_11.h" 18#include "dfs.h" 19 20u8 * hostapd_eid_vendor_he_capab(struct hostapd_data *hapd, u8 *eid) 21{ 22 struct ieee80211_he_capabilities *cap; 23 u8 *pos = eid; 24 25 if (!hapd->iface->current_mode) 26 return eid; 27 28 /* For now, use a vendor specific element since the P802.11ax draft is 29 * still subject to changes and the contents of this element may change. 30 * This can be replaced with the actual element once P802.11ax is 31 * finalized. */ 32 /* Vendor HE Capabilities element */ 33 *pos++ = WLAN_EID_VENDOR_SPECIFIC; 34 *pos++ = 4 /* The Vendor OUI, subtype */ + 35 sizeof(struct ieee80211_he_capabilities); 36 37 WPA_PUT_BE32(pos, (OUI_QCA << 8) | QCA_VENDOR_ELEM_HE_CAPAB); 38 pos += 4; 39 cap = (struct ieee80211_he_capabilities *) pos; 40 os_memset(cap, 0, sizeof(*cap)); 41 42 if (hapd->iface->conf->he_phy_capab.he_su_beamformer) 43 cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMER_CAPAB_IDX] |= 44 HE_PHYCAP_SU_BEAMFORMER_CAPAB; 45 46 if (hapd->iface->conf->he_phy_capab.he_su_beamformee) 47 cap->he_phy_capab_info[HE_PHYCAP_SU_BEAMFORMEE_CAPAB_IDX] |= 48 HE_PHYCAP_SU_BEAMFORMEE_CAPAB; 49 50 if (hapd->iface->conf->he_phy_capab.he_mu_beamformer) 51 cap->he_phy_capab_info[HE_PHYCAP_MU_BEAMFORMER_CAPAB_IDX] |= 52 HE_PHYCAP_MU_BEAMFORMER_CAPAB; 53 54 pos += sizeof(*cap); 55 56 return pos; 57} 58 59 60u8 * hostapd_eid_vendor_he_operation(struct hostapd_data *hapd, u8 *eid) 61{ 62 struct ieee80211_he_operation *oper; 63 u8 *pos = eid; 64 65 if (!hapd->iface->current_mode) 66 return eid; 67 68 /* For now, use a vendor specific element since the P802.11ax draft is 69 * still subject to changes and the contents of this element may change. 70 * This can be replaced with the actual element once P802.11ax is 71 * finalized. */ 72 /* Vendor HE Operation element */ 73 *pos++ = WLAN_EID_VENDOR_SPECIFIC; 74 *pos++ = 4 /* The Vendor OUI, subtype */ + 75 sizeof(struct ieee80211_he_operation); 76 77 WPA_PUT_BE32(pos, (OUI_QCA << 8) | QCA_VENDOR_ELEM_HE_OPER); 78 pos += 4; 79 oper = (struct ieee80211_he_operation *) pos; 80 os_memset(oper, 0, sizeof(*oper)); 81 82 if (hapd->iface->conf->he_op.he_bss_color) 83 oper->he_oper_params |= hapd->iface->conf->he_op.he_bss_color; 84 85 if (hapd->iface->conf->he_op.he_default_pe_duration) 86 oper->he_oper_params |= 87 (hapd->iface->conf->he_op.he_default_pe_duration << 88 HE_OPERATION_DFLT_PE_DURATION_OFFSET); 89 90 if (hapd->iface->conf->he_op.he_twt_required) 91 oper->he_oper_params |= HE_OPERATION_TWT_REQUIRED; 92 93 if (hapd->iface->conf->he_op.he_rts_threshold) 94 oper->he_oper_params |= 95 (hapd->iface->conf->he_op.he_rts_threshold << 96 HE_OPERATION_RTS_THRESHOLD_OFFSET); 97 98 pos += sizeof(*oper); 99 100 return pos; 101} 102