xref: /wlan-driver/qcacld-3.0/core/hdd/src/wlan_hdd_assoc.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  *  DOC: wlan_hdd_assoc.c
22*5113495bSYour Name  *
23*5113495bSYour Name  *  WLAN Host Device Driver implementation
24*5113495bSYour Name  *
25*5113495bSYour Name  */
26*5113495bSYour Name 
27*5113495bSYour Name #include "wlan_hdd_includes.h"
28*5113495bSYour Name #include <ani_global.h>
29*5113495bSYour Name #include "dot11f.h"
30*5113495bSYour Name #include "wlan_hdd_power.h"
31*5113495bSYour Name #include "wlan_hdd_trace.h"
32*5113495bSYour Name #include <linux/ieee80211.h>
33*5113495bSYour Name #include <linux/wireless.h>
34*5113495bSYour Name #include <linux/etherdevice.h>
35*5113495bSYour Name #include <net/cfg80211.h>
36*5113495bSYour Name #include "wlan_hdd_cfg80211.h"
37*5113495bSYour Name #include "csr_inside_api.h"
38*5113495bSYour Name #include "wlan_hdd_p2p.h"
39*5113495bSYour Name #include "wlan_hdd_tdls.h"
40*5113495bSYour Name #include "sme_api.h"
41*5113495bSYour Name #include "wlan_hdd_hostapd.h"
42*5113495bSYour Name #include <wlan_hdd_green_ap.h>
43*5113495bSYour Name #include <wlan_hdd_ipa.h>
44*5113495bSYour Name #include "wlan_hdd_lpass.h"
45*5113495bSYour Name #include <wlan_logging_sock_svc.h>
46*5113495bSYour Name #include <cds_sched.h>
47*5113495bSYour Name #include "wlan_policy_mgr_api.h"
48*5113495bSYour Name #include <cds_utils.h>
49*5113495bSYour Name #include "sme_power_save_api.h"
50*5113495bSYour Name #include "wlan_hdd_napi.h"
51*5113495bSYour Name #include <cdp_txrx_cmn.h>
52*5113495bSYour Name #include <cdp_txrx_flow_ctrl_legacy.h>
53*5113495bSYour Name #include <cdp_txrx_peer_ops.h>
54*5113495bSYour Name #include <cdp_txrx_misc.h>
55*5113495bSYour Name #include <cdp_txrx_ctrl.h>
56*5113495bSYour Name #include "ol_txrx.h"
57*5113495bSYour Name #include <wlan_logging_sock_svc.h>
58*5113495bSYour Name #include <wlan_hdd_object_manager.h>
59*5113495bSYour Name #include <cdp_txrx_handle.h>
60*5113495bSYour Name #include "wlan_pmo_ucfg_api.h"
61*5113495bSYour Name #include "wlan_hdd_tsf.h"
62*5113495bSYour Name #include "wlan_utility.h"
63*5113495bSYour Name #include "wlan_p2p_ucfg_api.h"
64*5113495bSYour Name #include "wlan_ipa_ucfg_api.h"
65*5113495bSYour Name #include "wlan_hdd_stats.h"
66*5113495bSYour Name #include "wlan_hdd_scan.h"
67*5113495bSYour Name #include "wlan_crypto_global_api.h"
68*5113495bSYour Name #include "wlan_hdd_bcn_recv.h"
69*5113495bSYour Name #include "wlan_mlme_twt_ucfg_api.h"
70*5113495bSYour Name 
71*5113495bSYour Name #include <wlan_cfg80211_crypto.h>
72*5113495bSYour Name #include <wlan_crypto_global_api.h>
73*5113495bSYour Name #include "wlan_dlm_ucfg_api.h"
74*5113495bSYour Name #include "wlan_hdd_sta_info.h"
75*5113495bSYour Name #include "wlan_hdd_ftm_time_sync.h"
76*5113495bSYour Name #include "wlan_cm_roam_api.h"
77*5113495bSYour Name 
78*5113495bSYour Name #include <ol_defines.h>
79*5113495bSYour Name #include "wlan_pkt_capture_ucfg_api.h"
80*5113495bSYour Name #include "wlan_if_mgr_ucfg_api.h"
81*5113495bSYour Name #include "wlan_if_mgr_public_struct.h"
82*5113495bSYour Name #include "wlan_cm_public_struct.h"
83*5113495bSYour Name #include "osif_cm_util.h"
84*5113495bSYour Name #include "wlan_hdd_cm_api.h"
85*5113495bSYour Name #include "cm_utf.h"
86*5113495bSYour Name 
87*5113495bSYour Name #include "wlan_hdd_bootup_marker.h"
88*5113495bSYour Name #include "wlan_roam_debug.h"
89*5113495bSYour Name 
90*5113495bSYour Name #include "wlan_hdd_twt.h"
91*5113495bSYour Name #include "wlan_cm_roam_ucfg_api.h"
92*5113495bSYour Name #include "wlan_hdd_son.h"
93*5113495bSYour Name #include "wlan_dp_ucfg_api.h"
94*5113495bSYour Name #include "wlan_cm_ucfg_api.h"
95*5113495bSYour Name 
96*5113495bSYour Name /* These are needed to recognize WPA and RSN suite types */
97*5113495bSYour Name #define HDD_WPA_OUI_SIZE 4
98*5113495bSYour Name #define HDD_RSN_OUI_SIZE 4
99*5113495bSYour Name uint8_t ccp_wpa_oui00[HDD_WPA_OUI_SIZE] = { 0x00, 0x50, 0xf2, 0x00 };
100*5113495bSYour Name uint8_t ccp_wpa_oui01[HDD_WPA_OUI_SIZE] = { 0x00, 0x50, 0xf2, 0x01 };
101*5113495bSYour Name uint8_t ccp_wpa_oui02[HDD_WPA_OUI_SIZE] = { 0x00, 0x50, 0xf2, 0x02 };
102*5113495bSYour Name uint8_t ccp_wpa_oui03[HDD_WPA_OUI_SIZE] = { 0x00, 0x50, 0xf2, 0x03 };
103*5113495bSYour Name uint8_t ccp_wpa_oui04[HDD_WPA_OUI_SIZE] = { 0x00, 0x50, 0xf2, 0x04 };
104*5113495bSYour Name uint8_t ccp_wpa_oui05[HDD_WPA_OUI_SIZE] = { 0x00, 0x50, 0xf2, 0x05 };
105*5113495bSYour Name 
106*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
107*5113495bSYour Name /* CCKM */
108*5113495bSYour Name uint8_t ccp_wpa_oui06[HDD_WPA_OUI_SIZE] = { 0x00, 0x40, 0x96, 0x00 };
109*5113495bSYour Name /* CCKM */
110*5113495bSYour Name uint8_t ccp_rsn_oui06[HDD_RSN_OUI_SIZE] = { 0x00, 0x40, 0x96, 0x00 };
111*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
112*5113495bSYour Name 
113*5113495bSYour Name /* group cipher */
114*5113495bSYour Name uint8_t ccp_rsn_oui00[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x00 };
115*5113495bSYour Name 
116*5113495bSYour Name /* WEP-40 or RSN */
117*5113495bSYour Name uint8_t ccp_rsn_oui01[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x01 };
118*5113495bSYour Name 
119*5113495bSYour Name /* TKIP or RSN-PSK */
120*5113495bSYour Name uint8_t ccp_rsn_oui02[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x02 };
121*5113495bSYour Name 
122*5113495bSYour Name /* Reserved */
123*5113495bSYour Name uint8_t ccp_rsn_oui03[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x03 };
124*5113495bSYour Name 
125*5113495bSYour Name /* AES-CCMP */
126*5113495bSYour Name uint8_t ccp_rsn_oui04[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x04 };
127*5113495bSYour Name 
128*5113495bSYour Name /* WEP-104 */
129*5113495bSYour Name uint8_t ccp_rsn_oui05[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x05 };
130*5113495bSYour Name 
131*5113495bSYour Name /* RSN-PSK-SHA256 */
132*5113495bSYour Name uint8_t ccp_rsn_oui07[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x06 };
133*5113495bSYour Name 
134*5113495bSYour Name /* RSN-8021X-SHA256 */
135*5113495bSYour Name uint8_t ccp_rsn_oui08[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x05 };
136*5113495bSYour Name 
137*5113495bSYour Name /* AES-GCMP-128 */
138*5113495bSYour Name uint8_t ccp_rsn_oui09[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x08 };
139*5113495bSYour Name 
140*5113495bSYour Name /* AES-GCMP-256 */
141*5113495bSYour Name uint8_t ccp_rsn_oui0a[HDD_RSN_OUI_SIZE] = { 0x00, 0x0F, 0xAC, 0x09 };
142*5113495bSYour Name #ifdef WLAN_FEATURE_FILS_SK
143*5113495bSYour Name uint8_t ccp_rsn_oui_0e[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0E};
144*5113495bSYour Name uint8_t ccp_rsn_oui_0f[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0F};
145*5113495bSYour Name uint8_t ccp_rsn_oui_10[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x10};
146*5113495bSYour Name uint8_t ccp_rsn_oui_11[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x11};
147*5113495bSYour Name #endif
148*5113495bSYour Name uint8_t ccp_rsn_oui_12[HDD_RSN_OUI_SIZE] = {0x50, 0x6F, 0x9A, 0x02};
149*5113495bSYour Name uint8_t ccp_rsn_oui_0b[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0B};
150*5113495bSYour Name uint8_t ccp_rsn_oui_0c[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0C};
151*5113495bSYour Name /* FT-SUITE-B AKM */
152*5113495bSYour Name uint8_t ccp_rsn_oui_0d[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x0D};
153*5113495bSYour Name 
154*5113495bSYour Name /* OWE https://tools.ietf.org/html/rfc8110 */
155*5113495bSYour Name uint8_t ccp_rsn_oui_18[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x12};
156*5113495bSYour Name 
157*5113495bSYour Name #ifdef WLAN_FEATURE_SAE
158*5113495bSYour Name /* SAE AKM */
159*5113495bSYour Name uint8_t ccp_rsn_oui_80[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x08};
160*5113495bSYour Name /* FT SAE AKM */
161*5113495bSYour Name uint8_t ccp_rsn_oui_90[HDD_RSN_OUI_SIZE] = {0x00, 0x0F, 0xAC, 0x09};
162*5113495bSYour Name #endif
163*5113495bSYour Name static const
164*5113495bSYour Name u8 ccp_rsn_oui_13[HDD_RSN_OUI_SIZE] = {0x50, 0x6F, 0x9A, 0x01};
165*5113495bSYour Name 
166*5113495bSYour Name #ifdef FEATURE_WLAN_WAPI
167*5113495bSYour Name #define HDD_WAPI_OUI_SIZE 4
168*5113495bSYour Name /* WPI-SMS4 */
169*5113495bSYour Name uint8_t ccp_wapi_oui01[HDD_WAPI_OUI_SIZE] = { 0x00, 0x14, 0x72, 0x01 };
170*5113495bSYour Name /* WAI-PSK */
171*5113495bSYour Name uint8_t ccp_wapi_oui02[HDD_WAPI_OUI_SIZE] = { 0x00, 0x14, 0x72, 0x02 };
172*5113495bSYour Name #endif  /* FEATURE_WLAN_WAPI */
173*5113495bSYour Name 
174*5113495bSYour Name /* Offset where the EID-Len-IE, start. */
175*5113495bSYour Name #define ASSOC_RSP_IES_OFFSET 6  /* Capability(2) + AID(2) + Status Code(2) */
176*5113495bSYour Name #define ASSOC_REQ_IES_OFFSET 4  /* Capability(2) + LI(2) */
177*5113495bSYour Name 
178*5113495bSYour Name /*
179*5113495bSYour Name  * beacon_filter_table - table of IEs used for beacon filtering
180*5113495bSYour Name  */
181*5113495bSYour Name static const int beacon_filter_table[] = {
182*5113495bSYour Name 	WLAN_ELEMID_DSPARMS,
183*5113495bSYour Name 	WLAN_ELEMID_ERP,
184*5113495bSYour Name 	WLAN_ELEMID_EDCAPARMS,
185*5113495bSYour Name 	WLAN_ELEMID_QOS_CAPABILITY,
186*5113495bSYour Name 	WLAN_ELEMID_HTINFO_ANA,
187*5113495bSYour Name 	WLAN_ELEMID_OP_MODE_NOTIFY,
188*5113495bSYour Name 	WLAN_ELEMID_VHTOP,
189*5113495bSYour Name 	WLAN_ELEMID_QUIET_CHANNEL,
190*5113495bSYour Name 	WLAN_ELEMID_TWT,
191*5113495bSYour Name #ifdef WLAN_FEATURE_11AX_BSS_COLOR
192*5113495bSYour Name 	/*
193*5113495bSYour Name 	 * EID: 221 vendor IE is being used temporarily by 11AX
194*5113495bSYour Name 	 * bss-color-change IE till it gets any fixed number. This
195*5113495bSYour Name 	 * vendor EID needs to be replaced with bss-color-change IE
196*5113495bSYour Name 	 * number.
197*5113495bSYour Name 	 */
198*5113495bSYour Name 	WLAN_ELEMID_VENDOR,
199*5113495bSYour Name #endif
200*5113495bSYour Name };
201*5113495bSYour Name 
202*5113495bSYour Name /*
203*5113495bSYour Name  * beacon_filter_extn_table - table of extn IEs used for beacon filtering
204*5113495bSYour Name  */
205*5113495bSYour Name static const int beacon_filter_extn_table[] = {
206*5113495bSYour Name 	WLAN_EXTN_ELEMID_HEOP,
207*5113495bSYour Name 	WLAN_EXTN_ELEMID_UORA,
208*5113495bSYour Name 	WLAN_EXTN_ELEMID_MUEDCA,
209*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
210*5113495bSYour Name 	WLAN_EXTN_ELEMID_EHTOP,
211*5113495bSYour Name #endif
212*5113495bSYour Name };
213*5113495bSYour Name 
214*5113495bSYour Name /* HE operation BIT positins */
215*5113495bSYour Name #if defined(WLAN_FEATURE_11AX)
216*5113495bSYour Name #define HE_OPERATION_DFLT_PE_DURATION_POS 0
217*5113495bSYour Name #define HE_OPERATION_TWT_REQUIRED_POS 3
218*5113495bSYour Name #define HE_OPERATION_RTS_THRESHOLD_POS 4
219*5113495bSYour Name #define HE_OPERATION_VHT_OPER_POS 14
220*5113495bSYour Name #define HE_OPERATION_CO_LOCATED_BSS_POS 15
221*5113495bSYour Name #define HE_OPERATION_ER_SU_DISABLE_POS 16
222*5113495bSYour Name #define HE_OPERATION_OPER_INFO_6G_POS 17
223*5113495bSYour Name #define HE_OPERATION_RESERVED_POS 18
224*5113495bSYour Name #define HE_OPERATION_BSS_COLOR_POS 24
225*5113495bSYour Name #define HE_OPERATION_PARTIAL_BSS_COLOR_POS 30
226*5113495bSYour Name #define HE_OPERATION_BSS_COL_DISABLED_POS 31
227*5113495bSYour Name #endif
228*5113495bSYour Name 
229*5113495bSYour Name /* EHT operation BIT positins */
230*5113495bSYour Name #if defined(WLAN_FEATURE_11BE)
231*5113495bSYour Name #define EHT_OPER_BASIC_RX_NSS_MCS_0_TO_7_POS 0
232*5113495bSYour Name #define EHT_OPER_BASIC_TX_NSS_MCS_0_TO_7_POS 4
233*5113495bSYour Name #define EHT_OPER_BASIC_RX_NSS_MCS_8_AND_9_POS 8
234*5113495bSYour Name #define EHT_OPER_BASIC_TX_NSS_MCS_8_AND_9_POS 12
235*5113495bSYour Name #define EHT_OPER_BASIC_RX_NSS_MCS_10_AND_11_POS 16
236*5113495bSYour Name #define EHT_OPER_BASIC_TX_NSS_MCS_10_AND_11_POS 20
237*5113495bSYour Name #define EHT_OPER_BASIC_RX_NSS_MCS_12_AND_13_POS 24
238*5113495bSYour Name #define EHT_OPER_BASIC_TX_NSS_MCS_12_AND_13_POS 28
239*5113495bSYour Name #endif
240*5113495bSYour Name 
241*5113495bSYour Name #if defined(WLAN_FEATURE_SAE) && \
242*5113495bSYour Name 		(defined(CFG80211_EXTERNAL_AUTH_SUPPORT) || \
243*5113495bSYour Name 		LINUX_VERSION_CODE >= KERNEL_VERSION(4, 17, 0))
244*5113495bSYour Name #if defined (CFG80211_SAE_AUTH_TA_ADDR_SUPPORT)
245*5113495bSYour Name /**
246*5113495bSYour Name  * wlan_hdd_sae_copy_ta_addr() - Send TA address to supplicant
247*5113495bSYour Name  * @params: pointer to external auth params
248*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
249*5113495bSYour Name  *
250*5113495bSYour Name  * This API is used to copy TA address info in supplicant structure.
251*5113495bSYour Name  *
252*5113495bSYour Name  * Return: None
253*5113495bSYour Name  */
254*5113495bSYour Name static inline
wlan_hdd_sae_copy_ta_addr(struct cfg80211_external_auth_params * params,struct wlan_hdd_link_info * link_info)255*5113495bSYour Name void wlan_hdd_sae_copy_ta_addr(struct cfg80211_external_auth_params *params,
256*5113495bSYour Name 			       struct wlan_hdd_link_info *link_info)
257*5113495bSYour Name {
258*5113495bSYour Name 	struct qdf_mac_addr ta = QDF_MAC_ADDR_ZERO_INIT;
259*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
260*5113495bSYour Name 	uint8_t *link_addr;
261*5113495bSYour Name 
262*5113495bSYour Name 	status = ucfg_cm_get_sae_auth_ta(link_info->adapter->hdd_ctx->pdev,
263*5113495bSYour Name 					 link_info->vdev_id,
264*5113495bSYour Name 					 &ta);
265*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status))
266*5113495bSYour Name 		qdf_ether_addr_copy(params->tx_addr, ta.bytes);
267*5113495bSYour Name 	else if (wlan_vdev_mlme_is_mlo_vdev(link_info->vdev)) {
268*5113495bSYour Name 		link_addr = wlan_vdev_mlme_get_linkaddr(link_info->vdev);
269*5113495bSYour Name 		qdf_ether_addr_copy(params->tx_addr, link_addr);
270*5113495bSYour Name 	}
271*5113495bSYour Name 
272*5113495bSYour Name 	hdd_debug("status:%d ta:" QDF_MAC_ADDR_FMT, status,
273*5113495bSYour Name 		  QDF_MAC_ADDR_REF(params->tx_addr));
274*5113495bSYour Name 
275*5113495bSYour Name }
276*5113495bSYour Name #else
277*5113495bSYour Name static inline
wlan_hdd_sae_copy_ta_addr(struct cfg80211_external_auth_params * params,struct wlan_hdd_link_info * link_info)278*5113495bSYour Name void wlan_hdd_sae_copy_ta_addr(struct cfg80211_external_auth_params *params,
279*5113495bSYour Name 			       struct wlan_hdd_link_info *link_info)
280*5113495bSYour Name {
281*5113495bSYour Name }
282*5113495bSYour Name #endif
283*5113495bSYour Name 
284*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_EXTERNAL_AUTH_MLO_SUPPORT)
285*5113495bSYour Name /**
286*5113495bSYour Name  * wlan_hdd_sae_update_mld_addr() - Send mld address to supplicant
287*5113495bSYour Name  * @params: pointer to external auth params
288*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
289*5113495bSYour Name  *
290*5113495bSYour Name  * This API is used to copy MLD address info in supplicant structure.
291*5113495bSYour Name  *
292*5113495bSYour Name  * Return: QDF_STATUS
293*5113495bSYour Name  */
294*5113495bSYour Name static inline QDF_STATUS
wlan_hdd_sae_update_mld_addr(struct cfg80211_external_auth_params * params,struct wlan_hdd_link_info * link_info)295*5113495bSYour Name wlan_hdd_sae_update_mld_addr(struct cfg80211_external_auth_params *params,
296*5113495bSYour Name 			     struct wlan_hdd_link_info *link_info)
297*5113495bSYour Name {
298*5113495bSYour Name 	struct qdf_mac_addr mld_addr;
299*5113495bSYour Name 	struct qdf_mac_addr *mld_roaming_addr;
300*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
301*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
302*5113495bSYour Name 
303*5113495bSYour Name 	if (!link_info->vdev)
304*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
305*5113495bSYour Name 
306*5113495bSYour Name 	vdev = link_info->vdev;
307*5113495bSYour Name 	wlan_objmgr_vdev_get_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
308*5113495bSYour Name 
309*5113495bSYour Name 	if (!ucfg_cm_is_sae_auth_addr_conversion_required(vdev))
310*5113495bSYour Name 		goto end;
311*5113495bSYour Name 
312*5113495bSYour Name 	if (ucfg_cm_is_vdev_roaming(vdev)) {
313*5113495bSYour Name 		/*
314*5113495bSYour Name 		 * while roaming, peer is not created yet till authentication
315*5113495bSYour Name 		 * So retrieving the MLD address which is cached from the
316*5113495bSYour Name 		 * scan entry.
317*5113495bSYour Name 		 */
318*5113495bSYour Name 		mld_roaming_addr = ucfg_cm_roaming_get_peer_mld_addr(vdev);
319*5113495bSYour Name 		if (!mld_roaming_addr) {
320*5113495bSYour Name 			status = QDF_STATUS_E_INVAL;
321*5113495bSYour Name 			goto end;
322*5113495bSYour Name 		}
323*5113495bSYour Name 		mld_addr = *mld_roaming_addr;
324*5113495bSYour Name 	} else {
325*5113495bSYour Name 		status = wlan_vdev_get_bss_peer_mld_mac(vdev, &mld_addr);
326*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
327*5113495bSYour Name 			status = QDF_STATUS_E_INVAL;
328*5113495bSYour Name 			goto end;
329*5113495bSYour Name 		}
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	qdf_mem_copy(params->mld_addr, mld_addr.bytes, QDF_MAC_ADDR_SIZE);
333*5113495bSYour Name 	hdd_debug("Sending MLD:" QDF_MAC_ADDR_FMT" to userspace",
334*5113495bSYour Name 		  QDF_MAC_ADDR_REF(mld_addr.bytes));
335*5113495bSYour Name 
336*5113495bSYour Name end:
337*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
338*5113495bSYour Name 	return status;
339*5113495bSYour Name }
340*5113495bSYour Name #else
341*5113495bSYour Name static inline QDF_STATUS
wlan_hdd_sae_update_mld_addr(struct cfg80211_external_auth_params * params,struct wlan_hdd_link_info * link_info)342*5113495bSYour Name wlan_hdd_sae_update_mld_addr(struct cfg80211_external_auth_params *params,
343*5113495bSYour Name 			     struct wlan_hdd_link_info *link_info)
344*5113495bSYour Name {
345*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
346*5113495bSYour Name }
347*5113495bSYour Name #endif
348*5113495bSYour Name 
349*5113495bSYour Name /**
350*5113495bSYour Name  * wlan_hdd_get_keymgmt_for_sae_akm() - Get the keymgmt OUI
351*5113495bSYour Name  * corresponding to the SAE AKM type
352*5113495bSYour Name  * @akm: AKM type
353*5113495bSYour Name  *
354*5113495bSYour Name  * This API is used to get the keymgmt OUI for the SAE AKM type.
355*5113495bSYour Name  * Return: keymgmt OUI
356*5113495bSYour Name  */
357*5113495bSYour Name static uint32_t
wlan_hdd_get_keymgmt_for_sae_akm(uint32_t akm)358*5113495bSYour Name wlan_hdd_get_keymgmt_for_sae_akm(uint32_t akm)
359*5113495bSYour Name {
360*5113495bSYour Name 	if (akm == WLAN_AKM_SAE)
361*5113495bSYour Name 		return WLAN_AKM_SUITE_SAE;
362*5113495bSYour Name 	else if (akm == WLAN_AKM_FT_SAE)
363*5113495bSYour Name 		return WLAN_AKM_SUITE_FT_OVER_SAE;
364*5113495bSYour Name 	else if (akm == WLAN_AKM_SAE_EXT_KEY)
365*5113495bSYour Name 		return WLAN_AKM_SUITE_SAE_EXT_KEY;
366*5113495bSYour Name 	else if (akm == WLAN_AKM_FT_SAE_EXT_KEY)
367*5113495bSYour Name 		return WLAN_AKM_SUITE_FT_SAE_EXT_KEY;
368*5113495bSYour Name 	/**
369*5113495bSYour Name 	 * Legacy FW doesn't support SAE-EXK-KEY or
370*5113495bSYour Name 	 * Cross-SAE_AKM roaming. In such cases, send
371*5113495bSYour Name 	 * SAE for both SAE and FT-SAE AKMs. The supplicant
372*5113495bSYour Name 	 * has backward compatibility to handle this case.
373*5113495bSYour Name 	 */
374*5113495bSYour Name 	else
375*5113495bSYour Name 		return WLAN_AKM_SUITE_SAE;
376*5113495bSYour Name }
377*5113495bSYour Name 
378*5113495bSYour Name /**
379*5113495bSYour Name  * wlan_hdd_sae_callback() - Sends SAE info to supplicant
380*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
381*5113495bSYour Name  * @roam_info: pointer to roam info
382*5113495bSYour Name  *
383*5113495bSYour Name  * This API is used to send required SAE info to trigger SAE in supplicant.
384*5113495bSYour Name  *
385*5113495bSYour Name  * Return: None
386*5113495bSYour Name  */
wlan_hdd_sae_callback(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roam_info)387*5113495bSYour Name static void wlan_hdd_sae_callback(struct wlan_hdd_link_info *link_info,
388*5113495bSYour Name 				  struct csr_roam_info *roam_info)
389*5113495bSYour Name {
390*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
391*5113495bSYour Name 	struct hdd_context *hdd_ctx = adapter->hdd_ctx;
392*5113495bSYour Name 	int flags;
393*5113495bSYour Name 	struct sir_sae_info *sae_info = roam_info->sae_info;
394*5113495bSYour Name 	struct cfg80211_external_auth_params params = {0};
395*5113495bSYour Name 	QDF_STATUS status;
396*5113495bSYour Name 
397*5113495bSYour Name 	if (wlan_hdd_validate_context(hdd_ctx))
398*5113495bSYour Name 		return;
399*5113495bSYour Name 
400*5113495bSYour Name 	if (!sae_info) {
401*5113495bSYour Name 		hdd_err("SAE info in NULL");
402*5113495bSYour Name 		return;
403*5113495bSYour Name 	}
404*5113495bSYour Name 
405*5113495bSYour Name 	flags = cds_get_gfp_flags();
406*5113495bSYour Name 
407*5113495bSYour Name 	params.key_mgmt_suite =
408*5113495bSYour Name 		wlan_hdd_get_keymgmt_for_sae_akm(sae_info->akm);
409*5113495bSYour Name 
410*5113495bSYour Name 	params.action = NL80211_EXTERNAL_AUTH_START;
411*5113495bSYour Name 	qdf_ether_addr_copy(params.bssid, sae_info->peer_mac_addr.bytes);
412*5113495bSYour Name 	wlan_hdd_sae_copy_ta_addr(&params, link_info);
413*5113495bSYour Name 	status = wlan_hdd_sae_update_mld_addr(&params, link_info);
414*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
415*5113495bSYour Name 		return;
416*5113495bSYour Name 
417*5113495bSYour Name 	qdf_mem_copy(params.ssid.ssid, sae_info->ssid.ssId,
418*5113495bSYour Name 		     sae_info->ssid.length);
419*5113495bSYour Name 	params.ssid.ssid_len = sae_info->ssid.length;
420*5113495bSYour Name 	cfg80211_external_auth_request(adapter->dev, &params, flags);
421*5113495bSYour Name 	hdd_debug("SAE: sent cmd");
422*5113495bSYour Name }
423*5113495bSYour Name #else
wlan_hdd_sae_callback(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roam_info)424*5113495bSYour Name static inline void wlan_hdd_sae_callback(struct wlan_hdd_link_info *link_info,
425*5113495bSYour Name 					 struct csr_roam_info *roam_info)
426*5113495bSYour Name { }
427*5113495bSYour Name #endif
428*5113495bSYour Name 
429*5113495bSYour Name /**
430*5113495bSYour Name  * hdd_start_powersave_timer_on_associated() - Start auto powersave timer
431*5113495bSYour Name  *  after associated
432*5113495bSYour Name  *  @link_info: Link info pointer in HDD adapter
433*5113495bSYour Name  *
434*5113495bSYour Name  * This function will start auto powersave timer for STA/P2P Client.
435*5113495bSYour Name  *
436*5113495bSYour Name  * Return: none
437*5113495bSYour Name  */
438*5113495bSYour Name static void
hdd_start_powersave_timer_on_associated(struct wlan_hdd_link_info * link_info)439*5113495bSYour Name hdd_start_powersave_timer_on_associated(struct wlan_hdd_link_info *link_info)
440*5113495bSYour Name {
441*5113495bSYour Name 	uint32_t timeout;
442*5113495bSYour Name 	uint32_t auto_bmps_timer_val;
443*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
444*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
445*5113495bSYour Name 
446*5113495bSYour Name 	if (adapter->device_mode != QDF_STA_MODE &&
447*5113495bSYour Name 	    adapter->device_mode != QDF_P2P_CLIENT_MODE)
448*5113495bSYour Name 		return;
449*5113495bSYour Name 
450*5113495bSYour Name 	ucfg_mlme_get_auto_bmps_timer_value(hdd_ctx->psoc,
451*5113495bSYour Name 					    &auto_bmps_timer_val);
452*5113495bSYour Name 	timeout = hdd_cm_is_vdev_roaming(link_info) ?
453*5113495bSYour Name 		AUTO_PS_ENTRY_TIMER_DEFAULT_VALUE :
454*5113495bSYour Name 		(auto_bmps_timer_val * 1000);
455*5113495bSYour Name 	sme_ps_enable_auto_ps_timer(hdd_ctx->mac_handle,
456*5113495bSYour Name 				    link_info->vdev_id,
457*5113495bSYour Name 				    timeout);
458*5113495bSYour Name }
459*5113495bSYour Name 
hdd_conn_set_authenticated(struct wlan_hdd_link_info * link_info,uint8_t auth_state)460*5113495bSYour Name void hdd_conn_set_authenticated(struct wlan_hdd_link_info *link_info,
461*5113495bSYour Name 				uint8_t auth_state)
462*5113495bSYour Name {
463*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
464*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
465*5113495bSYour Name 	char *auth_time;
466*5113495bSYour Name 	uint32_t time_buffer_size;
467*5113495bSYour Name 
468*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
469*5113495bSYour Name 	/* save the new connection state */
470*5113495bSYour Name 	hdd_debug("Authenticated state Changed from oldState:%d to State:%d",
471*5113495bSYour Name 		  sta_ctx->conn_info.is_authenticated, auth_state);
472*5113495bSYour Name 	sta_ctx->conn_info.is_authenticated = auth_state;
473*5113495bSYour Name 
474*5113495bSYour Name 	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_DP_ID);
475*5113495bSYour Name 	if (vdev) {
476*5113495bSYour Name 		ucfg_dp_conn_info_set_peer_authenticate(vdev, auth_state);
477*5113495bSYour Name 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
478*5113495bSYour Name 	}
479*5113495bSYour Name 
480*5113495bSYour Name 	auth_time = sta_ctx->conn_info.auth_time;
481*5113495bSYour Name 	time_buffer_size = sizeof(sta_ctx->conn_info.auth_time);
482*5113495bSYour Name 
483*5113495bSYour Name 	if (auth_state)
484*5113495bSYour Name 		qdf_get_time_of_the_day_in_hr_min_sec_usec(auth_time,
485*5113495bSYour Name 							   time_buffer_size);
486*5113495bSYour Name 	else
487*5113495bSYour Name 		qdf_mem_zero(auth_time, time_buffer_size);
488*5113495bSYour Name 	if (auth_state &&
489*5113495bSYour Name 	    (sta_ctx->conn_info.ptk_installed ||
490*5113495bSYour Name 	     sta_ctx->conn_info.uc_encrypt_type == eCSR_ENCRYPT_TYPE_NONE))
491*5113495bSYour Name 		hdd_start_powersave_timer_on_associated(link_info);
492*5113495bSYour Name }
493*5113495bSYour Name 
hdd_conn_set_connection_state(struct hdd_adapter * adapter,eConnectionState conn_state)494*5113495bSYour Name void hdd_conn_set_connection_state(struct hdd_adapter *adapter,
495*5113495bSYour Name 				   eConnectionState conn_state)
496*5113495bSYour Name {
497*5113495bSYour Name 	struct hdd_station_ctx *hdd_sta_ctx =
498*5113495bSYour Name 		WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink);
499*5113495bSYour Name 
500*5113495bSYour Name 	/* save the new connection state */
501*5113495bSYour Name 	if (conn_state == hdd_sta_ctx->conn_info.conn_state)
502*5113495bSYour Name 		return;
503*5113495bSYour Name 
504*5113495bSYour Name 	hdd_nofl_debug("connection state changed %d --> %d for dev %s (vdev %d)",
505*5113495bSYour Name 		       hdd_sta_ctx->conn_info.conn_state, conn_state,
506*5113495bSYour Name 		       adapter->dev->name, adapter->deflink->vdev_id);
507*5113495bSYour Name 
508*5113495bSYour Name 	hdd_sta_ctx->conn_info.conn_state = conn_state;
509*5113495bSYour Name }
510*5113495bSYour Name 
hdd_conn_get_connected_band(struct wlan_hdd_link_info * link_info)511*5113495bSYour Name enum band_info hdd_conn_get_connected_band(struct wlan_hdd_link_info *link_info)
512*5113495bSYour Name {
513*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
514*5113495bSYour Name 	uint32_t sta_freq = 0;
515*5113495bSYour Name 
516*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
517*5113495bSYour Name 	if (hdd_cm_is_vdev_associated(link_info))
518*5113495bSYour Name 		sta_freq = sta_ctx->conn_info.chan_freq;
519*5113495bSYour Name 
520*5113495bSYour Name 	if (wlan_reg_is_24ghz_ch_freq(sta_freq))
521*5113495bSYour Name 		return BAND_2G;
522*5113495bSYour Name 	else if (wlan_reg_is_5ghz_ch_freq(sta_freq) ||
523*5113495bSYour Name 		 wlan_reg_is_6ghz_chan_freq(sta_freq))
524*5113495bSYour Name 		return BAND_5G;
525*5113495bSYour Name 	else   /* If station is not connected return as BAND_ALL */
526*5113495bSYour Name 		return BAND_ALL;
527*5113495bSYour Name }
528*5113495bSYour Name 
529*5113495bSYour Name /**
530*5113495bSYour Name  * hdd_conn_get_connected_cipher_algo() - get current connection cipher type
531*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter.
532*5113495bSYour Name  * @sta_ctx: pointer to global HDD Station context
533*5113495bSYour Name  * @pConnectedCipherAlgo: pointer to connected cipher algo
534*5113495bSYour Name  *
535*5113495bSYour Name  * Return: false if any errors encountered, true otherwise
536*5113495bSYour Name  */
537*5113495bSYour Name static inline bool
hdd_conn_get_connected_cipher_algo(struct wlan_hdd_link_info * link_info,struct hdd_station_ctx * sta_ctx,eCsrEncryptionType * pConnectedCipherAlgo)538*5113495bSYour Name hdd_conn_get_connected_cipher_algo(struct wlan_hdd_link_info *link_info,
539*5113495bSYour Name 				   struct hdd_station_ctx *sta_ctx,
540*5113495bSYour Name 				   eCsrEncryptionType *pConnectedCipherAlgo)
541*5113495bSYour Name {
542*5113495bSYour Name 	bool connected;
543*5113495bSYour Name 
544*5113495bSYour Name 	connected = hdd_cm_is_vdev_associated(link_info);
545*5113495bSYour Name 	if (pConnectedCipherAlgo)
546*5113495bSYour Name 		*pConnectedCipherAlgo = sta_ctx->conn_info.uc_encrypt_type;
547*5113495bSYour Name 
548*5113495bSYour Name 	return connected;
549*5113495bSYour Name }
550*5113495bSYour Name 
551*5113495bSYour Name struct wlan_hdd_link_info *
hdd_get_sta_connection_in_progress(struct hdd_context * hdd_ctx)552*5113495bSYour Name hdd_get_sta_connection_in_progress(struct hdd_context *hdd_ctx)
553*5113495bSYour Name {
554*5113495bSYour Name 	struct hdd_adapter *adapter = NULL, *next_adapter = NULL;
555*5113495bSYour Name 	wlan_net_dev_ref_dbgid dbgid =
556*5113495bSYour Name 				NET_DEV_HOLD_GET_STA_CONNECTION_IN_PROGRESS;
557*5113495bSYour Name 	struct wlan_hdd_link_info *link_info;
558*5113495bSYour Name 
559*5113495bSYour Name 	if (!hdd_ctx) {
560*5113495bSYour Name 		hdd_err("HDD context is NULL");
561*5113495bSYour Name 		return NULL;
562*5113495bSYour Name 	}
563*5113495bSYour Name 
564*5113495bSYour Name 	hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter,
565*5113495bSYour Name 					   dbgid) {
566*5113495bSYour Name 		if ((QDF_STA_MODE == adapter->device_mode) ||
567*5113495bSYour Name 		    (QDF_P2P_CLIENT_MODE == adapter->device_mode) ||
568*5113495bSYour Name 		    (QDF_P2P_DEVICE_MODE == adapter->device_mode)) {
569*5113495bSYour Name 			hdd_adapter_for_each_active_link_info(adapter,
570*5113495bSYour Name 							      link_info) {
571*5113495bSYour Name 				if (!hdd_cm_is_connecting(link_info))
572*5113495bSYour Name 					continue;
573*5113495bSYour Name 
574*5113495bSYour Name 				hdd_debug("vdev_id %d: Connection is in progress",
575*5113495bSYour Name 					  link_info->vdev_id);
576*5113495bSYour Name 				hdd_adapter_dev_put_debug(adapter, dbgid);
577*5113495bSYour Name 				if (next_adapter)
578*5113495bSYour Name 					hdd_adapter_dev_put_debug(next_adapter,
579*5113495bSYour Name 								  dbgid);
580*5113495bSYour Name 				return link_info;
581*5113495bSYour Name 			}
582*5113495bSYour Name 		}
583*5113495bSYour Name 		hdd_adapter_dev_put_debug(adapter, dbgid);
584*5113495bSYour Name 	}
585*5113495bSYour Name 	return NULL;
586*5113495bSYour Name }
587*5113495bSYour Name 
hdd_abort_ongoing_sta_connection(struct hdd_context * hdd_ctx)588*5113495bSYour Name void hdd_abort_ongoing_sta_connection(struct hdd_context *hdd_ctx)
589*5113495bSYour Name {
590*5113495bSYour Name 	struct wlan_hdd_link_info *link_info;
591*5113495bSYour Name 
592*5113495bSYour Name 	link_info = hdd_get_sta_connection_in_progress(hdd_ctx);
593*5113495bSYour Name 	if (link_info &&
594*5113495bSYour Name 	    !wlan_vdev_mlme_is_mlo_link_switch_in_progress(link_info->vdev))
595*5113495bSYour Name 		wlan_hdd_cm_issue_disconnect(link_info,
596*5113495bSYour Name 					     REASON_UNSPEC_FAILURE, false);
597*5113495bSYour Name }
598*5113495bSYour Name 
hdd_abort_ongoing_sta_sae_connection(struct hdd_context * hdd_ctx)599*5113495bSYour Name void hdd_abort_ongoing_sta_sae_connection(struct hdd_context *hdd_ctx)
600*5113495bSYour Name {
601*5113495bSYour Name 	struct wlan_hdd_link_info *link_info;
602*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
603*5113495bSYour Name 	int32_t key_mgmt;
604*5113495bSYour Name 
605*5113495bSYour Name 	link_info = hdd_get_sta_connection_in_progress(hdd_ctx);
606*5113495bSYour Name 	if (!link_info ||
607*5113495bSYour Name 	    wlan_vdev_mlme_is_mlo_link_switch_in_progress(link_info->vdev))
608*5113495bSYour Name 		return;
609*5113495bSYour Name 
610*5113495bSYour Name 	vdev = hdd_objmgr_get_vdev_by_user(link_info->adapter->deflink,
611*5113495bSYour Name 					   WLAN_OSIF_ID);
612*5113495bSYour Name 	if (!vdev)
613*5113495bSYour Name 		return;
614*5113495bSYour Name 
615*5113495bSYour Name 	key_mgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
616*5113495bSYour Name 	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
617*5113495bSYour Name 
618*5113495bSYour Name 	if (key_mgmt < 0) {
619*5113495bSYour Name 		hdd_debug_rl("Invalid key_mgmt: %d", key_mgmt);
620*5113495bSYour Name 		return;
621*5113495bSYour Name 	}
622*5113495bSYour Name 
623*5113495bSYour Name 	if (QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_SAE) ||
624*5113495bSYour Name 	    QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_SAE) ||
625*5113495bSYour Name 	    QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_SAE_EXT_KEY) ||
626*5113495bSYour Name 	    QDF_HAS_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_SAE_EXT_KEY))
627*5113495bSYour Name 		wlan_hdd_cm_issue_disconnect(link_info->adapter->deflink,
628*5113495bSYour Name 					     REASON_DISASSOC_NETWORK_LEAVING,
629*5113495bSYour Name 					     false);
630*5113495bSYour Name }
631*5113495bSYour Name 
hdd_get_first_connected_sta_vdev_id(struct hdd_context * hdd_ctx,uint32_t * vdev_id)632*5113495bSYour Name QDF_STATUS hdd_get_first_connected_sta_vdev_id(struct hdd_context *hdd_ctx,
633*5113495bSYour Name 					       uint32_t *vdev_id)
634*5113495bSYour Name {
635*5113495bSYour Name 	struct hdd_adapter *adapter = NULL, *next_adapter = NULL;
636*5113495bSYour Name 	wlan_net_dev_ref_dbgid dbgid = NET_DEV_HOLD_IS_ANY_STA_CONNECTED;
637*5113495bSYour Name 	struct wlan_hdd_link_info *link_info;
638*5113495bSYour Name 
639*5113495bSYour Name 	if (!hdd_ctx) {
640*5113495bSYour Name 		hdd_err("HDD context is NULL");
641*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
642*5113495bSYour Name 	}
643*5113495bSYour Name 
644*5113495bSYour Name 	hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter,
645*5113495bSYour Name 					   dbgid) {
646*5113495bSYour Name 		if (adapter->device_mode == QDF_STA_MODE ||
647*5113495bSYour Name 		    adapter->device_mode == QDF_P2P_CLIENT_MODE) {
648*5113495bSYour Name 			hdd_adapter_for_each_active_link_info(adapter,
649*5113495bSYour Name 							      link_info) {
650*5113495bSYour Name 				if (!hdd_cm_is_vdev_connected(link_info))
651*5113495bSYour Name 					continue;
652*5113495bSYour Name 
653*5113495bSYour Name 				*vdev_id = link_info->vdev_id;
654*5113495bSYour Name 				hdd_adapter_dev_put_debug(adapter, dbgid);
655*5113495bSYour Name 				if (next_adapter)
656*5113495bSYour Name 					hdd_adapter_dev_put_debug(next_adapter,
657*5113495bSYour Name 								  dbgid);
658*5113495bSYour Name 				return QDF_STATUS_SUCCESS;
659*5113495bSYour Name 			}
660*5113495bSYour Name 		}
661*5113495bSYour Name 		hdd_adapter_dev_put_debug(adapter, dbgid);
662*5113495bSYour Name 	}
663*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
664*5113495bSYour Name }
665*5113495bSYour Name 
hdd_is_any_sta_connected(struct hdd_context * hdd_ctx)666*5113495bSYour Name bool hdd_is_any_sta_connected(struct hdd_context *hdd_ctx)
667*5113495bSYour Name {
668*5113495bSYour Name 	QDF_STATUS status;
669*5113495bSYour Name 	uint32_t vdev_id;
670*5113495bSYour Name 
671*5113495bSYour Name 	status = hdd_get_first_connected_sta_vdev_id(hdd_ctx, &vdev_id);
672*5113495bSYour Name 	return QDF_IS_STATUS_ERROR(status) ? false : true;
673*5113495bSYour Name }
674*5113495bSYour Name 
675*5113495bSYour Name /**
676*5113495bSYour Name  * hdd_remove_beacon_filter() - remove beacon filter
677*5113495bSYour Name  * @adapter: Pointer to the hdd adapter
678*5113495bSYour Name  *
679*5113495bSYour Name  * Return: 0 on success and errno on failure
680*5113495bSYour Name  */
hdd_remove_beacon_filter(struct hdd_adapter * adapter)681*5113495bSYour Name int hdd_remove_beacon_filter(struct hdd_adapter *adapter)
682*5113495bSYour Name {
683*5113495bSYour Name 	QDF_STATUS status;
684*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
685*5113495bSYour Name 
686*5113495bSYour Name 	status = sme_remove_beacon_filter(hdd_ctx->mac_handle,
687*5113495bSYour Name 					  adapter->deflink->vdev_id);
688*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(status)) {
689*5113495bSYour Name 		hdd_err("sme_remove_beacon_filter() failed");
690*5113495bSYour Name 		return -EFAULT;
691*5113495bSYour Name 	}
692*5113495bSYour Name 
693*5113495bSYour Name 	return 0;
694*5113495bSYour Name }
695*5113495bSYour Name 
hdd_add_beacon_filter(struct hdd_adapter * adapter)696*5113495bSYour Name int hdd_add_beacon_filter(struct hdd_adapter *adapter)
697*5113495bSYour Name {
698*5113495bSYour Name 	int i;
699*5113495bSYour Name 	uint32_t ie_map[SIR_BCN_FLT_MAX_ELEMS_IE_LIST] = {0};
700*5113495bSYour Name 	QDF_STATUS status;
701*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
702*5113495bSYour Name 
703*5113495bSYour Name 	for (i = 0; i < ARRAY_SIZE(beacon_filter_table); i++)
704*5113495bSYour Name 		qdf_set_bit(beacon_filter_table[i],
705*5113495bSYour Name 			    (unsigned long *)ie_map);
706*5113495bSYour Name 
707*5113495bSYour Name 	for (i = 0; i < ARRAY_SIZE(beacon_filter_extn_table); i++)
708*5113495bSYour Name 		qdf_set_bit(beacon_filter_extn_table[i] + WLAN_ELEMID_EXTN_ELEM,
709*5113495bSYour Name 			    (unsigned long *)ie_map);
710*5113495bSYour Name 
711*5113495bSYour Name 	status = sme_add_beacon_filter(hdd_ctx->mac_handle,
712*5113495bSYour Name 				       adapter->deflink->vdev_id, ie_map);
713*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(status)) {
714*5113495bSYour Name 		hdd_err("sme_add_beacon_filter() failed");
715*5113495bSYour Name 		return -EFAULT;
716*5113495bSYour Name 	}
717*5113495bSYour Name 	return 0;
718*5113495bSYour Name }
719*5113495bSYour Name 
hdd_copy_ht_caps(struct ieee80211_ht_cap * hdd_ht_cap,tDot11fIEHTCaps * roam_ht_cap)720*5113495bSYour Name void hdd_copy_ht_caps(struct ieee80211_ht_cap *hdd_ht_cap,
721*5113495bSYour Name 		      tDot11fIEHTCaps *roam_ht_cap)
722*5113495bSYour Name 
723*5113495bSYour Name {
724*5113495bSYour Name 	uint32_t i, temp_ht_cap;
725*5113495bSYour Name 
726*5113495bSYour Name 	qdf_mem_zero(hdd_ht_cap, sizeof(struct ieee80211_ht_cap));
727*5113495bSYour Name 
728*5113495bSYour Name 	if (roam_ht_cap->advCodingCap)
729*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_LDPC_CODING;
730*5113495bSYour Name 	if (roam_ht_cap->supportedChannelWidthSet)
731*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
732*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->mimoPowerSave &
733*5113495bSYour Name 	    (IEEE80211_HT_CAP_SM_PS >> IEEE80211_HT_CAP_SM_PS_SHIFT);
734*5113495bSYour Name 	if (temp_ht_cap)
735*5113495bSYour Name 		hdd_ht_cap->cap_info |=
736*5113495bSYour Name 			temp_ht_cap << IEEE80211_HT_CAP_SM_PS_SHIFT;
737*5113495bSYour Name 	if (roam_ht_cap->greenField)
738*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_GRN_FLD;
739*5113495bSYour Name 	if (roam_ht_cap->shortGI20MHz)
740*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SGI_20;
741*5113495bSYour Name 	if (roam_ht_cap->shortGI40MHz)
742*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_SGI_40;
743*5113495bSYour Name 	if (roam_ht_cap->txSTBC)
744*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_TX_STBC;
745*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->rxSTBC & (IEEE80211_HT_CAP_RX_STBC >>
746*5113495bSYour Name 	    IEEE80211_HT_CAP_RX_STBC_SHIFT);
747*5113495bSYour Name 	if (temp_ht_cap)
748*5113495bSYour Name 		hdd_ht_cap->cap_info |=
749*5113495bSYour Name 			temp_ht_cap << IEEE80211_HT_CAP_RX_STBC_SHIFT;
750*5113495bSYour Name 	if (roam_ht_cap->delayedBA)
751*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_DELAY_BA;
752*5113495bSYour Name 	if (roam_ht_cap->maximalAMSDUsize)
753*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_MAX_AMSDU;
754*5113495bSYour Name 	if (roam_ht_cap->dsssCckMode40MHz)
755*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_DSSSCCK40;
756*5113495bSYour Name 	if (roam_ht_cap->psmp)
757*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_RESERVED;
758*5113495bSYour Name 	if (roam_ht_cap->stbcControlFrame)
759*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_40MHZ_INTOLERANT;
760*5113495bSYour Name 	if (roam_ht_cap->lsigTXOPProtection)
761*5113495bSYour Name 		hdd_ht_cap->cap_info |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
762*5113495bSYour Name 
763*5113495bSYour Name 	/* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
764*5113495bSYour Name 	if (roam_ht_cap->maxRxAMPDUFactor)
765*5113495bSYour Name 		hdd_ht_cap->ampdu_params_info |=
766*5113495bSYour Name 			IEEE80211_HT_AMPDU_PARM_FACTOR;
767*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->mpduDensity &
768*5113495bSYour Name 	    (IEEE80211_HT_AMPDU_PARM_DENSITY >>
769*5113495bSYour Name 	     IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
770*5113495bSYour Name 	if (temp_ht_cap)
771*5113495bSYour Name 		hdd_ht_cap->ampdu_params_info |=
772*5113495bSYour Name 		temp_ht_cap << IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT;
773*5113495bSYour Name 
774*5113495bSYour Name 	/* 802.11n HT extended capabilities masks */
775*5113495bSYour Name 	if (roam_ht_cap->pco)
776*5113495bSYour Name 		hdd_ht_cap->extended_ht_cap_info |=
777*5113495bSYour Name 			IEEE80211_HT_EXT_CAP_PCO;
778*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->transitionTime &
779*5113495bSYour Name 	    (IEEE80211_HT_EXT_CAP_PCO_TIME >>
780*5113495bSYour Name 	    IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT);
781*5113495bSYour Name 	if (temp_ht_cap)
782*5113495bSYour Name 		hdd_ht_cap->extended_ht_cap_info |=
783*5113495bSYour Name 			temp_ht_cap << IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT;
784*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->mcsFeedback &
785*5113495bSYour Name 	    (IEEE80211_HT_EXT_CAP_MCS_FB >> IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT);
786*5113495bSYour Name 	if (temp_ht_cap)
787*5113495bSYour Name 		hdd_ht_cap->extended_ht_cap_info |=
788*5113495bSYour Name 			temp_ht_cap << IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT;
789*5113495bSYour Name 
790*5113495bSYour Name 	/* tx_bf_cap_info capabilities */
791*5113495bSYour Name 	if (roam_ht_cap->txBF)
792*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_TX_BF;
793*5113495bSYour Name 	if (roam_ht_cap->rxStaggeredSounding)
794*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
795*5113495bSYour Name 			TX_BF_CAP_INFO_RX_STAG_RED_SOUNDING;
796*5113495bSYour Name 	if (roam_ht_cap->txStaggeredSounding)
797*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
798*5113495bSYour Name 			TX_BF_CAP_INFO_TX_STAG_RED_SOUNDING;
799*5113495bSYour Name 	if (roam_ht_cap->rxZLF)
800*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_RX_ZFL;
801*5113495bSYour Name 	if (roam_ht_cap->txZLF)
802*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_TX_ZFL;
803*5113495bSYour Name 	if (roam_ht_cap->implicitTxBF)
804*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_IMP_TX_BF;
805*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->calibration &
806*5113495bSYour Name 	    (TX_BF_CAP_INFO_CALIBRATION >> TX_BF_CAP_INFO_CALIBRATION_SHIFT);
807*5113495bSYour Name 	if (temp_ht_cap)
808*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
809*5113495bSYour Name 			temp_ht_cap << TX_BF_CAP_INFO_CALIBRATION_SHIFT;
810*5113495bSYour Name 	if (roam_ht_cap->explicitCSITxBF)
811*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |= TX_BF_CAP_INFO_EXP_CSIT_BF;
812*5113495bSYour Name 	if (roam_ht_cap->explicitUncompressedSteeringMatrix)
813*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
814*5113495bSYour Name 			TX_BF_CAP_INFO_EXP_UNCOMP_STEER_MAT;
815*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->explicitBFCSIFeedback &
816*5113495bSYour Name 	    (TX_BF_CAP_INFO_EXP_BF_CSI_FB >>
817*5113495bSYour Name 	     TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT);
818*5113495bSYour Name 	if (temp_ht_cap)
819*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
820*5113495bSYour Name 			temp_ht_cap << TX_BF_CAP_INFO_EXP_BF_CSI_FB_SHIFT;
821*5113495bSYour Name 	temp_ht_cap =
822*5113495bSYour Name 	    roam_ht_cap->explicitUncompressedSteeringMatrixFeedback &
823*5113495bSYour Name 	    (TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT >>
824*5113495bSYour Name 	     TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT);
825*5113495bSYour Name 	if (temp_ht_cap)
826*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
827*5113495bSYour Name 			temp_ht_cap <<
828*5113495bSYour Name 			TX_BF_CAP_INFO_EXP_UNCMP_STEER_MAT_SHIFT;
829*5113495bSYour Name 	temp_ht_cap =
830*5113495bSYour Name 	    roam_ht_cap->explicitCompressedSteeringMatrixFeedback &
831*5113495bSYour Name 	    (TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB >>
832*5113495bSYour Name 	     TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT);
833*5113495bSYour Name 	if (temp_ht_cap)
834*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
835*5113495bSYour Name 			temp_ht_cap <<
836*5113495bSYour Name 				TX_BF_CAP_INFO_EXP_CMP_STEER_MAT_FB_SHIFT;
837*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->csiNumBFAntennae &
838*5113495bSYour Name 	    (TX_BF_CAP_INFO_CSI_NUM_BF_ANT >>
839*5113495bSYour Name 	     TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT);
840*5113495bSYour Name 	if (temp_ht_cap)
841*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
842*5113495bSYour Name 			temp_ht_cap << TX_BF_CAP_INFO_CSI_NUM_BF_ANT_SHIFT;
843*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->uncompressedSteeringMatrixBFAntennae &
844*5113495bSYour Name 	    (TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT >>
845*5113495bSYour Name 	     TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT);
846*5113495bSYour Name 	if (temp_ht_cap)
847*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
848*5113495bSYour Name 			temp_ht_cap <<
849*5113495bSYour Name 				TX_BF_CAP_INFO_UNCOMP_STEER_MAT_BF_ANT_SHIFT;
850*5113495bSYour Name 	temp_ht_cap = roam_ht_cap->compressedSteeringMatrixBFAntennae &
851*5113495bSYour Name 	    (TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT >>
852*5113495bSYour Name 	     TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT);
853*5113495bSYour Name 	if (temp_ht_cap)
854*5113495bSYour Name 		hdd_ht_cap->tx_BF_cap_info |=
855*5113495bSYour Name 			temp_ht_cap <<
856*5113495bSYour Name 				TX_BF_CAP_INFO_COMP_STEER_MAT_BF_ANT_SHIFT;
857*5113495bSYour Name 
858*5113495bSYour Name 	/* antenna selection */
859*5113495bSYour Name 	if (roam_ht_cap->antennaSelection)
860*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |= ANTENNA_SEL_INFO;
861*5113495bSYour Name 	if (roam_ht_cap->explicitCSIFeedbackTx)
862*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |=
863*5113495bSYour Name 			ANTENNA_SEL_INFO_EXP_CSI_FB_TX;
864*5113495bSYour Name 	if (roam_ht_cap->antennaIndicesFeedbackTx)
865*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |=
866*5113495bSYour Name 			ANTENNA_SEL_INFO_ANT_ID_FB_TX;
867*5113495bSYour Name 	if (roam_ht_cap->explicitCSIFeedback)
868*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |=
869*5113495bSYour Name 			ANTENNA_SEL_INFO_EXP_CSI_FB;
870*5113495bSYour Name 	if (roam_ht_cap->antennaIndicesFeedback)
871*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |=
872*5113495bSYour Name 			ANTENNA_SEL_INFO_ANT_ID_FB;
873*5113495bSYour Name 	if (roam_ht_cap->rxAS)
874*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |=
875*5113495bSYour Name 			ANTENNA_SEL_INFO_RX_AS;
876*5113495bSYour Name 	if (roam_ht_cap->txSoundingPPDUs)
877*5113495bSYour Name 		hdd_ht_cap->antenna_selection_info |=
878*5113495bSYour Name 			ANTENNA_SEL_INFO_TX_SOUNDING_PPDU;
879*5113495bSYour Name 
880*5113495bSYour Name 	/* mcs data rate */
881*5113495bSYour Name 	for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; ++i)
882*5113495bSYour Name 		hdd_ht_cap->mcs.rx_mask[i] =
883*5113495bSYour Name 			roam_ht_cap->supportedMCSSet[i];
884*5113495bSYour Name 	hdd_ht_cap->mcs.rx_highest =
885*5113495bSYour Name 			((short) (roam_ht_cap->supportedMCSSet[11]) << 8) |
886*5113495bSYour Name 			((short) (roam_ht_cap->supportedMCSSet[10]));
887*5113495bSYour Name 	hdd_ht_cap->mcs.tx_params =
888*5113495bSYour Name 			roam_ht_cap->supportedMCSSet[12];
889*5113495bSYour Name }
890*5113495bSYour Name 
891*5113495bSYour Name #define VHT_CAP_MAX_MPDU_LENGTH_MASK 0x00000003
892*5113495bSYour Name #define VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT 2
893*5113495bSYour Name #define VHT_CAP_RXSTBC_MASK_SHIFT 8
894*5113495bSYour Name #define VHT_CAP_BEAMFORMEE_STS_SHIFT 13
895*5113495bSYour Name #define VHT_CAP_BEAMFORMEE_STS_MASK \
896*5113495bSYour Name 	(0x0000e000 >> VHT_CAP_BEAMFORMEE_STS_SHIFT)
897*5113495bSYour Name #define VHT_CAP_SOUNDING_DIMENSIONS_SHIFT 16
898*5113495bSYour Name #define VHT_CAP_SOUNDING_DIMENSIONS_MASK \
899*5113495bSYour Name 	(0x00070000 >> VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
900*5113495bSYour Name #define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT 23
901*5113495bSYour Name #define VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \
902*5113495bSYour Name 	(0x03800000 >> VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT)
903*5113495bSYour Name #define VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT 26
904*5113495bSYour Name 
hdd_copy_vht_caps(struct ieee80211_vht_cap * hdd_vht_cap,tDot11fIEVHTCaps * roam_vht_cap)905*5113495bSYour Name void hdd_copy_vht_caps(struct ieee80211_vht_cap *hdd_vht_cap,
906*5113495bSYour Name 		       tDot11fIEVHTCaps *roam_vht_cap)
907*5113495bSYour Name {
908*5113495bSYour Name 	uint32_t temp_vht_cap;
909*5113495bSYour Name 
910*5113495bSYour Name 	qdf_mem_zero(hdd_vht_cap, sizeof(struct ieee80211_vht_cap));
911*5113495bSYour Name 
912*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->maxMPDULen & VHT_CAP_MAX_MPDU_LENGTH_MASK;
913*5113495bSYour Name 	hdd_vht_cap->vht_cap_info |= temp_vht_cap;
914*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->supportedChannelWidthSet &
915*5113495bSYour Name 		(IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK >>
916*5113495bSYour Name 			VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT);
917*5113495bSYour Name 	if (temp_vht_cap) {
918*5113495bSYour Name 		if (roam_vht_cap->supportedChannelWidthSet &
919*5113495bSYour Name 		    (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ >>
920*5113495bSYour Name 			VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT))
921*5113495bSYour Name 			hdd_vht_cap->vht_cap_info |=
922*5113495bSYour Name 				temp_vht_cap <<
923*5113495bSYour Name 				IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
924*5113495bSYour Name 		if (roam_vht_cap->supportedChannelWidthSet &
925*5113495bSYour Name 		    (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ >>
926*5113495bSYour Name 			VHT_CAP_SUPP_CHAN_WIDTH_MASK_SHIFT))
927*5113495bSYour Name 			hdd_vht_cap->vht_cap_info |=
928*5113495bSYour Name 			temp_vht_cap <<
929*5113495bSYour Name 			IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
930*5113495bSYour Name 	}
931*5113495bSYour Name 	if (roam_vht_cap->ldpcCodingCap)
932*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_RXLDPC;
933*5113495bSYour Name 	if (roam_vht_cap->shortGI80MHz)
934*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_SHORT_GI_80;
935*5113495bSYour Name 	if (roam_vht_cap->shortGI160and80plus80MHz)
936*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_SHORT_GI_160;
937*5113495bSYour Name 	if (roam_vht_cap->txSTBC)
938*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |= IEEE80211_VHT_CAP_TXSTBC;
939*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->rxSTBC & (IEEE80211_VHT_CAP_RXSTBC_MASK >>
940*5113495bSYour Name 		VHT_CAP_RXSTBC_MASK_SHIFT);
941*5113495bSYour Name 	if (temp_vht_cap)
942*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
943*5113495bSYour Name 			temp_vht_cap << VHT_CAP_RXSTBC_MASK_SHIFT;
944*5113495bSYour Name 	if (roam_vht_cap->suBeamFormerCap)
945*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
946*5113495bSYour Name 			IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
947*5113495bSYour Name 	if (roam_vht_cap->suBeamformeeCap)
948*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
949*5113495bSYour Name 			IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
950*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->csnofBeamformerAntSup &
951*5113495bSYour Name 			(VHT_CAP_BEAMFORMEE_STS_MASK);
952*5113495bSYour Name 	if (temp_vht_cap)
953*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
954*5113495bSYour Name 			temp_vht_cap << VHT_CAP_BEAMFORMEE_STS_SHIFT;
955*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->numSoundingDim &
956*5113495bSYour Name 			(VHT_CAP_SOUNDING_DIMENSIONS_MASK);
957*5113495bSYour Name 	if (temp_vht_cap)
958*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
959*5113495bSYour Name 			temp_vht_cap << VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
960*5113495bSYour Name 	if (roam_vht_cap->muBeamformerCap)
961*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
962*5113495bSYour Name 			IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
963*5113495bSYour Name 	if (roam_vht_cap->muBeamformeeCap)
964*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
965*5113495bSYour Name 			IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
966*5113495bSYour Name 	if (roam_vht_cap->vhtTXOPPS)
967*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
968*5113495bSYour Name 			IEEE80211_VHT_CAP_VHT_TXOP_PS;
969*5113495bSYour Name 	if (roam_vht_cap->htcVHTCap)
970*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
971*5113495bSYour Name 			IEEE80211_VHT_CAP_HTC_VHT;
972*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->maxAMPDULenExp &
973*5113495bSYour Name 			(VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK);
974*5113495bSYour Name 	if (temp_vht_cap)
975*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
976*5113495bSYour Name 			temp_vht_cap <<
977*5113495bSYour Name 			VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK_SHIFT;
978*5113495bSYour Name 	temp_vht_cap = roam_vht_cap->vhtLinkAdaptCap &
979*5113495bSYour Name 		(IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB >>
980*5113495bSYour Name 		 VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT);
981*5113495bSYour Name 	if (temp_vht_cap)
982*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |= temp_vht_cap <<
983*5113495bSYour Name 			VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB_SHIFT;
984*5113495bSYour Name 	if (roam_vht_cap->rxAntPattern)
985*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
986*5113495bSYour Name 			IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN;
987*5113495bSYour Name 	if (roam_vht_cap->txAntPattern)
988*5113495bSYour Name 		hdd_vht_cap->vht_cap_info |=
989*5113495bSYour Name 			IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
990*5113495bSYour Name 	hdd_vht_cap->supp_mcs.rx_mcs_map = roam_vht_cap->rxMCSMap;
991*5113495bSYour Name 	hdd_vht_cap->supp_mcs.rx_highest =
992*5113495bSYour Name 		((uint16_t)roam_vht_cap->rxHighSupDataRate);
993*5113495bSYour Name 	hdd_vht_cap->supp_mcs.tx_mcs_map = roam_vht_cap->txMCSMap;
994*5113495bSYour Name 	hdd_vht_cap->supp_mcs.tx_highest =
995*5113495bSYour Name 		((uint16_t)roam_vht_cap->txSupDataRate);
996*5113495bSYour Name }
997*5113495bSYour Name 
998*5113495bSYour Name /* ht param */
999*5113495bSYour Name #define HT_PARAM_CONTROLLED_ACCESS_ONLY 0x10
1000*5113495bSYour Name #define HT_PARAM_SERVICE_INT_GRAN 0xe0
1001*5113495bSYour Name #define HT_PARAM_SERVICE_INT_GRAN_SHIFT 5
1002*5113495bSYour Name 
1003*5113495bSYour Name /* operatinon mode */
1004*5113495bSYour Name #define HT_OP_MODE_TX_BURST_LIMIT 0x0008
1005*5113495bSYour Name 
1006*5113495bSYour Name /* stbc_param */
1007*5113495bSYour Name #define HT_STBC_PARAM_MCS 0x007f
1008*5113495bSYour Name 
hdd_copy_ht_operation(struct hdd_station_ctx * hdd_sta_ctx,tDot11fIEHTInfo * ht_ops)1009*5113495bSYour Name void hdd_copy_ht_operation(struct hdd_station_ctx *hdd_sta_ctx,
1010*5113495bSYour Name 			   tDot11fIEHTInfo *ht_ops)
1011*5113495bSYour Name {
1012*5113495bSYour Name 	struct ieee80211_ht_operation *hdd_ht_ops =
1013*5113495bSYour Name 		&hdd_sta_ctx->conn_info.ht_operation;
1014*5113495bSYour Name 	uint32_t i, temp_ht_ops;
1015*5113495bSYour Name 
1016*5113495bSYour Name 	qdf_mem_zero(hdd_ht_ops, sizeof(struct ieee80211_ht_operation));
1017*5113495bSYour Name 
1018*5113495bSYour Name 	hdd_ht_ops->primary_chan = ht_ops->primaryChannel;
1019*5113495bSYour Name 
1020*5113495bSYour Name 	/* HT_PARAMS */
1021*5113495bSYour Name 	temp_ht_ops = ht_ops->secondaryChannelOffset &
1022*5113495bSYour Name 		IEEE80211_HT_PARAM_CHA_SEC_OFFSET;
1023*5113495bSYour Name 	if (temp_ht_ops)
1024*5113495bSYour Name 		hdd_ht_ops->ht_param |= temp_ht_ops;
1025*5113495bSYour Name 	else
1026*5113495bSYour Name 		hdd_ht_ops->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
1027*5113495bSYour Name 	if (ht_ops->recommendedTxWidthSet)
1028*5113495bSYour Name 		hdd_ht_ops->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
1029*5113495bSYour Name 	if (ht_ops->rifsMode)
1030*5113495bSYour Name 		hdd_ht_ops->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
1031*5113495bSYour Name 	if (ht_ops->controlledAccessOnly)
1032*5113495bSYour Name 		hdd_ht_ops->ht_param |= HT_PARAM_CONTROLLED_ACCESS_ONLY;
1033*5113495bSYour Name 	temp_ht_ops = ht_ops->serviceIntervalGranularity &
1034*5113495bSYour Name 		(HT_PARAM_SERVICE_INT_GRAN >> HT_PARAM_SERVICE_INT_GRAN_SHIFT);
1035*5113495bSYour Name 	if (temp_ht_ops)
1036*5113495bSYour Name 		hdd_ht_ops->ht_param |= temp_ht_ops <<
1037*5113495bSYour Name 			HT_PARAM_SERVICE_INT_GRAN_SHIFT;
1038*5113495bSYour Name 
1039*5113495bSYour Name 	/* operation mode */
1040*5113495bSYour Name 	temp_ht_ops = ht_ops->opMode &
1041*5113495bSYour Name 			IEEE80211_HT_OP_MODE_PROTECTION;
1042*5113495bSYour Name 	switch (temp_ht_ops) {
1043*5113495bSYour Name 	case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
1044*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1045*5113495bSYour Name 			IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER;
1046*5113495bSYour Name 		break;
1047*5113495bSYour Name 	case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
1048*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1049*5113495bSYour Name 			IEEE80211_HT_OP_MODE_PROTECTION_20MHZ;
1050*5113495bSYour Name 		break;
1051*5113495bSYour Name 	case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
1052*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1053*5113495bSYour Name 			IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED;
1054*5113495bSYour Name 		break;
1055*5113495bSYour Name 	case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
1056*5113495bSYour Name 	default:
1057*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1058*5113495bSYour Name 			IEEE80211_HT_OP_MODE_PROTECTION_NONE;
1059*5113495bSYour Name 	}
1060*5113495bSYour Name 	if (ht_ops->nonGFDevicesPresent)
1061*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1062*5113495bSYour Name 			IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT;
1063*5113495bSYour Name 	if (ht_ops->transmitBurstLimit)
1064*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1065*5113495bSYour Name 			HT_OP_MODE_TX_BURST_LIMIT;
1066*5113495bSYour Name 	if (ht_ops->obssNonHTStaPresent)
1067*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1068*5113495bSYour Name 			IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT;
1069*5113495bSYour Name 
1070*5113495bSYour Name 	if (ht_ops->chan_center_freq_seg2)
1071*5113495bSYour Name 		hdd_ht_ops->operation_mode |=
1072*5113495bSYour Name 			(ht_ops->chan_center_freq_seg2 << IEEE80211_HT_OP_MODE_CCFS2_SHIFT);
1073*5113495bSYour Name 	/* stbc_param */
1074*5113495bSYour Name 	temp_ht_ops = ht_ops->basicSTBCMCS &
1075*5113495bSYour Name 			HT_STBC_PARAM_MCS;
1076*5113495bSYour Name 	if (temp_ht_ops)
1077*5113495bSYour Name 		hdd_ht_ops->stbc_param |= temp_ht_ops;
1078*5113495bSYour Name 	if (ht_ops->dualCTSProtection)
1079*5113495bSYour Name 		hdd_ht_ops->stbc_param |=
1080*5113495bSYour Name 			IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT;
1081*5113495bSYour Name 	if (ht_ops->secondaryBeacon)
1082*5113495bSYour Name 		hdd_ht_ops->stbc_param |=
1083*5113495bSYour Name 			IEEE80211_HT_STBC_PARAM_STBC_BEACON;
1084*5113495bSYour Name 	if (ht_ops->lsigTXOPProtectionFullSupport)
1085*5113495bSYour Name 		hdd_ht_ops->stbc_param |=
1086*5113495bSYour Name 			IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT;
1087*5113495bSYour Name 	if (ht_ops->pcoActive)
1088*5113495bSYour Name 		hdd_ht_ops->stbc_param |=
1089*5113495bSYour Name 			IEEE80211_HT_STBC_PARAM_PCO_ACTIVE;
1090*5113495bSYour Name 	if (ht_ops->pcoPhase)
1091*5113495bSYour Name 		hdd_ht_ops->stbc_param |=
1092*5113495bSYour Name 			IEEE80211_HT_STBC_PARAM_PCO_PHASE;
1093*5113495bSYour Name 
1094*5113495bSYour Name 	/* basic MCs set */
1095*5113495bSYour Name 	for (i = 0; i < 16; ++i)
1096*5113495bSYour Name 		hdd_ht_ops->basic_set[i] =
1097*5113495bSYour Name 			ht_ops->basicMCSSet[i];
1098*5113495bSYour Name }
1099*5113495bSYour Name 
1100*5113495bSYour Name #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
hdd_copy_vht_center_freq(struct ieee80211_vht_operation * ieee_ops,tDot11fIEVHTOperation * roam_ops)1101*5113495bSYour Name static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops,
1102*5113495bSYour Name 				     tDot11fIEVHTOperation *roam_ops)
1103*5113495bSYour Name {
1104*5113495bSYour Name 	ieee_ops->center_freq_seg0_idx = roam_ops->chan_center_freq_seg0;
1105*5113495bSYour Name 	ieee_ops->center_freq_seg1_idx = roam_ops->chan_center_freq_seg1;
1106*5113495bSYour Name }
1107*5113495bSYour Name #else
hdd_copy_vht_center_freq(struct ieee80211_vht_operation * ieee_ops,tDot11fIEVHTOperation * roam_ops)1108*5113495bSYour Name static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops,
1109*5113495bSYour Name 				     tDot11fIEVHTOperation *roam_ops)
1110*5113495bSYour Name {
1111*5113495bSYour Name 	ieee_ops->center_freq_seg1_idx = roam_ops->chan_center_freq_seg0;
1112*5113495bSYour Name 	ieee_ops->center_freq_seg2_idx = roam_ops->chan_center_freq_seg1;
1113*5113495bSYour Name }
1114*5113495bSYour Name #endif /* KERNEL_VERSION(4, 12, 0) */
1115*5113495bSYour Name 
hdd_copy_vht_operation(struct hdd_station_ctx * hdd_sta_ctx,tDot11fIEVHTOperation * vht_ops)1116*5113495bSYour Name void hdd_copy_vht_operation(struct hdd_station_ctx *hdd_sta_ctx,
1117*5113495bSYour Name 			    tDot11fIEVHTOperation *vht_ops)
1118*5113495bSYour Name {
1119*5113495bSYour Name 	struct ieee80211_vht_operation *hdd_vht_ops =
1120*5113495bSYour Name 		&hdd_sta_ctx->conn_info.vht_operation;
1121*5113495bSYour Name 
1122*5113495bSYour Name 	qdf_mem_zero(hdd_vht_ops, sizeof(struct ieee80211_vht_operation));
1123*5113495bSYour Name 
1124*5113495bSYour Name 	hdd_vht_ops->chan_width = vht_ops->chanWidth;
1125*5113495bSYour Name 	hdd_copy_vht_center_freq(hdd_vht_ops, vht_ops);
1126*5113495bSYour Name 	hdd_vht_ops->basic_mcs_set = vht_ops->basicMCSSet;
1127*5113495bSYour Name }
1128*5113495bSYour Name 
1129*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)) && \
1130*5113495bSYour Name 	defined(WLAN_FEATURE_11BE)
hdd_copy_eht_operation(struct hdd_station_ctx * hdd_sta_ctx,tDot11fIEeht_op * eht_ops)1131*5113495bSYour Name void hdd_copy_eht_operation(struct hdd_station_ctx *hdd_sta_ctx,
1132*5113495bSYour Name 			    tDot11fIEeht_op *eht_ops)
1133*5113495bSYour Name {
1134*5113495bSYour Name 	struct ieee80211_eht_operation *hdd_eht_ops =
1135*5113495bSYour Name 		&hdd_sta_ctx->conn_info.eht_operation;
1136*5113495bSYour Name 	struct ieee80211_eht_mcs_nss_supp_20mhz_only  mcs_param;
1137*5113495bSYour Name 	uint32_t filled = 0, len = 0;
1138*5113495bSYour Name 
1139*5113495bSYour Name 	qdf_mem_zero(hdd_eht_ops, sizeof(struct ieee80211_eht_operation));
1140*5113495bSYour Name 
1141*5113495bSYour Name 	if (!eht_ops->eht_op_information_present)
1142*5113495bSYour Name 		return;
1143*5113495bSYour Name 
1144*5113495bSYour Name 	/* Min length if op_info_present */
1145*5113495bSYour Name 	len += 3;
1146*5113495bSYour Name 
1147*5113495bSYour Name 	hdd_eht_ops->params |= IEEE80211_EHT_OPER_INFO_PRESENT;
1148*5113495bSYour Name 
1149*5113495bSYour Name 	if (eht_ops->eht_default_pe_duration)
1150*5113495bSYour Name 		hdd_eht_ops->params |=
1151*5113495bSYour Name 			IEEE80211_EHT_OPER_EHT_DEF_PE_DURATION;
1152*5113495bSYour Name 	if (eht_ops->group_addr_bu_indication_limit)
1153*5113495bSYour Name 		hdd_eht_ops->params |=
1154*5113495bSYour Name 			IEEE80211_EHT_OPER_GROUP_ADDRESSED_BU_IND_LIMIT;
1155*5113495bSYour Name 	if (eht_ops->group_addr_bu_indication_exponent)
1156*5113495bSYour Name 		hdd_eht_ops->params |=
1157*5113495bSYour Name 			IEEE80211_EHT_OPER_GROUP_ADDRESSED_BU_IND_EXP_MASK;
1158*5113495bSYour Name 
1159*5113495bSYour Name 	mcs_param.rx_tx_mcs7_max_nss =
1160*5113495bSYour Name 		eht_ops->basic_rx_max_nss_for_mcs_0_to_7 <<
1161*5113495bSYour Name 					EHT_OPER_BASIC_RX_NSS_MCS_0_TO_7_POS;
1162*5113495bSYour Name 	mcs_param.rx_tx_mcs7_max_nss |=
1163*5113495bSYour Name 		eht_ops->basic_tx_max_nss_for_mcs_0_to_7 <<
1164*5113495bSYour Name 					EHT_OPER_BASIC_TX_NSS_MCS_0_TO_7_POS;
1165*5113495bSYour Name 	mcs_param.rx_tx_mcs9_max_nss =
1166*5113495bSYour Name 		eht_ops->basic_rx_max_nss_for_mcs_8_and_9 <<
1167*5113495bSYour Name 					EHT_OPER_BASIC_RX_NSS_MCS_8_AND_9_POS;
1168*5113495bSYour Name 	mcs_param.rx_tx_mcs9_max_nss |=
1169*5113495bSYour Name 		eht_ops->basic_tx_max_nss_for_mcs_8_and_9 <<
1170*5113495bSYour Name 					EHT_OPER_BASIC_TX_NSS_MCS_8_AND_9_POS;
1171*5113495bSYour Name 	mcs_param.rx_tx_mcs11_max_nss =
1172*5113495bSYour Name 		eht_ops->basic_rx_max_nss_for_mcs_10_and_11 <<
1173*5113495bSYour Name 					EHT_OPER_BASIC_RX_NSS_MCS_10_AND_11_POS;
1174*5113495bSYour Name 	mcs_param.rx_tx_mcs11_max_nss |=
1175*5113495bSYour Name 		eht_ops->basic_tx_max_nss_for_mcs_10_and_11 <<
1176*5113495bSYour Name 					EHT_OPER_BASIC_TX_NSS_MCS_10_AND_11_POS;
1177*5113495bSYour Name 	mcs_param.rx_tx_mcs13_max_nss =
1178*5113495bSYour Name 		eht_ops->basic_rx_max_nss_for_mcs_12_and_13 <<
1179*5113495bSYour Name 					EHT_OPER_BASIC_RX_NSS_MCS_12_AND_13_POS;
1180*5113495bSYour Name 	mcs_param.rx_tx_mcs13_max_nss |=
1181*5113495bSYour Name 		eht_ops->basic_tx_max_nss_for_mcs_12_and_13 <<
1182*5113495bSYour Name 					EHT_OPER_BASIC_TX_NSS_MCS_12_AND_13_POS;
1183*5113495bSYour Name 
1184*5113495bSYour Name 	hdd_eht_ops->basic_mcs_nss = mcs_param;
1185*5113495bSYour Name 	hdd_eht_ops->optional[filled++] = eht_ops->channel_width;
1186*5113495bSYour Name 	hdd_eht_ops->optional[filled++] = eht_ops->ccfs0;
1187*5113495bSYour Name 	hdd_eht_ops->optional[filled++] = eht_ops->ccfs1;
1188*5113495bSYour Name 
1189*5113495bSYour Name 	if (eht_ops->disabled_sub_chan_bitmap_present) {
1190*5113495bSYour Name 		hdd_eht_ops->params |=
1191*5113495bSYour Name 			IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT;
1192*5113495bSYour Name 		len += 2;
1193*5113495bSYour Name 		hdd_eht_ops->optional[filled++] =
1194*5113495bSYour Name 				eht_ops->disabled_sub_chan_bitmap[0][0];
1195*5113495bSYour Name 		hdd_eht_ops->optional[filled++] =
1196*5113495bSYour Name 				eht_ops->disabled_sub_chan_bitmap[0][1];
1197*5113495bSYour Name 	}
1198*5113495bSYour Name 	hdd_sta_ctx->conn_info.eht_oper_len =
1199*5113495bSYour Name 				sizeof(struct ieee80211_eht_operation) + len;
1200*5113495bSYour Name }
1201*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) && \
1202*5113495bSYour Name 	defined(WLAN_FEATURE_11BE)
hdd_copy_eht_operation(struct hdd_station_ctx * hdd_sta_ctx,tDot11fIEeht_op * eht_ops)1203*5113495bSYour Name void hdd_copy_eht_operation(struct hdd_station_ctx *hdd_sta_ctx,
1204*5113495bSYour Name 			    tDot11fIEeht_op *eht_ops)
1205*5113495bSYour Name {
1206*5113495bSYour Name 	struct ieee80211_eht_operation *hdd_eht_ops =
1207*5113495bSYour Name 		&hdd_sta_ctx->conn_info.eht_operation;
1208*5113495bSYour Name 	uint32_t mcs_param = 0, filled = 0, len = 0;
1209*5113495bSYour Name 
1210*5113495bSYour Name 	qdf_mem_zero(hdd_eht_ops, sizeof(struct ieee80211_eht_operation));
1211*5113495bSYour Name 
1212*5113495bSYour Name 	if (!eht_ops->eht_op_information_present)
1213*5113495bSYour Name 		return;
1214*5113495bSYour Name 
1215*5113495bSYour Name 	/* Min length if op_info_present */
1216*5113495bSYour Name 	len += 3;
1217*5113495bSYour Name 
1218*5113495bSYour Name 	hdd_eht_ops->params |= IEEE80211_EHT_OPER_INFO_PRESENT;
1219*5113495bSYour Name 
1220*5113495bSYour Name 	if (eht_ops->eht_default_pe_duration)
1221*5113495bSYour Name 		hdd_eht_ops->params |=
1222*5113495bSYour Name 			IEEE80211_EHT_OPER_EHT_DEF_PE_DURATION;
1223*5113495bSYour Name 	if (eht_ops->group_addr_bu_indication_limit)
1224*5113495bSYour Name 		hdd_eht_ops->params |=
1225*5113495bSYour Name 			IEEE80211_EHT_OPER_GROUP_ADDRESSED_BU_IND_LIMIT;
1226*5113495bSYour Name 	if (eht_ops->group_addr_bu_indication_exponent)
1227*5113495bSYour Name 		hdd_eht_ops->params |=
1228*5113495bSYour Name 			IEEE80211_EHT_OPER_GROUP_ADDRESSED_BU_IND_EXP_MASK;
1229*5113495bSYour Name 
1230*5113495bSYour Name 	mcs_param |= eht_ops->basic_rx_max_nss_for_mcs_0_to_7 <<
1231*5113495bSYour Name 				EHT_OPER_BASIC_RX_NSS_MCS_0_TO_7_POS;
1232*5113495bSYour Name 	mcs_param |= eht_ops->basic_tx_max_nss_for_mcs_0_to_7 <<
1233*5113495bSYour Name 				EHT_OPER_BASIC_TX_NSS_MCS_0_TO_7_POS;
1234*5113495bSYour Name 	mcs_param |= eht_ops->basic_rx_max_nss_for_mcs_8_and_9 <<
1235*5113495bSYour Name 				EHT_OPER_BASIC_RX_NSS_MCS_8_AND_9_POS;
1236*5113495bSYour Name 	mcs_param |= eht_ops->basic_tx_max_nss_for_mcs_8_and_9 <<
1237*5113495bSYour Name 				EHT_OPER_BASIC_TX_NSS_MCS_8_AND_9_POS;
1238*5113495bSYour Name 	mcs_param |= eht_ops->basic_rx_max_nss_for_mcs_10_and_11 <<
1239*5113495bSYour Name 				EHT_OPER_BASIC_RX_NSS_MCS_10_AND_11_POS;
1240*5113495bSYour Name 	mcs_param |= eht_ops->basic_tx_max_nss_for_mcs_10_and_11 <<
1241*5113495bSYour Name 				EHT_OPER_BASIC_TX_NSS_MCS_10_AND_11_POS;
1242*5113495bSYour Name 	mcs_param |= eht_ops->basic_rx_max_nss_for_mcs_12_and_13 <<
1243*5113495bSYour Name 				EHT_OPER_BASIC_RX_NSS_MCS_12_AND_13_POS;
1244*5113495bSYour Name 	mcs_param |= eht_ops->basic_tx_max_nss_for_mcs_12_and_13 <<
1245*5113495bSYour Name 				EHT_OPER_BASIC_TX_NSS_MCS_12_AND_13_POS;
1246*5113495bSYour Name 
1247*5113495bSYour Name 	hdd_eht_ops->basic_mcs_nss = mcs_param;
1248*5113495bSYour Name 	hdd_eht_ops->optional[filled++] = eht_ops->channel_width;
1249*5113495bSYour Name 	hdd_eht_ops->optional[filled++] = eht_ops->ccfs0;
1250*5113495bSYour Name 	hdd_eht_ops->optional[filled++] = eht_ops->ccfs1;
1251*5113495bSYour Name 
1252*5113495bSYour Name 	if (eht_ops->disabled_sub_chan_bitmap_present) {
1253*5113495bSYour Name 		hdd_eht_ops->params |=
1254*5113495bSYour Name 			IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT;
1255*5113495bSYour Name 		len += 2;
1256*5113495bSYour Name 		hdd_eht_ops->optional[filled++] =
1257*5113495bSYour Name 				eht_ops->disabled_sub_chan_bitmap[0][0];
1258*5113495bSYour Name 		hdd_eht_ops->optional[filled++] =
1259*5113495bSYour Name 				eht_ops->disabled_sub_chan_bitmap[0][1];
1260*5113495bSYour Name 	}
1261*5113495bSYour Name 	hdd_sta_ctx->conn_info.eht_oper_len =
1262*5113495bSYour Name 				sizeof(struct ieee80211_eht_operation) + len;
1263*5113495bSYour Name }
1264*5113495bSYour Name #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)) && \
1265*5113495bSYour Name 	defined(WLAN_FEATURE_11BE)
hdd_copy_eht_operation(struct hdd_station_ctx * hdd_sta_ctx,tDot11fIEeht_op * eht_ops)1266*5113495bSYour Name void hdd_copy_eht_operation(struct hdd_station_ctx *hdd_sta_ctx,
1267*5113495bSYour Name 			    tDot11fIEeht_op *eht_ops)
1268*5113495bSYour Name {
1269*5113495bSYour Name 	struct ieee80211_eht_operation *hdd_eht_ops =
1270*5113495bSYour Name 		&hdd_sta_ctx->conn_info.eht_operation;
1271*5113495bSYour Name 	uint32_t filled = 0, len = 0;
1272*5113495bSYour Name 
1273*5113495bSYour Name 	qdf_mem_zero(hdd_eht_ops, sizeof(struct ieee80211_eht_operation));
1274*5113495bSYour Name 
1275*5113495bSYour Name 	if (!eht_ops->eht_op_information_present)
1276*5113495bSYour Name 		return;
1277*5113495bSYour Name 
1278*5113495bSYour Name 	hdd_eht_ops->chan_width = eht_ops->channel_width;
1279*5113495bSYour Name 	hdd_eht_ops->ccfs = eht_ops->ccfs0;
1280*5113495bSYour Name 	hdd_eht_ops->present_bm = eht_ops->disabled_sub_chan_bitmap_present;
1281*5113495bSYour Name 
1282*5113495bSYour Name 	if (eht_ops->disabled_sub_chan_bitmap_present) {
1283*5113495bSYour Name 		hdd_eht_ops->disable_subchannel_bitmap[filled++] =
1284*5113495bSYour Name 				eht_ops->disabled_sub_chan_bitmap[0][0];
1285*5113495bSYour Name 		hdd_eht_ops->disable_subchannel_bitmap[filled++] =
1286*5113495bSYour Name 				eht_ops->disabled_sub_chan_bitmap[0][1];
1287*5113495bSYour Name 		len += 2;
1288*5113495bSYour Name 	}
1289*5113495bSYour Name 	hdd_sta_ctx->conn_info.eht_oper_len =
1290*5113495bSYour Name 				sizeof(struct ieee80211_eht_operation) + len;
1291*5113495bSYour Name }
1292*5113495bSYour Name #endif
1293*5113495bSYour Name 
1294*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)) && \
1295*5113495bSYour Name      defined(WLAN_FEATURE_11AX)
hdd_copy_he_operation(struct hdd_station_ctx * hdd_sta_ctx,tDot11fIEhe_op * he_operation)1296*5113495bSYour Name void hdd_copy_he_operation(struct hdd_station_ctx *hdd_sta_ctx,
1297*5113495bSYour Name 			   tDot11fIEhe_op *he_operation)
1298*5113495bSYour Name {
1299*5113495bSYour Name 	struct ieee80211_he_operation *hdd_he_operation;
1300*5113495bSYour Name 	uint32_t he_oper_params = 0;
1301*5113495bSYour Name 	uint32_t len = 0, filled = 0;
1302*5113495bSYour Name 	uint8_t he_oper_6g_params = 0;
1303*5113495bSYour Name 	uint32_t he_oper_len;
1304*5113495bSYour Name 
1305*5113495bSYour Name 	if (!he_operation->present)
1306*5113495bSYour Name 		return;
1307*5113495bSYour Name 	if (he_operation->vht_oper_present)
1308*5113495bSYour Name 		len += 3;
1309*5113495bSYour Name 	if (he_operation->co_located_bss)
1310*5113495bSYour Name 		len += 1;
1311*5113495bSYour Name 	if (he_operation->oper_info_6g_present)
1312*5113495bSYour Name 		len += 5;
1313*5113495bSYour Name 
1314*5113495bSYour Name 	he_oper_len = sizeof(struct ieee80211_he_operation) + len;
1315*5113495bSYour Name 
1316*5113495bSYour Name 	hdd_he_operation = qdf_mem_malloc(he_oper_len);
1317*5113495bSYour Name 	if (!hdd_he_operation)
1318*5113495bSYour Name 		return;
1319*5113495bSYour Name 
1320*5113495bSYour Name 	/* Fill he_oper_params */
1321*5113495bSYour Name 	he_oper_params |= he_operation->default_pe <<
1322*5113495bSYour Name 					HE_OPERATION_DFLT_PE_DURATION_POS;
1323*5113495bSYour Name 	he_oper_params |= he_operation->twt_required <<
1324*5113495bSYour Name 					HE_OPERATION_TWT_REQUIRED_POS;
1325*5113495bSYour Name 	he_oper_params |= he_operation->txop_rts_threshold <<
1326*5113495bSYour Name 					HE_OPERATION_RTS_THRESHOLD_POS;
1327*5113495bSYour Name 	he_oper_params |= he_operation->vht_oper_present <<
1328*5113495bSYour Name 					HE_OPERATION_VHT_OPER_POS;
1329*5113495bSYour Name 	he_oper_params |= he_operation->co_located_bss <<
1330*5113495bSYour Name 					HE_OPERATION_CO_LOCATED_BSS_POS;
1331*5113495bSYour Name 	he_oper_params |= he_operation->er_su_disable <<
1332*5113495bSYour Name 					HE_OPERATION_ER_SU_DISABLE_POS;
1333*5113495bSYour Name 	he_oper_params |= he_operation->oper_info_6g_present <<
1334*5113495bSYour Name 					HE_OPERATION_OPER_INFO_6G_POS;
1335*5113495bSYour Name 	he_oper_params |= he_operation->reserved2 <<
1336*5113495bSYour Name 					HE_OPERATION_RESERVED_POS;
1337*5113495bSYour Name 	he_oper_params |= he_operation->bss_color <<
1338*5113495bSYour Name 					HE_OPERATION_BSS_COLOR_POS;
1339*5113495bSYour Name 	he_oper_params |= he_operation->partial_bss_col <<
1340*5113495bSYour Name 					HE_OPERATION_PARTIAL_BSS_COLOR_POS;
1341*5113495bSYour Name 	he_oper_params |= he_operation->bss_col_disabled <<
1342*5113495bSYour Name 					HE_OPERATION_BSS_COL_DISABLED_POS;
1343*5113495bSYour Name 
1344*5113495bSYour Name 	hdd_he_operation->he_oper_params = he_oper_params;
1345*5113495bSYour Name 
1346*5113495bSYour Name 	/* Fill he_mcs_nss set */
1347*5113495bSYour Name 	qdf_mem_copy(&hdd_he_operation->he_mcs_nss_set,
1348*5113495bSYour Name 		     he_operation->basic_mcs_nss,
1349*5113495bSYour Name 		     sizeof(hdd_he_operation->he_mcs_nss_set));
1350*5113495bSYour Name 
1351*5113495bSYour Name 	/* Fill he_params_optional fields */
1352*5113495bSYour Name 
1353*5113495bSYour Name 	if (he_operation->vht_oper_present) {
1354*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1355*5113495bSYour Name 			he_operation->vht_oper.info.chan_width;
1356*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1357*5113495bSYour Name 			he_operation->vht_oper.info.center_freq_seg0;
1358*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1359*5113495bSYour Name 			he_operation->vht_oper.info.center_freq_seg1;
1360*5113495bSYour Name 	}
1361*5113495bSYour Name 	if (he_operation->co_located_bss)
1362*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1363*5113495bSYour Name 				he_operation->maxbssid_ind.info.data;
1364*5113495bSYour Name 
1365*5113495bSYour Name 	if (he_operation->oper_info_6g_present) {
1366*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1367*5113495bSYour Name 			he_operation->oper_info_6g.info.primary_ch;
1368*5113495bSYour Name 		he_oper_6g_params |=
1369*5113495bSYour Name 			he_operation->oper_info_6g.info.ch_width << 0;
1370*5113495bSYour Name 		he_oper_6g_params |=
1371*5113495bSYour Name 			he_operation->oper_info_6g.info.dup_bcon << 2;
1372*5113495bSYour Name 		he_oper_6g_params |=
1373*5113495bSYour Name 			he_operation->oper_info_6g.info.reserved << 3;
1374*5113495bSYour Name 
1375*5113495bSYour Name 		hdd_he_operation->optional[filled++] = he_oper_6g_params;
1376*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1377*5113495bSYour Name 			he_operation->oper_info_6g.info.center_freq_seg0;
1378*5113495bSYour Name 		hdd_he_operation->optional[filled++] =
1379*5113495bSYour Name 			he_operation->oper_info_6g.info.center_freq_seg1;
1380*5113495bSYour Name 		hdd_he_operation->optional[filled] =
1381*5113495bSYour Name 				he_operation->oper_info_6g.info.min_rate;
1382*5113495bSYour Name 	}
1383*5113495bSYour Name 
1384*5113495bSYour Name 	if (hdd_sta_ctx->cache_conn_info.he_operation) {
1385*5113495bSYour Name 		qdf_mem_free(hdd_sta_ctx->cache_conn_info.he_operation);
1386*5113495bSYour Name 		hdd_sta_ctx->cache_conn_info.he_operation = NULL;
1387*5113495bSYour Name 	}
1388*5113495bSYour Name 
1389*5113495bSYour Name 	hdd_sta_ctx->cache_conn_info.he_oper_len = he_oper_len;
1390*5113495bSYour Name 
1391*5113495bSYour Name 	hdd_sta_ctx->cache_conn_info.he_operation = hdd_he_operation;
1392*5113495bSYour Name }
1393*5113495bSYour Name #endif
1394*5113495bSYour Name 
hdd_is_roam_sync_in_progress(struct hdd_context * hdd_ctx,uint8_t vdev_id)1395*5113495bSYour Name bool hdd_is_roam_sync_in_progress(struct hdd_context *hdd_ctx, uint8_t vdev_id)
1396*5113495bSYour Name {
1397*5113495bSYour Name 	return wlan_cm_is_roam_sync_in_progress(hdd_ctx->psoc, vdev_id);
1398*5113495bSYour Name }
1399*5113495bSYour Name 
hdd_conn_remove_connect_info(struct hdd_station_ctx * sta_ctx)1400*5113495bSYour Name void hdd_conn_remove_connect_info(struct hdd_station_ctx *sta_ctx)
1401*5113495bSYour Name {
1402*5113495bSYour Name 	/* Remove bssid and peer_macaddr */
1403*5113495bSYour Name 	qdf_mem_zero(&sta_ctx->conn_info.bssid, QDF_MAC_ADDR_SIZE);
1404*5113495bSYour Name 	qdf_mem_zero(&sta_ctx->conn_info.peer_macaddr[0],
1405*5113495bSYour Name 		     QDF_MAC_ADDR_SIZE);
1406*5113495bSYour Name 
1407*5113495bSYour Name 	/* Clear all security settings */
1408*5113495bSYour Name 	sta_ctx->conn_info.auth_type = eCSR_AUTH_TYPE_OPEN_SYSTEM;
1409*5113495bSYour Name 	sta_ctx->conn_info.uc_encrypt_type = eCSR_ENCRYPT_TYPE_NONE;
1410*5113495bSYour Name 
1411*5113495bSYour Name 	sta_ctx->conn_info.proxy_arp_service = 0;
1412*5113495bSYour Name 
1413*5113495bSYour Name 	qdf_mem_zero(&sta_ctx->conn_info.ssid, sizeof(tCsrSSIDInfo));
1414*5113495bSYour Name 
1415*5113495bSYour Name 	/*
1416*5113495bSYour Name 	 * Reset the ptk, gtk status flags to avoid using current connection
1417*5113495bSYour Name 	 * status in further connections.
1418*5113495bSYour Name 	 */
1419*5113495bSYour Name 	sta_ctx->conn_info.gtk_installed = false;
1420*5113495bSYour Name 	sta_ctx->conn_info.ptk_installed = false;
1421*5113495bSYour Name }
1422*5113495bSYour Name 
hdd_clear_roam_profile_ie(struct hdd_adapter * adapter)1423*5113495bSYour Name void hdd_clear_roam_profile_ie(struct hdd_adapter *adapter)
1424*5113495bSYour Name {
1425*5113495bSYour Name 	hdd_enter();
1426*5113495bSYour Name 
1427*5113495bSYour Name #ifdef FEATURE_WLAN_WAPI
1428*5113495bSYour Name 	adapter->wapi_info.wapi_auth_mode = WAPI_AUTH_MODE_OPEN;
1429*5113495bSYour Name 	adapter->wapi_info.wapi_mode = false;
1430*5113495bSYour Name #endif
1431*5113495bSYour Name 
1432*5113495bSYour Name 	hdd_exit();
1433*5113495bSYour Name }
1434*5113495bSYour Name 
1435*5113495bSYour Name #if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
hdd_set_unpause_queue(void * soc,uint8_t vdev_id)1436*5113495bSYour Name static inline void hdd_set_unpause_queue(void *soc, uint8_t vdev_id)
1437*5113495bSYour Name {
1438*5113495bSYour Name 	cdp_fc_vdev_unpause(soc, vdev_id,
1439*5113495bSYour Name 			    OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED, 0);
1440*5113495bSYour Name }
1441*5113495bSYour Name #else
hdd_set_unpause_queue(void * soc,uint8_t vdev_id)1442*5113495bSYour Name static inline void hdd_set_unpause_queue(void *soc, uint8_t vdev_id)
1443*5113495bSYour Name {
1444*5113495bSYour Name }
1445*5113495bSYour Name #endif
1446*5113495bSYour Name 
1447*5113495bSYour Name #ifdef FEATURE_WDS
1448*5113495bSYour Name /**
1449*5113495bSYour Name  * hdd_config_wds_repeater_mode() - configures vdev for wds repeater mode
1450*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
1451*5113495bSYour Name  * @peer_addr: peer mac address
1452*5113495bSYour Name  *
1453*5113495bSYour Name  * Configure dp vdev to detect and drop multicast echo packets and enable
1454*5113495bSYour Name  * 4 address frame format in fw.
1455*5113495bSYour Name  *
1456*5113495bSYour Name  * Return: None
1457*5113495bSYour Name  */
hdd_config_wds_repeater_mode(struct wlan_hdd_link_info * link_info,uint8_t * peer_addr)1458*5113495bSYour Name static void hdd_config_wds_repeater_mode(struct wlan_hdd_link_info *link_info,
1459*5113495bSYour Name 					 uint8_t *peer_addr)
1460*5113495bSYour Name {
1461*5113495bSYour Name 	cdp_config_param_type vdev_param;
1462*5113495bSYour Name 	ol_txrx_soc_handle soc = cds_get_context(QDF_MODULE_ID_SOC);
1463*5113495bSYour Name 
1464*5113495bSYour Name 	vdev_param.cdp_vdev_param_mec = true;
1465*5113495bSYour Name 	if (cdp_txrx_set_vdev_param(soc, link_info->vdev_id,
1466*5113495bSYour Name 				    CDP_ENABLE_MEC, vdev_param))
1467*5113495bSYour Name 		hdd_debug("Failed to set MEC param on DP vdev");
1468*5113495bSYour Name 
1469*5113495bSYour Name 	hdd_nofl_info("Turn on 4 address for peer: " QDF_MAC_ADDR_FMT,
1470*5113495bSYour Name 		      QDF_MAC_ADDR_REF(peer_addr));
1471*5113495bSYour Name 	if (sme_set_peer_param(peer_addr, WMI_HOST_PEER_USE_4ADDR, true,
1472*5113495bSYour Name 			       link_info->vdev_id))
1473*5113495bSYour Name 		hdd_err("Failed to enable WDS on vdev");
1474*5113495bSYour Name }
1475*5113495bSYour Name #else
1476*5113495bSYour Name static inline void
hdd_config_wds_repeater_mode(struct wlan_hdd_link_info * link_info,uint8_t * peer_addr)1477*5113495bSYour Name hdd_config_wds_repeater_mode(struct wlan_hdd_link_info *link_info,
1478*5113495bSYour Name 			     uint8_t *peer_addr)
1479*5113495bSYour Name {
1480*5113495bSYour Name }
1481*5113495bSYour Name #endif
1482*5113495bSYour Name 
hdd_change_peer_state(struct wlan_hdd_link_info * link_info,uint8_t * peer_mac,enum ol_txrx_peer_state sta_state)1483*5113495bSYour Name QDF_STATUS hdd_change_peer_state(struct wlan_hdd_link_info *link_info,
1484*5113495bSYour Name 				 uint8_t *peer_mac,
1485*5113495bSYour Name 				 enum ol_txrx_peer_state sta_state)
1486*5113495bSYour Name {
1487*5113495bSYour Name 	QDF_STATUS err;
1488*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
1489*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
1490*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1491*5113495bSYour Name 
1492*5113495bSYour Name 	err = cdp_peer_state_update(soc, peer_mac, sta_state);
1493*5113495bSYour Name 	if (err != QDF_STATUS_SUCCESS) {
1494*5113495bSYour Name 		hdd_err("peer state update failed");
1495*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
1496*5113495bSYour Name 	}
1497*5113495bSYour Name 
1498*5113495bSYour Name 	if (hdd_is_roam_sync_in_progress(hdd_ctx, link_info->vdev_id)) {
1499*5113495bSYour Name 		if (adapter->device_mode == QDF_STA_MODE &&
1500*5113495bSYour Name 		    (wlan_mlme_get_wds_mode(hdd_ctx->psoc) ==
1501*5113495bSYour Name 		    WLAN_WDS_MODE_REPEATER))
1502*5113495bSYour Name 			hdd_config_wds_repeater_mode(link_info, peer_mac);
1503*5113495bSYour Name 
1504*5113495bSYour Name 		hdd_son_deliver_peer_authorize_event(link_info, peer_mac);
1505*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1506*5113495bSYour Name 	}
1507*5113495bSYour Name 
1508*5113495bSYour Name 	if (sta_state == OL_TXRX_PEER_STATE_AUTH) {
1509*5113495bSYour Name 		/* Reset scan reject params on successful set key */
1510*5113495bSYour Name 		hdd_debug("Reset scan reject params");
1511*5113495bSYour Name 		hdd_init_scan_reject_params(hdd_ctx);
1512*5113495bSYour Name 
1513*5113495bSYour Name 		err = sme_set_peer_authorized(peer_mac, link_info->vdev_id);
1514*5113495bSYour Name 		if (err != QDF_STATUS_SUCCESS) {
1515*5113495bSYour Name 			hdd_err("Failed to set the peer state to authorized");
1516*5113495bSYour Name 			return QDF_STATUS_E_FAULT;
1517*5113495bSYour Name 		}
1518*5113495bSYour Name 
1519*5113495bSYour Name 		if (adapter->device_mode == QDF_STA_MODE ||
1520*5113495bSYour Name 		    adapter->device_mode == QDF_P2P_CLIENT_MODE) {
1521*5113495bSYour Name 			hdd_set_unpause_queue(soc, link_info->vdev_id);
1522*5113495bSYour Name 		}
1523*5113495bSYour Name 
1524*5113495bSYour Name 		if (adapter->device_mode == QDF_STA_MODE &&
1525*5113495bSYour Name 		    (wlan_mlme_get_wds_mode(hdd_ctx->psoc) ==
1526*5113495bSYour Name 		    WLAN_WDS_MODE_REPEATER))
1527*5113495bSYour Name 			hdd_config_wds_repeater_mode(link_info, peer_mac);
1528*5113495bSYour Name 
1529*5113495bSYour Name 		hdd_son_deliver_peer_authorize_event(link_info, peer_mac);
1530*5113495bSYour Name 	}
1531*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1532*5113495bSYour Name }
1533*5113495bSYour Name 
hdd_update_dp_vdev_flags(void * cbk_data,uint8_t vdev_id,uint32_t vdev_param,bool is_link_up)1534*5113495bSYour Name QDF_STATUS hdd_update_dp_vdev_flags(void *cbk_data,
1535*5113495bSYour Name 				    uint8_t vdev_id,
1536*5113495bSYour Name 				    uint32_t vdev_param,
1537*5113495bSYour Name 				    bool is_link_up)
1538*5113495bSYour Name {
1539*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1540*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1541*5113495bSYour Name 	struct hdd_context *hdd_ctx;
1542*5113495bSYour Name 	struct wlan_objmgr_psoc **psoc;
1543*5113495bSYour Name 	cdp_config_param_type val;
1544*5113495bSYour Name 
1545*5113495bSYour Name 	if (!cbk_data)
1546*5113495bSYour Name 		return status;
1547*5113495bSYour Name 
1548*5113495bSYour Name 	psoc = cbk_data;
1549*5113495bSYour Name 
1550*5113495bSYour Name 	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
1551*5113495bSYour Name 	if (!hdd_ctx)
1552*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1553*5113495bSYour Name 
1554*5113495bSYour Name 	if (!hdd_ctx->tdls_nap_active)
1555*5113495bSYour Name 		return status;
1556*5113495bSYour Name 
1557*5113495bSYour Name 	if (vdev_id == WLAN_INVALID_VDEV_ID) {
1558*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
1559*5113495bSYour Name 		return status;
1560*5113495bSYour Name 	}
1561*5113495bSYour Name 
1562*5113495bSYour Name 	val.cdp_vdev_param_tdls_flags = is_link_up;
1563*5113495bSYour Name 	cdp_txrx_set_vdev_param(soc, vdev_id, vdev_param, val);
1564*5113495bSYour Name 
1565*5113495bSYour Name 	return status;
1566*5113495bSYour Name }
1567*5113495bSYour Name 
hdd_roam_register_sta(struct wlan_hdd_link_info * link_info,struct qdf_mac_addr * bssid,bool is_auth_required)1568*5113495bSYour Name QDF_STATUS hdd_roam_register_sta(struct wlan_hdd_link_info *link_info,
1569*5113495bSYour Name 				 struct qdf_mac_addr *bssid,
1570*5113495bSYour Name 				 bool is_auth_required)
1571*5113495bSYour Name {
1572*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
1573*5113495bSYour Name 	struct ol_txrx_desc_type txrx_desc = {0};
1574*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1575*5113495bSYour Name 	enum phy_ch_width ch_width;
1576*5113495bSYour Name 	enum wlan_phymode phymode;
1577*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
1578*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
1579*5113495bSYour Name 
1580*5113495bSYour Name 	/* Get the Station ID from the one saved during the association */
1581*5113495bSYour Name 	if (!QDF_IS_ADDR_BROADCAST(bssid->bytes))
1582*5113495bSYour Name 		WLAN_ADDR_COPY(txrx_desc.peer_addr.bytes,
1583*5113495bSYour Name 			       bssid->bytes);
1584*5113495bSYour Name 	else
1585*5113495bSYour Name 		WLAN_ADDR_COPY(txrx_desc.peer_addr.bytes,
1586*5113495bSYour Name 			       adapter->mac_addr.bytes);
1587*5113495bSYour Name 
1588*5113495bSYour Name 	/* set the QoS field appropriately */
1589*5113495bSYour Name 	if (hdd_wmm_is_active(adapter))
1590*5113495bSYour Name 		txrx_desc.is_qos_enabled = 1;
1591*5113495bSYour Name 	else
1592*5113495bSYour Name 		txrx_desc.is_qos_enabled = 0;
1593*5113495bSYour Name 
1594*5113495bSYour Name #ifdef FEATURE_WLAN_WAPI
1595*5113495bSYour Name 	hdd_debug("WAPI STA Registered: %d",
1596*5113495bSYour Name 		   adapter->wapi_info.is_wapi_sta);
1597*5113495bSYour Name 	if (adapter->wapi_info.is_wapi_sta)
1598*5113495bSYour Name 		txrx_desc.is_wapi_supported = 1;
1599*5113495bSYour Name 	else
1600*5113495bSYour Name 		txrx_desc.is_wapi_supported = 0;
1601*5113495bSYour Name #endif /* FEATURE_WLAN_WAPI */
1602*5113495bSYour Name 
1603*5113495bSYour Name 	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_DP_ID);
1604*5113495bSYour Name 	if (!vdev)
1605*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1606*5113495bSYour Name 
1607*5113495bSYour Name 	qdf_status = ucfg_dp_sta_register_txrx_ops(vdev);
1608*5113495bSYour Name 	hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
1609*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1610*5113495bSYour Name 		hdd_err("DP tx/rx ops register failed Status: %d", qdf_status);
1611*5113495bSYour Name 		return qdf_status;
1612*5113495bSYour Name 	}
1613*5113495bSYour Name 
1614*5113495bSYour Name 	if (adapter->device_mode == QDF_NDI_MODE) {
1615*5113495bSYour Name 		phymode = ucfg_mlme_get_vdev_phy_mode(
1616*5113495bSYour Name 						adapter->hdd_ctx->psoc,
1617*5113495bSYour Name 						link_info->vdev_id);
1618*5113495bSYour Name 		ch_width = ucfg_mlme_get_ch_width_from_phymode(phymode);
1619*5113495bSYour Name 	} else {
1620*5113495bSYour Name 		ch_width = ucfg_mlme_get_peer_ch_width(adapter->hdd_ctx->psoc,
1621*5113495bSYour Name 						txrx_desc.peer_addr.bytes);
1622*5113495bSYour Name 	}
1623*5113495bSYour Name 	txrx_desc.bw = hdd_convert_ch_width_to_cdp_peer_bw(ch_width);
1624*5113495bSYour Name 	qdf_status = cdp_peer_register(soc, OL_TXRX_PDEV_ID, &txrx_desc);
1625*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1626*5113495bSYour Name 		hdd_err("cdp_peer_register() failed Status: %d [0x%08X]",
1627*5113495bSYour Name 			 qdf_status, qdf_status);
1628*5113495bSYour Name 		return qdf_status;
1629*5113495bSYour Name 	}
1630*5113495bSYour Name 
1631*5113495bSYour Name 	hdd_cm_set_peer_authenticate(link_info, &txrx_desc.peer_addr,
1632*5113495bSYour Name 				     is_auth_required);
1633*5113495bSYour Name 
1634*5113495bSYour Name 	return qdf_status;
1635*5113495bSYour Name }
1636*5113495bSYour Name 
1637*5113495bSYour Name /**
1638*5113495bSYour Name  * hdd_change_sta_state_authenticated()-
1639*5113495bSYour Name  * This function changes STA state to authenticated
1640*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
1641*5113495bSYour Name  * @roaminfo: pointer to the RoamInfo structure.
1642*5113495bSYour Name  *
1643*5113495bSYour Name  * This is called from hdd_RoamSetKeyCompleteHandler
1644*5113495bSYour Name  * in context to eCSR_ROAM_SET_KEY_COMPLETE event from fw.
1645*5113495bSYour Name  *
1646*5113495bSYour Name  * Return: 0 on success and errno on failure
1647*5113495bSYour Name  */
1648*5113495bSYour Name static int
hdd_change_sta_state_authenticated(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roaminfo)1649*5113495bSYour Name hdd_change_sta_state_authenticated(struct wlan_hdd_link_info *link_info,
1650*5113495bSYour Name 				   struct csr_roam_info *roaminfo)
1651*5113495bSYour Name {
1652*5113495bSYour Name 	uint8_t *mac_addr;
1653*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
1654*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
1655*5113495bSYour Name 	struct hdd_context *hdd_ctx;
1656*5113495bSYour Name 	QDF_STATUS status;
1657*5113495bSYour Name 	bool alt_pipe;
1658*5113495bSYour Name 
1659*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
1660*5113495bSYour Name 
1661*5113495bSYour Name 	mac_addr = sta_ctx->conn_info.bssid.bytes;
1662*5113495bSYour Name 
1663*5113495bSYour Name 	if (ucfg_ipa_is_enabled() && !sta_ctx->conn_info.is_authenticated &&
1664*5113495bSYour Name 	    adapter->device_mode == QDF_STA_MODE &&
1665*5113495bSYour Name 	    sta_ctx->conn_info.auth_type != eCSR_AUTH_TYPE_NONE &&
1666*5113495bSYour Name 	    sta_ctx->conn_info.auth_type != eCSR_AUTH_TYPE_OPEN_SYSTEM &&
1667*5113495bSYour Name 	    sta_ctx->conn_info.auth_type != eCSR_AUTH_TYPE_SHARED_KEY) {
1668*5113495bSYour Name 
1669*5113495bSYour Name 		hdd_ctx = WLAN_HDD_GET_CTX(adapter);
1670*5113495bSYour Name 		status = hdd_ipa_get_tx_pipe(hdd_ctx, link_info, &alt_pipe);
1671*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status)) {
1672*5113495bSYour Name 			hdd_debug("Failed to get alternate pipe for vdev %d",
1673*5113495bSYour Name 				  link_info->vdev_id);
1674*5113495bSYour Name 			alt_pipe = false;
1675*5113495bSYour Name 		}
1676*5113495bSYour Name 
1677*5113495bSYour Name 		ucfg_ipa_wlan_evt(adapter->hdd_ctx->pdev, adapter->dev,
1678*5113495bSYour Name 				  adapter->device_mode,
1679*5113495bSYour Name 				  link_info->vdev_id,
1680*5113495bSYour Name 				  WLAN_IPA_STA_CONNECT, mac_addr,
1681*5113495bSYour Name 				  alt_pipe);
1682*5113495bSYour Name 	}
1683*5113495bSYour Name 
1684*5113495bSYour Name 	hdd_cm_set_peer_authenticate(link_info,
1685*5113495bSYour Name 				     &sta_ctx->conn_info.bssid, false);
1686*5113495bSYour Name 
1687*5113495bSYour Name 	return 0;
1688*5113495bSYour Name }
1689*5113495bSYour Name 
1690*5113495bSYour Name /**
1691*5113495bSYour Name  * hdd_change_peer_state_after_set_key() - change the peer state on set key
1692*5113495bSYour Name  *                                         complete
1693*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
1694*5113495bSYour Name  * @roaminfo: pointer to roam info
1695*5113495bSYour Name  * @roam_result: roam result
1696*5113495bSYour Name  *
1697*5113495bSYour Name  * Peer state will be OL_TXRX_PEER_STATE_CONN until set key is complete.
1698*5113495bSYour Name  * This function checks for the successful set key completion and update
1699*5113495bSYour Name  * the peer state to OL_TXRX_PEER_STATE_AUTH.
1700*5113495bSYour Name  *
1701*5113495bSYour Name  * Return: None
1702*5113495bSYour Name  */
1703*5113495bSYour Name static void
hdd_change_peer_state_after_set_key(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roaminfo,eCsrRoamResult roam_result)1704*5113495bSYour Name hdd_change_peer_state_after_set_key(struct wlan_hdd_link_info *link_info,
1705*5113495bSYour Name 				    struct csr_roam_info *roaminfo,
1706*5113495bSYour Name 				    eCsrRoamResult roam_result)
1707*5113495bSYour Name {
1708*5113495bSYour Name 	struct hdd_station_ctx *hdd_sta_ctx;
1709*5113495bSYour Name 	eCsrEncryptionType encr_type;
1710*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
1711*5113495bSYour Name 
1712*5113495bSYour Name 	hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
1713*5113495bSYour Name 	encr_type = hdd_sta_ctx->conn_info.uc_encrypt_type;
1714*5113495bSYour Name 
1715*5113495bSYour Name 	if (eCSR_ROAM_RESULT_AUTHENTICATED == roam_result) {
1716*5113495bSYour Name 		hdd_sta_ctx->conn_info.gtk_installed = true;
1717*5113495bSYour Name 		/*
1718*5113495bSYour Name 		 * PTK exchange happens in preauthentication itself if key_mgmt
1719*5113495bSYour Name 		 * is FT-PSK, ptk_installed was false as there is no set PTK
1720*5113495bSYour Name 		 * after roaming. STA TL state moves to authenticated only if
1721*5113495bSYour Name 		 * ptk_installed is true. So, make ptk_installed to true in
1722*5113495bSYour Name 		 * case of 11R roaming.
1723*5113495bSYour Name 		 */
1724*5113495bSYour Name 		if (sme_neighbor_roam_is11r_assoc(adapter->hdd_ctx->mac_handle,
1725*5113495bSYour Name 						  link_info->vdev_id))
1726*5113495bSYour Name 			hdd_sta_ctx->conn_info.ptk_installed = true;
1727*5113495bSYour Name 	} else {
1728*5113495bSYour Name 		hdd_sta_ctx->conn_info.ptk_installed = true;
1729*5113495bSYour Name 	}
1730*5113495bSYour Name 
1731*5113495bSYour Name 	/* In WPA case move STA to authenticated when ptk is installed. Earlier
1732*5113495bSYour Name 	 * in WEP case STA was moved to AUTHENTICATED prior to setting the
1733*5113495bSYour Name 	 * unicast key and it was resulting in sending few un-encrypted packet.
1734*5113495bSYour Name 	 * Now in WEP case STA state will be moved to AUTHENTICATED after we
1735*5113495bSYour Name 	 * set the unicast and broadcast key.
1736*5113495bSYour Name 	 */
1737*5113495bSYour Name 	if ((encr_type == eCSR_ENCRYPT_TYPE_WEP40) ||
1738*5113495bSYour Name 	    (encr_type == eCSR_ENCRYPT_TYPE_WEP104) ||
1739*5113495bSYour Name 	    (encr_type == eCSR_ENCRYPT_TYPE_WEP40_STATICKEY) ||
1740*5113495bSYour Name 	    (encr_type == eCSR_ENCRYPT_TYPE_WEP104_STATICKEY)) {
1741*5113495bSYour Name 		if (hdd_sta_ctx->conn_info.gtk_installed &&
1742*5113495bSYour Name 		    hdd_sta_ctx->conn_info.ptk_installed)
1743*5113495bSYour Name 			hdd_change_sta_state_authenticated(link_info, roaminfo);
1744*5113495bSYour Name 	} else if (hdd_sta_ctx->conn_info.ptk_installed) {
1745*5113495bSYour Name 		hdd_change_sta_state_authenticated(link_info, roaminfo);
1746*5113495bSYour Name 	}
1747*5113495bSYour Name 
1748*5113495bSYour Name 	if (hdd_sta_ctx->conn_info.gtk_installed &&
1749*5113495bSYour Name 		hdd_sta_ctx->conn_info.ptk_installed) {
1750*5113495bSYour Name 		hdd_sta_ctx->conn_info.gtk_installed = false;
1751*5113495bSYour Name 		hdd_sta_ctx->conn_info.ptk_installed = false;
1752*5113495bSYour Name 	}
1753*5113495bSYour Name }
1754*5113495bSYour Name 
1755*5113495bSYour Name /**
1756*5113495bSYour Name  * hdd_roam_set_key_complete_handler() - Update the security parameters
1757*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
1758*5113495bSYour Name  * @roam_info: pointer to roam info
1759*5113495bSYour Name  * @roam_status: roam status
1760*5113495bSYour Name  * @roam_result: roam result
1761*5113495bSYour Name  *
1762*5113495bSYour Name  * Return: QDF_STATUS enumeration
1763*5113495bSYour Name  */
1764*5113495bSYour Name static QDF_STATUS
hdd_roam_set_key_complete_handler(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roam_info,eRoamCmdStatus roam_status,eCsrRoamResult roam_result)1765*5113495bSYour Name hdd_roam_set_key_complete_handler(struct wlan_hdd_link_info *link_info,
1766*5113495bSYour Name 				  struct csr_roam_info *roam_info,
1767*5113495bSYour Name 				  eRoamCmdStatus roam_status,
1768*5113495bSYour Name 				  eCsrRoamResult roam_result)
1769*5113495bSYour Name {
1770*5113495bSYour Name 	eCsrEncryptionType algorithm;
1771*5113495bSYour Name 	bool connected;
1772*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
1773*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
1774*5113495bSYour Name 
1775*5113495bSYour Name 	hdd_enter();
1776*5113495bSYour Name 
1777*5113495bSYour Name 	if (!roam_info) {
1778*5113495bSYour Name 		hdd_err("roam_info is NULL");
1779*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1780*5113495bSYour Name 	}
1781*5113495bSYour Name 
1782*5113495bSYour Name 	if (!hdd_ctx || !hdd_ctx->psoc) {
1783*5113495bSYour Name 		hdd_err("hdd_ctx or psoc is NULL");
1784*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1785*5113495bSYour Name 	}
1786*5113495bSYour Name 
1787*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
1788*5113495bSYour Name 	/*
1789*5113495bSYour Name 	 * if (WPA), tell TL to go to 'authenticated' after the keys are set.
1790*5113495bSYour Name 	 * then go to 'authenticated'.  For all other authentication types
1791*5113495bSYour Name 	 * (those that do not require upper layer authentication) we can put TL
1792*5113495bSYour Name 	 * directly into 'authenticated' state.
1793*5113495bSYour Name 	 */
1794*5113495bSYour Name 	hdd_debug("Set Key completion roam_status =%d roam_result=%d "
1795*5113495bSYour Name 		  QDF_MAC_ADDR_FMT, roam_status, roam_result,
1796*5113495bSYour Name 		  QDF_MAC_ADDR_REF(roam_info->peerMac.bytes));
1797*5113495bSYour Name 
1798*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
1799*5113495bSYour Name 	connected = hdd_conn_get_connected_cipher_algo(link_info, sta_ctx,
1800*5113495bSYour Name 						       &algorithm);
1801*5113495bSYour Name 	if (connected) {
1802*5113495bSYour Name 		hdd_change_peer_state_after_set_key(link_info,
1803*5113495bSYour Name 						    roam_info, roam_result);
1804*5113495bSYour Name 	}
1805*5113495bSYour Name 
1806*5113495bSYour Name 	policy_mgr_restart_opportunistic_timer(hdd_ctx->psoc, false);
1807*5113495bSYour Name 
1808*5113495bSYour Name 	hdd_exit();
1809*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1810*5113495bSYour Name }
1811*5113495bSYour Name 
hdd_save_peer(struct hdd_station_ctx * sta_ctx,struct qdf_mac_addr * peer_mac_addr)1812*5113495bSYour Name bool hdd_save_peer(struct hdd_station_ctx *sta_ctx,
1813*5113495bSYour Name 		   struct qdf_mac_addr *peer_mac_addr)
1814*5113495bSYour Name {
1815*5113495bSYour Name 	int idx;
1816*5113495bSYour Name 	struct qdf_mac_addr *mac_addr;
1817*5113495bSYour Name 
1818*5113495bSYour Name 	for (idx = 0; idx < MAX_PEERS; idx++) {
1819*5113495bSYour Name 		mac_addr = &sta_ctx->conn_info.peer_macaddr[idx];
1820*5113495bSYour Name 		if (qdf_is_macaddr_zero(mac_addr)) {
1821*5113495bSYour Name 			hdd_debug("adding peer: "QDF_MAC_ADDR_FMT" at idx: %d",
1822*5113495bSYour Name 				  QDF_MAC_ADDR_REF(peer_mac_addr->bytes), idx);
1823*5113495bSYour Name 			qdf_copy_macaddr(mac_addr, peer_mac_addr);
1824*5113495bSYour Name 			return true;
1825*5113495bSYour Name 		}
1826*5113495bSYour Name 	}
1827*5113495bSYour Name 
1828*5113495bSYour Name 	return false;
1829*5113495bSYour Name }
1830*5113495bSYour Name 
hdd_delete_peer(struct hdd_station_ctx * sta_ctx,struct qdf_mac_addr * peer_mac_addr)1831*5113495bSYour Name void hdd_delete_peer(struct hdd_station_ctx *sta_ctx,
1832*5113495bSYour Name 		     struct qdf_mac_addr *peer_mac_addr)
1833*5113495bSYour Name {
1834*5113495bSYour Name 	int i;
1835*5113495bSYour Name 	struct qdf_mac_addr *mac_addr;
1836*5113495bSYour Name 
1837*5113495bSYour Name 	for (i = 0; i < MAX_PEERS; i++) {
1838*5113495bSYour Name 		mac_addr = &sta_ctx->conn_info.peer_macaddr[i];
1839*5113495bSYour Name 		if (qdf_is_macaddr_equal(mac_addr, peer_mac_addr)) {
1840*5113495bSYour Name 			qdf_zero_macaddr(mac_addr);
1841*5113495bSYour Name 			return;
1842*5113495bSYour Name 		}
1843*5113495bSYour Name 	}
1844*5113495bSYour Name }
1845*5113495bSYour Name 
hdd_any_valid_peer_present(struct wlan_hdd_link_info * link_info)1846*5113495bSYour Name bool hdd_any_valid_peer_present(struct wlan_hdd_link_info *link_info)
1847*5113495bSYour Name {
1848*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
1849*5113495bSYour Name 	int i;
1850*5113495bSYour Name 	struct qdf_mac_addr *mac_addr;
1851*5113495bSYour Name 
1852*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
1853*5113495bSYour Name 	for (i = 0; i < MAX_PEERS; i++) {
1854*5113495bSYour Name 		mac_addr = &sta_ctx->conn_info.peer_macaddr[i];
1855*5113495bSYour Name 		if (!qdf_is_macaddr_zero(mac_addr) &&
1856*5113495bSYour Name 		    !qdf_is_macaddr_broadcast(mac_addr)) {
1857*5113495bSYour Name 			hdd_debug("peer: index: %u " QDF_MAC_ADDR_FMT, i,
1858*5113495bSYour Name 				  QDF_MAC_ADDR_REF(mac_addr->bytes));
1859*5113495bSYour Name 			return true;
1860*5113495bSYour Name 		}
1861*5113495bSYour Name 	}
1862*5113495bSYour Name 
1863*5113495bSYour Name 	return false;
1864*5113495bSYour Name }
1865*5113495bSYour Name 
1866*5113495bSYour Name /**
1867*5113495bSYour Name  * hdd_roam_mic_error_indication_handler() - MIC error indication handler
1868*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
1869*5113495bSYour Name  * @roam_info: pointer to roam info
1870*5113495bSYour Name  *
1871*5113495bSYour Name  * This function indicates the Mic failure to the supplicant
1872*5113495bSYour Name  *
1873*5113495bSYour Name  * Return: None
1874*5113495bSYour Name  */
1875*5113495bSYour Name static void
hdd_roam_mic_error_indication_handler(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roam_info)1876*5113495bSYour Name hdd_roam_mic_error_indication_handler(struct wlan_hdd_link_info *link_info,
1877*5113495bSYour Name 				      struct csr_roam_info *roam_info)
1878*5113495bSYour Name {
1879*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
1880*5113495bSYour Name 	tSirMicFailureInfo *mic_failure_info;
1881*5113495bSYour Name 
1882*5113495bSYour Name 	if (!hdd_cm_is_vdev_associated(link_info))
1883*5113495bSYour Name 		return;
1884*5113495bSYour Name 
1885*5113495bSYour Name 	mic_failure_info = roam_info->u.pMICFailureInfo;
1886*5113495bSYour Name 	cfg80211_michael_mic_failure(adapter->dev,
1887*5113495bSYour Name 				     mic_failure_info->taMacAddr,
1888*5113495bSYour Name 				     mic_failure_info->multicast ?
1889*5113495bSYour Name 					NL80211_KEYTYPE_GROUP :
1890*5113495bSYour Name 					NL80211_KEYTYPE_PAIRWISE,
1891*5113495bSYour Name 				     mic_failure_info->keyId,
1892*5113495bSYour Name 				     mic_failure_info->TSC,
1893*5113495bSYour Name 				     GFP_KERNEL);
1894*5113495bSYour Name }
1895*5113495bSYour Name 
1896*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
hdd_roam_register_tdlssta(struct hdd_adapter * adapter,const uint8_t * peerMac,uint8_t qos)1897*5113495bSYour Name QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
1898*5113495bSYour Name 				     const uint8_t *peerMac, uint8_t qos)
1899*5113495bSYour Name {
1900*5113495bSYour Name 	QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
1901*5113495bSYour Name 	struct ol_txrx_desc_type txrx_desc = { 0 };
1902*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1903*5113495bSYour Name 	enum phy_ch_width ch_width;
1904*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
1905*5113495bSYour Name 
1906*5113495bSYour Name 	/*
1907*5113495bSYour Name 	 * TDLS sta in BSS should be set as STA type TDLS and STA MAC should
1908*5113495bSYour Name 	 * be peer MAC, here we are working on direct Link
1909*5113495bSYour Name 	 */
1910*5113495bSYour Name 	WLAN_ADDR_COPY(txrx_desc.peer_addr.bytes, peerMac);
1911*5113495bSYour Name 
1912*5113495bSYour Name 	/* set the QoS field appropriately .. */
1913*5113495bSYour Name 	txrx_desc.is_qos_enabled = qos;
1914*5113495bSYour Name 
1915*5113495bSYour Name 	vdev = hdd_objmgr_get_vdev_by_user(adapter->deflink, WLAN_DP_ID);
1916*5113495bSYour Name 	if (!vdev)
1917*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1918*5113495bSYour Name 
1919*5113495bSYour Name 	qdf_status = ucfg_dp_tdlsta_register_txrx_ops(vdev);
1920*5113495bSYour Name 	hdd_objmgr_put_vdev_by_user(vdev, WLAN_DP_ID);
1921*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1922*5113495bSYour Name 		hdd_err("DP tx/rx ops register failed Status: %d", qdf_status);
1923*5113495bSYour Name 		return qdf_status;
1924*5113495bSYour Name 	}
1925*5113495bSYour Name 
1926*5113495bSYour Name 	ch_width = ucfg_mlme_get_peer_ch_width(adapter->hdd_ctx->psoc,
1927*5113495bSYour Name 					       txrx_desc.peer_addr.bytes);
1928*5113495bSYour Name 	txrx_desc.bw = hdd_convert_ch_width_to_cdp_peer_bw(ch_width);
1929*5113495bSYour Name 	/* Register the Station with TL...  */
1930*5113495bSYour Name 	qdf_status = cdp_peer_register(soc, OL_TXRX_PDEV_ID, &txrx_desc);
1931*5113495bSYour Name 	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
1932*5113495bSYour Name 		hdd_err("cdp_peer_register() failed Status: %d [0x%08X]",
1933*5113495bSYour Name 			qdf_status, qdf_status);
1934*5113495bSYour Name 		return qdf_status;
1935*5113495bSYour Name 	}
1936*5113495bSYour Name 
1937*5113495bSYour Name 	return qdf_status;
1938*5113495bSYour Name }
1939*5113495bSYour Name 
1940*5113495bSYour Name #endif
1941*5113495bSYour Name 
1942*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0))
1943*5113495bSYour Name 
hdd_rx_unprot_disassoc(struct net_device * dev,const u8 * buf,size_t len)1944*5113495bSYour Name static void hdd_rx_unprot_disassoc(struct net_device *dev,
1945*5113495bSYour Name 				   const u8 *buf, size_t len)
1946*5113495bSYour Name {
1947*5113495bSYour Name 	cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
1948*5113495bSYour Name }
1949*5113495bSYour Name 
hdd_rx_unprot_deauth(struct net_device * dev,const u8 * buf,size_t len)1950*5113495bSYour Name static void hdd_rx_unprot_deauth(struct net_device *dev,
1951*5113495bSYour Name 				 const u8 *buf, size_t len)
1952*5113495bSYour Name {
1953*5113495bSYour Name 	cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
1954*5113495bSYour Name }
1955*5113495bSYour Name 
1956*5113495bSYour Name #else
1957*5113495bSYour Name 
hdd_rx_unprot_disassoc(struct net_device * dev,const u8 * buf,size_t len)1958*5113495bSYour Name static void hdd_rx_unprot_disassoc(struct net_device *dev,
1959*5113495bSYour Name 				   const u8 *buf, size_t len)
1960*5113495bSYour Name {
1961*5113495bSYour Name 	cfg80211_send_unprot_disassoc(dev, buf, len);
1962*5113495bSYour Name }
1963*5113495bSYour Name 
hdd_rx_unprot_deauth(struct net_device * dev,const u8 * buf,size_t len)1964*5113495bSYour Name static void hdd_rx_unprot_deauth(struct net_device *dev,
1965*5113495bSYour Name 				 const u8 *buf, size_t len)
1966*5113495bSYour Name {
1967*5113495bSYour Name 	cfg80211_send_unprot_deauth(dev, buf, len);
1968*5113495bSYour Name }
1969*5113495bSYour Name 
1970*5113495bSYour Name #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) */
1971*5113495bSYour Name 
1972*5113495bSYour Name /**
1973*5113495bSYour Name  * hdd_indicate_unprot_mgmt_frame() - indicate unprotected management frame
1974*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
1975*5113495bSYour Name  * @frame_length: Length of the unprotected frame being passed
1976*5113495bSYour Name  * @frame: Pointer to the frame buffer
1977*5113495bSYour Name  * @frame_type: 802.11 frame type
1978*5113495bSYour Name  *
1979*5113495bSYour Name  * This function forwards the unprotected management frame to the supplicant.
1980*5113495bSYour Name  *
1981*5113495bSYour Name  * Return: nothing
1982*5113495bSYour Name  */
1983*5113495bSYour Name static void
hdd_indicate_unprot_mgmt_frame(struct wlan_hdd_link_info * link_info,uint32_t frame_length,uint8_t * frame,uint8_t frame_type)1984*5113495bSYour Name hdd_indicate_unprot_mgmt_frame(struct wlan_hdd_link_info *link_info,
1985*5113495bSYour Name 			       uint32_t frame_length, uint8_t *frame,
1986*5113495bSYour Name 			       uint8_t frame_type)
1987*5113495bSYour Name {
1988*5113495bSYour Name 	uint8_t type, subtype;
1989*5113495bSYour Name 	struct hdd_stats *hdd_stats;
1990*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
1991*5113495bSYour Name 
1992*5113495bSYour Name 	hdd_debug("Frame Type = %d Frame Length = %d",
1993*5113495bSYour Name 		  frame_type, frame_length);
1994*5113495bSYour Name 
1995*5113495bSYour Name 	if (hdd_validate_adapter(adapter))
1996*5113495bSYour Name 		return;
1997*5113495bSYour Name 
1998*5113495bSYour Name 	if (!frame_length) {
1999*5113495bSYour Name 		hdd_err("Frame Length is Invalid ZERO");
2000*5113495bSYour Name 		return;
2001*5113495bSYour Name 	}
2002*5113495bSYour Name 
2003*5113495bSYour Name 	if (!frame) {
2004*5113495bSYour Name 		hdd_err("frame is NULL");
2005*5113495bSYour Name 		return;
2006*5113495bSYour Name 	}
2007*5113495bSYour Name 
2008*5113495bSYour Name 	type = WLAN_HDD_GET_TYPE_FRM_FC(frame[0]);
2009*5113495bSYour Name 	if (type != SIR_MAC_MGMT_FRAME) {
2010*5113495bSYour Name 		hdd_warn("Unexpected frame type %d", type);
2011*5113495bSYour Name 		return;
2012*5113495bSYour Name 	}
2013*5113495bSYour Name 
2014*5113495bSYour Name 	hdd_stats = &link_info->hdd_stats;
2015*5113495bSYour Name 	subtype = WLAN_HDD_GET_SUBTYPE_FRM_FC(frame[0]);
2016*5113495bSYour Name 	switch (subtype) {
2017*5113495bSYour Name 	case SIR_MAC_MGMT_DISASSOC:
2018*5113495bSYour Name 		hdd_rx_unprot_disassoc(adapter->dev, frame, frame_length);
2019*5113495bSYour Name 		hdd_stats->hdd_pmf_stats.num_unprot_disassoc_rx++;
2020*5113495bSYour Name 		break;
2021*5113495bSYour Name 	case SIR_MAC_MGMT_DEAUTH:
2022*5113495bSYour Name 		hdd_rx_unprot_deauth(adapter->dev, frame, frame_length);
2023*5113495bSYour Name 		hdd_stats->hdd_pmf_stats.num_unprot_deauth_rx++;
2024*5113495bSYour Name 		break;
2025*5113495bSYour Name 	default:
2026*5113495bSYour Name 		hdd_warn("Unexpected frame subtype %d", subtype);
2027*5113495bSYour Name 		break;
2028*5113495bSYour Name 	}
2029*5113495bSYour Name }
2030*5113495bSYour Name 
2031*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
2032*5113495bSYour Name /**
2033*5113495bSYour Name  * hdd_indicate_tsm_ie() - send traffic stream metrics ie
2034*5113495bSYour Name  * @adapter: pointer to adapter
2035*5113495bSYour Name  * @tid: traffic identifier
2036*5113495bSYour Name  * @state: state
2037*5113495bSYour Name  * @measInterval: measurement interval
2038*5113495bSYour Name  *
2039*5113495bSYour Name  * This function sends traffic stream metrics IE information to
2040*5113495bSYour Name  * the supplicant via wireless event.
2041*5113495bSYour Name  *
2042*5113495bSYour Name  * Return: none
2043*5113495bSYour Name  */
2044*5113495bSYour Name static void
hdd_indicate_tsm_ie(struct hdd_adapter * adapter,uint8_t tid,uint8_t state,uint16_t measInterval)2045*5113495bSYour Name hdd_indicate_tsm_ie(struct hdd_adapter *adapter, uint8_t tid,
2046*5113495bSYour Name 		    uint8_t state, uint16_t measInterval)
2047*5113495bSYour Name {
2048*5113495bSYour Name 	union iwreq_data wrqu;
2049*5113495bSYour Name 	char buf[IW_CUSTOM_MAX + 1];
2050*5113495bSYour Name 	int nBytes = 0;
2051*5113495bSYour Name 
2052*5113495bSYour Name 	if (!adapter)
2053*5113495bSYour Name 		return;
2054*5113495bSYour Name 
2055*5113495bSYour Name 	/* create the event */
2056*5113495bSYour Name 	memset(&wrqu, '\0', sizeof(wrqu));
2057*5113495bSYour Name 	memset(buf, '\0', sizeof(buf));
2058*5113495bSYour Name 
2059*5113495bSYour Name 	hdd_debug("TSM Ind tid(%d) state(%d) MeasInt(%d)",
2060*5113495bSYour Name 		 tid, state, measInterval);
2061*5113495bSYour Name 
2062*5113495bSYour Name 	nBytes =
2063*5113495bSYour Name 		snprintf(buf, IW_CUSTOM_MAX, "TSMIE=%d:%d:%d", tid, state,
2064*5113495bSYour Name 			 measInterval);
2065*5113495bSYour Name 
2066*5113495bSYour Name 	wrqu.data.pointer = buf;
2067*5113495bSYour Name 	wrqu.data.length = nBytes;
2068*5113495bSYour Name 	/* send the event */
2069*5113495bSYour Name 	hdd_wext_send_event(adapter->dev, IWEVCUSTOM, &wrqu, buf);
2070*5113495bSYour Name }
2071*5113495bSYour Name 
2072*5113495bSYour Name /**
2073*5113495bSYour Name  * hdd_indicate_ese_adj_ap_rep_ind() - send adjacent AP report indication
2074*5113495bSYour Name  * @adapter: pointer to adapter
2075*5113495bSYour Name  * @roam_info: pointer to roam info
2076*5113495bSYour Name  *
2077*5113495bSYour Name  * Return: none
2078*5113495bSYour Name  */
2079*5113495bSYour Name static void
hdd_indicate_ese_adj_ap_rep_ind(struct hdd_adapter * adapter,struct csr_roam_info * roam_info)2080*5113495bSYour Name hdd_indicate_ese_adj_ap_rep_ind(struct hdd_adapter *adapter,
2081*5113495bSYour Name 				struct csr_roam_info *roam_info)
2082*5113495bSYour Name {
2083*5113495bSYour Name 	union iwreq_data wrqu;
2084*5113495bSYour Name 	char buf[IW_CUSTOM_MAX + 1];
2085*5113495bSYour Name 	int nBytes = 0;
2086*5113495bSYour Name 
2087*5113495bSYour Name 	if ((!adapter) || (!roam_info))
2088*5113495bSYour Name 		return;
2089*5113495bSYour Name 
2090*5113495bSYour Name 	/* create the event */
2091*5113495bSYour Name 	memset(&wrqu, '\0', sizeof(wrqu));
2092*5113495bSYour Name 	memset(buf, '\0', sizeof(buf));
2093*5113495bSYour Name 
2094*5113495bSYour Name 	hdd_debug("CCXADJAPREP=%u", roam_info->tsmRoamDelay);
2095*5113495bSYour Name 
2096*5113495bSYour Name 	nBytes =
2097*5113495bSYour Name 		snprintf(buf, IW_CUSTOM_MAX, "CCXADJAPREP=%u",
2098*5113495bSYour Name 			 roam_info->tsmRoamDelay);
2099*5113495bSYour Name 
2100*5113495bSYour Name 	wrqu.data.pointer = buf;
2101*5113495bSYour Name 	wrqu.data.length = nBytes;
2102*5113495bSYour Name 
2103*5113495bSYour Name 	/* send the event */
2104*5113495bSYour Name 	hdd_wext_send_event(adapter->dev, IWEVCUSTOM, &wrqu, buf);
2105*5113495bSYour Name }
2106*5113495bSYour Name 
2107*5113495bSYour Name /**
2108*5113495bSYour Name  * hdd_indicate_ese_bcn_report_no_results() - beacon report no scan results
2109*5113495bSYour Name  * @adapter: pointer to adapter
2110*5113495bSYour Name  * @measurementToken: measurement token
2111*5113495bSYour Name  * @flag: flag
2112*5113495bSYour Name  * @numBss: number of bss
2113*5113495bSYour Name  *
2114*5113495bSYour Name  * If the measurement is none and no scan results found,
2115*5113495bSYour Name  * indicate the supplicant about measurement done.
2116*5113495bSYour Name  *
2117*5113495bSYour Name  * Return: none
2118*5113495bSYour Name  */
2119*5113495bSYour Name void
hdd_indicate_ese_bcn_report_no_results(const struct hdd_adapter * adapter,const uint16_t measurementToken,const bool flag,const uint8_t numBss)2120*5113495bSYour Name hdd_indicate_ese_bcn_report_no_results(const struct hdd_adapter *adapter,
2121*5113495bSYour Name 				       const uint16_t measurementToken,
2122*5113495bSYour Name 				       const bool flag, const uint8_t numBss)
2123*5113495bSYour Name {
2124*5113495bSYour Name 	union iwreq_data wrqu;
2125*5113495bSYour Name 	char buf[IW_CUSTOM_MAX];
2126*5113495bSYour Name 	char *pos = buf;
2127*5113495bSYour Name 	int nBytes = 0, freeBytes = IW_CUSTOM_MAX;
2128*5113495bSYour Name 
2129*5113495bSYour Name 	memset(&wrqu, '\0', sizeof(wrqu));
2130*5113495bSYour Name 	memset(buf, '\0', sizeof(buf));
2131*5113495bSYour Name 
2132*5113495bSYour Name 	hdd_debug("CCXBCNREP=%d %d %d", measurementToken,
2133*5113495bSYour Name 		 flag, numBss);
2134*5113495bSYour Name 
2135*5113495bSYour Name 	nBytes =
2136*5113495bSYour Name 		snprintf(pos, freeBytes, "CCXBCNREP=%d %d %d", measurementToken,
2137*5113495bSYour Name 			 flag, numBss);
2138*5113495bSYour Name 
2139*5113495bSYour Name 	wrqu.data.pointer = buf;
2140*5113495bSYour Name 	wrqu.data.length = nBytes;
2141*5113495bSYour Name 	/* send the event */
2142*5113495bSYour Name 	hdd_wext_send_event(adapter->dev, IWEVCUSTOM, &wrqu, buf);
2143*5113495bSYour Name }
2144*5113495bSYour Name 
2145*5113495bSYour Name /**
2146*5113495bSYour Name  * hdd_indicate_ese_bcn_report_ind() - send beacon report indication
2147*5113495bSYour Name  * @adapter: pointer to adapter
2148*5113495bSYour Name  * @roam_info: pointer to roam info
2149*5113495bSYour Name  *
2150*5113495bSYour Name  * If the measurement is none and no scan results found,
2151*5113495bSYour Name  * indicate the supplicant about measurement done.
2152*5113495bSYour Name  *
2153*5113495bSYour Name  * Return: none
2154*5113495bSYour Name  */
2155*5113495bSYour Name static void
hdd_indicate_ese_bcn_report_ind(const struct hdd_adapter * adapter,const struct csr_roam_info * roam_info)2156*5113495bSYour Name hdd_indicate_ese_bcn_report_ind(const struct hdd_adapter *adapter,
2157*5113495bSYour Name 				const struct csr_roam_info *roam_info)
2158*5113495bSYour Name {
2159*5113495bSYour Name 	union iwreq_data wrqu;
2160*5113495bSYour Name 	char buf[IW_CUSTOM_MAX];
2161*5113495bSYour Name 	char *pos = buf;
2162*5113495bSYour Name 	int nBytes = 0, freeBytes = IW_CUSTOM_MAX;
2163*5113495bSYour Name 	uint8_t i = 0, len = 0;
2164*5113495bSYour Name 	uint8_t tot_bcn_ieLen = 0;  /* total size of the beacon report data */
2165*5113495bSYour Name 	uint8_t lastSent = 0, sendBss = 0;
2166*5113495bSYour Name 	int bcnRepFieldSize =
2167*5113495bSYour Name 		sizeof(roam_info->pEseBcnReportRsp->bcnRepBssInfo[0].
2168*5113495bSYour Name 		       bcnReportFields);
2169*5113495bSYour Name 	uint8_t ieLenByte = 1;
2170*5113495bSYour Name 	/*
2171*5113495bSYour Name 	 * CCXBCNREP=meas_tok<sp>flag<sp>no_of_bss<sp>tot_bcn_ie_len = 18 bytes
2172*5113495bSYour Name 	 */
2173*5113495bSYour Name #define ESEBCNREPHEADER_LEN  (18)
2174*5113495bSYour Name 
2175*5113495bSYour Name 	if ((!adapter) || (!roam_info))
2176*5113495bSYour Name 		return;
2177*5113495bSYour Name 
2178*5113495bSYour Name 	/*
2179*5113495bSYour Name 	 * Custom event can pass maximum of 256 bytes of data,
2180*5113495bSYour Name 	 * based on the IE len we need to identify how many BSS info can
2181*5113495bSYour Name 	 * be filled in to custom event data.
2182*5113495bSYour Name 	 */
2183*5113495bSYour Name 	/*
2184*5113495bSYour Name 	 * meas_tok<sp>flag<sp>no_of_bss<sp>tot_bcn_ie_len bcn_rep_data
2185*5113495bSYour Name 	 * bcn_rep_data will have bcn_rep_fields,ie_len,ie without any spaces
2186*5113495bSYour Name 	 * CCXBCNREP=meas_tok<sp>flag<sp>no_of_bss<sp>tot_bcn_ie_len = 18 bytes
2187*5113495bSYour Name 	 */
2188*5113495bSYour Name 
2189*5113495bSYour Name 	if ((roam_info->pEseBcnReportRsp->flag >> 1)
2190*5113495bSYour Name 	    && (!roam_info->pEseBcnReportRsp->numBss)) {
2191*5113495bSYour Name 		hdd_debug("Measurement Done but no scan results");
2192*5113495bSYour Name 		/* If the measurement is none and no scan results found,
2193*5113495bSYour Name 		 * indicate the supplicant about measurement done
2194*5113495bSYour Name 		 */
2195*5113495bSYour Name 		hdd_indicate_ese_bcn_report_no_results(
2196*5113495bSYour Name 				adapter,
2197*5113495bSYour Name 				roam_info->pEseBcnReportRsp->
2198*5113495bSYour Name 				measurementToken,
2199*5113495bSYour Name 				roam_info->pEseBcnReportRsp->flag,
2200*5113495bSYour Name 				roam_info->pEseBcnReportRsp->numBss);
2201*5113495bSYour Name 	} else {
2202*5113495bSYour Name 		while (lastSent < roam_info->pEseBcnReportRsp->numBss) {
2203*5113495bSYour Name 			memset(&wrqu, '\0', sizeof(wrqu));
2204*5113495bSYour Name 			memset(buf, '\0', sizeof(buf));
2205*5113495bSYour Name 			tot_bcn_ieLen = 0;
2206*5113495bSYour Name 			sendBss = 0;
2207*5113495bSYour Name 			pos = buf;
2208*5113495bSYour Name 			freeBytes = IW_CUSTOM_MAX;
2209*5113495bSYour Name 
2210*5113495bSYour Name 			for (i = lastSent;
2211*5113495bSYour Name 			     i < roam_info->pEseBcnReportRsp->numBss; i++) {
2212*5113495bSYour Name 				len =
2213*5113495bSYour Name 					bcnRepFieldSize + ieLenByte +
2214*5113495bSYour Name 					roam_info->pEseBcnReportRsp->
2215*5113495bSYour Name 					bcnRepBssInfo[i].ieLen;
2216*5113495bSYour Name 				if ((len + tot_bcn_ieLen) >
2217*5113495bSYour Name 				    (IW_CUSTOM_MAX - ESEBCNREPHEADER_LEN)) {
2218*5113495bSYour Name 					break;
2219*5113495bSYour Name 				}
2220*5113495bSYour Name 				tot_bcn_ieLen += len;
2221*5113495bSYour Name 				sendBss++;
2222*5113495bSYour Name 				hdd_debug("i(%d) sizeof bcnReportFields(%d) IeLength(%d) Length of Ie(%d) totLen(%d)",
2223*5113495bSYour Name 					 i, bcnRepFieldSize, 1,
2224*5113495bSYour Name 					 roam_info->pEseBcnReportRsp->
2225*5113495bSYour Name 					 bcnRepBssInfo[i].ieLen, tot_bcn_ieLen);
2226*5113495bSYour Name 			}
2227*5113495bSYour Name 
2228*5113495bSYour Name 			hdd_debug("Sending %d BSS Info", sendBss);
2229*5113495bSYour Name 			hdd_debug("CCXBCNREP=%d %d %d %d",
2230*5113495bSYour Name 				 roam_info->pEseBcnReportRsp->measurementToken,
2231*5113495bSYour Name 				 roam_info->pEseBcnReportRsp->flag, sendBss,
2232*5113495bSYour Name 				 tot_bcn_ieLen);
2233*5113495bSYour Name 
2234*5113495bSYour Name 			nBytes = snprintf(pos, freeBytes, "CCXBCNREP=%d %d %d ",
2235*5113495bSYour Name 					  roam_info->pEseBcnReportRsp->
2236*5113495bSYour Name 					  measurementToken,
2237*5113495bSYour Name 					  roam_info->pEseBcnReportRsp->flag,
2238*5113495bSYour Name 					  sendBss);
2239*5113495bSYour Name 			pos += nBytes;
2240*5113495bSYour Name 			freeBytes -= nBytes;
2241*5113495bSYour Name 
2242*5113495bSYour Name 			/* Copy total Beacon report data length */
2243*5113495bSYour Name 			qdf_mem_copy(pos, (char *)&tot_bcn_ieLen,
2244*5113495bSYour Name 				     sizeof(tot_bcn_ieLen));
2245*5113495bSYour Name 			pos += sizeof(tot_bcn_ieLen);
2246*5113495bSYour Name 			freeBytes -= sizeof(tot_bcn_ieLen);
2247*5113495bSYour Name 
2248*5113495bSYour Name 			for (i = 0; i < sendBss; i++) {
2249*5113495bSYour Name 				hdd_debug("ChanNum(%d) Spare(%d) MeasDuration(%d)"
2250*5113495bSYour Name 				       " PhyType(%d) RecvSigPower(%d) ParentTSF(%u)"
2251*5113495bSYour Name 				       " TargetTSF[0](%u) TargetTSF[1](%u) BeaconInterval(%u)"
2252*5113495bSYour Name 				       " CapabilityInfo(%d) BSSID(%02X:%02X:%02X:%02X:%02X:%02X)",
2253*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2254*5113495bSYour Name 				       bcnRepBssInfo[i +
2255*5113495bSYour Name 						     lastSent].bcnReportFields.
2256*5113495bSYour Name 				       ChanNum,
2257*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2258*5113495bSYour Name 				       bcnRepBssInfo[i +
2259*5113495bSYour Name 						     lastSent].bcnReportFields.
2260*5113495bSYour Name 				       Spare,
2261*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2262*5113495bSYour Name 				       bcnRepBssInfo[i +
2263*5113495bSYour Name 						     lastSent].bcnReportFields.
2264*5113495bSYour Name 				       MeasDuration,
2265*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2266*5113495bSYour Name 				       bcnRepBssInfo[i +
2267*5113495bSYour Name 						     lastSent].bcnReportFields.
2268*5113495bSYour Name 				       PhyType,
2269*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2270*5113495bSYour Name 				       bcnRepBssInfo[i +
2271*5113495bSYour Name 						     lastSent].bcnReportFields.
2272*5113495bSYour Name 				       RecvSigPower,
2273*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2274*5113495bSYour Name 				       bcnRepBssInfo[i +
2275*5113495bSYour Name 						     lastSent].bcnReportFields.
2276*5113495bSYour Name 				       ParentTsf,
2277*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2278*5113495bSYour Name 				       bcnRepBssInfo[i +
2279*5113495bSYour Name 						     lastSent].bcnReportFields.
2280*5113495bSYour Name 				       TargetTsf[0],
2281*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2282*5113495bSYour Name 				       bcnRepBssInfo[i +
2283*5113495bSYour Name 						     lastSent].bcnReportFields.
2284*5113495bSYour Name 				       TargetTsf[1],
2285*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2286*5113495bSYour Name 				       bcnRepBssInfo[i +
2287*5113495bSYour Name 						     lastSent].bcnReportFields.
2288*5113495bSYour Name 				       BcnInterval,
2289*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2290*5113495bSYour Name 				       bcnRepBssInfo[i +
2291*5113495bSYour Name 						     lastSent].bcnReportFields.
2292*5113495bSYour Name 				       CapabilityInfo,
2293*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2294*5113495bSYour Name 				       bcnRepBssInfo[i +
2295*5113495bSYour Name 						     lastSent].bcnReportFields.
2296*5113495bSYour Name 				       Bssid[0],
2297*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2298*5113495bSYour Name 				       bcnRepBssInfo[i +
2299*5113495bSYour Name 						     lastSent].bcnReportFields.
2300*5113495bSYour Name 				       Bssid[1],
2301*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2302*5113495bSYour Name 				       bcnRepBssInfo[i +
2303*5113495bSYour Name 						     lastSent].bcnReportFields.
2304*5113495bSYour Name 				       Bssid[2],
2305*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2306*5113495bSYour Name 				       bcnRepBssInfo[i +
2307*5113495bSYour Name 						     lastSent].bcnReportFields.
2308*5113495bSYour Name 				       Bssid[3],
2309*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2310*5113495bSYour Name 				       bcnRepBssInfo[i +
2311*5113495bSYour Name 						     lastSent].bcnReportFields.
2312*5113495bSYour Name 				       Bssid[4],
2313*5113495bSYour Name 				       roam_info->pEseBcnReportRsp->
2314*5113495bSYour Name 				       bcnRepBssInfo[i +
2315*5113495bSYour Name 						     lastSent].bcnReportFields.
2316*5113495bSYour Name 				       Bssid[5]);
2317*5113495bSYour Name 
2318*5113495bSYour Name 				/* bcn report fields are copied */
2319*5113495bSYour Name 				len =
2320*5113495bSYour Name 					sizeof(roam_info->pEseBcnReportRsp->
2321*5113495bSYour Name 					       bcnRepBssInfo[i +
2322*5113495bSYour Name 							     lastSent].
2323*5113495bSYour Name 					       bcnReportFields);
2324*5113495bSYour Name 				qdf_mem_copy(pos,
2325*5113495bSYour Name 					     (char *)&roam_info->
2326*5113495bSYour Name 					     pEseBcnReportRsp->bcnRepBssInfo[i +
2327*5113495bSYour Name 									     lastSent].
2328*5113495bSYour Name 					     bcnReportFields, len);
2329*5113495bSYour Name 				pos += len;
2330*5113495bSYour Name 				freeBytes -= len;
2331*5113495bSYour Name 
2332*5113495bSYour Name 				/* Add 1 byte of ie len */
2333*5113495bSYour Name 				len =
2334*5113495bSYour Name 					roam_info->pEseBcnReportRsp->
2335*5113495bSYour Name 					bcnRepBssInfo[i + lastSent].ieLen;
2336*5113495bSYour Name 				qdf_mem_copy(pos, (char *)&len, sizeof(len));
2337*5113495bSYour Name 				pos += sizeof(len);
2338*5113495bSYour Name 				freeBytes -= sizeof(len);
2339*5113495bSYour Name 
2340*5113495bSYour Name 				/* copy IE from scan results */
2341*5113495bSYour Name 				qdf_mem_copy(pos,
2342*5113495bSYour Name 					     (char *)roam_info->
2343*5113495bSYour Name 					     pEseBcnReportRsp->bcnRepBssInfo[i +
2344*5113495bSYour Name 									     lastSent].
2345*5113495bSYour Name 					     pBuf, len);
2346*5113495bSYour Name 				pos += len;
2347*5113495bSYour Name 				freeBytes -= len;
2348*5113495bSYour Name 			}
2349*5113495bSYour Name 
2350*5113495bSYour Name 			wrqu.data.pointer = buf;
2351*5113495bSYour Name 			wrqu.data.length = IW_CUSTOM_MAX - freeBytes;
2352*5113495bSYour Name 
2353*5113495bSYour Name 			/* send the event */
2354*5113495bSYour Name 			hdd_wext_send_event(adapter->dev, IWEVCUSTOM, &wrqu,
2355*5113495bSYour Name 					    buf);
2356*5113495bSYour Name 			lastSent += sendBss;
2357*5113495bSYour Name 		}
2358*5113495bSYour Name 	}
2359*5113495bSYour Name }
2360*5113495bSYour Name 
2361*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
2362*5113495bSYour Name 
2363*5113495bSYour Name /*
2364*5113495bSYour Name  * hdd_roam_channel_switch_handler() - hdd channel switch handler
2365*5113495bSYour Name  * @link_info: Link info pointer in HDD adapter
2366*5113495bSYour Name  * @roam_info: Pointer to roam info
2367*5113495bSYour Name  *
2368*5113495bSYour Name  * Return: None
2369*5113495bSYour Name  */
2370*5113495bSYour Name static void
hdd_roam_channel_switch_handler(struct wlan_hdd_link_info * link_info,struct csr_roam_info * roam_info)2371*5113495bSYour Name hdd_roam_channel_switch_handler(struct wlan_hdd_link_info *link_info,
2372*5113495bSYour Name 				struct csr_roam_info *roam_info)
2373*5113495bSYour Name {
2374*5113495bSYour Name 	struct hdd_chan_change_params chan_change = {0};
2375*5113495bSYour Name 	QDF_STATUS status;
2376*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
2377*5113495bSYour Name 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
2378*5113495bSYour Name 	mac_handle_t mac_handle;
2379*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
2380*5113495bSYour Name 	uint8_t connected_vdev;
2381*5113495bSYour Name 	bool notify = true, is_sap_go_moved_before_sta = false;
2382*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
2383*5113495bSYour Name 
2384*5113495bSYour Name 	mac_handle = hdd_adapter_get_mac_handle(adapter);
2385*5113495bSYour Name 	if (!mac_handle)
2386*5113495bSYour Name 		return;
2387*5113495bSYour Name 
2388*5113495bSYour Name 	/* Enable Roaming on STA interface which was disabled before CSA */
2389*5113495bSYour Name 	if (adapter->device_mode == QDF_STA_MODE)
2390*5113495bSYour Name 		sme_start_roaming(mac_handle, link_info->vdev_id,
2391*5113495bSYour Name 				  REASON_VDEV_RESTART_FROM_HOST,
2392*5113495bSYour Name 				  RSO_CHANNEL_SWITCH);
2393*5113495bSYour Name 
2394*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
2395*5113495bSYour Name 	if (sta_ctx) {
2396*5113495bSYour Name 		sta_ctx->conn_info.chan_freq = roam_info->chan_info.mhz;
2397*5113495bSYour Name 		sta_ctx->conn_info.ch_width = roam_info->chan_info.ch_width;
2398*5113495bSYour Name 	}
2399*5113495bSYour Name 
2400*5113495bSYour Name 	chan_change.chan_freq = roam_info->chan_info.mhz;
2401*5113495bSYour Name 	chan_change.chan_params.ch_width =
2402*5113495bSYour Name 		roam_info->chan_info.ch_width;
2403*5113495bSYour Name 	chan_change.chan_params.sec_ch_offset =
2404*5113495bSYour Name 		roam_info->chan_info.sec_ch_offset;
2405*5113495bSYour Name 	chan_change.chan_params.mhz_freq_seg0 =
2406*5113495bSYour Name 		roam_info->chan_info.band_center_freq1;
2407*5113495bSYour Name 	chan_change.chan_params.mhz_freq_seg1 =
2408*5113495bSYour Name 		roam_info->chan_info.band_center_freq2;
2409*5113495bSYour Name 
2410*5113495bSYour Name 	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
2411*5113495bSYour Name 	if (!vdev) {
2412*5113495bSYour Name 		hdd_err("Invalid vdev");
2413*5113495bSYour Name 		return;
2414*5113495bSYour Name 	}
2415*5113495bSYour Name 
2416*5113495bSYour Name 	if ((adapter->device_mode == QDF_STA_MODE ||
2417*5113495bSYour Name 	     adapter->device_mode == QDF_P2P_CLIENT_MODE)) {
2418*5113495bSYour Name 		if (!wlan_get_connected_vdev_by_bssid(
2419*5113495bSYour Name 				hdd_ctx->pdev, sta_ctx->conn_info.bssid.bytes,
2420*5113495bSYour Name 				&connected_vdev))
2421*5113495bSYour Name 			notify = false;
2422*5113495bSYour Name 		else if (link_info->vdev_id != connected_vdev ||
2423*5113495bSYour Name 			 !ucfg_cm_is_vdev_active(vdev))
2424*5113495bSYour Name 			notify = false;
2425*5113495bSYour Name 	}
2426*5113495bSYour Name 	if (notify) {
2427*5113495bSYour Name 		qdf_sched_work(0, &link_info->chan_change_notify_work);
2428*5113495bSYour Name 	} else {
2429*5113495bSYour Name 		hdd_err("BSS "QDF_MAC_ADDR_FMT" no connected with vdev %d (%d)",
2430*5113495bSYour Name 			QDF_MAC_ADDR_REF(sta_ctx->conn_info.bssid.bytes),
2431*5113495bSYour Name 			link_info->vdev_id, connected_vdev);
2432*5113495bSYour Name 	}
2433*5113495bSYour Name 	status = policy_mgr_set_hw_mode_on_channel_switch(hdd_ctx->psoc,
2434*5113495bSYour Name 							  link_info->vdev_id);
2435*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
2436*5113495bSYour Name 		hdd_debug("set hw mode change not done");
2437*5113495bSYour Name 
2438*5113495bSYour Name 	is_sap_go_moved_before_sta =
2439*5113495bSYour Name 			wlan_vdev_mlme_is_sap_go_move_before_sta(vdev);
2440*5113495bSYour Name 	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
2441*5113495bSYour Name 
2442*5113495bSYour Name 	if (!is_sap_go_moved_before_sta)
2443*5113495bSYour Name 		policy_mgr_check_concurrent_intf_and_restart_sap(
2444*5113495bSYour Name 		   hdd_ctx->psoc,
2445*5113495bSYour Name 		   !!link_info->session.ap.sap_config.acs_cfg.acs_mode);
2446*5113495bSYour Name 
2447*5113495bSYour Name 	wlan_twt_concurrency_update(hdd_ctx);
2448*5113495bSYour Name 	if (adapter->device_mode == QDF_STA_MODE ||
2449*5113495bSYour Name 	    adapter->device_mode == QDF_P2P_CLIENT_MODE) {
2450*5113495bSYour Name 		vdev = hdd_objmgr_get_vdev_by_user(link_info,
2451*5113495bSYour Name 						   WLAN_OSIF_ID);
2452*5113495bSYour Name 		if (!vdev)
2453*5113495bSYour Name 			return;
2454*5113495bSYour Name 
2455*5113495bSYour Name 		status = ucfg_if_mgr_deliver_event(
2456*5113495bSYour Name 				vdev, WLAN_IF_MGR_EV_STA_CSA_COMPLETE, NULL);
2457*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
2458*5113495bSYour Name 			hdd_debug("Failed to deliver CSA complete evt");
2459*5113495bSYour Name 
2460*5113495bSYour Name 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
2461*5113495bSYour Name 	}
2462*5113495bSYour Name }
2463*5113495bSYour Name 
2464*5113495bSYour Name #ifdef WLAN_FEATURE_HOST_ROAM
wlan_hdd_ft_set_key_delay(struct wlan_objmgr_vdev * vdev)2465*5113495bSYour Name void wlan_hdd_ft_set_key_delay(struct wlan_objmgr_vdev *vdev)
2466*5113495bSYour Name {
2467*5113495bSYour Name 	int errno = 0;
2468*5113495bSYour Name 
2469*5113495bSYour Name 	if (ucfg_cm_ft_key_ready_for_install(vdev))
2470*5113495bSYour Name 		errno =
2471*5113495bSYour Name 		wlan_cfg80211_crypto_add_key(vdev,
2472*5113495bSYour Name 					     WLAN_CRYPTO_KEY_TYPE_UNICAST,
2473*5113495bSYour Name 					     0, false);
2474*5113495bSYour Name 	if (errno)
2475*5113495bSYour Name 		hdd_err("ft set key failed");
2476*5113495bSYour Name }
2477*5113495bSYour Name #endif
2478*5113495bSYour Name 
hdd_sme_roam_callback(void * context,struct csr_roam_info * roam_info,eRoamCmdStatus roam_status,eCsrRoamResult roam_result)2479*5113495bSYour Name QDF_STATUS hdd_sme_roam_callback(void *context,
2480*5113495bSYour Name 				 struct csr_roam_info *roam_info,
2481*5113495bSYour Name 				 eRoamCmdStatus roam_status,
2482*5113495bSYour Name 				 eCsrRoamResult roam_result)
2483*5113495bSYour Name {
2484*5113495bSYour Name 	QDF_STATUS qdf_ret_status = QDF_STATUS_SUCCESS;
2485*5113495bSYour Name 	struct wlan_hdd_link_info *link_info = context;
2486*5113495bSYour Name 	struct hdd_adapter *adapter = link_info->adapter;
2487*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx = NULL;
2488*5113495bSYour Name 	struct hdd_context *hdd_ctx;
2489*5113495bSYour Name 
2490*5113495bSYour Name 	hdd_debug("CSR Callback: status=%s (%d) result= %s (%d)",
2491*5113495bSYour Name 		  get_e_roam_cmd_status_str(roam_status), roam_status,
2492*5113495bSYour Name 		  get_e_csr_roam_result_str(roam_result), roam_result);
2493*5113495bSYour Name 
2494*5113495bSYour Name 	/* Sanity check */
2495*5113495bSYour Name 	if (WLAN_HDD_ADAPTER_MAGIC != adapter->magic) {
2496*5113495bSYour Name 		hdd_err("Invalid adapter or adapter has invalid magic");
2497*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2498*5113495bSYour Name 	}
2499*5113495bSYour Name 
2500*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
2501*5113495bSYour Name 	hdd_ctx = WLAN_HDD_GET_CTX(adapter);
2502*5113495bSYour Name 
2503*5113495bSYour Name 	MTRACE(qdf_trace(QDF_MODULE_ID_HDD, TRACE_CODE_HDD_RX_SME_MSG,
2504*5113495bSYour Name 				 link_info->vdev_id, roam_status));
2505*5113495bSYour Name 
2506*5113495bSYour Name 	switch (roam_status) {
2507*5113495bSYour Name 	case eCSR_ROAM_MIC_ERROR_IND:
2508*5113495bSYour Name 		hdd_roam_mic_error_indication_handler(link_info, roam_info);
2509*5113495bSYour Name 		break;
2510*5113495bSYour Name 
2511*5113495bSYour Name 	case eCSR_ROAM_SET_KEY_COMPLETE:
2512*5113495bSYour Name 	{
2513*5113495bSYour Name 		qdf_ret_status =
2514*5113495bSYour Name 			hdd_roam_set_key_complete_handler(link_info, roam_info,
2515*5113495bSYour Name 							  roam_status,
2516*5113495bSYour Name 							  roam_result);
2517*5113495bSYour Name 		if (eCSR_ROAM_RESULT_AUTHENTICATED == roam_result)
2518*5113495bSYour Name 			hdd_debug("set key complete, session: %d",
2519*5113495bSYour Name 				  link_info->vdev_id);
2520*5113495bSYour Name 	}
2521*5113495bSYour Name 		break;
2522*5113495bSYour Name 	case eCSR_ROAM_UNPROT_MGMT_FRAME_IND:
2523*5113495bSYour Name 		if (roam_info)
2524*5113495bSYour Name 			hdd_indicate_unprot_mgmt_frame(link_info,
2525*5113495bSYour Name 						       roam_info->nFrameLength,
2526*5113495bSYour Name 						       roam_info->pbFrames,
2527*5113495bSYour Name 						       roam_info->frameType);
2528*5113495bSYour Name 		break;
2529*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
2530*5113495bSYour Name 	case eCSR_ROAM_TSM_IE_IND:
2531*5113495bSYour Name 		if (roam_info)
2532*5113495bSYour Name 			hdd_indicate_tsm_ie(adapter,
2533*5113495bSYour Name 					    roam_info->tsm_ie.tsid,
2534*5113495bSYour Name 					    roam_info->tsm_ie.state,
2535*5113495bSYour Name 					    roam_info->tsm_ie.msmt_interval);
2536*5113495bSYour Name 		break;
2537*5113495bSYour Name 	case eCSR_ROAM_ESE_ADJ_AP_REPORT_IND:
2538*5113495bSYour Name 	{
2539*5113495bSYour Name 		hdd_indicate_ese_adj_ap_rep_ind(adapter, roam_info);
2540*5113495bSYour Name 		break;
2541*5113495bSYour Name 	}
2542*5113495bSYour Name 
2543*5113495bSYour Name 	case eCSR_ROAM_ESE_BCN_REPORT_IND:
2544*5113495bSYour Name 	{
2545*5113495bSYour Name 		hdd_indicate_ese_bcn_report_ind(adapter, roam_info);
2546*5113495bSYour Name 		break;
2547*5113495bSYour Name 	}
2548*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
2549*5113495bSYour Name 	case eCSR_ROAM_STA_CHANNEL_SWITCH:
2550*5113495bSYour Name 		hdd_roam_channel_switch_handler(link_info, roam_info);
2551*5113495bSYour Name 		break;
2552*5113495bSYour Name 
2553*5113495bSYour Name 	case eCSR_ROAM_NDP_STATUS_UPDATE:
2554*5113495bSYour Name 		hdd_ndp_event_handler(link_info, roam_info,
2555*5113495bSYour Name 				      roam_status, roam_result);
2556*5113495bSYour Name 		break;
2557*5113495bSYour Name 	case eCSR_ROAM_SAE_COMPUTE:
2558*5113495bSYour Name 		if (roam_info)
2559*5113495bSYour Name 			wlan_hdd_sae_callback(link_info, roam_info);
2560*5113495bSYour Name 		break;
2561*5113495bSYour Name 	default:
2562*5113495bSYour Name 		break;
2563*5113495bSYour Name 	}
2564*5113495bSYour Name 	return qdf_ret_status;
2565*5113495bSYour Name }
2566*5113495bSYour Name 
2567*5113495bSYour Name #ifdef WLAN_FEATURE_FILS_SK
2568*5113495bSYour Name /**
2569*5113495bSYour Name  * hdd_translate_fils_rsn_to_csr_auth() - Translate FILS RSN to CSR auth type
2570*5113495bSYour Name  * @auth_suite: auth suite
2571*5113495bSYour Name  * @auth_type: pointer to enum csr_akm_type
2572*5113495bSYour Name  *
2573*5113495bSYour Name  * Return: None
2574*5113495bSYour Name  */
hdd_translate_fils_rsn_to_csr_auth(int8_t auth_suite[4],enum csr_akm_type * auth_type)2575*5113495bSYour Name static void hdd_translate_fils_rsn_to_csr_auth(int8_t auth_suite[4],
2576*5113495bSYour Name 					enum csr_akm_type *auth_type)
2577*5113495bSYour Name {
2578*5113495bSYour Name 	if (!memcmp(auth_suite, ccp_rsn_oui_0e, 4))
2579*5113495bSYour Name 		*auth_type = eCSR_AUTH_TYPE_FILS_SHA256;
2580*5113495bSYour Name 	else if (!memcmp(auth_suite, ccp_rsn_oui_0f, 4))
2581*5113495bSYour Name 		*auth_type = eCSR_AUTH_TYPE_FILS_SHA384;
2582*5113495bSYour Name 	else if (!memcmp(auth_suite, ccp_rsn_oui_10, 4))
2583*5113495bSYour Name 		*auth_type = eCSR_AUTH_TYPE_FT_FILS_SHA256;
2584*5113495bSYour Name 	else if (!memcmp(auth_suite, ccp_rsn_oui_11, 4))
2585*5113495bSYour Name 		*auth_type = eCSR_AUTH_TYPE_FT_FILS_SHA384;
2586*5113495bSYour Name }
2587*5113495bSYour Name #else
hdd_translate_fils_rsn_to_csr_auth(int8_t auth_suite[4],enum csr_akm_type * auth_type)2588*5113495bSYour Name static inline void hdd_translate_fils_rsn_to_csr_auth(int8_t auth_suite[4],
2589*5113495bSYour Name 					enum csr_akm_type *auth_type)
2590*5113495bSYour Name {
2591*5113495bSYour Name }
2592*5113495bSYour Name #endif
2593*5113495bSYour Name 
2594*5113495bSYour Name #ifdef WLAN_FEATURE_SAE
2595*5113495bSYour Name /**
2596*5113495bSYour Name  * hdd_translate_sae_rsn_to_csr_auth() - Translate SAE RSN to CSR auth type
2597*5113495bSYour Name  * @auth_suite: auth suite
2598*5113495bSYour Name  * @auth_type: pointer to enum csr_akm_type
2599*5113495bSYour Name  *
2600*5113495bSYour Name  * Return: None
2601*5113495bSYour Name  */
hdd_translate_sae_rsn_to_csr_auth(int8_t auth_suite[4],enum csr_akm_type * auth_type)2602*5113495bSYour Name static void hdd_translate_sae_rsn_to_csr_auth(int8_t auth_suite[4],
2603*5113495bSYour Name 					enum csr_akm_type *auth_type)
2604*5113495bSYour Name {
2605*5113495bSYour Name 	if (qdf_mem_cmp(auth_suite, ccp_rsn_oui_80, 4) == 0)
2606*5113495bSYour Name 		*auth_type = eCSR_AUTH_TYPE_SAE;
2607*5113495bSYour Name 	else if (qdf_mem_cmp(auth_suite, ccp_rsn_oui_90, 4) == 0)
2608*5113495bSYour Name 		*auth_type = eCSR_AUTH_TYPE_FT_SAE;
2609*5113495bSYour Name 
2610*5113495bSYour Name }
2611*5113495bSYour Name #else
hdd_translate_sae_rsn_to_csr_auth(int8_t auth_suite[4],enum csr_akm_type * auth_type)2612*5113495bSYour Name static inline void hdd_translate_sae_rsn_to_csr_auth(int8_t auth_suite[4],
2613*5113495bSYour Name 					enum csr_akm_type *auth_type)
2614*5113495bSYour Name {
2615*5113495bSYour Name }
2616*5113495bSYour Name #endif
2617*5113495bSYour Name 
hdd_filter_ft_info(const uint8_t * frame,size_t len,uint32_t * ft_info_len)2618*5113495bSYour Name void *hdd_filter_ft_info(const uint8_t *frame, size_t len,
2619*5113495bSYour Name 			 uint32_t *ft_info_len)
2620*5113495bSYour Name {
2621*5113495bSYour Name 	uint32_t ft_ie_len, md_ie_len, rsn_ie_len, ie_len;
2622*5113495bSYour Name 	const uint8_t *rsn_ie, *md_ie, *ft_ie;
2623*5113495bSYour Name 	void *ft_info;
2624*5113495bSYour Name 
2625*5113495bSYour Name 	ft_ie_len = 0;
2626*5113495bSYour Name 	md_ie_len = 0;
2627*5113495bSYour Name 	rsn_ie_len = 0;
2628*5113495bSYour Name 	ie_len = len - DOT11F_FF_CAPABILITIES_LEN - DOT11F_FF_STATUS_LEN
2629*5113495bSYour Name 			   - DOT11F_IE_AID_MAX_LEN - sizeof(tSirMacMgmtHdr);
2630*5113495bSYour Name 	rsn_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_RSN, frame, ie_len);
2631*5113495bSYour Name 
2632*5113495bSYour Name 	if (rsn_ie) {
2633*5113495bSYour Name 		rsn_ie_len = rsn_ie[1] + 2;
2634*5113495bSYour Name 		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_DEBUG,
2635*5113495bSYour Name 			(void *)rsn_ie, rsn_ie_len);
2636*5113495bSYour Name 	}
2637*5113495bSYour Name 	md_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_MOBILITYDOMAIN,
2638*5113495bSYour Name 					 frame, ie_len);
2639*5113495bSYour Name 	if (md_ie) {
2640*5113495bSYour Name 		md_ie_len = md_ie[1] + 2;
2641*5113495bSYour Name 		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_DEBUG,
2642*5113495bSYour Name 			(void *)md_ie, md_ie_len);
2643*5113495bSYour Name 	}
2644*5113495bSYour Name 	ft_ie = wlan_get_ie_ptr_from_eid(DOT11F_EID_FTINFO, frame, ie_len);
2645*5113495bSYour Name 	if (ft_ie)
2646*5113495bSYour Name 		ft_ie_len = ft_ie[1] + 2;
2647*5113495bSYour Name 
2648*5113495bSYour Name 	*ft_info_len = rsn_ie_len + md_ie_len + ft_ie_len;
2649*5113495bSYour Name 	ft_info = qdf_mem_malloc(*ft_info_len);
2650*5113495bSYour Name 	if (!ft_info)
2651*5113495bSYour Name 		return NULL;
2652*5113495bSYour Name 	if (rsn_ie_len)
2653*5113495bSYour Name 		qdf_mem_copy(ft_info, rsn_ie, rsn_ie_len);
2654*5113495bSYour Name 	if (md_ie_len)
2655*5113495bSYour Name 		qdf_mem_copy(ft_info + rsn_ie_len, md_ie, md_ie_len);
2656*5113495bSYour Name 	if (ft_ie_len)
2657*5113495bSYour Name 		qdf_mem_copy(ft_info + rsn_ie_len + md_ie_len,
2658*5113495bSYour Name 			     ft_ie, ft_ie_len);
2659*5113495bSYour Name 	return ft_info;
2660*5113495bSYour Name }
2661*5113495bSYour Name 
2662*5113495bSYour Name /**
2663*5113495bSYour Name  * hdd_translate_rsn_to_csr_auth_type() - Translate RSN to CSR auth type
2664*5113495bSYour Name  * @auth_suite: auth suite
2665*5113495bSYour Name  *
2666*5113495bSYour Name  * Return: enum csr_akm_type enumeration
2667*5113495bSYour Name  */
hdd_translate_rsn_to_csr_auth_type(uint8_t auth_suite[4])2668*5113495bSYour Name enum csr_akm_type hdd_translate_rsn_to_csr_auth_type(uint8_t auth_suite[4])
2669*5113495bSYour Name {
2670*5113495bSYour Name 	enum csr_akm_type auth_type = eCSR_AUTH_TYPE_UNKNOWN;
2671*5113495bSYour Name 	/* is the auth type supported? */
2672*5113495bSYour Name 	if (memcmp(auth_suite, ccp_rsn_oui01, 4) == 0) {
2673*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_RSN;
2674*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui02, 4) == 0) {
2675*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_RSN_PSK;
2676*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui04, 4) == 0) {
2677*5113495bSYour Name 		/* Check for 11r FT Authentication with PSK */
2678*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_FT_RSN_PSK;
2679*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui03, 4) == 0) {
2680*5113495bSYour Name 		/* Check for 11R FT Authentication with 802.1X */
2681*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_FT_RSN;
2682*5113495bSYour Name 	} else
2683*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
2684*5113495bSYour Name 	if (memcmp(auth_suite, ccp_rsn_oui06, 4) == 0) {
2685*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_CCKM_RSN;
2686*5113495bSYour Name 	} else
2687*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
2688*5113495bSYour Name 	if (memcmp(auth_suite, ccp_rsn_oui07, 4) == 0) {
2689*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_RSN_PSK_SHA256;
2690*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui08, 4) == 0) {
2691*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_RSN_8021X_SHA256;
2692*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui_18, 4) == 0) {
2693*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_OWE;
2694*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui_12, 4) == 0) {
2695*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_DPP_RSN;
2696*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui_0b, 4) == 0) {
2697*5113495bSYour Name 		/* Check for Suite B EAP 256 */
2698*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_SUITEB_EAP_SHA256;
2699*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui_0c, 4) == 0) {
2700*5113495bSYour Name 		/* Check for Suite B EAP 384 */
2701*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_SUITEB_EAP_SHA384;
2702*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui_0d, 4) == 0) {
2703*5113495bSYour Name 		/* Check for FT Suite B EAP 384 */
2704*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_FT_SUITEB_EAP_SHA384;
2705*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_rsn_oui_13, 4) == 0) {
2706*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_OSEN;
2707*5113495bSYour Name 	} else {
2708*5113495bSYour Name 		hdd_translate_fils_rsn_to_csr_auth(auth_suite, &auth_type);
2709*5113495bSYour Name 		hdd_translate_sae_rsn_to_csr_auth(auth_suite, &auth_type);
2710*5113495bSYour Name 	}
2711*5113495bSYour Name 
2712*5113495bSYour Name 	return auth_type;
2713*5113495bSYour Name }
2714*5113495bSYour Name 
2715*5113495bSYour Name /**
2716*5113495bSYour Name  * hdd_translate_wpa_to_csr_auth_type() - Translate WPA to CSR auth type
2717*5113495bSYour Name  * @auth_suite: auth suite
2718*5113495bSYour Name  *
2719*5113495bSYour Name  * Return: enum csr_akm_type enumeration
2720*5113495bSYour Name  */
hdd_translate_wpa_to_csr_auth_type(uint8_t auth_suite[4])2721*5113495bSYour Name enum csr_akm_type hdd_translate_wpa_to_csr_auth_type(uint8_t auth_suite[4])
2722*5113495bSYour Name {
2723*5113495bSYour Name 	enum csr_akm_type auth_type = eCSR_AUTH_TYPE_UNKNOWN;
2724*5113495bSYour Name 	/* is the auth type supported? */
2725*5113495bSYour Name 	if (memcmp(auth_suite, ccp_wpa_oui01, 4) == 0) {
2726*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_WPA;
2727*5113495bSYour Name 	} else if (memcmp(auth_suite, ccp_wpa_oui02, 4) == 0) {
2728*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_WPA_PSK;
2729*5113495bSYour Name 	} else
2730*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
2731*5113495bSYour Name 	if (memcmp(auth_suite, ccp_wpa_oui06, 4) == 0) {
2732*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_CCKM_WPA;
2733*5113495bSYour Name 	} else
2734*5113495bSYour Name #endif /* FEATURE_WLAN_ESE */
2735*5113495bSYour Name 	{
2736*5113495bSYour Name 		hdd_translate_fils_rsn_to_csr_auth(auth_suite, &auth_type);
2737*5113495bSYour Name 	}
2738*5113495bSYour Name 
2739*5113495bSYour Name 	return auth_type;
2740*5113495bSYour Name }
2741*5113495bSYour Name 
2742*5113495bSYour Name /**
2743*5113495bSYour Name  * hdd_translate_rsn_to_csr_encryption_type() -
2744*5113495bSYour Name  *	Translate RSN to CSR encryption type
2745*5113495bSYour Name  * @cipher_suite: cipher suite
2746*5113495bSYour Name  *
2747*5113495bSYour Name  * Return: eCsrEncryptionType enumeration
2748*5113495bSYour Name  */
2749*5113495bSYour Name eCsrEncryptionType
hdd_translate_rsn_to_csr_encryption_type(uint8_t cipher_suite[4])2750*5113495bSYour Name hdd_translate_rsn_to_csr_encryption_type(uint8_t cipher_suite[4])
2751*5113495bSYour Name {
2752*5113495bSYour Name 	eCsrEncryptionType cipher_type;
2753*5113495bSYour Name 
2754*5113495bSYour Name 	if (memcmp(cipher_suite, ccp_rsn_oui04, 4) == 0)
2755*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_AES;
2756*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_rsn_oui09, 4) == 0)
2757*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_AES_GCMP;
2758*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_rsn_oui0a, 4) == 0)
2759*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_AES_GCMP_256;
2760*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_rsn_oui02, 4) == 0)
2761*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_TKIP;
2762*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_rsn_oui00, 4) == 0)
2763*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_NONE;
2764*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_rsn_oui01, 4) == 0)
2765*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
2766*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_rsn_oui05, 4) == 0)
2767*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
2768*5113495bSYour Name 	else
2769*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_FAILED;
2770*5113495bSYour Name 
2771*5113495bSYour Name 	return cipher_type;
2772*5113495bSYour Name }
2773*5113495bSYour Name 
2774*5113495bSYour Name /**
2775*5113495bSYour Name  * hdd_translate_wpa_to_csr_encryption_type() -
2776*5113495bSYour Name  *	Translate WPA to CSR encryption type
2777*5113495bSYour Name  * @cipher_suite: cipher suite
2778*5113495bSYour Name  *
2779*5113495bSYour Name  * Return: eCsrEncryptionType enumeration
2780*5113495bSYour Name  */
2781*5113495bSYour Name eCsrEncryptionType
hdd_translate_wpa_to_csr_encryption_type(uint8_t cipher_suite[4])2782*5113495bSYour Name hdd_translate_wpa_to_csr_encryption_type(uint8_t cipher_suite[4])
2783*5113495bSYour Name {
2784*5113495bSYour Name 	eCsrEncryptionType cipher_type;
2785*5113495bSYour Name 
2786*5113495bSYour Name 	if (memcmp(cipher_suite, ccp_wpa_oui04, 4) == 0)
2787*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_AES;
2788*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_wpa_oui02, 4) == 0)
2789*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_TKIP;
2790*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_wpa_oui00, 4) == 0)
2791*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_NONE;
2792*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_wpa_oui01, 4) == 0)
2793*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_WEP40_STATICKEY;
2794*5113495bSYour Name 	else if (memcmp(cipher_suite, ccp_wpa_oui05, 4) == 0)
2795*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_WEP104_STATICKEY;
2796*5113495bSYour Name 	else
2797*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_FAILED;
2798*5113495bSYour Name 
2799*5113495bSYour Name 	return cipher_type;
2800*5113495bSYour Name }
2801*5113495bSYour Name 
2802*5113495bSYour Name #ifdef FEATURE_WLAN_WAPI
hdd_translate_wapi_to_csr_auth_type(uint8_t auth_suite[4])2803*5113495bSYour Name enum csr_akm_type hdd_translate_wapi_to_csr_auth_type(uint8_t auth_suite[4])
2804*5113495bSYour Name {
2805*5113495bSYour Name 	enum csr_akm_type auth_type;
2806*5113495bSYour Name 
2807*5113495bSYour Name 	if (memcmp(auth_suite, ccp_wapi_oui01, 4) == 0)
2808*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_WAPI_WAI_CERTIFICATE;
2809*5113495bSYour Name 	else if (memcmp(auth_suite, ccp_wapi_oui02, 4) == 0)
2810*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_WAPI_WAI_PSK;
2811*5113495bSYour Name 	else
2812*5113495bSYour Name 		auth_type = eCSR_AUTH_TYPE_UNKNOWN;
2813*5113495bSYour Name 
2814*5113495bSYour Name 	return auth_type;
2815*5113495bSYour Name }
2816*5113495bSYour Name 
2817*5113495bSYour Name eCsrEncryptionType
hdd_translate_wapi_to_csr_encryption_type(uint8_t cipher_suite[4])2818*5113495bSYour Name hdd_translate_wapi_to_csr_encryption_type(uint8_t cipher_suite[4])
2819*5113495bSYour Name {
2820*5113495bSYour Name 	eCsrEncryptionType cipher_type;
2821*5113495bSYour Name 
2822*5113495bSYour Name 	if (memcmp(cipher_suite, ccp_wapi_oui01, 4) == 0 ||
2823*5113495bSYour Name 		   memcmp(cipher_suite, ccp_wapi_oui02, 4) == 0)
2824*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_WPI;
2825*5113495bSYour Name 	else
2826*5113495bSYour Name 		cipher_type = eCSR_ENCRYPT_TYPE_FAILED;
2827*5113495bSYour Name 
2828*5113495bSYour Name 	return cipher_type;
2829*5113495bSYour Name }
2830*5113495bSYour Name #endif /* FEATURE_WLAN_WAPI */
2831*5113495bSYour Name 
2832*5113495bSYour Name enum cdp_peer_bw
hdd_convert_ch_width_to_cdp_peer_bw(enum phy_ch_width ch_width)2833*5113495bSYour Name hdd_convert_ch_width_to_cdp_peer_bw(enum phy_ch_width ch_width)
2834*5113495bSYour Name {
2835*5113495bSYour Name 	switch (ch_width) {
2836*5113495bSYour Name 	case CH_WIDTH_20MHZ:
2837*5113495bSYour Name 		return CDP_20_MHZ;
2838*5113495bSYour Name 	case CH_WIDTH_40MHZ:
2839*5113495bSYour Name 		return CDP_40_MHZ;
2840*5113495bSYour Name 	case CH_WIDTH_80MHZ:
2841*5113495bSYour Name 		return CDP_80_MHZ;
2842*5113495bSYour Name 	case CH_WIDTH_160MHZ:
2843*5113495bSYour Name 		return CDP_160_MHZ;
2844*5113495bSYour Name 	case CH_WIDTH_80P80MHZ:
2845*5113495bSYour Name 		return CDP_80P80_MHZ;
2846*5113495bSYour Name 	case CH_WIDTH_5MHZ:
2847*5113495bSYour Name 		return CDP_5_MHZ;
2848*5113495bSYour Name 	case CH_WIDTH_10MHZ:
2849*5113495bSYour Name 		return CDP_10_MHZ;
2850*5113495bSYour Name 	case CH_WIDTH_320MHZ:
2851*5113495bSYour Name 		return CDP_320_MHZ;
2852*5113495bSYour Name 	default:
2853*5113495bSYour Name 		return CDP_BW_INVALID;
2854*5113495bSYour Name 	}
2855*5113495bSYour Name 
2856*5113495bSYour Name 	return CDP_BW_INVALID;
2857*5113495bSYour Name }
2858*5113495bSYour Name 
2859*5113495bSYour Name #ifdef WLAN_FEATURE_FILS_SK
hdd_is_fils_connection(struct hdd_context * hdd_ctx,struct hdd_adapter * adapter)2860*5113495bSYour Name bool hdd_is_fils_connection(struct hdd_context *hdd_ctx,
2861*5113495bSYour Name 			    struct hdd_adapter *adapter)
2862*5113495bSYour Name {
2863*5113495bSYour Name 	struct wlan_fils_connection_info *fils_info;
2864*5113495bSYour Name 
2865*5113495bSYour Name 	fils_info = wlan_cm_get_fils_connection_info(hdd_ctx->psoc,
2866*5113495bSYour Name 						     adapter->deflink->vdev_id);
2867*5113495bSYour Name 	if (fils_info)
2868*5113495bSYour Name 		return fils_info->is_fils_connection;
2869*5113495bSYour Name 
2870*5113495bSYour Name 	return false;
2871*5113495bSYour Name }
2872*5113495bSYour Name #else
hdd_is_fils_connection(struct hdd_context * hdd_ctx,struct hdd_adapter * adapter)2873*5113495bSYour Name bool hdd_is_fils_connection(struct hdd_context *hdd_ctx,
2874*5113495bSYour Name 			    struct hdd_adapter *adapter)
2875*5113495bSYour Name {
2876*5113495bSYour Name 	return false;
2877*5113495bSYour Name }
2878*5113495bSYour Name #endif
2879*5113495bSYour Name 
hdd_roam_profile_init(struct wlan_hdd_link_info * link_info)2880*5113495bSYour Name void hdd_roam_profile_init(struct wlan_hdd_link_info *link_info)
2881*5113495bSYour Name {
2882*5113495bSYour Name 	struct csr_roam_profile *roam_profile;
2883*5113495bSYour Name 	struct hdd_station_ctx *sta_ctx;
2884*5113495bSYour Name 
2885*5113495bSYour Name 	hdd_enter();
2886*5113495bSYour Name 
2887*5113495bSYour Name 	roam_profile = hdd_roam_profile(link_info);
2888*5113495bSYour Name 	qdf_mem_zero(roam_profile, sizeof(*roam_profile));
2889*5113495bSYour Name 
2890*5113495bSYour Name 	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
2891*5113495bSYour Name 
2892*5113495bSYour Name 	/* Configure the roaming profile links to SSID and bssid. */
2893*5113495bSYour Name 	roam_profile->SSIDs.numOfSSIDs = 0;
2894*5113495bSYour Name 	roam_profile->SSIDs.SSIDList = &sta_ctx->conn_info.ssid;
2895*5113495bSYour Name 
2896*5113495bSYour Name 	roam_profile->BSSIDs.numOfBSSIDs = 0;
2897*5113495bSYour Name 	roam_profile->BSSIDs.bssid = &sta_ctx->conn_info.bssid;
2898*5113495bSYour Name 
2899*5113495bSYour Name 	/* Set the numOfChannels to zero to scan all the channels */
2900*5113495bSYour Name 	roam_profile->ChannelInfo.numOfChannels = 0;
2901*5113495bSYour Name 	roam_profile->ChannelInfo.freq_list = NULL;
2902*5113495bSYour Name 
2903*5113495bSYour Name 	roam_profile->BSSType = eCSR_BSS_TYPE_INFRASTRUCTURE;
2904*5113495bSYour Name 
2905*5113495bSYour Name 	roam_profile->phyMode = eCSR_DOT11_MODE_AUTO;
2906*5113495bSYour Name 
2907*5113495bSYour Name 	/* Set the default scan mode */
2908*5113495bSYour Name 	link_info->adapter->scan_info.scan_mode = eSIR_ACTIVE_SCAN;
2909*5113495bSYour Name 
2910*5113495bSYour Name 	hdd_clear_roam_profile_ie(link_info->adapter);
2911*5113495bSYour Name 	hdd_exit();
2912*5113495bSYour Name }
2913*5113495bSYour Name 
2914*5113495bSYour Name struct osif_cm_ops osif_ops = {
2915*5113495bSYour Name 	.connect_active_notify_cb = hdd_cm_connect_active_notify,
2916*5113495bSYour Name 	.connect_complete_cb = hdd_cm_connect_complete,
2917*5113495bSYour Name 	.disconnect_complete_cb = hdd_cm_disconnect_complete,
2918*5113495bSYour Name 	.netif_queue_control_cb = hdd_cm_netif_queue_control,
2919*5113495bSYour Name 	.napi_serialize_control_cb = hdd_cm_napi_serialize_control,
2920*5113495bSYour Name 	.save_gtk_cb = hdd_cm_save_gtk,
2921*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
2922*5113495bSYour Name 	.roam_rt_stats_event_cb = wlan_hdd_cfg80211_roam_events_callback,
2923*5113495bSYour Name #endif
2924*5113495bSYour Name #ifdef WLAN_FEATURE_FILS_SK
2925*5113495bSYour Name 	.set_hlp_data_cb = hdd_cm_set_hlp_data,
2926*5113495bSYour Name #endif
2927*5113495bSYour Name #ifdef WLAN_FEATURE_PREAUTH_ENABLE
2928*5113495bSYour Name 	.ft_preauth_complete_cb = hdd_cm_ft_preauth_complete,
2929*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
2930*5113495bSYour Name 	.cckm_preauth_complete_cb = hdd_cm_cckm_preauth_complete,
2931*5113495bSYour Name #endif
2932*5113495bSYour Name #endif
2933*5113495bSYour Name #ifdef WLAN_VENDOR_HANDOFF_CONTROL
2934*5113495bSYour Name 	.vendor_handoff_params_cb = hdd_cm_get_vendor_handoff_params,
2935*5113495bSYour Name #endif
2936*5113495bSYour Name 	.send_vdev_keys_cb = hdd_cm_send_vdev_keys,
2937*5113495bSYour Name 	.get_scan_ie_params_cb = hdd_cm_get_scan_ie_params,
2938*5113495bSYour Name #ifdef WLAN_BOOST_CPU_FREQ_IN_ROAM
2939*5113495bSYour Name 	.perfd_set_cpufreq_cb = hdd_cm_perfd_set_cpufreq,
2940*5113495bSYour Name #endif
2941*5113495bSYour Name };
2942*5113495bSYour Name 
hdd_cm_register_cb(void)2943*5113495bSYour Name QDF_STATUS hdd_cm_register_cb(void)
2944*5113495bSYour Name {
2945*5113495bSYour Name 	QDF_STATUS status;
2946*5113495bSYour Name 	osif_cm_set_legacy_cb(&osif_ops);
2947*5113495bSYour Name 
2948*5113495bSYour Name 	status = osif_cm_register_cb();
2949*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
2950*5113495bSYour Name 		return status;
2951*5113495bSYour Name 
2952*5113495bSYour Name 	/* Overwrite with UTF cb if UTF enabled */
2953*5113495bSYour Name 	return cm_utf_register_os_if_cb();
2954*5113495bSYour Name }
2955*5113495bSYour Name 
hdd_cm_unregister_cb(void)2956*5113495bSYour Name void hdd_cm_unregister_cb(void)
2957*5113495bSYour Name {
2958*5113495bSYour Name 	osif_cm_reset_legacy_cb();
2959*5113495bSYour Name }
2960