• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
hostapd_eid_vendor_he_capab(struct hostapd_data * hapd,u8 * eid)20 u8 * 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 
hostapd_eid_vendor_he_operation(struct hostapd_data * hapd,u8 * eid)60 u8 * 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