1 /*
2  * Copyright (c) 2012-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 #ifndef WLAN_QCT_WLANSAP_INTERNAL_H
21 #define WLAN_QCT_WLANSAP_INTERNAL_H
22 
23 /*
24  * This file contains the internal API exposed by the wlan SAP PAL layer
25  * module.
26  */
27 
28 #include "cds_api.h"
29 #include "cds_packet.h"
30 
31 /* Pick up the CSR API definitions */
32 #include "csr_api.h"
33 #include "sap_api.h"
34 #include "sap_fsm_ext.h"
35 #include "sap_ch_select.h"
36 #include <wlan_scan_public_structs.h>
37 #include <wlan_objmgr_pdev_obj.h>
38 #include "wlan_vdev_mlme_main.h"
39 #include "wlan_vdev_mlme_api.h"
40 
41 /* DFS Non Occupancy Period =30 minutes, in microseconds */
42 #define SAP_DFS_NON_OCCUPANCY_PERIOD      (30 * 60 * 1000 * 1000)
43 
44 #define SAP_DEBUG
45 
46 #define IS_ETSI_WEATHER_FREQ(_freq)   ((_freq >= 5600) && (_freq <= 5650))
47 #define IS_CH_BONDING_WITH_WEATHER_CH(_ch)   (_ch == 116)
48 #define IS_CHAN_JAPAN_INDOOR(_ch) ((_ch >= 36)  && (_ch <= 64))
49 #define IS_CHAN_JAPAN_OUTDOOR(_ch)((_ch >= 100) && (_ch <= 140))
50 #define DEFAULT_CAC_TIMEOUT (60 * 1000) /* msecs - 1 min */
51 #define ETSI_WEATHER_CH_CAC_TIMEOUT (10 * 60 * 1000)    /* msecs - 10 min */
52 #define SAP_CHAN_PREFERRED_INDOOR  1
53 #define SAP_CHAN_PREFERRED_OUTDOOR 2
54 
55 /*SAP Specific logging*/
56 
57 #define sap_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_SAP, params)
58 #define sap_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_SAP, params)
59 #define sap_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_SAP, params)
60 #define sap_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_SAP, params)
61 #define sap_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_SAP, params)
62 
63 #define sap_nofl_alert(params...) \
64 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_SAP, params)
65 #define sap_nofl_err(params...) \
66 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_SAP, params)
67 #define sap_nofl_warn(params...) \
68 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_SAP, params)
69 #define sap_nofl_info(params...) \
70 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_SAP, params)
71 #define sap_nofl_debug(params...) \
72 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_SAP, params)
73 
74 #define sap_alert_rl(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_SAP, params)
75 #define sap_err_rl(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_SAP, params)
76 #define sap_warn_rl(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_SAP, params)
77 #define sap_info_rl(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_SAP, params)
78 #define sap_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_SAP, params)
79 
80 /*----------------------------------------------------------------------------
81  *  Typedefs
82  * -------------------------------------------------------------------------*/
83 /*----------------------------------------------------------------------------
84  *  Type Declarations - For internal SAP context information
85  * -------------------------------------------------------------------------*/
86 /*----------------------------------------------------------------------------
87  *  Opaque SAP context Type Declaration
88  * -------------------------------------------------------------------------*/
89 /* We were only using this syntax, when this was truly opaque. */
90 /* (I.E., it was defined in a different file.) */
91 
92 /**
93  * enum sap_fsm_state - SAP FSM states for Access Point role
94  * @SAP_INIT: init state
95  * @SAP_STARTING: starting phase
96  * @SAP_STARTED: up and running
97  * @SAP_STOPPING: about to stop and transitions to init
98  */
99 enum sap_fsm_state {
100 	SAP_INIT,
101 	SAP_STARTING,
102 	SAP_STARTED,
103 	SAP_STOPPING
104 };
105 
106 #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
107 /*
108  * In a setup having two MDM both operating in AP+AP MCC scenario
109  * if both the AP decides to use same or close channel set, CTS to
110  * self, mechanism is causing issues with connectivity. For this, its
111  * proposed that 2nd MDM devices which comes up later should detect
112  * presence of first MDM device via special Q2Q IE present in becon
113  * and avoid those channels mentioned in IE.
114  *
115  * Following struct will keep this info in sapCtx struct, and will be used
116  * to avoid such channels in Random Channel Select in case of radar ind.
117  */
118 struct sap_avoid_channels_info {
119 	bool       present;
120 	uint8_t    channels[CFG_VALID_CHANNEL_LIST_LEN];
121 };
122 #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
123 
124 #define MAX_VLAN 4
125 struct sap_context {
126 
127 	/* Include the current channel frequency of AP */
128 	uint32_t chan_freq;
129 	uint32_t sec_ch_freq;
130 
131 #ifdef DCS_INTERFERENCE_DETECTION
132 	qdf_freq_t dcs_ch_freq;
133 #endif
134 	union {
135 		uint8_t sessionId;
136 		uint8_t vdev_id;
137 	};
138 	uint8_t sap_radar_found_status;
139 
140 	/* vdev object corresponding to sessionId */
141 	struct wlan_objmgr_vdev *vdev;
142 
143 	/* Include the associations MAC addresses */
144 	uint8_t self_mac_addr[CDS_MAC_ADDRESS_LEN];
145 	struct start_bss_config sap_bss_cfg;
146 
147 	/* SAP event Callback to hdd */
148 	sap_event_cb sap_event_cb;
149 
150 	/*
151 	 * Include the state machine structure here, state var that keeps
152 	 * track of state machine
153 	 */
154 	enum sap_fsm_state fsm_state;
155 	enum sap_csa_reason_code csa_reason;
156 
157 	/* Actual storage for AP and self (STA) SSID */
158 	tCsrSSIDInfo SSIDList[2];
159 
160 	/* Actual storage for AP bssid */
161 	struct qdf_mac_addr bssid;
162 
163 	/* Mac filtering settings */
164 	eSapMacAddrACL eSapMacAddrAclMode;
165 	struct qdf_mac_addr acceptMacList[MAX_ACL_MAC_ADDRESS];
166 	uint16_t nAcceptMac;
167 	struct qdf_mac_addr denyMacList[MAX_ACL_MAC_ADDRESS];
168 	uint16_t nDenyMac;
169 
170 	void *user_context;
171 
172 	uint32_t nStaWPARSnReqIeLength;
173 	uint8_t pStaWpaRsnReqIE[MAX_ASSOC_IND_IE_LEN];
174 
175 	eCsrPhyMode phyMode;
176 	uint32_t *freq_list;
177 	uint8_t num_of_channel;
178 	uint16_t ch_width_orig;
179 	struct ch_params ch_params;
180 	uint32_t chan_freq_before_switch_band;
181 	enum phy_ch_width chan_width_before_switch_band;
182 	uint32_t auto_channel_select_weight;
183 	bool enableOverLapCh;
184 	struct sap_acs_cfg *acs_cfg;
185 
186 	qdf_time_t acs_req_timestamp;
187 
188 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
189 	uint8_t cc_switch_mode;
190 #endif
191 
192 #if defined(FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE)
193 	bool dfs_ch_disable;
194 #endif
195 	bool isCacEndNotified;
196 	bool isCacStartNotified;
197 	bool is_sap_ready_for_chnl_chng;
198 #ifdef FEATURE_RADAR_HISTORY
199 	struct prev_cac_result cac_result;
200 #endif
201 #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
202 	/*
203 	 * In a setup having two MDM both operating in AP+AP MCC scenario
204 	 * if both the AP decides to use same or close channel set, CTS to
205 	 * self, mechanism is causing issues with connectivity. For this, its
206 	 * proposed that 2nd MDM devices which comes up later should detect
207 	 * presence of first MDM device via special Q2Q IE present in becon
208 	 * and avoid those channels mentioned in IE.
209 	 *
210 	 * this struct contains the list of channels on which another MDM AP
211 	 * in MCC mode were detected.
212 	 */
213 	struct sap_avoid_channels_info sap_detected_avoid_ch_ie;
214 #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
215 	/*
216 	 * sap_state, sap_status are created
217 	 * to inform upper layers about ACS scan status.
218 	 * Don't use these members for any other purposes.
219 	 */
220 	eSapHddEvent sap_state;
221 	eSapStatus sap_status;
222 	uint32_t roc_ind_scan_id;
223 	bool vendor_acs_dfs_lte_enabled;
224 	uint8_t dfs_vendor_channel;
225 	uint8_t dfs_vendor_chan_bw;
226 	uint16_t beacon_tx_rate;
227 	enum sap_acs_dfs_mode dfs_mode;
228 	wlan_scan_requester req_id;
229 	uint8_t sap_sta_id;
230 	bool dfs_cac_offload;
231 	bool is_chan_change_inprogress;
232 	/* Disabled mcs13 by sap or not */
233 	bool disabled_mcs13;
234 	qdf_list_t owe_pending_assoc_ind_list;
235 	qdf_list_t ft_pending_assoc_ind_list;
236 	qdf_event_t ft_pending_event;
237 	uint32_t freq_before_ch_switch;
238 	struct ch_params ch_params_before_ch_switch;
239 #ifdef WLAN_FEATURE_P2P_P2P_STA
240 /*
241  *This param is used for GO+GO force scc logic where after
242  *setkey first GO will move to latest GO's channel
243  */
244 	bool is_forcescc_restart_required;
245 #endif
246 	qdf_freq_t candidate_freq;
247 #ifdef FEATURE_WLAN_CH_AVOID_EXT
248 	uint32_t restriction_mask;
249 #endif
250 	bool require_h2e;
251 	bool partial_acs_scan;
252 	bool optimize_acs_chan_selected;
253 #ifdef WLAN_FEATURE_SAP_ACS_OPTIMIZE
254 /*
255  * This param is used to track clean channels where there
256  * is no AP found on these channels
257  */
258 	bool clean_channel_array[NUM_CHANNELS];
259 #endif
260 #ifdef QCA_MULTIPASS_SUPPORT
261 	uint16_t vlan_map[2 * MAX_VLAN];
262 #endif
263 };
264 
265 /*----------------------------------------------------------------------------
266  *  External declarations for global context
267  * -------------------------------------------------------------------------*/
268 
269 /**
270  * struct sap_sm_event - SAP state machine event definition
271  * @params: A VOID pointer type for all possible inputs
272  * @event: State machine input event message
273  * @u1: Introduced to handle csr_roam_complete_cb roamStatus
274  * @u2: Introduced to handle csr_roam_complete_cb roamResult
275  */
276 struct sap_sm_event {
277 	void *params;
278 	uint32_t event;
279 	uint32_t u1;
280 	uint32_t u2;
281 };
282 
283 /*----------------------------------------------------------------------------
284  * Function Declarations and Documentation
285  * -------------------------------------------------------------------------*/
286 
287 /**
288  * sap_get_mac_context() - Get a pointer to the global MAC context
289  *
290  * Return: pointer to the global MAC context, or NULL if the MAC
291  *         context is no longer registered
292  */
sap_get_mac_context(void)293 static inline struct mac_context *sap_get_mac_context(void)
294 {
295 	return cds_get_context(QDF_MODULE_ID_PE);
296 }
297 
298 QDF_STATUS wlansap_context_get(struct sap_context *ctx);
299 void wlansap_context_put(struct sap_context *ctx);
300 
301 /**
302  * wlansap_pre_start_bss_acs_scan_callback() - callback for scan results
303  * @mac_handle:    the mac_handle passed in with the scan request
304  * @sap_ctx:       the SAP context pointer.
305  * @scanid:        scan id passed
306  * @sessionid:     session identifier
307  * @scan_status:        status of scan -success, failure or abort
308  *
309  * Api for scan callback. This function is invoked as a result of scan
310  * completion and reports the scan results.
311  *
312  * Return: The QDF_STATUS code associated with performing the operation
313  */
314 QDF_STATUS wlansap_pre_start_bss_acs_scan_callback(mac_handle_t mac_handle,
315 						   struct sap_context *sap_ctx,
316 						   uint8_t sessionid,
317 						   uint32_t scanid,
318 						   eCsrScanStatus scan_status);
319 
320 /**
321  * sap_chan_sel_exit() - Exit function for free out the allocated memory,
322  * @ch_info_params: Pointer to sap_sel_ch_info structure
323  *
324  * Return: None
325  */
326 void sap_chan_sel_exit(struct sap_sel_ch_info *ch_info_params);
327 
328 /**
329  * sap_sort_channel_list() - Sort channel list based on channel weight
330  * @mac_ctx: Pointer to mac_context
331  * @vdev_id: Vdev ID
332  * @ch_list: Pointer to qdf_list_t
333  * @ch_info: Pointer to sap_sel_ch_info structure
334  * @domain: Regulatory Domain
335  * @operating_band: Operating band
336  *
337  * Return: None
338  *
339  */
340 void
341 sap_sort_channel_list(struct mac_context *mac_ctx, uint8_t vdev_id,
342 		      qdf_list_t *ch_list, struct sap_sel_ch_info *ch_info,
343 		      v_REGDOMAIN_t *domain, uint32_t *operating_band);
344 
345 /**
346  * sap_select_channel() - select SAP channel
347  * @mac_handle: Opaque handle to the global MAC context
348  * @sap_ctx: Sap context
349  * @scan_list: scan entry list
350  *
351  * Runs a algorithm to select the best channel to operate in based on BSS
352  * rssi and bss count on each channel
353  *
354  * Returns: channel frequency if success, 0 otherwise
355  */
356 uint32_t sap_select_channel(mac_handle_t mac_handle, struct sap_context *sap_ctx,
357 			   qdf_list_t *scan_list);
358 
359 QDF_STATUS
360 sap_signal_hdd_event(struct sap_context *sap_ctx,
361 		  struct csr_roam_info *pCsrRoamInfo,
362 		  eSapHddEvent sapHddevent, void *);
363 
364 QDF_STATUS sap_fsm(struct sap_context *sap_ctx, struct sap_sm_event *sap_event);
365 
366 QDF_STATUS
367 sap_is_peer_mac_allowed(struct sap_context *sap_ctx, uint8_t *peerMac);
368 
369 void
370 sap_sort_mac_list(struct qdf_mac_addr *macList, uint16_t size);
371 
372 void
373 sap_add_mac_to_acl(struct qdf_mac_addr *macList, uint16_t *size,
374 		   uint8_t *peerMac);
375 
376 void
377 sap_remove_mac_from_acl(struct qdf_mac_addr *macList, uint16_t *size,
378 			uint16_t index);
379 
380 void
381 sap_print_acl(struct qdf_mac_addr *macList, uint16_t size);
382 
383 bool
384 sap_search_mac_list(struct qdf_mac_addr *macList, uint16_t num_mac,
385 		    uint8_t *peerMac, uint16_t *index);
386 
387 QDF_STATUS sap_init_dfs_channel_nol_list(struct sap_context *sap_ctx);
388 
389 bool sap_dfs_is_channel_in_nol_list(struct sap_context *sap_ctx,
390 				    qdf_freq_t chan_freq,
391 				    ePhyChanBondState chanBondState);
392 void sap_dfs_cac_timer_callback(void *data);
393 
394 /**
395  * sap_cac_reset_notify() - BSS cleanup notification handler
396  * @mac_handle: Opaque handle to the global MAC context
397  *
398  * This function should be called upon stop bss indication to clean up
399  * DFS global structure.
400  */
401 void sap_cac_reset_notify(mac_handle_t mac_handle);
402 
403 bool is_concurrent_sap_ready_for_channel_change(mac_handle_t mac_handle,
404 						struct sap_context *sap_ctx);
405 
406 bool sap_is_conc_sap_doing_scc_dfs(mac_handle_t mac_handle,
407 				   struct sap_context *given_sapctx);
408 
409 uint8_t sap_get_total_number_sap_intf(mac_handle_t mac_handle);
410 
411 /**
412  * sap_channel_sel - Function for initiating scan request for ACS
413  * @sap_context: Sap Context value.
414  *
415  * Initiates Scan for ACS to pick a channel.
416  *
417  * Return: The QDF_STATUS code associated with performing the operation.
418  */
419 QDF_STATUS sap_channel_sel(struct sap_context *sap_context);
420 
421 /**
422  * sap_validate_chan - Function validate the channel and forces SCC
423  * @sap_context: Sap Context value.
424  * @pre_start_bss: if its called pre start BSS with valid channel.
425  * @check_for_connection_update: true, check and wait for connection update
426  *				 false, do not perform connection update
427  *
428  * validate and update the channel in case of force SCC.
429  *
430  * Return: The QDF_STATUS code associated with performing the operation.
431  */
432 QDF_STATUS
433 sap_validate_chan(struct sap_context *sap_context,
434 		  bool pre_start_bss,
435 		  bool check_for_connection_update);
436 
437 /**
438  * sap_check_in_avoid_ch_list() - checks if given channel present is channel
439  * avoidance list
440  * avoid_channels_info struct
441  * @sap_ctx:        sap context.
442  * @channel:        channel to be checked in sap_ctx's avoid ch list
443  *
444  * sap_ctx contains sap_avoid_ch_info strcut containing the list of channels on
445  * which MDM device's AP with MCC was detected. This function checks if given
446  * channel is present in that list.
447  *
448  * Return: true, if channel was present, false othersie.
449  */
450 bool
451 sap_check_in_avoid_ch_list(struct sap_context *sap_ctx, uint8_t channel);
452 
453 /**
454  * sap_set_session_param() - set sap related param to sap context and global var
455  * @mac_handle: Opaque handle to the global MAC context
456  * @sapctx: pointer to sapctx
457  * @session_id: session id for sap
458  *
459  * This API will set appropriate softap parameters to sap context
460  *
461  * Return: QDF_STATUS
462  */
463 QDF_STATUS sap_set_session_param(mac_handle_t mac_handle,
464 				 struct sap_context *sapctx,
465 				 uint32_t session_id);
466 
467 /**
468  * sap_clear_session_param() - clear sap related param from sap context
469  * @mac_handle: Opaque handle to the global MAC context
470  * @sapctx: pointer to sapctx
471  * @session_id: session id for sap
472  *
473  * This API will clear appropriate softap parameters from sap context
474  *
475  * Return: QDF_STATUS
476  */
477 QDF_STATUS sap_clear_session_param(mac_handle_t mac_handle,
478 				   struct sap_context *sapctx,
479 				   uint32_t session_id);
480 
481 void sap_scan_event_callback(struct wlan_objmgr_vdev *vdev,
482 			struct scan_event *event, void *arg);
483 
484 #ifdef DFS_COMPONENT_ENABLE
485 /**
486  * sap_indicate_radar() - Process radar indication
487  * @sap_ctx: pointer to sap context
488  *
489  * process radar indication.
490  *
491  * Return: frequency to which sap wishes to switch.
492  */
493 qdf_freq_t sap_indicate_radar(struct sap_context *sap_ctx);
494 #else
sap_indicate_radar(struct sap_context * sap_ctx)495 static inline qdf_freq_t sap_indicate_radar(struct sap_context *sap_ctx)
496 {
497 	return 0;
498 }
499 #endif
500 
501 /**
502  * sap_select_default_oper_chan() - Select AP mode default operating channel
503  * @mac_ctx: mac context
504  * @acs_cfg: pointer to ACS config info
505  *
506  * Select AP mode default operating channel based on ACS hw mode and channel
507  * range configuration when ACS scan fails due to some reasons, such as scan
508  * timeout, etc.
509  *
510  * Return: Selected operating channel frequency
511  */
512 uint32_t sap_select_default_oper_chan(struct mac_context *mac_ctx,
513 				      struct sap_acs_cfg *acs_cfg);
514 
515 /*
516  * sap_is_dfs_cac_wait_state() - check if sap is in cac wait state
517  * @sap_ctx: sap context to check
518  *
519  * Return: true if sap is in cac wait state
520  */
521 bool sap_is_dfs_cac_wait_state(struct sap_context *sap_ctx);
522 
523 /**
524  * sap_chan_bond_dfs_sub_chan - check bonded channel includes dfs sub chan
525  * @sap_context: Handle to SAP context.
526  * @channel_freq: chan whose bonded chan will be checked
527  * @bond_state: The channel bonding mode of the passed channel.
528  *
529  * This function checks if a given bonded channel includes dfs sub chan.
530  *
531  * Return: true if at least one dfs sub chan is bonded, otherwise false
532  */
533 bool
534 sap_chan_bond_dfs_sub_chan(struct sap_context *sap_context,
535 			   qdf_freq_t channel_freq,
536 			   ePhyChanBondState bond_state);
537 
538 /**
539  * sap_plus_sap_cac_skip() - Check current sap can skip CAC or not
540  *  in SAP+SAP concurrency
541  * @mac: mac ctx
542  * @sap_ctx: SAP context
543  * @chan_freq: SAP channel frequency
544  *
545  * All APs are done with CAC timer, all APs should start beaconing.
546  * Lets assume AP1 and AP2 started beaconing on DFS channel, Now lets
547  * say AP1 goes down and comes back on same DFS channel. In this case
548  * AP1 shouldn't start CAC timer and start beacon immediately because
549  * AP2 is already beaconing on this channel. This case will be handled
550  * by checking CAC completion on AP2.
551  *
552  * Return: true if current SAP can skip CAC
553  */
554 bool sap_plus_sap_cac_skip(struct mac_context *mac,
555 			   struct sap_context *sap_ctx,
556 			   qdf_freq_t chan_freq);
557 
558 void
559 sap_build_start_bss_config(struct start_bss_config *sap_bss_cfg,
560 			   struct sap_config *config);
561 #endif
562