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