From 26ea02a1eaf42f329e855470b763e4a390ef1b7b Mon Sep 17 00:00:00 2001 From: gaurank kathpalia Date: Thu, 23 Jul 2020 23:05:45 +0530 Subject: [PATCH] qcacmn: Handle connect and disconnect events in connection manager Handle connect and disconnect events in connection manager state machine. Change-Id: I62cba42ed726c3cc61343109c4e3208eba0d7e9e CRs-Fixed: 2740300 --- .../connection_mgr/core/src/wlan_cm_connect.c | 55 ++++++ .../core/src/wlan_cm_connect_scan.c | 24 +++ .../core/src/wlan_cm_disconnect.c | 31 +++ .../connection_mgr/core/src/wlan_cm_main.h | 54 +++--- .../core/src/wlan_cm_main_api.h | 114 +++++++++++ .../mlme/connection_mgr/core/src/wlan_cm_sm.c | 183 +++++++++++++----- .../mlme/connection_mgr/core/src/wlan_cm_sm.h | 33 +++- .../dispatcher/inc/wlan_cm_public_struct.h | 8 +- 8 files changed, 410 insertions(+), 92 deletions(-) diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c index 7c7f00cf01a7..6fa2d22fe8fc 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c @@ -17,3 +17,58 @@ /** * DOC: Implements connect specific APIs of connection manager */ + +#include "wlan_cm_main_api.h" + +QDF_STATUS cm_connect_start(struct cnx_mgr *cm_ctx, struct cm_connect_req *req) +{ + /* + * TODO: Interface event, get candidate list, do hw mode change and + * serialize. Also move to scan state from here if required. + * If candidate found and all are blacklisted or serialization fails + * post WLAN_CM_SM_EV_CONNECT_REQ_FAIL. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id) +{ + /* + * TODO: get first valid candidate, create bss peer. + * fill vdev crypto for the peer. + * call vdev sm to start connect for the candidate. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_try_next_candidate(struct cnx_mgr *cm_ctx, + struct wlan_cm_connect_rsp *resp) +{ + /* + * TODO: get next valid candidate, if no candidate left, post + * WLAN_CM_SM_EV_CONNECT_FAILURE to SM, inform osif about failure for + * the candidate if its not last one. and initiate the connect for + * next candidate. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_connect_cmd_timeout(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id) +{ + /* + * TODO: get the connect req from connect list and post + * WLAN_CM_SM_EV_CONNECT_FAILURE. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx, + struct wlan_cm_connect_rsp *resp) +{ + /* + * TODO: inform osif about success/failure, inform interface manager + * update fils/wep key and inform legacy, update bcn filter and scan + * entry mlme info, blm action and remove from serialization at the end. + */ + return QDF_STATUS_SUCCESS; +} diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_connect_scan.c b/umac/mlme/connection_mgr/core/src/wlan_cm_connect_scan.c index 192629747dad..5aa629faedfa 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_connect_scan.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_connect_scan.c @@ -18,3 +18,27 @@ * DOC: Implements connect scan (scan for ssid) specific apis of * connection manager */ + +#include "wlan_cm_main_api.h" + +QDF_STATUS cm_connect_scan_start(struct cnx_mgr *cm_ctx, + struct cm_connect_req *req) +{ + /* + * TODO: initiate connect scan and scan timer. + * post WLAN_CM_SM_EV_CONNECT_SCAN_FAILURE on scan req failure. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_connect_scan_resp(struct cnx_mgr *cm_ctx, wlan_scan_id *scan_id, + QDF_STATUS status) +{ + /* + * TODO: get connect req from head and check if scan_id match + * if not drop else proceed with success or failure handling + * (post WLAN_CM_SM_EV_CONNECT_FAILURE in case of status failure or if + * no candidate found again after scan) + */ + return QDF_STATUS_SUCCESS; +} diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c b/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c index 0138c2bf1d53..ed177c621ba9 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c @@ -17,3 +17,34 @@ /** * DOC: Implements disconnect specific apis of connection manager */ +#include "wlan_cm_main_api.h" + +QDF_STATUS cm_disconnect_start(struct cnx_mgr *cm_ctx, + struct cm_disconnect_req *req) +{ + /* + * TODO: Interface event, stop scan, disconnect TDLS, P2P roc cleanup + * queue serialization. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_disconnect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id) +{ + /* + * TODO: call vdev sm to start disconnect. + */ + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS cm_disconnect_complete(struct cnx_mgr *cm_ctx, + struct wlan_cm_discon_rsp *resp) +{ + /* + * TODO: inform osif, inform interface manager + * update fils/wep key and inform legacy, update bcn filter and scan + * entry mlme info, blm action and remove from serialization at the end. + */ + return QDF_STATUS_SUCCESS; +} + diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_main.h b/umac/mlme/connection_mgr/core/src/wlan_cm_main.h index 206e6ab6dc26..6fe4d97a8810 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_main.h +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_main.h @@ -73,19 +73,19 @@ enum wlan_cm_sm_state { /** * enum wlan_cm_sm_evt - connection manager related events - * @WLAN_CM_SM_EV_CONNECT_REQ: Connect request event - * @WLAN_CM_SM_EV_SCAN_FOR_SSID: Event for scan for SSID - * @WLAN_CM_SM_EV_SCAN_FOR_SSID_SUCCESS: Scan for SSID success event - * @WLAN_CM_SM_EV_SCAN_FOR_SSID_FAILURE: Scan for SSID fail event - * @WLAN_CM_SM_EV_CONNECT_START_REQ: Connect start request after BSSID list - * is prepared - * @WLAN_CM_SM_EV_CONNECT_START: Connect request for a particular BSSID + * @WLAN_CM_SM_EV_CONNECT_REQ: Connect request event from requester + * @WLAN_CM_SM_EV_SCAN: Event to start connect scan + * @WLAN_CM_SM_EV_SCAN_SUCCESS: Connect scan success event + * @WLAN_CM_SM_EV_SCAN_FAILURE: Connect scan fail event + * @WLAN_CM_SM_EV_CONNECT_START: Connect start process initiate + * @WLAN_CM_SM_EV_CONNECT_ACTIVE: Connect request is activated * @WLAN_CM_SM_EV_CONNECT_SUCCESS: Connect success - * @WLAN_CM_SM_EV_CONNECT_NEXT_CANDIDATE: Select next candidate for connection - * @WLAN_CM_SM_EV_CONNECT_FAILURE: Connect failed event - * @WLAN_CM_SM_EV_DISCONNECT_REQ: Disconnect request event - * @WLAN_CM_SM_EV_DISCONNECT_START_REQ: Start disconnect sequence - * @WLAN_CM_SM_EV_DISCONNECT_START: Disconnect process start event + * @WLAN_CM_SM_EV_CONNECT_GET_NEXT_CANDIDATE: Get next candidate for connection + * @WLAN_CM_SM_EV_CONNECT_FAILURE: Connect failed for all candidate + * @WLAN_CM_SM_EV_DISCONNECT_REQ: Disconnect request event from + * requester + * @WLAN_CM_SM_EV_DISCONNECT_START: Start disconnect sequence + * @WLAN_CM_SM_EV_DISCONNECT_ACTIVE: Process disconnect after in active cmd * @WLAN_CM_SM_EV_DISCONNECT_DONE: Disconnect done event * @WLAN_CM_SM_EV_ROAM_START: Roam start event * @WLAN_CM_SM_EV_ROAM_SYNC: Roam sync event @@ -98,24 +98,21 @@ enum wlan_cm_sm_state { * @WLAN_CM_SM_EV_REASSOC_DONE: Reassoc completed * @WLAN_CM_SM_EV_REASSOC_FAILURE: Reassoc failed * @WLAN_CM_SM_EV_ROAM_COMPLETE: Roaming completed - * @WLAN_CM_SM_EV_CONNECT_TIMEOUT: Connect timeout event - * @WLAN_CM_SM_EV_CONNECT_SER_FAIL: Connect request failed to serialize - * @WLAN_CM_SM_EV_HW_MODE_CHANGE_FAIL: HW mode change failed event * @WLAN_CM_SM_EV_MAX: Max event */ enum wlan_cm_sm_evt { WLAN_CM_SM_EV_CONNECT_REQ = 0, - WLAN_CM_SM_EV_SCAN_FOR_SSID = 1, - WLAN_CM_SM_EV_SCAN_FOR_SSID_SUCCESS = 2, - WLAN_CM_SM_EV_SCAN_FOR_SSID_FAILURE = 3, - WLAN_CM_SM_EV_CONNECT_START_REQ = 4, - WLAN_CM_SM_EV_CONNECT_START = 5, + WLAN_CM_SM_EV_SCAN = 1, + WLAN_CM_SM_EV_SCAN_SUCCESS = 2, + WLAN_CM_SM_EV_SCAN_FAILURE = 3, + WLAN_CM_SM_EV_CONNECT_START = 4, + WLAN_CM_SM_EV_CONNECT_ACTIVE = 5, WLAN_CM_SM_EV_CONNECT_SUCCESS = 6, - WLAN_CM_SM_EV_CONNECT_NEXT_CANDIDATE = 7, + WLAN_CM_SM_EV_CONNECT_GET_NEXT_CANDIDATE = 7, WLAN_CM_SM_EV_CONNECT_FAILURE = 8, WLAN_CM_SM_EV_DISCONNECT_REQ = 9, - WLAN_CM_SM_EV_DISCONNECT_START_REQ = 10, - WLAN_CM_SM_EV_DISCONNECT_START = 11, + WLAN_CM_SM_EV_DISCONNECT_START = 10, + WLAN_CM_SM_EV_DISCONNECT_ACTIVE = 11, WLAN_CM_SM_EV_DISCONNECT_DONE = 12, WLAN_CM_SM_EV_ROAM_START = 13, WLAN_CM_SM_EV_ROAM_SYNC = 14, @@ -128,9 +125,6 @@ enum wlan_cm_sm_evt { WLAN_CM_SM_EV_REASSOC_DONE = 21, WLAN_CM_SM_EV_REASSOC_FAILURE = 22, WLAN_CM_SM_EV_ROAM_COMPLETE = 23, - WLAN_CM_SM_EV_CONNECT_TIMEOUT = 24, - WLAN_CM_SM_EV_CONNECT_SER_FAIL = 25, - WLAN_CM_SM_EV_HW_MODE_CHANGE_FAIL = 26, WLAN_CM_SM_EV_MAX, }; @@ -164,8 +158,8 @@ struct cm_state_sm { * @cur_candidate: current candidate */ struct cm_connect_req { - uint64_t cm_id; - uint64_t scan_id; + wlan_cm_id cm_id; + wlan_scan_id scan_id; qdf_timer_t scan_timer; qdf_timer_t hw_mode_timer; struct wlan_cm_connect_req req; @@ -180,7 +174,7 @@ struct cm_connect_req { * @req: disconnect connect req from osif */ struct cm_disconnect_req { - uint64_t cm_id; + wlan_cm_id cm_id; struct wlan_cm_disconnect_req req; }; @@ -195,7 +189,7 @@ struct cm_disconnect_req { struct cm_req { qdf_list_node_t node; enum wlan_cm_source source; - uint64_t cm_id; + wlan_cm_id cm_id; union { struct cm_connect_req connect_req; struct cm_disconnect_req discon_req; diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h b/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h index 6c367a0fcbd7..b0184a356f5e 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_main_api.h @@ -23,4 +23,118 @@ #ifndef __WLAN_CM_MAIN_API_H__ #define __WLAN_CM_MAIN_API_H__ +#include "wlan_cm_main.h" + +/*************** CONNECT APIs ****************/ +/** + * cm_connect_start() - This API will be called to initiate the connect + * process + * @cm_ctx: connection manager context + * @req: Connect request. + * + * Return: QDF status + */ +QDF_STATUS cm_connect_start(struct cnx_mgr *cm_ctx, struct cm_connect_req *req); + +/** + * cm_connect_scan_start() - This API will be called to initiate the connect + * scan if no candidate are found in scan db. + * @cm_ctx: connection manager context + * @req: Connect request. + * + * Return: QDF status + */ +QDF_STATUS cm_connect_scan_start(struct cnx_mgr *cm_ctx, + struct cm_connect_req *req); + +/** + * cm_connect_scan_resp() - Handle the connect scan resp and next action + * scan if no candidate are found in scan db. + * @scan_id: scan id of the req + * @status: Connect scan status + * + * Return: QDF status + */ +QDF_STATUS cm_connect_scan_resp(struct cnx_mgr *cm_ctx, wlan_scan_id *scan_id, + QDF_STATUS status); + +/** + * cm_connect_active() - This API would be called after the connect + * request gets activated in serialization. + * @cm_ctx: connection manager context + * @cm_id: Connection mgr ID assigned to this connect request. + * + * Return: QDF status + */ +QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); + +/** + * cm_try_next_candidate() - This API would try to connect to next valid + * candidate and fail if no candidate left + * request gets activated in serialization. + * @cm_ctx: connection manager context + * @connect_resp: connect resp. + * + * Return: QDF status + */ +QDF_STATUS cm_try_next_candidate(struct cnx_mgr *cm_ctx, + struct wlan_cm_connect_rsp *connect_resp); + +/** + * cm_connect_cmd_timeout() - Called if active connect command timeout + * @cm_ctx: connection manager context + * @cm_id: Connection mgr ID assigned to this connect request. + * + * Return: QDF status + */ +QDF_STATUS cm_connect_cmd_timeout(struct cnx_mgr *cm_ctx, wlan_cm_id cm_id); + +/** + * cm_connect_complete() - This API would be called after connect complete + * request from the serialization. + * @cm_ctx: connection manager context + * @resp: Connection complete resp. + * + * This API would be called after connection completion resp from VDEV mgr + * + * Return: QDF status + */ +QDF_STATUS cm_connect_complete(struct cnx_mgr *cm_ctx, + struct wlan_cm_connect_rsp *resp); + +/*************** DISCONNECT APIs ****************/ + +/** + * cm_disconnect_start() - Initiate the disconnect process + * @cm_ctx: connection manager context + * @req: Disconnect request. + * + * Return: QDF status + */ +QDF_STATUS cm_disconnect_start(struct cnx_mgr *cm_ctx, + struct cm_disconnect_req *req); + +/** + * cm_disconnect_active() - This API would be called after the disconnect + * request gets activated in serialization. + * @cm_ctx: connection manager context + * @cm_id: Connection mgr ID assigned to this connect request. + * + * Return: QDF status + */ +QDF_STATUS cm_disconnect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id); + +/** + * cm_connect_complete() - This API would be called after connect complete + * request from the serialization. + * @cm_ctx: connection manager context + * @resp: disconnection complete resp. + * + * This API would be called after connection completion resp from VDEV mgr + * + * Return: QDF status + */ +QDF_STATUS cm_disconnect_complete(struct cnx_mgr *cm_ctx, + struct wlan_cm_discon_rsp *resp); + #endif /* __WLAN_CM_MAIN_API_H__ */ diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_sm.c b/umac/mlme/connection_mgr/core/src/wlan_cm_sm.c index 6e626bd44473..a8a04168f6ff 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_sm.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_sm.c @@ -18,7 +18,7 @@ * DOC: Implements general SM framework for connection manager */ -#include "wlan_cm_main.h" +#include "wlan_cm_main_api.h" #include "wlan_cm_sm.h" #include "wlan_cm_roam_sm.h" @@ -62,7 +62,7 @@ void mlme_cm_sm_state_update(struct cnx_mgr *cm_ctx, */ static void mlme_cm_state_init_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; mlme_cm_sm_state_update(cm_ctx, WLAN_CM_S_INIT, WLAN_CM_SS_IDLE); } @@ -88,13 +88,27 @@ static void mlme_cm_state_init_exit(void *ctx) * Return: bool */ static bool mlme_cm_state_init_event(void *ctx, uint16_t event, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; switch (event) { + case WLAN_CM_SM_EV_CONNECT_REQ: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_S_CONNECTING); + mlme_cm_sm_deliver_event(cm_ctx, + WLAN_CM_SM_EV_CONNECT_START, + data_len, data); + status = true; + break; + case WLAN_CM_SM_EV_CONNECT_FAILURE: + cm_connect_complete(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_DISCONNECT_DONE: + cm_disconnect_complete(cm_ctx, data); + status = true; + break; default: status = false; break; @@ -114,7 +128,7 @@ static bool mlme_cm_state_init_event(void *ctx, uint16_t event, */ static void mlme_cm_state_connecting_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; mlme_cm_sm_state_update(cm_ctx, WLAN_CM_S_CONNECTING, WLAN_CM_SS_IDLE); } @@ -142,13 +156,17 @@ static void mlme_cm_state_connecting_exit(void *ctx) * Return: bool */ static bool mlme_cm_state_connecting_event(void *ctx, uint16_t event, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; switch (event) { + case WLAN_CM_SM_EV_CONNECT_START: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_SS_JOIN_PENDING); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; default: status = false; break; @@ -168,7 +186,7 @@ static bool mlme_cm_state_connecting_event(void *ctx, uint16_t event, */ static void mlme_cm_state_connected_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; mlme_cm_sm_state_update(cm_ctx, WLAN_CM_S_CONNECTED, WLAN_CM_SS_IDLE); } @@ -196,13 +214,23 @@ static void mlme_cm_state_connected_exit(void *ctx) * Return: bool */ static bool mlme_cm_state_connected_event(void *ctx, uint16_t event, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; switch (event) { + case WLAN_CM_SM_EV_CONNECT_SUCCESS: + cm_connect_complete(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_DISCONNECT_REQ: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_S_DISCONNECTING); + mlme_cm_sm_deliver_event(cm_ctx, + WLAN_CM_SM_EV_DISCONNECT_START, + data_len, data); + status = true; + break; default: status = false; break; @@ -222,7 +250,7 @@ static bool mlme_cm_state_connected_event(void *ctx, uint16_t event, */ static void mlme_cm_state_disconnecting_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; mlme_cm_sm_state_update(cm_ctx, WLAN_CM_S_DISCONNECTING, WLAN_CM_SS_IDLE); @@ -251,13 +279,25 @@ static void mlme_cm_state_disconnecting_exit(void *ctx) * Return: bool */ static bool mlme_cm_state_disconnecting_event(void *ctx, uint16_t event, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; switch (event) { + case WLAN_CM_SM_EV_DISCONNECT_START: + cm_disconnect_start(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_DISCONNECT_ACTIVE: + cm_disconnect_active(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_DISCONNECT_DONE: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_S_INIT); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; default: status = false; break; @@ -277,7 +317,7 @@ static bool mlme_cm_state_disconnecting_event(void *ctx, uint16_t event, */ static void mlme_cm_subst_join_pending_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; if (mlme_cm_get_state(cm_ctx) != WLAN_CM_S_CONNECTING) QDF_BUG(0); @@ -308,13 +348,39 @@ static void mlme_cm_subst_join_pending_exit(void *ctx) * Return: bool */ static bool mlme_cm_subst_join_pending_event(void *ctx, uint16_t event, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; + QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; switch (event) { + case WLAN_CM_SM_EV_CONNECT_START: + cm_connect_start(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_CONNECT_ACTIVE: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_SS_JOIN_ACTIVE); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; + case WLAN_CM_SM_EV_SCAN: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_SS_SCAN); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; + case WLAN_CM_SM_EV_SCAN_FAILURE: + qdf_status = QDF_STATUS_E_FAILURE; + /* Fall through after setting status failure */ + case WLAN_CM_SM_EV_SCAN_SUCCESS: + cm_connect_scan_resp(cm_ctx, data, qdf_status); + status = true; + break; + case WLAN_CM_SM_EV_CONNECT_FAILURE: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_S_INIT); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; default: status = false; break; @@ -334,7 +400,7 @@ static bool mlme_cm_subst_join_pending_event(void *ctx, uint16_t event, */ static void mlme_cm_subst_scan_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; if (mlme_cm_get_state(cm_ctx) != WLAN_CM_S_CONNECTING) QDF_BUG(0); @@ -365,12 +431,22 @@ static void mlme_cm_subst_scan_exit(void *ctx) * Return: bool */ static bool mlme_cm_subst_scan_event(void *ctx, uint16_t event, - uint16_t event_data_len, void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; switch (event) { + case WLAN_CM_SM_EV_SCAN: + cm_connect_scan_start(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_SCAN_SUCCESS: + case WLAN_CM_SM_EV_SCAN_FAILURE: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_SS_JOIN_PENDING); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; default: status = false; break; @@ -390,7 +466,7 @@ static bool mlme_cm_subst_scan_event(void *ctx, uint16_t event, */ static void mlme_cm_subst_join_active_entry(void *ctx) { - struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; if (mlme_cm_get_state(cm_ctx) != WLAN_CM_S_CONNECTING) QDF_BUG(0); @@ -421,13 +497,30 @@ static void mlme_cm_subst_join_active_exit(void *ctx) * Return: bool */ static bool mlme_cm_subst_join_active_event(void *ctx, uint16_t event, - uint16_t event_data_len, - void *event_data) + uint16_t data_len, void *data) { -// struct cnx_mgr *cm_ctx = (struct cnx_mgr *)ctx; + struct cnx_mgr *cm_ctx = ctx; bool status; switch (event) { + case WLAN_CM_SM_EV_CONNECT_ACTIVE: + cm_connect_active(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_CONNECT_SUCCESS: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_S_CONNECTED); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; + case WLAN_CM_SM_EV_CONNECT_GET_NEXT_CANDIDATE: + cm_try_next_candidate(cm_ctx, data); + status = true; + break; + case WLAN_CM_SM_EV_CONNECT_FAILURE: + mlme_cm_sm_transition_to(cm_ctx, WLAN_CM_S_INIT); + mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); + status = true; + break; default: status = false; break; @@ -595,17 +688,17 @@ struct wlan_sm_state_info cm_sm_info[] = { static const char *cm_sm_event_names[] = { "EV_CONNECT_REQ", - "EV_SCAN_FOR_SSID", - "EV_SCAN_FOR_SSID_SUCCESS", - "EV_SCAN_FOR_SSID_FAILURE", - "EV_CONNECT_START_REQ", + "EV_SCAN", + "EV_SCAN_SUCCESS", + "EV_SCAN_FAILURE", "EV_CONNECT_START", + "EV_CONNECT_ACTIVE", "EV_CONNECT_SUCCESS", - "EV_CONNECT_NEXT_CANDIDATE", + "EV_CONNECT_GET_NXT_CANDIDATE", "EV_CONNECT_FAILURE", "EV_DISCONNECT_REQ", - "EV_DISCONNECT_START_REQ", "EV_DISCONNECT_START", + "EV_DISCONNECT_ACTIVE", "EV_DISCONNECT_DONE", "EV_ROAM_START", "EV_ROAM_SYNC", @@ -618,9 +711,6 @@ static const char *cm_sm_event_names[] = { "EV_REASSOC_DONE", "EV_REASSOC_FAILURE", "EV_ROAM_COMPLETE", - "EV_CONNECT_TIMEOUT", - "EV_CONNECT_SER_FAIL", - "EV_HW_MODE_CHANGE_FAIL", }; enum wlan_cm_sm_state mlme_cm_get_state(struct cnx_mgr *cm_ctx) @@ -653,15 +743,6 @@ enum wlan_cm_sm_state mlme_cm_get_sub_state(struct cnx_mgr *cm_ctx) return cm_ctx->sm.cm_substate; } -static inline -QDF_STATUS mlme_cm_sm_deliver_event(struct cnx_mgr *cm_ctx, - enum wlan_cm_sm_evt event, - uint16_t event_data_len, void *event_data) -{ - return wlan_sm_dispatch(cm_ctx->sm.sm_hdl, event, - event_data_len, event_data); -} - static void mlme_cm_sm_print_state_event(struct cnx_mgr *cm_ctx, enum wlan_cm_sm_evt event) { @@ -688,10 +769,9 @@ static void mlme_cm_sm_print_state(struct cnx_mgr *cm_ctx) cm_sm_info[state].name, cm_sm_info[substate].name); } -QDF_STATUS mlme_cm_sm_deliver_evt(struct wlan_objmgr_vdev *vdev, - enum wlan_cm_sm_evt event, - uint16_t event_data_len, - void *event_data) +QDF_STATUS wlan_mlme_cm_sm_deliver_evt(struct wlan_objmgr_vdev *vdev, + enum wlan_cm_sm_evt event, + uint16_t data_len, void *data) { struct vdev_mlme_obj *vdev_mlme; QDF_STATUS status; @@ -718,8 +798,7 @@ QDF_STATUS mlme_cm_sm_deliver_evt(struct wlan_objmgr_vdev *vdev, substate_entry = mlme_cm_get_sub_state(cm_ctx); mlme_cm_sm_print_state_event(cm_ctx, event); - status = mlme_cm_sm_deliver_event(cm_ctx, event, event_data_len, - event_data); + status = mlme_cm_sm_deliver_event(cm_ctx, event, data_len, data); /* Take exit state, exit substate for prints */ state_exit = mlme_cm_get_state(cm_ctx); substate_exit = mlme_cm_get_sub_state(cm_ctx); diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_sm.h b/umac/mlme/connection_mgr/core/src/wlan_cm_sm.h index 3d17f9788391..9f0b040a8d22 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_sm.h +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_sm.h @@ -217,21 +217,40 @@ void mlme_cm_sm_state_update(struct cnx_mgr *cm_ctx, enum wlan_cm_sm_state substate); /** - * mlme_cm_sm_deliver_evt() - Delivers event to CM SM + * mlme_cm_sm_deliver_event() - Delivers event to connection manager SM + * @cm_ctx: cm ctx + * @event: CM event + * @data_len: data size + * @data: event data + * + * API to dispatch event to VDEV MLME SM without lock + * + * Return: SUCCESS: on handling event + * FAILURE: on ignoring the event + */ +static inline +QDF_STATUS mlme_cm_sm_deliver_event(struct cnx_mgr *cm_ctx, + enum wlan_cm_sm_evt event, + uint16_t data_len, void *data) +{ + return wlan_sm_dispatch(cm_ctx->sm.sm_hdl, event, data_len, data); +} + +/** + * wlan_mlme_cm_sm_deliver_evt() - Delivers event to CM SM * @vdev: Object manager VDEV object * @event: CM event - * @event_data_len: data size - * @event_data: event data + * @data_len: data size + * @data: event data * * API to dispatch event to VDEV MLME SM with lock acquired * * Return: SUCCESS: on handling event * FAILURE: on ignoring the event */ -QDF_STATUS mlme_cm_sm_deliver_evt(struct wlan_objmgr_vdev *vdev, - enum wlan_cm_sm_evt event, - uint16_t event_data_len, - void *event_data); +QDF_STATUS wlan_mlme_cm_sm_deliver_evt(struct wlan_objmgr_vdev *vdev, + enum wlan_cm_sm_evt event, + uint16_t data_len, void *data); #endif /* FEATURE_CM_ENABLE */ #endif /* __WLAN_CM_SM_H__ */ diff --git a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h index 7af9425e88d7..1e1f573a9e08 100644 --- a/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h +++ b/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_public_struct.h @@ -26,6 +26,8 @@ #ifdef FEATURE_CM_ENABLE #include +typedef uint32_t wlan_cm_id; + /** * struct wlan_cm_wep_key_params - store wep key info * @key: key info @@ -170,7 +172,7 @@ struct wlan_cm_connect_req { */ struct wlan_cm_vdev_connect_req { uint8_t vdev_id; - uint8_t cm_id; + wlan_cm_id cm_id; struct scan_cache_node *bss; }; @@ -197,7 +199,7 @@ struct wlan_cm_disconnect_req { * @req: disconnect req */ struct wlan_cm_vdev_discon_req { - uint8_t cm_id; + wlan_cm_id cm_id; struct wlan_cm_disconnect_req req; }; @@ -299,7 +301,7 @@ struct wlan_connect_rsp_ies { */ struct wlan_cm_connect_rsp { uint8_t vdev_id; - uint8_t cm_id; + wlan_cm_id cm_id; uint8_t connect_status; enum wlan_cm_connect_fail_reason reason; uint8_t reason_code;