1 /* 2 * Copyright (c) 2012-2015,2020-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: wlan_cm_sm.h 20 * 21 * This header file maintain structures required for connection mgr sm infra 22 */ 23 24 #ifndef __WLAN_CM_SM_H__ 25 #define __WLAN_CM_SM_H__ 26 27 #include <wlan_sm_engine.h> 28 29 /** 30 * enum wlan_cm_sm_evt - connection manager related events 31 * Note: make sure to update cm_sm_event_names on updating this enum 32 * @WLAN_CM_SM_EV_CONNECT_REQ: Connect request event from requester 33 * @WLAN_CM_SM_EV_SCAN: Event to start connect scan 34 * @WLAN_CM_SM_EV_SCAN_SUCCESS: Connect scan success event 35 * @WLAN_CM_SM_EV_SCAN_FAILURE: Connect scan fail event 36 * @WLAN_CM_SM_EV_HW_MODE_SUCCESS: Hw mode change is success 37 * @WLAN_CM_SM_EV_HW_MODE_FAILURE: Hw mode change is failure 38 * @WLAN_CM_SM_EV_CONNECT_START: Connect start process initiate 39 * @WLAN_CM_SM_EV_CONNECT_ACTIVE: Connect request is activated 40 * @WLAN_CM_SM_EV_CONNECT_SUCCESS: Connect success 41 * @WLAN_CM_SM_EV_BSS_SELECT_IND_SUCCESS: Mlme resp for BSS select indication 42 * @WLAN_CM_SM_EV_BSS_CREATE_PEER_SUCCESS: BSS peer create success 43 * @WLAN_CM_SM_EV_CONNECT_GET_NEXT_CANDIDATE: Get next candidate for connection 44 * @WLAN_CM_SM_EV_CONNECT_FAILURE: Connect failed for all candidate 45 * @WLAN_CM_SM_EV_DISCONNECT_REQ: Disconnect request event from 46 * requester 47 * @WLAN_CM_SM_EV_DISCONNECT_START: Start disconnect sequence 48 * @WLAN_CM_SM_EV_DISCONNECT_ACTIVE: Process disconnect after in active cmd 49 * @WLAN_CM_SM_EV_DISCONNECT_DONE: Disconnect done event 50 * @WLAN_CM_SM_EV_ROAM_START: Roam start event for LFR2 and LFR3 51 * @WLAN_CM_SM_EV_ROAM_SYNC: Roam sync event for LFR3 52 * @WLAN_CM_SM_EV_ROAM_INVOKE_FAIL: Roam invoke fail event 53 * @WLAN_CM_SM_EV_ROAM_HO_FAIL: Hands off failed event 54 * @WLAN_CM_SM_EV_PREAUTH_DONE: Preauth is completed 55 * @WLAN_CM_SM_EV_GET_NEXT_PREAUTH_AP: Get next candidate as preauth failed 56 * @WLAN_CM_SM_EV_PREAUTH_FAIL: Preauth failed for all candidate 57 * @WLAN_CM_SM_EV_START_REASSOC: Start reassoc after preauth done 58 * @WLAN_CM_SM_EV_REASSOC_ACTIVE: Reassoc request activated 59 * @WLAN_CM_SM_EV_REASSOC_DONE: Reassoc completed 60 * @WLAN_CM_SM_EV_REASSOC_FAILURE: Reassoc failed 61 * @WLAN_CM_SM_EV_ROAM_COMPLETE: Roaming completed 62 * @WLAN_CM_SM_EV_ROAM_REQ: LFR3/FW roam - Roam req from connect 63 * LFR2/Host roam - Roam req from host/FW 64 * @WLAN_CM_SM_EV_ROAM_INVOKE: Host initiated LFR3/FW roam req 65 * @WLAN_CM_SM_EV_ROAM_ABORT: Roam abort 66 * @WLAN_CM_SM_EV_ROAM_DONE: Roam done 67 * @WLAN_CM_SM_EV_PREAUTH_ACTIVE: Preauth active 68 * @WLAN_CM_SM_EV_PREAUTH_RESP: Preauth response 69 * @WLAN_CM_SM_EV_REASSOC_TIMER: Reassoc timer expired 70 * @WLAN_CM_SM_EV_HO_ROAM_DISCONNECT_DONE: Disconnect done for hands off/roaming 71 * @WLAN_CM_SM_EV_RSO_STOP_RSP: Event to continue disconnect after 72 * RSO stop response is received 73 * @WLAN_CM_SM_EV_BEARER_SWITCH_COMPLETE: Event to continue connect after bearer 74 * switch complete 75 * @WLAN_CM_SM_EV_MAX: Max event 76 */ 77 enum wlan_cm_sm_evt { 78 WLAN_CM_SM_EV_CONNECT_REQ = 0, 79 WLAN_CM_SM_EV_SCAN = 1, 80 WLAN_CM_SM_EV_SCAN_SUCCESS = 2, 81 WLAN_CM_SM_EV_SCAN_FAILURE = 3, 82 WLAN_CM_SM_EV_HW_MODE_SUCCESS = 4, 83 WLAN_CM_SM_EV_HW_MODE_FAILURE = 5, 84 WLAN_CM_SM_EV_CONNECT_START = 6, 85 WLAN_CM_SM_EV_CONNECT_ACTIVE = 7, 86 WLAN_CM_SM_EV_CONNECT_SUCCESS = 8, 87 WLAN_CM_SM_EV_BSS_SELECT_IND_SUCCESS = 9, 88 WLAN_CM_SM_EV_BSS_CREATE_PEER_SUCCESS = 10, 89 WLAN_CM_SM_EV_CONNECT_GET_NEXT_CANDIDATE = 11, 90 WLAN_CM_SM_EV_CONNECT_FAILURE = 12, 91 WLAN_CM_SM_EV_DISCONNECT_REQ = 13, 92 WLAN_CM_SM_EV_DISCONNECT_START = 14, 93 WLAN_CM_SM_EV_DISCONNECT_ACTIVE = 15, 94 WLAN_CM_SM_EV_DISCONNECT_DONE = 16, 95 WLAN_CM_SM_EV_ROAM_START = 17, 96 WLAN_CM_SM_EV_ROAM_SYNC = 18, 97 WLAN_CM_SM_EV_ROAM_INVOKE_FAIL = 19, 98 WLAN_CM_SM_EV_ROAM_HO_FAIL = 20, 99 WLAN_CM_SM_EV_PREAUTH_DONE = 21, 100 WLAN_CM_SM_EV_GET_NEXT_PREAUTH_AP = 22, 101 WLAN_CM_SM_EV_PREAUTH_FAIL = 23, 102 WLAN_CM_SM_EV_START_REASSOC = 24, 103 WLAN_CM_SM_EV_REASSOC_ACTIVE = 25, 104 WLAN_CM_SM_EV_REASSOC_DONE = 26, 105 WLAN_CM_SM_EV_REASSOC_FAILURE = 27, 106 WLAN_CM_SM_EV_ROAM_COMPLETE = 28, 107 WLAN_CM_SM_EV_ROAM_REQ = 29, 108 WLAN_CM_SM_EV_ROAM_INVOKE = 30, 109 WLAN_CM_SM_EV_ROAM_ABORT = 31, 110 WLAN_CM_SM_EV_ROAM_DONE = 32, 111 WLAN_CM_SM_EV_PREAUTH_ACTIVE = 33, 112 WLAN_CM_SM_EV_PREAUTH_RESP = 34, 113 WLAN_CM_SM_EV_REASSOC_TIMER = 35, 114 WLAN_CM_SM_EV_HO_ROAM_DISCONNECT_DONE = 36, 115 WLAN_CM_SM_EV_RSO_STOP_RSP = 37, 116 WLAN_CM_SM_EV_BEARER_SWITCH_COMPLETE = 38, 117 WLAN_CM_SM_EV_MAX, 118 }; 119 120 /** 121 * cm_sm_create() - Invoke SM creation for connection manager 122 * @cm_ctx: connection manager ctx 123 * 124 * API allocates CM MLME SM and initializes SM lock 125 * 126 * Return: SUCCESS on successful allocation 127 * FAILURE, if registration fails 128 */ 129 QDF_STATUS cm_sm_create(struct cnx_mgr *cm_ctx); 130 131 /** 132 * cm_sm_destroy() - Invoke SM deletion for connection manager 133 * @cm_ctx: connection manager ctx 134 * 135 * API destroys CM MLME SM and SM lock 136 * 137 * Return: SUCCESS on successful deletion 138 * FAILURE, if deletion fails 139 */ 140 QDF_STATUS cm_sm_destroy(struct cnx_mgr *cm_ctx); 141 142 /** 143 * cm_sm_history_print() - Prints SM history 144 * @vdev: vdev object 145 * 146 * API to print CM SM history 147 * 148 * Return: void 149 */ 150 #ifdef SM_ENG_HIST_ENABLE 151 void cm_sm_history_print(struct wlan_objmgr_vdev *vdev); 152 #else 153 static inline cm_sm_history_print(struct wlan_objmgr_vdev * vdev)154 void cm_sm_history_print(struct wlan_objmgr_vdev *vdev) 155 { } 156 #endif 157 158 #ifdef WLAN_CM_USE_SPINLOCK 159 /** 160 * cm_lock_create() - Create CM SM mutex/spinlock 161 * @cm_ctx: connection manager ctx 162 * 163 * Creates CM SM mutex/spinlock 164 * 165 * Return: void 166 */ 167 static inline void cm_lock_create(struct cnx_mgr * cm_ctx)168 cm_lock_create(struct cnx_mgr *cm_ctx) 169 { 170 qdf_spinlock_create(&cm_ctx->sm.cm_sm_lock); 171 } 172 173 /** 174 * cm_lock_destroy() - Destroy CM SM mutex/spinlock 175 * @cm_ctx: connection manager ctx 176 * 177 * Destroy CM SM mutex/spinlock 178 * 179 * Return: void 180 */ 181 static inline void cm_lock_destroy(struct cnx_mgr * cm_ctx)182 cm_lock_destroy(struct cnx_mgr *cm_ctx) 183 { 184 qdf_spinlock_destroy(&cm_ctx->sm.cm_sm_lock); 185 } 186 187 /** 188 * cm_lock_acquire() - acquire CM SM mutex/spinlock 189 * @cm_ctx: connection manager ctx 190 * 191 * acquire CM SM mutex/spinlock 192 * 193 * return: void 194 */ cm_lock_acquire(struct cnx_mgr * cm_ctx)195 static inline void cm_lock_acquire(struct cnx_mgr *cm_ctx) 196 { 197 qdf_spin_lock_bh(&cm_ctx->sm.cm_sm_lock); 198 } 199 200 /** 201 * cm_lock_release() - release CM SM mutex/spinlock 202 * @cm_ctx: connection manager ctx 203 * 204 * release CM SM mutex/spinlock 205 * 206 * return: void 207 */ cm_lock_release(struct cnx_mgr * cm_ctx)208 static inline void cm_lock_release(struct cnx_mgr *cm_ctx) 209 { 210 qdf_spin_unlock_bh(&cm_ctx->sm.cm_sm_lock); 211 } 212 #else 213 static inline void cm_lock_create(struct cnx_mgr * cm_ctx)214 cm_lock_create(struct cnx_mgr *cm_ctx) 215 { 216 qdf_mutex_create(&cm_ctx->sm.cm_sm_lock); 217 } 218 219 static inline void cm_lock_destroy(struct cnx_mgr * cm_ctx)220 cm_lock_destroy(struct cnx_mgr *cm_ctx) 221 { 222 qdf_mutex_destroy(&cm_ctx->sm.cm_sm_lock); 223 } 224 cm_lock_acquire(struct cnx_mgr * cm_ctx)225 static inline void cm_lock_acquire(struct cnx_mgr *cm_ctx) 226 { 227 qdf_mutex_acquire(&cm_ctx->sm.cm_sm_lock); 228 } 229 cm_lock_release(struct cnx_mgr * cm_ctx)230 static inline void cm_lock_release(struct cnx_mgr *cm_ctx) 231 { 232 qdf_mutex_release(&cm_ctx->sm.cm_sm_lock); 233 } 234 #endif /* WLAN_CM_USE_SPINLOCK */ 235 236 /** 237 * cm_sm_transition_to() - invokes state transition 238 * @cm_ctx: connection manager ctx 239 * @state: new cm state 240 * 241 * API to invoke SM API to move to new state 242 * 243 * Return: void 244 */ cm_sm_transition_to(struct cnx_mgr * cm_ctx,enum wlan_cm_sm_state state)245 static inline void cm_sm_transition_to(struct cnx_mgr *cm_ctx, 246 enum wlan_cm_sm_state state) 247 { 248 wlan_sm_transition_to(cm_ctx->sm.sm_hdl, state); 249 } 250 251 /** 252 * cm_get_state() - get mlme state 253 * @cm_ctx: connection manager SM ctx 254 * 255 * API to get cm state 256 * 257 * Return: state of cm 258 */ 259 enum wlan_cm_sm_state cm_get_state(struct cnx_mgr *cm_ctx); 260 261 /** 262 * cm_get_sub_state() - get mlme substate 263 * @cm_ctx: connection manager SM ctx 264 * 265 * API to get cm substate 266 * 267 * Return: substate of cm 268 */ 269 enum wlan_cm_sm_state cm_get_sub_state(struct cnx_mgr *cm_ctx); 270 271 /** 272 * cm_set_state() - set cm mlme state 273 * @cm_ctx: connection manager SM ctx 274 * @state: cm state 275 * 276 * API to set cm state 277 * 278 * Return: void 279 */ 280 void cm_set_state(struct cnx_mgr *cm_ctx, enum wlan_cm_sm_state state); 281 282 /** 283 * cm_set_substate() - set cm mlme sub state 284 * @cm_ctx: connection manager SM ctx 285 * @substate: cm sub state 286 * 287 * API to set cm sub state 288 * 289 * Return: void 290 */ 291 void cm_set_substate(struct cnx_mgr *cm_ctx, 292 enum wlan_cm_sm_state substate); 293 294 /** 295 * cm_sm_state_update() - set cm mlme state and sub state 296 * @cm_ctx: connection manager SM ctx 297 * @state: cm state 298 * @substate: cm sub state 299 * 300 * API to invoke util APIs to set state and MLME sub state 301 * 302 * Return: void 303 */ 304 void cm_sm_state_update(struct cnx_mgr *cm_ctx, 305 enum wlan_cm_sm_state state, 306 enum wlan_cm_sm_state substate); 307 308 /** 309 * cm_sm_deliver_event_sync() - Delivers event to connection manager SM while 310 * holding lock 311 * @cm_ctx: cm ctx 312 * @event: CM event 313 * @data_len: data size 314 * @data: event data 315 * 316 * API to dispatch event to VDEV MLME SM without lock, in case lock is already 317 * held. 318 * 319 * Context: Can be called from any context, This should be called in case 320 * SM lock is already taken. If lock is not taken use cm_sm_deliver_event API 321 * instead. 322 * 323 * Return: SUCCESS: on handling event 324 * FAILURE: If event not handled 325 */ 326 static inline cm_sm_deliver_event_sync(struct cnx_mgr * cm_ctx,enum wlan_cm_sm_evt event,uint16_t data_len,void * data)327 QDF_STATUS cm_sm_deliver_event_sync(struct cnx_mgr *cm_ctx, 328 enum wlan_cm_sm_evt event, 329 uint16_t data_len, void *data) 330 { 331 return wlan_sm_dispatch(cm_ctx->sm.sm_hdl, event, data_len, data); 332 } 333 334 /** 335 * cm_sm_deliver_event() - Delivers event to connection manager SM 336 * @vdev: Object manager VDEV object 337 * @event: CM event 338 * @data_len: data size 339 * @data: event data 340 * 341 * API to dispatch event to VDEV MLME SM with lock. To be used while posting 342 * events from API called from public API. i.e. indication/response/request 343 * from any other module or NB/SB req/resp. 344 * 345 * Context: Can be called from any context, This should be called in case 346 * SM lock is not taken, the API will take the lock before posting to SM. 347 * If lock is already taken use cm_sm_deliver_event_sync API instead. 348 * 349 * Return: SUCCESS: on handling event 350 * FAILURE: If event not handled 351 */ 352 QDF_STATUS cm_sm_deliver_event(struct wlan_objmgr_vdev *vdev, 353 enum wlan_cm_sm_evt event, 354 uint16_t data_len, void *data); 355 356 /** 357 * cm_fill_vdev_crypto_params() - Update the vdev crypto params 358 * from the connect req structure 359 * @cm_ctx: connection manager SM ctx 360 * @req: connect request structure 361 * 362 * Return: void 363 */ 364 void cm_fill_vdev_crypto_params(struct cnx_mgr *cm_ctx, 365 struct wlan_cm_connect_req *req); 366 #endif /* __WLAN_CM_SM_H__ */ 367