1  /*
2   * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2023 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_global.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_GLOBAL_H
32  #define __LIM_GLOBAL_H
33  
34  #include "wni_api.h"
35  #include "sir_api.h"
36  #include "sir_mac_prot_def.h"
37  #include "sir_mac_prop_exts.h"
38  #include "sir_common.h"
39  #include "sir_debug.h"
40  #include "wni_cfg.h"
41  #include "csr_api.h"
42  #include "sap_api.h"
43  #include "dot11f.h"
44  #include "wma_if.h"
45  
46  /* Deferred Message Queue Length */
47  #define MAX_DEFERRED_QUEUE_LEN                  80
48  
49  #ifdef CHANNEL_HOPPING_ALL_BANDS
50  #define CHAN_HOP_ALL_BANDS_ENABLE        1
51  #else
52  #define CHAN_HOP_ALL_BANDS_ENABLE        0
53  #endif
54  
55  /* enums exported by LIM are as follows */
56  
57  /*System role definition */
58  typedef enum eLimSystemRole {
59  	eLIM_UNKNOWN_ROLE,
60  	eLIM_AP_ROLE,
61  	eLIM_STA_ROLE,
62  	eLIM_P2P_DEVICE_ROLE,
63  	eLIM_P2P_DEVICE_GO,
64  	eLIM_P2P_DEVICE_CLIENT,
65  	eLIM_NDI_ROLE
66  } tLimSystemRole;
67  
68  /*
69   * SME state definition accessible across all Sirius modules.
70   * AP only states are LIM_SME_CHANNEL_SCAN_STATE &
71   * LIM_SME_NORMAL_CHANNEL_SCAN_STATE.
72   * Note that these states may also be present in STA
73   * side too when DFS support is present for a STA in IBSS mode.
74   */
75  typedef enum eLimSmeStates {
76  	eLIM_SME_OFFLINE_STATE,
77  	eLIM_SME_IDLE_STATE,
78  	eLIM_SME_SUSPEND_STATE,
79  	eLIM_SME_WT_JOIN_STATE,
80  	eLIM_SME_WT_AUTH_STATE,
81  	eLIM_SME_WT_ASSOC_STATE,
82  	eLIM_SME_WT_REASSOC_STATE,
83  	eLIM_SME_JOIN_FAILURE_STATE,
84  	eLIM_SME_ASSOCIATED_STATE,
85  	eLIM_SME_REASSOCIATED_STATE,
86  	eLIM_SME_LINK_EST_STATE,
87  	eLIM_SME_WT_PRE_AUTH_STATE,
88  	eLIM_SME_WT_DISASSOC_STATE,
89  	eLIM_SME_WT_DEAUTH_STATE,
90  	eLIM_SME_WT_START_BSS_STATE,
91  	eLIM_SME_WT_STOP_BSS_STATE,
92  	eLIM_SME_NORMAL_STATE,
93  } tLimSmeStates;
94  
95  /*
96   * MLM state definition.
97   * While these states are present on AP too when it is
98   * STA mode, per-STA MLM state exclusive to AP is:
99   * eLIM_MLM_WT_AUTH_FRAME3.
100   */
101  typedef enum eLimMlmStates {
102  	eLIM_MLM_OFFLINE_STATE,
103  	eLIM_MLM_IDLE_STATE,
104  	eLIM_MLM_WT_JOIN_BEACON_STATE,
105  	eLIM_MLM_JOINED_STATE,
106  	eLIM_MLM_BSS_STARTED_STATE,
107  	eLIM_MLM_WT_AUTH_FRAME2_STATE,
108  	eLIM_MLM_WT_AUTH_FRAME3_STATE,
109  	eLIM_MLM_WT_AUTH_FRAME4_STATE,
110  	eLIM_MLM_AUTH_RSP_TIMEOUT_STATE,
111  	eLIM_MLM_AUTHENTICATED_STATE,
112  	eLIM_MLM_WT_ASSOC_RSP_STATE,
113  	eLIM_MLM_WT_REASSOC_RSP_STATE,
114  	eLIM_MLM_ASSOCIATED_STATE,
115  	eLIM_MLM_REASSOCIATED_STATE,
116  	eLIM_MLM_LINK_ESTABLISHED_STATE,
117  	eLIM_MLM_WT_ASSOC_CNF_STATE,
118  	eLIM_MLM_WT_ADD_BSS_RSP_STATE,
119  	eLIM_MLM_WT_DEL_BSS_RSP_STATE,
120  	eLIM_MLM_WT_ADD_BSS_RSP_ASSOC_STATE,
121  	eLIM_MLM_WT_ADD_BSS_RSP_REASSOC_STATE,
122  	eLIM_MLM_WT_ADD_BSS_RSP_PREASSOC_STATE,
123  	eLIM_MLM_WT_ADD_STA_RSP_STATE,
124  	eLIM_MLM_WT_DEL_STA_RSP_STATE,
125  	/*
126  	 * MLM goes to this state when LIM initiates DELETE_STA
127  	 * as processing of Assoc req because the entry already exists.
128  	 * LIM comes out of this state when DELETE_STA response from
129  	 * HAL is received. LIM needs to maintain this state so that ADD_STA
130  	 * can be issued while processing DELETE_STA response from HAL.
131  	 */
132  	eLIM_MLM_WT_ASSOC_DEL_STA_RSP_STATE,
133  	eLIM_MLM_WT_SET_BSS_KEY_STATE,
134  	eLIM_MLM_WT_SET_STA_KEY_STATE,
135  	eLIM_MLM_WT_SET_STA_BCASTKEY_STATE,
136  	eLIM_MLM_WT_ADD_BSS_RSP_FT_REASSOC_STATE,
137  	eLIM_MLM_WT_FT_REASSOC_RSP_STATE,
138  	eLIM_MLM_WT_SAE_AUTH_STATE,
139  	eLIM_MLM_WT_FT_AUTH_STATE,
140  } tLimMlmStates;
141  
142  /* 11h channel switch states */
143  
144  /*
145   * This enum indicates in which state the channel-swith
146   * is presently operating.
147   * eLIM_11H_CHANSW_INIT - Default state
148   * eLIM_11H_CHANSW_RUNNING - When channel switch is running
149   * eLIM_11H_CHANSW_END - After channel switch is complete
150   */
151  typedef enum eLimDot11hChanSwStates {
152  	eLIM_11H_CHANSW_INIT,
153  	eLIM_11H_CHANSW_RUNNING,
154  	eLIM_11H_CHANSW_END
155  } tLimDot11hChanSwStates;
156  
157  /* MLM Req/Cnf structure definitions */
158  typedef struct sLimMlmAuthReq {
159  	tSirMacAddr peerMacAddr;
160  	tAniAuthType authType;
161  	uint8_t sessionId;
162  } tLimMlmAuthReq, *tpLimMlmAuthReq;
163  
164  typedef struct sLimMlmJoinReq {
165  	uint8_t sessionId;
166  	struct bss_description bssDescription;
167  	/*
168  	 * WARNING: Pls make bssDescription as last variable in struct
169  	 * tLimMlmJoinReq as it has ieFields followed after this bss
170  	 * description. Adding a variable after this corrupts the ieFields
171  	 */
172  } tLimMlmJoinReq, *tpLimMlmJoinReq;
173  
174  /* Forward declarations */
175  struct sSirAssocReq;
176  struct sDphHashNode;
177  
178  /* struct lim_assoc_data - Assoc data to be cached to defer association
179   *			   indication to SME
180   * @present: Indicates whether assoc data is present or not
181   * @sub_type: Indicates whether it is Association Request(=0) or Reassociation
182   *            Request(=1) frame
183   * @sa: Mac address of requesting peer
184   * @assoc_req: pointer to parsed ASSOC/REASSOC Request frame
185   * @pmf_connection: flag indicating pmf connection
186   * @assoc_req_copied: boolean to indicate if assoc req was copied to tmp above
187   * @dup_entry: flag indicating if duplicate entry found
188   * @sta_ds: station dph entry
189   * @partner_peer_idx: peer_idx which is already allocated by partner link
190   */
191  struct lim_assoc_data {
192  	bool present;
193  	uint8_t sub_type;
194  	tSirMacAddr sa;
195  	struct sSirAssocReq *assoc_req;
196  	bool pmf_connection;
197  	bool assoc_req_copied;
198  	bool dup_entry;
199  	struct sDphHashNode *sta_ds;
200  	uint16_t partner_peer_idx;
201  };
202  
203  /* Pre-authentication structure definition */
204  typedef struct tLimPreAuthNode {
205  	struct tLimPreAuthNode *next;
206  	tSirMacAddr peerMacAddr;
207  	tAniAuthType authType;
208  	tLimMlmStates mlmState;
209  	uint8_t authNodeIdx;
210  	uint8_t challengeText[SIR_MAC_AUTH_CHALLENGE_LENGTH];
211  	uint8_t fTimerStarted:1;
212  	uint8_t fSeen:1;
213  	uint8_t fFree:1;
214  	uint8_t rsvd:5;
215  	TX_TIMER timer;
216  	uint16_t seq_num;
217  	unsigned long timestamp;
218  	/* keeping copy of association request received, this is
219  	 * to defer the association request processing
220  	 */
221  	struct lim_assoc_data assoc_req;
222  	bool is_mlo_ie_present;
223  #ifdef WLAN_FEATURE_11BE_MLO
224  	tSirMacAddr peer_mld;
225  #endif
226  } tLimPreAuthNode, *tpLimPreAuthNode;
227  
228  /* Pre-authentication table definition */
229  typedef struct tLimPreAuthTable {
230  	uint32_t numEntry;
231  	tLimPreAuthNode **pTable;
232  } tLimPreAuthTable, *tpLimPreAuthTable;
233  
234  /**
235   * struct lim_sta_context - LIM per STA structure
236   * @mlmState: LIM State
237   * @authType: Authentication algorithm
238   * @akm_type: AKM of the connection
239   * @listenInterval: Listen interval
240   * @capabilityInfo: Capabilities
241   * @disassocReason: Disassociation reason code
242   * @resultCode:     Result code
243   * @subType:        Indicates association or reassociation
244   * @updateContext:  Update context
245   * @schClean:       Scheduler clean
246   * @htCapability:   802.11n HT capability
247   * @vhtCapability:  802.11ac VHT capability
248   * @cleanupTrigger: Cleanup trigger
249   * @protStatusCode: Protocol Status code
250   * @he_capable:     802.11ax HE capability
251   * @owe_ie:         Pointer to OWE IE
252   * @owe_ie_len:     Length of OWE IE
253   * @ft_ie:         Pointer to FT related IE
254   * @ft_ie_len:     Length of FT related IE
255   * @eht_capable:     802.11be EHT capability
256   */
257  struct lim_sta_context {
258  	tLimMlmStates mlmState;
259  	tAniAuthType authType;		/* auth algo in auth frame */
260  	enum ani_akm_type akm_type;	/* akm in rsn/wpa ie */
261  	uint16_t listenInterval;
262  	tSirMacCapabilityInfo capabilityInfo;
263  	enum wlan_reason_code disassocReason;
264  
265  	tSirResultCodes resultCode;
266  
267  	uint8_t subType:1;      /* Indicates ASSOC (0) or REASSOC (1) */
268  	uint8_t updateContext:1;
269  	uint8_t schClean:1;
270  	/* 802.11n HT Capability in Station: Enabled 1 or DIsabled 0 */
271  	uint8_t htCapability:1;
272  	uint8_t vhtCapability:1;
273  	uint16_t cleanupTrigger;
274  	uint16_t protStatusCode;
275  #ifdef WLAN_FEATURE_11AX
276  	bool he_capable;
277  #endif
278  	bool force_1x1;
279  	uint8_t *owe_ie;
280  	uint32_t owe_ie_len;
281  	uint8_t *ft_ie;
282  	uint32_t ft_ie_len;
283  #ifdef WLAN_FEATURE_11BE
284  	bool eht_capable;
285  #endif
286  };
287  
288  /* Structure definition to hold deferred messages queue parameters */
289  typedef struct sLimDeferredMsgQParams {
290  	struct scheduler_msg deferredQueue[MAX_DEFERRED_QUEUE_LEN];
291  	uint16_t size;
292  	uint16_t read;
293  	uint16_t write;
294  } tLimDeferredMsgQParams, *tpLimDeferredMsgQParams;
295  
296  typedef struct sCfgProtection {
297  	uint32_t overlapFromlla:1;
298  	uint32_t overlapFromllb:1;
299  	uint32_t overlapFromllg:1;
300  	uint32_t overlapHt20:1;
301  	uint32_t overlapNonGf:1;
302  	uint32_t overlapLsigTxop:1;
303  	uint32_t overlapRifs:1;
304  	uint32_t overlapOBSS:1; /* added for obss */
305  	uint32_t fromlla:1;
306  	uint32_t fromllb:1;
307  	uint32_t fromllg:1;
308  	uint32_t ht20:1;
309  	uint32_t nonGf:1;
310  	uint32_t lsigTxop:1;
311  	uint32_t rifs:1;
312  	uint32_t obss:1;        /* added for Obss */
313  } tCfgProtection, *tpCfgProtection;
314  
315  typedef enum eLimProtStaCacheType {
316  	eLIM_PROT_STA_CACHE_TYPE_INVALID,
317  	eLIM_PROT_STA_CACHE_TYPE_llB,
318  	eLIM_PROT_STA_CACHE_TYPE_llG,
319  	eLIM_PROT_STA_CACHE_TYPE_HT20
320  } tLimProtStaCacheType;
321  
322  typedef struct sCacheParams {
323  	uint8_t active;
324  	tSirMacAddr addr;
325  	tLimProtStaCacheType protStaCacheType;
326  
327  } tCacheParams, *tpCacheParams;
328  
329  #define LIM_PROT_STA_OVERLAP_CACHE_SIZE    HAL_NUM_ASSOC_STA
330  #define LIM_PROT_STA_CACHE_SIZE            HAL_NUM_ASSOC_STA
331  
332  typedef struct sLimProtStaParams {
333  	uint8_t numSta;
334  	uint8_t protectionEnabled;
335  } tLimProtStaParams, *tpLimProtStaParams;
336  
337  typedef struct sLimNoShortParams {
338  	uint8_t numNonShortPreambleSta;
339  	tCacheParams staNoShortCache[LIM_PROT_STA_CACHE_SIZE];
340  } tLimNoShortParams, *tpLimNoShortParams;
341  
342  typedef struct sLimNoShortSlotParams {
343  	uint8_t numNonShortSlotSta;
344  	tCacheParams staNoShortSlotCache[LIM_PROT_STA_CACHE_SIZE];
345  } tLimNoShortSlotParams, *tpLimNoShortSlotParams;
346  
347  /* Enums used for channel switching. */
348  typedef enum eLimChannelSwitchState {
349  	eLIM_CHANNEL_SWITCH_IDLE,
350  	eLIM_CHANNEL_SWITCH_PRIMARY_ONLY,
351  	eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY
352  } tLimChannelSwitchState;
353  
354  /* Channel Switch Info */
355  typedef struct sLimChannelSwitchInfo {
356  	tLimChannelSwitchState state;
357  	uint32_t sw_target_freq;
358  	uint8_t primaryChannel;
359  	uint8_t ch_center_freq_seg0;
360  	uint8_t ch_center_freq_seg1;
361  	uint8_t sec_ch_offset;
362  	enum phy_ch_width ch_width;
363  #ifdef WLAN_FEATURE_11BE
364  	uint16_t puncture_bitmap;
365  #endif
366  	int8_t switchCount;
367  	uint32_t switchTimeoutValue;
368  	uint8_t switchMode;
369  } tLimChannelSwitchInfo, *tpLimChannelSwitchInfo;
370  
371  typedef struct sLimOperatingModeInfo {
372  	uint8_t present;
373  	uint8_t chanWidth:4;
374  	uint8_t rxNSS:3;
375  	uint8_t rxNSSType:1;
376  } tLimOperatingModeInfo, *tpLimOperatingModeInfo;
377  
378  typedef struct sLimWiderBWChannelSwitch {
379  	uint8_t newChanWidth;
380  	uint8_t newCenterChanFreq0;
381  	uint8_t newCenterChanFreq1;
382  } tLimWiderBWChannelSwitchInfo, *tpLimWiderBWChannelSwitchInfo;
383  
384  typedef struct sLimTspecInfo {
385  	/* 0==free, else used */
386  	uint8_t inuse;
387  	/* index in list */
388  	uint8_t idx;
389  	tSirMacAddr staAddr;
390  	uint16_t assocId;
391  	struct mac_tspec_ie tspec;
392  	/* number of Tclas elements */
393  	uint8_t numTclas;
394  	tSirTclasInfo tclasInfo[SIR_MAC_TCLASIE_MAXNUM];
395  	uint8_t tclasProc;
396  	/* tclassProc is valid only if this is set to 1. */
397  	uint8_t tclasProcPresent:1;
398  } qdf_packed tLimTspecInfo, *tpLimTspecInfo;
399  
400  typedef struct sLimAdmitPolicyInfo {
401  	/* admit control policy type */
402  	uint8_t type;
403  	/* oversubscription factor : 0 means nothing is allowed */
404  	uint8_t bw_factor;
405  	/* valid only when 'type' is set BW_FACTOR */
406  } tLimAdmitPolicyInfo, *tpLimAdmitPolicyInfo;
407  
408  typedef enum eLimWscEnrollState {
409  	eLIM_WSC_ENROLL_NOOP,
410  	eLIM_WSC_ENROLL_BEGIN,
411  	eLIM_WSC_ENROLL_IN_PROGRESS,
412  	eLIM_WSC_ENROLL_END
413  } tLimWscEnrollState;
414  
415  #define WSC_PASSWD_ID_PUSH_BUTTON         (0x0004)
416  
417  typedef struct sLimWscIeInfo {
418  	bool apSetupLocked;
419  	bool selectedRegistrar;
420  	uint16_t selectedRegistrarConfigMethods;
421  	tLimWscEnrollState wscEnrollmentState;
422  	tLimWscEnrollState probeRespWscEnrollmentState;
423  	uint8_t reqType;
424  	uint8_t respType;
425  } tLimWscIeInfo, *tpLimWscIeInfo;
426  
427  /* maximum number of tspec's supported */
428  #define LIM_NUM_TSPEC_MAX      15
429  
430  /* structure to hold all 11h specific data */
431  typedef struct sLimSpecMgmtInfo {
432  	tLimDot11hChanSwStates dot11hChanSwState;
433  } tLimSpecMgmtInfo, *tpLimSpecMgmtInfo;
434  
435  /**
436   * struct lim_delba_req_info - Delba request struct
437   * @vdev_id: vdev id
438   * @peer_macaddr: peer mac address
439   * @tid: tid
440   * @reason_code: reason code
441   */
442  struct lim_delba_req_info {
443  	uint8_t vdev_id;
444  	tSirMacAddr peer_macaddr;
445  	uint8_t tid;
446  	uint8_t reason_code;
447  };
448  #endif
449