فهرست منبع

qcacmn: Handle EV_DISCONNECT_ACTIVE event in roaming state

In the case of Roam Start sub-state, if a new connect/disconnect
is received, an internal disconnect/actual disconnect is queued
in serialization and then the state is changed to connecting
or disconnecting, but if the disconnect command becomes active
directly the EV_DISCONNECT_ACTIVE is received in roam substates
but is not handled.

As EV_DISCONNECT_ACTIVE is not handled the disconnect is not
processed and VDEV can remain in UP state while CM assuming that
the disconnect is completed will allow a new connection which
cause 2nd BSS peer creation.

Fix is to handle EV_DISCONNECT_ACTIVE event in Roam sub-states.

Change-Id: I30180db2e15af9b793e52e891f86d54c55b7b5e0
CRs-Fixed: 2986468
Abhishek Singh 4 سال پیش
والد
کامیت
6deea68417
1فایلهای تغییر یافته به همراه7 افزوده شده و 0 حذف شده
  1. 7 0
      umac/mlme/connection_mgr/core/src/wlan_cm_roam_sm.c

+ 7 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_roam_sm.c

@@ -152,6 +152,9 @@ static bool cm_handle_connect_disconnect_in_roam(struct cnx_mgr *cm_ctx,
 		cm_sm_deliver_event_sync(cm_ctx, WLAN_CM_SM_EV_DISCONNECT_START,
 					 data_len, data);
 		break;
+	case WLAN_CM_SM_EV_DISCONNECT_ACTIVE:
+		cm_disconnect_active(cm_ctx, data);
+		break;
 	default:
 		return false;
 		break;
@@ -227,6 +230,7 @@ bool cm_subst_preauth_event(void *ctx, uint16_t event,
 	switch (event) {
 	case WLAN_CM_SM_EV_CONNECT_REQ:
 	case WLAN_CM_SM_EV_DISCONNECT_REQ:
+	case WLAN_CM_SM_EV_DISCONNECT_ACTIVE:
 		event_handled =
 			cm_handle_connect_disconnect_in_roam(cm_ctx, event,
 							     data_len, data);
@@ -304,6 +308,7 @@ bool cm_subst_reassoc_event(void *ctx, uint16_t event,
 	switch (event) {
 	case WLAN_CM_SM_EV_CONNECT_REQ:
 	case WLAN_CM_SM_EV_DISCONNECT_REQ:
+	case WLAN_CM_SM_EV_DISCONNECT_ACTIVE:
 		event_handled =
 			cm_handle_connect_disconnect_in_roam(cm_ctx, event,
 							     data_len, data);
@@ -383,6 +388,7 @@ bool cm_subst_roam_start_event(void *ctx, uint16_t event,
 	switch (event) {
 	case WLAN_CM_SM_EV_CONNECT_REQ:
 	case WLAN_CM_SM_EV_DISCONNECT_REQ:
+	case WLAN_CM_SM_EV_DISCONNECT_ACTIVE:
 		event_handled =
 			cm_handle_connect_disconnect_in_roam(cm_ctx, event,
 							     data_len, data);
@@ -436,6 +442,7 @@ bool cm_subst_roam_sync_event(void *ctx, uint16_t event,
 	switch (event) {
 	case WLAN_CM_SM_EV_CONNECT_REQ:
 	case WLAN_CM_SM_EV_DISCONNECT_REQ:
+	case WLAN_CM_SM_EV_DISCONNECT_ACTIVE:
 		event_handled =
 			cm_handle_connect_disconnect_in_roam(cm_ctx, event,
 							     data_len, data);