1 /*
2  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * This file lim_assoc_utils.h contains the utility definitions
22  * LIM uses while processing Re/Association messages.
23  * Author:        Chandra Modumudi
24  * Date:          02/13/02
25  * History:-
26  * Date           Modified by    Modification Information
27  * --------------------------------------------------------------------
28  * 05/26/10       js             WPA handling in (Re)Assoc frames
29  *
30  */
31 #ifndef __LIM_ASSOC_UTILS_H
32 #define __LIM_ASSOC_UTILS_H
33 
34 #include "sir_api.h"
35 #include "sir_debug.h"
36 
37 #include "lim_types.h"
38 #include "wlan_cm_api.h"
39 
40 #define SIZE_OF_NOA_DESCRIPTOR 13
41 #define MAX_NOA_PERIOD_IN_MICROSECS 3000000
42 
43 uint8_t lim_compare_capabilities(struct mac_context *,
44 				 tSirAssocReq *,
45 				 tSirMacCapabilityInfo *, struct pe_session *);
46 uint8_t lim_check_rx_basic_rates(struct mac_context *, tSirMacRateSet, struct pe_session *);
47 uint8_t lim_check_mcs_set(struct mac_context *mac, uint8_t *supportedMCSSet);
48 
49 /**
50  * lim_cleanup_rx_path() - Called to cleanup STA state at SP & RFP.
51  * @mac: Pointer to Global MAC structure
52  * @sta: Pointer to the per STA data structure initialized by LIM
53  *	 and maintained at DPH
54  * @pe_session: pointer to pe session
55  * @delete_peer: is peer delete allowed
56  *
57  * To circumvent RFP's handling of dummy packet when it does not
58  * have an incomplete packet for the STA to be deleted, a packet
59  * with 'more framgents' bit set will be queued to RFP's WQ before
60  * queuing 'dummy packet'.
61  * A 'dummy' BD is pushed into RFP's WQ with type=00, subtype=1010
62  * (Disassociation frame) and routing flags in BD set to eCPU's
63  * Low Priority WQ.
64  * RFP cleans up its local context for the STA id mentioned in the
65  * BD and then pushes BD to eCPU's low priority WQ.
66  *
67  * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
68  */
69 QDF_STATUS lim_cleanup_rx_path(struct mac_context *, tpDphHashNode,
70 			       struct pe_session *, bool delete_peer);
71 
72 void lim_reject_association(struct mac_context *, tSirMacAddr, uint8_t,
73 			    uint8_t, tAniAuthType, uint16_t, uint8_t,
74 			    enum wlan_status_code, struct pe_session *);
75 
76 QDF_STATUS lim_populate_peer_rate_set(struct mac_context *mac,
77 				      struct supported_rates *pRates,
78 				      uint8_t *pSupportedMCSSet,
79 				      uint8_t basicOnly,
80 				      struct pe_session *pe_session,
81 				      tDot11fIEVHTCaps *pVHTCaps,
82 				      tDot11fIEhe_cap *he_caps,
83 				      tDot11fIEeht_cap *eht_caps,
84 				      struct sDphHashNode *sta_ds,
85 				      struct bss_description *bss_desc);
86 
87 /**
88  * lim_populate_own_rate_set() - comprises the basic and extended rates read
89  *                                from CFG
90  * @mac_ctx: pointer to global mac structure
91  * @rates: pointer to supported rates
92  * @supported_mcs_set: pointer to supported mcs rates
93  * @basic_only: update only basic rates if set true
94  * @session_entry: pe session entry
95  * @vht_caps: pointer to vht capability
96  * @he_caps: pointer to HE capability
97  * @eht_caps: pointer to EHT capability
98  *
99  * This function is called by limProcessAssocRsp() or
100  * lim_add_staInIBSS()
101  * - It creates a combined rate set of 12 rates max which
102  *   comprises the basic and extended rates read from CFG
103  * - It sorts the combined rate Set and copy it in the
104  *   rate array of the pSTA descriptor
105  * - It sets the erpEnabled bit of the STA descriptor
106  * ERP bit is set iff the dph PHY mode is 11G and there is at least
107  * an A rate in the supported or extended rate sets
108  *
109  * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE.
110  */
111 QDF_STATUS lim_populate_own_rate_set(struct mac_context *mac_ctx,
112 				     struct supported_rates *rates,
113 				     uint8_t *supported_mcs_set,
114 				     uint8_t basic_only,
115 				     struct pe_session *session_entry,
116 				     struct sDot11fIEVHTCaps *vht_caps,
117 				     struct sDot11fIEhe_cap *he_caps,
118 				     struct sDot11fIEeht_cap *eht_caps);
119 
120 QDF_STATUS lim_populate_matching_rate_set(struct mac_context *mac_ctx,
121 					  tpDphHashNode sta_ds,
122 					  tSirMacRateSet *oper_rate_set,
123 					  tSirMacRateSet *ext_rate_set,
124 					  uint8_t *supported_mcs_set,
125 					  struct pe_session *session_entry,
126 					  tDot11fIEVHTCaps *vht_caps,
127 					  tDot11fIEhe_cap *he_caps,
128 					  tDot11fIEeht_cap *eht_caps);
129 
130 QDF_STATUS lim_add_sta(struct mac_context *, tpDphHashNode, uint8_t, struct pe_session *);
131 QDF_STATUS lim_del_bss(struct mac_context *, tpDphHashNode, uint16_t, struct pe_session *);
132 QDF_STATUS lim_del_sta(struct mac_context *, tpDphHashNode, bool, struct pe_session *);
133 QDF_STATUS lim_add_sta_self(struct mac_context *, uint8_t, struct pe_session *);
134 
135 /**
136  *lim_del_peer_info() - remove all peer information from host driver and fw
137  * @mac:    Pointer to Global MAC structure
138  * @pe_session: Pointer to PE Session entry
139  *
140  * @Return: QDF_STATUS
141  */
142 QDF_STATUS lim_del_peer_info(struct mac_context *mac,
143 			     struct pe_session *pe_session);
144 
145 /**
146  * lim_del_sta_all() - Cleanup all peers associated with VDEV
147  * @mac:    Pointer to Global MAC structure
148  * @pe_session: Pointer to PE Session entry
149  *
150  * @Return: QDF Status of operation.
151  */
152 QDF_STATUS lim_del_sta_all(struct mac_context *mac,
153 			   struct pe_session *pe_session);
154 
155 #ifdef WLAN_FEATURE_HOST_ROAM
156 void lim_restore_pre_reassoc_state(struct mac_context *,
157 				   tSirResultCodes, uint16_t, struct pe_session *);
158 void lim_post_reassoc_failure(struct mac_context *,
159 			      tSirResultCodes, uint16_t, struct pe_session *);
160 bool lim_is_reassoc_in_progress(struct mac_context *, struct pe_session *);
161 
162 void lim_handle_add_bss_in_re_assoc_context(struct mac_context *mac,
163 		tpDphHashNode sta, struct pe_session *pe_session);
164 void lim_handle_del_bss_in_re_assoc_context(struct mac_context *mac,
165 		   tpDphHashNode sta, struct pe_session *pe_session);
166 void lim_send_retry_reassoc_req_frame(struct mac_context *mac,
167 	      tLimMlmReassocReq *pMlmReassocReq, struct pe_session *pe_session);
168 QDF_STATUS lim_add_ft_sta_self(struct mac_context *mac, uint16_t assocId,
169 				  struct pe_session *pe_session);
170 #else
lim_restore_pre_reassoc_state(struct mac_context * mac_ctx,tSirResultCodes res_code,uint16_t prot_status,struct pe_session * pe_session)171 static inline void lim_restore_pre_reassoc_state(struct mac_context *mac_ctx,
172 			tSirResultCodes res_code, uint16_t prot_status,
173 			struct pe_session *pe_session)
174 {}
lim_post_reassoc_failure(struct mac_context * mac_ctx,tSirResultCodes res_code,uint16_t prot_status,struct pe_session * pe_session)175 static inline void lim_post_reassoc_failure(struct mac_context *mac_ctx,
176 			      tSirResultCodes res_code, uint16_t prot_status,
177 			      struct pe_session *pe_session)
178 {}
lim_handle_add_bss_in_re_assoc_context(struct mac_context * mac,tpDphHashNode sta,struct pe_session * pe_session)179 static inline void lim_handle_add_bss_in_re_assoc_context(struct mac_context *mac,
180 		tpDphHashNode sta, struct pe_session *pe_session)
181 {}
lim_handle_del_bss_in_re_assoc_context(struct mac_context * mac,tpDphHashNode sta,struct pe_session * pe_session)182 static inline void lim_handle_del_bss_in_re_assoc_context(struct mac_context *mac,
183 		   tpDphHashNode sta, struct pe_session *pe_session)
184 {}
lim_send_retry_reassoc_req_frame(struct mac_context * mac,tLimMlmReassocReq * pMlmReassocReq,struct pe_session * pe_session)185 static inline void lim_send_retry_reassoc_req_frame(struct mac_context *mac,
186 	      tLimMlmReassocReq *pMlmReassocReq, struct pe_session *pe_session)
187 {}
lim_is_reassoc_in_progress(struct mac_context * mac_ctx,struct pe_session * pe_session)188 static inline bool lim_is_reassoc_in_progress(struct mac_context *mac_ctx,
189 		struct pe_session *pe_session)
190 {
191 	return false;
192 }
lim_add_ft_sta_self(struct mac_context * mac,uint16_t assocId,struct pe_session * pe_session)193 static inline QDF_STATUS lim_add_ft_sta_self(struct mac_context *mac,
194 		uint16_t assocId, struct pe_session *pe_session)
195 {
196 	return QDF_STATUS_SUCCESS;
197 }
198 #endif
199 
200 #ifdef WLAN_FEATURE_11BE
201 static inline bool
lim_is_add_sta_params_eht_capable(tpAddStaParams add_sta_params)202 lim_is_add_sta_params_eht_capable(tpAddStaParams add_sta_params)
203 {
204 	return add_sta_params->eht_capable;
205 }
206 #else
207 static inline bool
lim_is_add_sta_params_eht_capable(tpAddStaParams add_sta_params)208 lim_is_add_sta_params_eht_capable(tpAddStaParams add_sta_params)
209 {
210 	return false;
211 }
212 #endif
213 
214 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
lim_is_roam_synch_in_progress(struct wlan_objmgr_psoc * psoc,struct pe_session * pe_session)215 static inline bool lim_is_roam_synch_in_progress(struct wlan_objmgr_psoc *psoc,
216 						 struct pe_session *pe_session)
217 {
218 	return wlan_cm_is_vdev_roam_sync_inprogress(pe_session->vdev);
219 }
220 #else
lim_is_roam_synch_in_progress(struct wlan_objmgr_psoc * psoc,struct pe_session * pe_session)221 static inline bool lim_is_roam_synch_in_progress(struct wlan_objmgr_psoc *psoc,
222 						 struct pe_session *pe_session)
223 {
224 	return false;
225 }
226 #endif
227 
228 void
229 lim_send_del_sta_cnf(struct mac_context *mac, struct qdf_mac_addr sta_dsaddr,
230 		     uint16_t staDsAssocId,
231 		     struct lim_sta_context mlmStaContext,
232 		     tSirResultCodes status_code,
233 		     struct pe_session *pe_session);
234 
235 void lim_handle_cnf_wait_timeout(struct mac_context *mac, uint16_t staId);
236 void lim_delete_dph_hash_entry(struct mac_context *, tSirMacAddr, uint16_t, struct pe_session *);
237 void lim_check_and_announce_join_success(struct mac_context *,
238 					 tSirProbeRespBeacon *,
239 					 tpSirMacMgmtHdr, struct pe_session *);
240 void lim_update_re_assoc_globals(struct mac_context *mac,
241 				 tpSirAssocRsp pAssocRsp,
242 				 struct pe_session *pe_session);
243 
244 void lim_update_assoc_sta_datas(struct mac_context *mac,
245 				tpDphHashNode sta, tpSirAssocRsp pAssocRsp,
246 				struct pe_session *pe_session,
247 				tSchBeaconStruct *beacon);
248 
249 /**
250  * lim_sta_add_bss_update_ht_parameter() - function to update ht related
251  *                                         parameters when add bss request
252  * @bss_chan_freq: operating frequency of bss
253  * @ht_cap: ht capability extract from beacon/assoc response
254  * @ht_inf: ht information extract from beacon/assoc response
255  * @chan_width_support: local wide bandwidth support capability
256  * @add_bss: add bss request struct to be updated
257  *
258  * Return: none
259  */
260 void lim_sta_add_bss_update_ht_parameter(uint32_t bss_chan_freq,
261 					 tDot11fIEHTCaps* ht_cap,
262 					 tDot11fIEHTInfo* ht_inf,
263 					 bool chan_width_support,
264 					 struct bss_params *add_bss);
265 
266 /**
267  * lim_sta_send_add_bss() - add bss and send peer assoc after receive assoc
268  * rsp in sta mode
269  *.@mac: pointer to Global MAC structure
270  * @pAssocRsp: contains the structured assoc/reassoc Response got from AP
271  * @beaconstruct: the ProbeRsp/Beacon structured details
272  * @bssDescription: bss description passed to PE from the SME
273  * @updateEntry: bool flag of whether update bss and sta
274  * @pe_session: pointer to pe session
275  *
276  * Return: none
277  */
278 QDF_STATUS lim_sta_send_add_bss(struct mac_context *mac,
279 				tpSirAssocRsp pAssocRsp,
280 				tpSchBeaconStruct pBeaconStruct,
281 				struct bss_description *bssDescription,
282 				uint8_t updateEntry,
283 				struct pe_session *pe_session);
284 
285 /**
286  * lim_sta_send_add_bss_pre_assoc() - add bss after channel switch and before
287  * associate req in sta mode
288  *.@mac: pointer to Global MAC structure
289  * @pe_session: pointer to pe session
290  *
291  * Return: none
292  */
293 QDF_STATUS lim_sta_send_add_bss_pre_assoc(struct mac_context *mac,
294 					  struct pe_session *pe_session);
295 
296 void lim_prepare_and_send_del_all_sta_cnf(struct mac_context *mac,
297 					  tSirResultCodes status_code,
298 					  struct pe_session *pe_session);
299 
300 void lim_prepare_and_send_del_sta_cnf(struct mac_context *mac,
301 				      tpDphHashNode sta,
302 				      tSirResultCodes status_code,
303 				      struct pe_session *pe_session);
304 
305 QDF_STATUS lim_extract_ap_capabilities(struct mac_context *mac, uint8_t *pIE,
306 					  uint16_t ieLen,
307 					  tpSirProbeRespBeacon beaconStruct);
308 void lim_init_pre_auth_timer_table(struct mac_context *mac,
309 				   tpLimPreAuthTable pPreAuthTimerTable);
310 tpLimPreAuthNode lim_acquire_free_pre_auth_node(struct mac_context *mac,
311 						tpLimPreAuthTable
312 						pPreAuthTimerTable);
313 tpLimPreAuthNode lim_get_pre_auth_node_from_index(struct mac_context *mac,
314 						  tpLimPreAuthTable pAuthTable,
315 						  uint32_t authNodeIdx);
316 
317 /* Util API to check if the channels supported by STA is within range */
318 QDF_STATUS lim_is_dot11h_supported_channels_valid(struct mac_context *mac,
319 						     tSirAssocReq *assoc);
320 
321 /* Util API to check if the txpower supported by STA is within range */
322 QDF_STATUS lim_is_dot11h_power_capabilities_in_range(struct mac_context *mac,
323 							tSirAssocReq *assoc,
324 							struct pe_session *);
325 /**
326  * lim_fill_rx_highest_supported_rate() - Fill highest rx rate
327  * @mac: Global MAC context
328  * @rxHighestRate: location to store the highest rate
329  * @pSupportedMCSSet: location of the 'supported MCS set' field in HT
330  *                    capability element
331  *
332  * Fills in the Rx Highest Supported Data Rate field from
333  * the 'supported MCS set' field in HT capability element.
334  *
335  * Return: void
336  */
337 void lim_fill_rx_highest_supported_rate(struct mac_context *mac,
338 					uint16_t *rxHighestRate,
339 					uint8_t *pSupportedMCSSet);
340 void lim_send_sme_unprotected_mgmt_frame_ind(struct mac_context *mac, uint8_t frameType,
341 					     uint8_t *frame, uint32_t frameLen,
342 					     uint16_t sessionId,
343 					     struct pe_session *pe_session);
344 /**
345  * lim_send_sme_tsm_ie_ind() - Send TSM IE information to SME
346  * @mac: Global MAC context
347  * @pe_session: PE session context
348  * @tid: traffic id
349  * @state: tsm state (enabled/disabled)
350  * @measurement_interval: measurement interval
351  *
352  * Return: void
353  */
354 #ifdef FEATURE_WLAN_ESE
355 void lim_send_sme_tsm_ie_ind(struct mac_context *mac,
356 			     struct pe_session *pe_session,
357 			     uint8_t tid, uint8_t state,
358 			     uint16_t measurement_interval);
359 #else
360 static inline
lim_send_sme_tsm_ie_ind(struct mac_context * mac,struct pe_session * pe_session,uint8_t tid,uint8_t state,uint16_t measurement_interval)361 void lim_send_sme_tsm_ie_ind(struct mac_context *mac,
362 			     struct pe_session *pe_session,
363 			     uint8_t tid, uint8_t state,
364 			     uint16_t measurement_interval)
365 {}
366 #endif /* FEATURE_WLAN_ESE */
367 
368 /**
369  * lim_populate_vht_mcs_set - function to populate vht mcs rate set
370  * @mac_ctx: pointer to global mac structure
371  * @rates: pointer to supported rate set
372  * @peer_vht_caps: pointer to peer vht capabilities
373  * @session_entry: pe session entry
374  * @nss: number of spatial streams
375  * @sta_ds: pointer to peer sta data structure
376  *
377  * Populates vht mcs rate set based on peer and self capabilities
378  *
379  * Return: QDF_STATUS_SUCCESS on success else QDF_STATUS_E_FAILURE
380  */
381 QDF_STATUS lim_populate_vht_mcs_set(struct mac_context *mac_ctx,
382 				    struct supported_rates *rates,
383 				    tDot11fIEVHTCaps *peer_vht_caps,
384 				    struct pe_session *session_entry,
385 				    uint8_t nss,
386 				    struct sDphHashNode *sta_ds);
387 
388 /**
389  * lim_extract_ies_from_deauth_disassoc() - Extract IEs from deauth/disassoc
390  *
391  * @session: PE session entry
392  * @deauth_disassoc_frame: A pointer to the deauth/disconnect frame buffer
393  *			   received from WMA.
394  * @deauth_disassoc_frame_leni: Length of the deauth/disconnect frame.
395  *
396  * This function receives deauth/disassoc frame from header. It extracts
397  * the IEs(tagged params) from the frame and caches in vdev object.
398  *
399  * Return: None
400  */
401 void
402 lim_extract_ies_from_deauth_disassoc(struct pe_session *session,
403 				     uint8_t *deauth_disassoc_frame,
404 				     uint16_t deauth_disassoc_frame_len);
405 
406 /**
407  * lim_update_vhtcaps_assoc_resp : Update VHT caps in assoc response.
408  * @mac_ctx Pointer to Global MAC structure
409  * @pAddBssParams: parameters required for add bss params.
410  * @vht_caps: VHT capabilities.
411  * @pe_session : session entry.
412  *
413  * Return : void
414  */
415 void lim_update_vhtcaps_assoc_resp(struct mac_context *mac_ctx,
416 				   struct bss_params *pAddBssParams,
417 				   tDot11fIEVHTCaps *vht_caps,
418 				   struct pe_session *pe_session);
419 
420 /**
421  * lim_free_assoc_req_frm_buf() - free assoc request frame buffer
422  * @assoc_req: pointer to tpSirAssocReq
423  *
424  * Return : void
425  */
426 void lim_free_assoc_req_frm_buf(tpSirAssocReq assoc_req);
427 
428 /**
429  * lim_alloc_assoc_req_frm_buf() - allocate assoc request frame buffer
430  * @assoc_req: pointer to tpSirAssocReq
431  * @buf: pointer to assoc request frame
432  * @mac_header_len: ieee80211 header length
433  * @frame_len: payload length of assoc request frame
434  */
435 bool lim_alloc_assoc_req_frm_buf(tpSirAssocReq assoc_req,
436 				 qdf_nbuf_t buf, uint32_t mac_header_len,
437 				 uint32_t frame_len);
438 #endif /* __LIM_ASSOC_UTILS_H */
439