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  *
22  * This file lim_api.h contains the definitions exported by
23  * LIM module.
24  * Author:        Chandra Modumudi
25  * Date:          02/11/02
26  * History:-
27  * Date           Modified by    Modification Information
28  * --------------------------------------------------------------------
29  *
30  */
31 #ifndef __LIM_API_H
32 #define __LIM_API_H
33 #include "wni_api.h"
34 #include "sir_api.h"
35 #include "ani_global.h"
36 #include "sir_mac_prot_def.h"
37 #include "sir_common.h"
38 #include "sir_debug.h"
39 #include "sch_global.h"
40 #include "utils_api.h"
41 #include "lim_global.h"
42 #include "wma_if.h"
43 #include "wma_types.h"
44 #include "scheduler_api.h"
45 #include "spatial_reuse_api.h"
46 
47 /* Macro to count heartbeat */
48 #define limResetHBPktCount(pe_session)   (pe_session->LimRxedBeaconCntDuringHB = 0)
49 
50 /* Useful macros for fetching various states in mac->lim */
51 /* gLimSystemRole */
52 #define GET_LIM_SYSTEM_ROLE(pe_session)      (pe_session->limSystemRole)
53 #define LIM_IS_AP_ROLE(pe_session)           (GET_LIM_SYSTEM_ROLE(pe_session) == eLIM_AP_ROLE)
54 #define LIM_IS_STA_ROLE(pe_session)          (GET_LIM_SYSTEM_ROLE(pe_session) == eLIM_STA_ROLE)
55 #define LIM_IS_UNKNOWN_ROLE(pe_session)      (GET_LIM_SYSTEM_ROLE(pe_session) == eLIM_UNKNOWN_ROLE)
56 #define LIM_IS_P2P_DEVICE_ROLE(pe_session)   (GET_LIM_SYSTEM_ROLE(pe_session) == eLIM_P2P_DEVICE_ROLE)
57 #define LIM_IS_P2P_DEVICE_GO(pe_session)     (GET_LIM_SYSTEM_ROLE(pe_session) == eLIM_P2P_DEVICE_GO)
58 #define LIM_IS_NDI_ROLE(pe_session) \
59 		(GET_LIM_SYSTEM_ROLE(pe_session) == eLIM_NDI_ROLE)
60 /* gLimSmeState */
61 #define GET_LIM_SME_STATE(mac)                 (mac->lim.gLimSmeState)
62 #define SET_LIM_SME_STATE(mac, state)          (mac->lim.gLimSmeState = state)
63 /* gLimMlmState */
64 #define GET_LIM_MLM_STATE(mac)                 (mac->lim.gLimMlmState)
65 #define SET_LIM_MLM_STATE(mac, state)          (mac->lim.gLimMlmState = state)
66 /*tpdphHashNode mlmStaContext*/
67 #define GET_LIM_STA_CONTEXT_MLM_STATE(sta)   (sta->mlmStaContext.mlmState)
68 #define SET_LIM_STA_CONTEXT_MLM_STATE(sta, state)  (sta->mlmStaContext.mlmState = state)
69 #define LIM_IS_CONNECTION_ACTIVE(pe_session)  (pe_session->LimRxedBeaconCntDuringHB)
70 /*mac->lim.gLimProcessDefdMsgs*/
71 #define GET_LIM_PROCESS_DEFD_MESGS(mac) (mac->lim.gLimProcessDefdMsgs)
72 
73 #ifdef WLAN_FEATURE_SR
74 /**
75  * enum sr_status_of_roamed_ap - SR(Spatial Reuse) status of roamed AP
76  * SR_DISALLOW: SR not supported by roamed AP
77  * SR_THRESHOLD_IN_RANGE: SR is supported by roamed AP/after param change
78  * in beacon/probe resp and the configured threshold is in range.
79  * SR_THRESHOLD_NOT_IN_RANGE: SR is supported by roamed AP/after param change
80  * in beacon/probe resp and configured threshold is not in range.
81  */
82 enum sr_status_of_roamed_ap {
83 	SR_DISALLOW,
84 	SR_THRESHOLD_IN_RANGE,
85 	SR_THRESHOLD_NOT_IN_RANGE,
86 };
87 #endif
88 
89 /**
90  * lim_post_msg_api() - post normal priority PE message
91  * @mac: mac context
92  * @msg: message to be posted
93  *
94  * This function is called to post a message to the tail of the PE
95  * message queue to be processed in the MC Thread with normal
96  * priority.
97  *
98  * Return: QDF_STATUS_SUCCESS on success, other QDF_STATUS on error
99  */
100 QDF_STATUS lim_post_msg_api(struct mac_context *mac, struct scheduler_msg *msg);
101 
102 static inline void
lim_post_msg_to_process_deferred_queue(struct mac_context * mac)103 lim_post_msg_to_process_deferred_queue(struct mac_context *mac)
104 {
105 	struct scheduler_msg msg = {0};
106 	QDF_STATUS status;
107 
108 	if (!mac->lim.gLimProcessDefdMsgs || !mac->lim.gLimDeferredMsgQ.size)
109 		return;
110 
111 	msg.type = SIR_LIM_PROCESS_DEFERRED_QUEUE;
112 	msg.bodyptr = NULL;
113 	msg.bodyval = 0;
114 
115 	status = lim_post_msg_api(mac, &msg);
116 	if (QDF_IS_STATUS_ERROR(status))
117 		pe_err("Failed to post lim msg:0x%x", msg.type);
118 }
119 
120 #define SET_LIM_PROCESS_DEFD_MESGS(mac, val) \
121 	mac->lim.gLimProcessDefdMsgs = val; \
122 	pe_debug("Defer LIM msg %d", val); \
123 	lim_post_msg_to_process_deferred_queue(mac);
124 
125 /* LIM exported function templates */
126 #define LIM_MIN_BCN_PR_LENGTH  12
127 #define LIM_BCN_PR_CAPABILITY_OFFSET 10
128 #define LIM_ASSOC_REQ_IE_OFFSET 4
129 
130 /**
131  * enum lim_vendor_ie_access_policy - vendor ie access policy
132  * @LIM_ACCESS_POLICY_NONE: access policy not valid
133  * @LIM_ACCESS_POLICY_RESPOND_IF_IE_IS_PRESENT: respond only if vendor ie
134  *         is present in probe request and assoc request frames
135  * @LIM_ACCESS_POLICY_DONOT_RESPOND_IF_IE_IS_PRESENT: do not respond if vendor
136  *         ie is present in probe request or assoc request frames
137  */
138 enum lim_vendor_ie_access_policy {
139 	LIM_ACCESS_POLICY_NONE,
140 	LIM_ACCESS_POLICY_RESPOND_IF_IE_IS_PRESENT,
141 	LIM_ACCESS_POLICY_DONOT_RESPOND_IF_IE_IS_PRESENT,
142 };
143 
144 typedef enum eMgmtFrmDropReason {
145 	eMGMT_DROP_NO_DROP,
146 	eMGMT_DROP_NOT_LAST_IBSS_BCN,
147 	eMGMT_DROP_INFRA_BCN_IN_IBSS,
148 	eMGMT_DROP_SCAN_MODE_FRAME,
149 	eMGMT_DROP_NON_SCAN_MODE_FRAME,
150 	eMGMT_DROP_INVALID_SIZE,
151 	eMGMT_DROP_SPURIOUS_FRAME,
152 	eMGMT_DROP_DUPLICATE_AUTH_FRAME,
153 	eMGMT_DROP_EXCESSIVE_MGMT_FRAME,
154 	eMGMT_DROP_DEAUTH_DURING_ROAM_STARTED,
155 } tMgmtFrmDropReason;
156 
157 /**
158  * Function to initialize LIM state machines.
159  * This called upon LIM thread creation.
160  */
161 QDF_STATUS lim_initialize(struct mac_context *);
162 QDF_STATUS pe_open(struct mac_context *mac, struct cds_config_info *cds_cfg);
163 QDF_STATUS pe_close(struct mac_context *mac);
164 QDF_STATUS lim_start(struct mac_context *mac);
165 QDF_STATUS pe_start(struct mac_context *mac);
166 void pe_stop(struct mac_context *mac);
167 
168 /**
169  * is_mgmt_protected  -  check RMF enabled for the peer
170  * @vdev_id: vdev id
171  * @peer_mac_addr: peer mac address
172  *
173  * Return: True if RMF enabled and key is installed
174  */
175 bool is_mgmt_protected(uint32_t vdev_id, const uint8_t *peer_mac_addr);
176 
177 /**
178  * lim_stop_pmfcomeback_timer() - stop pmf comeback timer
179  * @session: Pointer to PE session
180  *
181  * Return: None
182  */
183 void lim_stop_pmfcomeback_timer(struct pe_session *session);
184 
185 /**
186  * pe_register_mgmt_rx_frm_callback() - registers callback for receiving
187  *                                      mgmt rx frames
188  * @mac_ctx: mac global ctx
189  *
190  * This function registers a PE function to mgmt txrx component and a WMA
191  * function to WMI layer as event handler for receiving mgmt frames.
192  *
193  * Return: None
194  */
195 void pe_register_mgmt_rx_frm_callback(struct mac_context *mac_ctx);
196 
197 /**
198  * pe_deregister_mgmt_rx_frm_callback() - degisters callback for receiving
199  *                                        mgmt rx frames
200  * @mac_ctx: mac global ctx
201  *
202  * This function deregisters the PE function registered to mgmt txrx component
203  * and the WMA function registered to WMI layer as event handler for receiving
204  * mgmt frames.
205  *
206  * Return: None
207  */
208 void pe_deregister_mgmt_rx_frm_callback(struct mac_context *mac_ctx);
209 
210 /**
211  * pe_register_callbacks_with_wma() - register SME and PE callback functions to
212  * WMA.
213  * @mac: mac global ctx
214  * @ready_req: Ready request parameters, containing callback pointers
215  *
216  * Return: None
217  */
218 void pe_register_callbacks_with_wma(struct mac_context *mac,
219 				    struct sme_ready_req *ready_req);
220 
221 /**
222  * Function to cleanup LIM state.
223  * This called upon reset/persona change etc
224  */
225 void lim_cleanup(struct mac_context *);
226 
227 /**
228  * lim_post_msg_high_priority() - post high priority PE message
229  * @mac: mac context
230  * @msg: message to be posted
231  *
232  * This function is called to post a message to the head of the PE
233  * message queue to be processed in the MC Thread with expedited
234  * priority.
235  *
236  * Return: QDF_STATUS_SUCCESS on success, other QDF_STATUS on error
237  */
238 QDF_STATUS lim_post_msg_high_priority(struct mac_context *mac,
239 				      struct scheduler_msg *msg);
240 
241 /**
242  * Function to process messages posted to LIM thread
243  * and dispatch to various sub modules within LIM module.
244  */
245 void lim_message_processor(struct mac_context *, struct scheduler_msg *);
246 
247 /* / Function used by other Sirius modules to read global SME state */
lim_get_sme_state(struct mac_context * mac)248 static inline tLimSmeStates lim_get_sme_state(struct mac_context *mac)
249 {
250 	return mac->lim.gLimSmeState;
251 }
252 
253 /**
254  * lim_received_hb_handler() - This function is called by
255  * sch_beacon_process() upon receiving a Beacon on STA. This
256  * also gets called upon receiving Probe Response after heat
257  * beat failure is detected.
258  *
259  * @mac - global mac structure
260  * @chan_freq - channel frequency indicated in Beacon, Probe
261  *
262  * Response return - none
263  */
264 void lim_received_hb_handler(struct mac_context *, uint32_t,
265 			     struct pe_session *);
266 
267 /* / Function that triggers STA context deletion */
268 void lim_trigger_sta_deletion(struct mac_context *mac, tpDphHashNode sta,
269 			      struct pe_session *pe_session);
270 
271 #ifdef FEATURE_WLAN_TDLS
272 /* Function that sends TDLS Del Sta indication to SME */
273 void lim_send_sme_tdls_del_sta_ind(struct mac_context *mac, tpDphHashNode sta,
274 				   struct pe_session *pe_session,
275 				   uint16_t reasonCode);
276 #endif
277 
278 /**
279  * lim_detect_change_in_ap_capabilities() - Detect any change in AP's
280  * capabilities.
281  * @mac: Pointer to Global MAC structure
282  * @pBeacon: Pointer to parsed Beacon/probe rsp structure
283  * @session: pe session
284  * @is_bcn: if passed pointer is beacon or probe
285  *
286  * Return: void
287  */
288 void lim_detect_change_in_ap_capabilities(struct mac_context *mac,
289 					  tpSirProbeRespBeacon pBeacon,
290 					  struct pe_session *session,
291 					  bool is_bcn);
292 
293 QDF_STATUS lim_update_short_slot(struct mac_context *mac,
294 				    tpSirProbeRespBeacon pBeacon,
295 				    tpUpdateBeaconParams pBeaconParams,
296 				    struct pe_session *);
297 
298 /**
299  * lim_ps_offload_handle_missed_beacon_ind() - handle missed beacon indication
300  * @mac: global mac context
301  * @msg: message
302  *
303  * This function process the SIR_HAL_MISSED_BEACON_IND
304  * message from HAL, to do active AP probing.
305  *
306  * Return: void
307  */
308 void lim_ps_offload_handle_missed_beacon_ind(struct mac_context *mac,
309 					     struct scheduler_msg *msg);
310 
311 void lim_send_heart_beat_timeout_ind(struct mac_context *mac, struct pe_session *pe_session);
312 tMgmtFrmDropReason lim_is_pkt_candidate_for_drop(struct mac_context *mac,
313 						 uint8_t *pRxPacketInfo,
314 						 uint32_t subType);
315 
316 bool lim_is_sb_disconnect_allowed_fl(struct pe_session *session,
317 				     const char *func, uint32_t line);
318 
319 /**
320  * lim_is_sb_disconnect_allowed() - check pe session state to see if disconnect
321  * is already in progress.
322  * @session: pe session
323  *
324  * Return: false if disconnect is already in progress
325  */
326 #define lim_is_sb_disconnect_allowed(session) \
327 	lim_is_sb_disconnect_allowed_fl(session, __func__, __LINE__)
328 
329 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
330 /**
331  * pe_roam_synch_callback() - Callback registered at wma, gets invoked when
332  * ROAM SYNCH event is received from firmware
333  * @mac_ctx: global mac context
334  * @vdev_id: VDEV id
335  * @roam_sync_ind_ptr: Structure with roam synch parameters
336  * @ie_len: ie length
337  * @reason: Operation to be done by the callback
338  *
339  * This is a PE level callback called from WMA to complete the roam synch
340  * propagation at PE level and also fill the BSS descriptor which will be
341  * helpful further to complete the roam synch propagation.
342  *
343  * Return: QDF_STATUS
344  */
345 QDF_STATUS
346 pe_roam_synch_callback(struct mac_context *mac_ctx,
347 		       uint8_t vdev_id,
348 		       struct roam_offload_synch_ind *roam_sync_ind_ptr,
349 		       uint16_t ie_len,
350 		       enum sir_roam_op_code reason);
351 
352 void
353 lim_check_ft_initial_im_association(struct roam_offload_synch_ind *roam_synch,
354 				    struct pe_session *session_entry);
355 
356 /**
357  * pe_disconnect_callback() - Callback to handle deauth event is received
358  * from firmware
359  * @mac: pointer to global mac context
360  * @vdev_id: VDEV in which the event was received
361  * @deauth_disassoc_frame: Deauth/disassoc frame received from firmware
362  * @deauth_disassoc_frame_len: Length of @deauth_disassoc_frame
363  * @reason_code: Fw sent reason code if disassoc/deauth frame is not
364  * available
365  *
366  * Return: QDF_STATUS
367  */
368 QDF_STATUS
369 pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id,
370 		       uint8_t *deauth_disassoc_frame,
371 		       uint16_t deauth_disassoc_frame_len,
372 		       uint16_t reason_code);
373 
374 QDF_STATUS
375 pe_set_ie_for_roam_invoke(struct mac_context *mac_ctx, uint8_t vdev_id,
376 			  uint16_t dot11_mode, enum QDF_OPMODE opmode);
377 
378 #else
379 static inline QDF_STATUS
pe_roam_synch_callback(struct mac_context * mac_ctx,uint8_t vdev_id,struct roam_offload_synch_ind * roam_sync_ind_ptr,uint16_t ie_len,enum sir_roam_op_code reason)380 pe_roam_synch_callback(struct mac_context *mac_ctx,
381 		       uint8_t vdev_id,
382 		       struct roam_offload_synch_ind *roam_sync_ind_ptr,
383 		       uint16_t ie_len,
384 		       enum sir_roam_op_code reason)
385 {
386 	return QDF_STATUS_E_NOSUPPORT;
387 }
388 
389 static inline QDF_STATUS
pe_disconnect_callback(struct mac_context * mac,uint8_t vdev_id,uint8_t * deauth_disassoc_frame,uint16_t deauth_disassoc_frame_len,uint16_t reason_code)390 pe_disconnect_callback(struct mac_context *mac, uint8_t vdev_id,
391 		       uint8_t *deauth_disassoc_frame,
392 		       uint16_t deauth_disassoc_frame_len,
393 		       uint16_t reason_code)
394 {
395 	return QDF_STATUS_E_NOSUPPORT;
396 }
397 
398 static inline QDF_STATUS
pe_set_ie_for_roam_invoke(struct mac_context * mac_ctx,uint8_t vdev_id,uint16_t dot11_mode,enum QDF_OPMODE opmode)399 pe_set_ie_for_roam_invoke(struct mac_context *mac_ctx, uint8_t vdev_id,
400 			  uint16_t dot11_mode, enum QDF_OPMODE opmode)
401 {
402 	return QDF_STATUS_E_NOSUPPORT;
403 }
404 #endif
405 
406 /**
407  * lim_update_lost_link_info() - update lost link information to SME
408  * @mac: global MAC handle
409  * @session: PE session
410  * @rssi: rssi value from the received frame
411  *
412  * Return: None
413  */
414 void lim_update_lost_link_info(struct mac_context *mac, struct pe_session *session,
415 				int32_t rssi);
416 
417 /**
418  * lim_mon_init_session() - create PE session for monitor mode operation
419  * @mac_ptr: mac pointer
420  * @msg: Pointer to struct sir_create_session type.
421  *
422  * Return: NONE
423  */
424 void lim_mon_init_session(struct mac_context *mac_ptr,
425 			  struct sir_create_session *msg);
426 
427 /**
428  * lim_mon_deinit_session() - delete PE session for monitor mode operation
429  * @mac_ptr: mac pointer
430  * @msg: Pointer to struct sir_delete_session type.
431  *
432  * Return: NONE
433  */
434 void lim_mon_deinit_session(struct mac_context *mac_ptr,
435 			    struct sir_delete_session *msg);
436 
437 #define limGetQosMode(pe_session, pVal) (*(pVal) = (pe_session)->limQosEnabled)
438 #define limGetWmeMode(pe_session, pVal) (*(pVal) = (pe_session)->limWmeEnabled)
439 #define limGetWsmMode(pe_session, pVal) (*(pVal) = (pe_session)->limWsmEnabled)
440 /* ----------------------------------------------------------------------- */
lim_get_phy_mode(struct mac_context * mac,uint32_t * phyMode,struct pe_session * pe_session)441 static inline void lim_get_phy_mode(struct mac_context *mac, uint32_t *phyMode,
442 				    struct pe_session *pe_session)
443 {
444 	*phyMode =
445 		pe_session ? pe_session->gLimPhyMode : mac->lim.gLimPhyMode;
446 }
447 
448 /* ----------------------------------------------------------------------- */
lim_get_rf_band_new(struct mac_context * mac,enum reg_wifi_band * band,struct pe_session * pe_session)449 static inline void lim_get_rf_band_new(struct mac_context *mac,
450 				       enum reg_wifi_band *band,
451 				       struct pe_session *pe_session)
452 {
453 	*band = pe_session ? pe_session->limRFBand : REG_BAND_UNKNOWN;
454 }
455 
456 /**
457  * pe_mc_process_handler() - Message Processor for PE
458  * @msg: Pointer to the message structure
459  *
460  * Verifies the system is in a mode where messages are expected to be
461  * processed, and if so, routes the message to the appropriate handler
462  * based upon message type.
463  *
464  * Return: QDF_STATUS_SUCCESS if the message was handled, otherwise an
465  *         appropriate QDF_STATUS error code
466  */
467 QDF_STATUS pe_mc_process_handler(struct scheduler_msg *msg);
468 
469 /** -------------------------------------------------------------
470    \fn pe_free_msg
471    \brief Called by CDS scheduler (function cds_sched_flush_mc_mqs)
472  \      to free a given PE message on the TX and MC thread.
473  \      This happens when there are messages pending in the PE
474  \      queue when system is being stopped and reset.
475    \param   struct mac_context *mac
476    \param   struct scheduler_msg       pMsg
477    \return none
478    -----------------------------------------------------------------*/
479 void pe_free_msg(struct mac_context *mac, struct scheduler_msg *pMsg);
480 
481 /**
482  * lim_process_abort_scan_ind() - abort the scan which is presently being run
483  *
484  * @mac_ctx: Pointer to Global MAC structure
485  * @vdev_id: vdev_id
486  * @scan_id: Scan ID from the scan request
487  * @scan_requesor_id: Entity requesting the scan
488  *
489  * @return: None
490  */
491 void lim_process_abort_scan_ind(struct mac_context *mac, uint8_t vdev_id,
492 	uint32_t scan_id, uint32_t scan_requestor_id);
493 
494 void __lim_process_sme_assoc_cnf_new(struct mac_context *, uint32_t, uint32_t *);
495 
496 /**
497  * lim_handle_frame_genby_mbssid() - wrapper for beacon and probe response
498  * @frame: the pointer of frame data
499  * @frame_len: the length of frame data
500  * @frm_subtype: frame type
501  * @bssid: the pointer to bssid
502  *
503  * This function is used as wrapper to handle the beacon and probe response
504  * frames which is generated by MBSSID frame.
505  *
506  * Return: QDF_STATUS
507  */
508 QDF_STATUS lim_handle_frame_genby_mbssid(uint8_t *frame, uint32_t frame_len,
509 					 uint8_t frm_subtype, char *bssid);
510 
511 /**
512  * lim_process_sme_addts_rsp_timeout(): Send addts rsp timeout to SME
513  * @mac: Pointer to Global MAC structure
514  * @param: Addts rsp timer count
515  *
516  * This function is used to reset the addts sent flag and
517  * send addts rsp timeout to SME
518  *
519  * Return: None
520  */
521 void lim_process_sme_addts_rsp_timeout(struct mac_context *mac, uint32_t param);
522 QDF_STATUS lim_update_ext_cap_ie(struct mac_context *mac_ctx, uint8_t *ie_data,
523 				 uint8_t *local_ie_buf, uint16_t *local_ie_len,
524 				 struct pe_session *session);
525 
526 /**
527  * lim_handle_sap_beacon(): Handle the beacon received from scan module for SAP
528  * @pdev: pointer to the pdev object
529  * @scan_entry: pointer to the scan cache entry for the beacon
530  *
531  * Registered as callback to the scan module for handling beacon frames.
532  * This API filters the and allows beacons for SAP protection mechanisms
533  * if there are active SAP sessions and the received beacon's channel
534  * matches the SAP active channel
535  *
536  * Return: None
537  */
538 void lim_handle_sap_beacon(struct wlan_objmgr_pdev *pdev,
539 					struct scan_cache_entry *scan_entry);
540 
541 /**
542  * lim_translate_rsn_oui_to_akm_type() - translate RSN OUI to AKM type
543  * @auth_suite: auth suite
544  *
545  * Return: AKM type
546  */
547 enum ani_akm_type lim_translate_rsn_oui_to_akm_type(uint8_t auth_suite[4]);
548 
549 #ifdef WLAN_SUPPORT_TWT
550 /**
551  * lim_fill_roamed_peer_twt_caps() - Update Peer TWT capabilities
552  * @mac_ctx: Pointer to mac context
553  * @vdev_id: vdev id
554  * @roam_synch: Pointer to roam synch indication
555  *
556  * Return: None
557  */
558 void lim_fill_roamed_peer_twt_caps(struct mac_context *mac_ctx, uint8_t vdev_id,
559 				   struct roam_offload_synch_ind *roam_synch);
560 
561 /**
562  * lim_set_twt_peer_capabilities() - Update Peer TWT capabilities
563  * @mac_ctx: Pointer to mac context
564  * @peer_mac: peer mac address
565  * @he_cap: pointer to HE capabilities IE
566  * @he_op: pointer to HE IE
567  *
568  * Based on the peer IE capabilities, update the TWT peer private object
569  *
570  * Return: None
571  */
572 void lim_set_twt_peer_capabilities(struct mac_context *mac_ctx,
573 				   struct qdf_mac_addr *peer_mac,
574 				   tDot11fIEhe_cap *he_cap,
575 				   tDot11fIEhe_op *he_op);
576 
577 /**
578  * lim_set_twt_ext_capabilities() - Update twt caps for 11n devices
579  * @mac_ctx: Pointer to mac context
580  * @peer_mac: peer mac address
581  * @ext_cap: pointer to Extended capabilities IE
582  *
583  */
584 void lim_set_twt_ext_capabilities(struct mac_context *mac_ctx,
585 				  struct qdf_mac_addr *peer_mac,
586 				  struct s_ext_cap *ext_cap);
587 #else
588 static inline
lim_fill_roamed_peer_twt_caps(struct mac_context * mac_ctx,uint8_t vdev_id,struct roam_offload_synch_ind * roam_synch)589 void lim_fill_roamed_peer_twt_caps(struct mac_context *mac_ctx, uint8_t vdev_id,
590 				   struct roam_offload_synch_ind *roam_synch)
591 {}
592 
593 static inline
lim_set_twt_peer_capabilities(struct mac_context * mac_ctx,struct qdf_mac_addr * peer_mac,tDot11fIEhe_cap * he_cap,tDot11fIEhe_op * he_op)594 void lim_set_twt_peer_capabilities(struct mac_context *mac_ctx,
595 				    struct qdf_mac_addr *peer_mac,
596 				    tDot11fIEhe_cap *he_cap,
597 				    tDot11fIEhe_op *he_op)
598 {}
599 
600 static inline
lim_set_twt_ext_capabilities(struct mac_context * mac_ctx,struct qdf_mac_addr * peer_mac,struct s_ext_cap * ext_cap)601 void lim_set_twt_ext_capabilities(struct mac_context *mac_ctx,
602 				  struct qdf_mac_addr *peer_mac,
603 				  struct s_ext_cap *ext_cap)
604 {}
605 #endif
606 
607 /**
608  * lim_get_basic_rates() - Get basic rates for the given frequency
609  * @b_rates: Pointer to rates
610  * @chan_freq: frequency for which rates are required
611  *
612  * This api will get basic rates for the given frequency
613  *
614  * Return: void
615  */
616 void lim_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq);
617 
618 #define FW_CTS2SELF_PROFILE 34
619 
620 /**
621  * lim_enable_cts_to_self_for_exempted_iot_ap() - enable cts to self for iot ap
622  * @mac_ctx: mac context
623  * @session: pe session
624  * @ie_ptr: ie pointer
625  * @ie_len: ie length
626  *
627  * Return: true on success else false
628  */
629 bool lim_enable_cts_to_self_for_exempted_iot_ap(
630 				       struct mac_context *mac_ctx,
631 				       struct pe_session *session,
632 				       uint8_t *ie_ptr,
633 				       uint16_t ie_len);
634 
635 /**
636  * lim_fill_pe_session() - Lim fill pe session
637  * @mac_ctx: Pointer to mac context
638  * @session: pe session
639  * @bss_desc: Pointer to bss description
640  *
641  * This api will fill lim pe session with info
642  * from bss description
643  *
644  * Return: qdf status
645  */
646 QDF_STATUS
647 lim_fill_pe_session(struct mac_context *mac_ctx,
648 		    struct pe_session *session,
649 		    struct bss_description *bss_desc);
650 
651 /**
652  * lim_update_omn_ie_ch_width() - update omn_ie_ch_width in struct
653  * assoc_channel_info while processing bcn/probe resp/assoc resp/re-assoc resp
654  * @vdev: VDEV object manager
655  * @ch_width: ch_width present in OMN IE
656  *
657  * Return: none
658  */
659 void lim_update_omn_ie_ch_width(struct wlan_objmgr_vdev *vdev,
660 				enum phy_ch_width ch_width);
661 
662 #ifdef WLAN_FEATURE_11BE_MLO
663 /*
664  * lim_add_bcn_probe() - Add the generated probe resp to scan DB
665  * @vdev: VDEV object manager
666  * @bcn_probe: Pointer to bcn/probe
667  * @len: Length of frame.
668  * @freq: Freq on frame.
669  * @rssi: RSSI of the frame.
670  *
671  * Prepares the meta data to add the generated bcn/probe frame to
672  * scan DB.
673  *
674  * Return: QDF_STATUS
675  */
676 QDF_STATUS
677 lim_add_bcn_probe(struct wlan_objmgr_vdev *vdev, uint8_t *bcn_probe,
678 		  uint32_t len, qdf_freq_t freq, int32_t rssi);
679 
680 /**
681  * lim_update_mlo_mgr_info() - API to update mlo_mgr link info
682  * @mac_ctx: Pointer to mac context
683  * @vdev: vdev
684  * @link_addr: link address
685  * @link_id: Link id
686  * @freq: chan freq
687  *
688  * This api will update link sp[ecific info into mlo_mgr
689  *
690  * Return: qdf_status
691  */
692 QDF_STATUS
693 lim_update_mlo_mgr_info(struct mac_context *mac_ctx,
694 			struct wlan_objmgr_vdev *vdev,
695 			struct qdf_mac_addr *link_addr, uint8_t link_id,
696 			uint16_t freq);
697 /**
698  * lim_gen_link_specific_probe_rsp() - Generate link specific prb response
699  * @mac_ctx: Pointer to mac context
700  * @session_entry: pe session
701  * @rcvd_probe_resp: Pointer to received prb resp from AP.
702  * @probe_rsp: ptr to prb rsp
703  * @probe_rsp_len: length of prb rsp
704  * @rssi : rssi for link
705  *
706  * This api will generate link specific probe response
707  * and save in scan database.
708  *
709  * Return: qdf status
710  */
711 QDF_STATUS
712 lim_gen_link_specific_probe_rsp(struct mac_context *mac_ctx,
713 				struct pe_session *session_entry,
714 				tpSirProbeRespBeacon rcvd_probe_resp,
715 				uint8_t *probe_rsp,
716 				uint32_t probe_rsp_len,
717 				int32_t rssi);
718 /**
719  * lim_check_for_ml_probe_req() - check if ml probe req is sent
720  * @session: pe session
721  *
722  * Return qdf status
723  */
724 QDF_STATUS lim_check_for_ml_probe_req(struct pe_session *session);
725 
726 /**
727  * lim_process_cu_for_probe_rsp() - process critical update for probe response
728  * @mac_ctx: Pointer to mac context
729  * @session: pe session
730  * @probe_rsp: ptr to probe response
731  * @probe_rsp_len: length of probe response
732  *
733  * This api will generate link specific probe response and invoke function
734  * to process critical update IEs
735  *
736  * Return: qdf status
737  */
738 QDF_STATUS
739 lim_process_cu_for_probe_rsp(struct mac_context *mac_ctx,
740 			     struct pe_session *session,
741 			     uint8_t *probe_rsp,
742 			     uint32_t probe_rsp_len);
743 
744 #else
745 static inline QDF_STATUS
lim_add_bcn_probe(struct wlan_objmgr_vdev * vdev,uint8_t * bcn_probe,uint32_t len,qdf_freq_t freq,int32_t rssi)746 lim_add_bcn_probe(struct wlan_objmgr_vdev *vdev, uint8_t *bcn_probe,
747 		  uint32_t len, qdf_freq_t freq, int32_t rssi)
748 {
749 	return QDF_STATUS_E_NOSUPPORT;
750 }
751 
752 static inline QDF_STATUS
lim_update_mlo_mgr_info(struct mac_context * mac_ctx,struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * link_addr,uint8_t link_id,uint16_t freq)753 lim_update_mlo_mgr_info(struct mac_context *mac_ctx,
754 			struct wlan_objmgr_vdev *vdev,
755 			struct qdf_mac_addr *link_addr, uint8_t link_id,
756 			uint16_t freq)
757 {
758 	return QDF_STATUS_SUCCESS;
759 }
760 
761 static inline QDF_STATUS
lim_gen_link_specific_probe_rsp(struct mac_context * mac_ctx,struct pe_session * session_entry,tpSirProbeRespBeacon rcvd_probe_resp,uint8_t * probe_rsp,uint32_t probe_rsp_len,int32_t rssi)762 lim_gen_link_specific_probe_rsp(struct mac_context *mac_ctx,
763 				struct pe_session *session_entry,
764 				tpSirProbeRespBeacon rcvd_probe_resp,
765 				uint8_t *probe_rsp,
766 				uint32_t probe_rsp_len,
767 				int32_t rssi)
768 {
769 	return QDF_STATUS_SUCCESS;
770 }
771 
772 static inline QDF_STATUS
lim_check_for_ml_probe_req(struct pe_session * session)773 lim_check_for_ml_probe_req(struct pe_session *session)
774 {
775 	return QDF_STATUS_E_NOSUPPORT;
776 }
777 
778 static inline QDF_STATUS
lim_process_cu_for_probe_rsp(struct mac_context * mac_ctx,struct pe_session * session,uint8_t * probe_rsp,uint32_t probe_rsp_len)779 lim_process_cu_for_probe_rsp(struct mac_context *mac_ctx,
780 			     struct pe_session *session,
781 			     uint8_t *probe_rsp,
782 			     uint32_t probe_rsp_len)
783 {
784 	return QDF_STATUS_SUCCESS;
785 }
786 #endif
787 
788 #ifdef WLAN_FEATURE_SR
789 
790 /**
791  * lim_update_vdev_sr_elements() - Update VDEV variable with
792  * parsed values received in SRP IE
793  * @session_entry: pe session
794  * @sta_ds: STA node
795  *
796  * Return void
797  */
798 void lim_update_vdev_sr_elements(struct pe_session *session_entry,
799 				 tpDphHashNode sta_ds);
800 
801 /**
802  * lim_process_srp_ie() - process srp ie during re/association
803  * @tpSirAssocRsp: assoc response
804  * @tpDphHashNode: sta node
805  *
806  * Return: success/failure
807  */
808 QDF_STATUS lim_process_srp_ie(tpSirAssocRsp ar, tpDphHashNode sta_ds);
809 
810 /**
811  * lim_handle_sr_cap() - To handle SR(Spatial Reuse) capability
812  * of roamed AP
813  * @vdev: objmgr vdev
814  * @reason: reason for the update
815  *
816  * This function is to check and compare SR cap of previous and
817  * roamed AP and takes decision to send event to userspace.
818  *
819  * Return: None
820  */
821 void lim_handle_sr_cap(struct wlan_objmgr_vdev *vdev,
822 		       enum sr_osif_reason_code reason);
823 
824 #else
825 static inline void
lim_update_vdev_sr_elements(struct pe_session * session_entry,tpDphHashNode sta_ds)826 lim_update_vdev_sr_elements(struct pe_session *session_entry,
827 			    tpDphHashNode sta_ds)
828 {
829 }
830 
831 static inline
lim_process_srp_ie(tpSirAssocRsp ar,tpDphHashNode sta_ds)832 QDF_STATUS lim_process_srp_ie(tpSirAssocRsp ar, tpDphHashNode sta_ds)
833 {
834 	return QDF_STATUS_SUCCESS;
835 }
836 
837 static inline void
lim_handle_sr_cap(struct wlan_objmgr_vdev * vdev,enum sr_osif_reason_code reason)838 lim_handle_sr_cap(struct wlan_objmgr_vdev *vdev,
839 		  enum sr_osif_reason_code reason)
840 {
841 }
842 #endif
843 
844 #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(WLAN_FEATURE_11BE_MLO)
845 /**
846  * lim_cm_roam_create_session() - Create pe session for legacy to MLO roaming
847  * @mac_ctx: Pointer to mac context
848  * @vdev_id: vdev id
849  * @roam_synch: Pointer to roam synch indication
850  *
851  * This api will check if vdev is link vdev and create a new pe session
852  * for legacy to MLO roaming case.
853  *
854  * Return: pe session
855  */
856 struct pe_session *
857 lim_cm_roam_create_session(struct mac_context *mac_ctx,
858 			   uint8_t vdev_id,
859 			   struct roam_offload_synch_ind *sync_ind);
860 
861 /**
862  * lim_create_and_fill_link_session() - handler for legacy to mlo roaming
863  * @mac_ctx: Pointer to mac context
864  * @vdev_id: vdev id
865  * @roam_synch: Pointer to roam synch indication
866  * @ie_len: ie length
867  *
868  * This is a lim level api called to handle legacy to MLO roaming scenario.
869  *
870  * Return: qdf status
871  */
872 QDF_STATUS
873 lim_create_and_fill_link_session(struct mac_context *mac_ctx,
874 				 uint8_t vdev_id,
875 				 struct roam_offload_synch_ind *sync_ind,
876 				 uint16_t ie_len);
877 
878 /**
879  * lim_cm_fill_link_session() - Update link session parameters
880  * @mac_ctx: Pointer to mac context
881  * @vdev_id: vdev id
882  * @pe_session: Pointer to pe session
883  * @roam_synch: Pointer to roam synch indication
884  * @ie_len: ie length
885  *
886  * This api will fill pe session and also fill the BSS descriptor
887  * which will be helpful further to complete the roam synch propagation.
888  *
889  * Return: qdf status
890  */
891 QDF_STATUS
892 lim_cm_fill_link_session(struct mac_context *mac_ctx,
893 			 uint8_t vdev_id,
894 			 struct pe_session *pe_session,
895 			 struct roam_offload_synch_ind *sync_ind,
896 			 uint16_t ie_len);
897 
898 /**
899  * lim_roam_mlo_create_peer() - Create roam mlo peer
900  * @mac_ctx: Pointer to mac context
901  * @sync_ind: Pointer to roam synch indication
902  * @vdev_id: vdev id
903  * @peer_mac: Peer mac pointer
904  *
905  * This api will create mlo peer called during mlo roaming scenario
906  *
907  * Return: QDF_STATUS
908  */
909 QDF_STATUS lim_roam_mlo_create_peer(struct mac_context *mac,
910 				    struct roam_offload_synch_ind *sync_ind,
911 				    uint8_t vdev_id, uint8_t *peer_mac);
912 
913 /**
914  * lim_mlo_roam_delete_link_peer() - Delete mlo link peer
915  * @pe_session: Pointer to pe session
916  * @sta_ds: sta state node
917  *
918  * This api will delete mlo link peer called during mlo roaming scenario
919  *
920  * Return: none
921  */
922 void
923 lim_mlo_roam_delete_link_peer(struct pe_session *pe_session,
924 			      tpDphHashNode sta_ds);
925 #else
926 static inline struct pe_session *
lim_cm_roam_create_session(struct mac_context * mac_ctx,uint8_t vdev_id,struct roam_offload_synch_ind * sync_ind)927 lim_cm_roam_create_session(struct mac_context *mac_ctx,
928 			   uint8_t vdev_id,
929 			   struct roam_offload_synch_ind *sync_ind)
930 {
931 	return NULL;
932 }
933 
934 static inline QDF_STATUS
lim_create_and_fill_link_session(struct mac_context * mac_ctx,uint8_t vdev_id,struct roam_offload_synch_ind * sync_ind,uint16_t ie_len)935 lim_create_and_fill_link_session(struct mac_context *mac_ctx,
936 				 uint8_t vdev_id,
937 				 struct roam_offload_synch_ind *sync_ind,
938 				 uint16_t ie_len)
939 {
940 	return QDF_STATUS_E_NOSUPPORT;
941 }
942 
943 static inline QDF_STATUS
lim_cm_fill_link_session(struct mac_context * mac_ctx,uint8_t vdev_id,struct pe_session * pe_session,struct roam_offload_synch_ind * sync_ind,uint16_t ie_len)944 lim_cm_fill_link_session(struct mac_context *mac_ctx,
945 			 uint8_t vdev_id,
946 			 struct pe_session *pe_session,
947 			 struct roam_offload_synch_ind *sync_ind,
948 			 uint16_t ie_len)
949 {
950 	return QDF_STATUS_E_NOSUPPORT;
951 }
952 
953 static inline QDF_STATUS
lim_roam_mlo_create_peer(struct mac_context * mac,struct roam_offload_synch_ind * sync_ind,uint8_t vdev_id,uint8_t * peer_mac)954 lim_roam_mlo_create_peer(struct mac_context *mac,
955 			 struct roam_offload_synch_ind *sync_ind,
956 			 uint8_t vdev_id, uint8_t *peer_mac)
957 {
958 	return QDF_STATUS_SUCCESS;
959 }
960 
961 static inline void
lim_mlo_roam_delete_link_peer(struct pe_session * pe_session,tpDphHashNode sta_ds)962 lim_mlo_roam_delete_link_peer(struct pe_session *pe_session,
963 			      tpDphHashNode sta_ds)
964 {
965 }
966 #endif /* WLAN_FEATURE_ROAM_OFFLOAD && WLAN_FEATURE_11BE_MLO */
967 
968 enum ani_akm_type
969 lim_get_connected_akm(struct pe_session *session, int32_t ucast_cipher,
970 		      int32_t auth_mode, int32_t akm);
971 
972 /**
973  * lim_get_encrypt_ed_type() - Get encrypt type
974  * @ucast_cipher: Ucast cipher
975  *
976  * Return: Encryption type enum
977  */
978 tAniEdType lim_get_encrypt_ed_type(int32_t ucast_cipher);
979 /************************************************************/
980 #endif /* __LIM_API_H */
981