Quellcode durchsuchen

qcacld-3.0: Handle disconnect rsp via connection mgr

Host add support to handle disconnect response via connection
manager.

Change-Id: I444dc93b0e089b3694bb041a671ec788910d5bcf
CRs-Fixed: 2846115
Abhishek Ambure vor 4 Jahren
Ursprung
Commit
aa2bfeb4f7

+ 21 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_api.h

@@ -27,6 +27,7 @@
 #ifdef FEATURE_CM_ENABLE
 #include <wlan_cm_public_struct.h>
 #include "scheduler_api.h"
+#include "connection_mgr/core/src/wlan_cm_main_api.h"
 
 /**
  * struct cm_vdev_join_req - connect req from legacy CM to vdev manager
@@ -74,6 +75,16 @@ struct cm_vdev_discon_ind {
 	struct wlan_cm_discon_ind disconnect_param;
 };
 
+/**
+ * struct cm_vdev_disconnect_rsp - disconnect rsp from vdev mgr to CM
+ * @vdev_id: vdev id
+ * @psoc: psoc object
+ */
+struct cm_vdev_disconnect_rsp {
+	uint8_t vdev_id;
+	struct wlan_objmgr_psoc *psoc;
+};
+
 /**
  * struct cm_vdev_join_rsp - connect rsp from vdev mgr to connection mgr
  * @psoc: psoc object
@@ -309,6 +320,16 @@ QDF_STATUS cm_disconnect(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
  */
 QDF_STATUS cm_send_sb_disconnect_req(struct scheduler_msg *msg);
 
+/**
+ * cm_handle_disconnect_resp() - Process vdev discon rsp and send to CM
+ * @msg: scheduler message
+ *
+ * Process disconnect rsp and send it to CM SM.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cm_handle_disconnect_resp(struct scheduler_msg *msg);
+
 /**
  * wlan_cm_send_connect_rsp() - Process vdev join rsp and send to CM
  * @msg: scheduler message

+ 54 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -172,3 +172,57 @@ QDF_STATUS cm_send_sb_disconnect_req(struct scheduler_msg *msg)
 
 	return status;
 }
+
+static void cm_copy_peer_disconnect_ies(struct wlan_objmgr_vdev *vdev,
+					struct element_info *ap_ie)
+{
+	struct wlan_ies *discon_ie;
+
+	discon_ie = mlme_get_peer_disconnect_ies(vdev);
+	if (!discon_ie)
+		return;
+
+	ap_ie->ptr = qdf_mem_malloc(discon_ie->len);
+	if (!ap_ie)
+		return;
+
+	ap_ie->len = discon_ie->len;
+	qdf_mem_copy(ap_ie->ptr, discon_ie->data, discon_ie->len);
+}
+
+QDF_STATUS cm_handle_disconnect_resp(struct scheduler_msg *msg)
+{
+	QDF_STATUS status;
+	struct cm_vdev_disconnect_rsp *ind;
+	struct wlan_cm_discon_rsp resp = {0};
+	struct wlan_objmgr_vdev *vdev;
+
+	if (!msg || !msg->bodyptr)
+		return QDF_STATUS_E_FAILURE;
+
+	ind = msg->bodyptr;
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(ind->psoc, ind->vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("vdev_id: %d : vdev not found", ind->vdev_id);
+		qdf_mem_free(ind);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (!cm_get_active_disconnect_req(vdev, &resp.req)) {
+		qdf_mem_free(ind);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (resp.req.req.source == CM_PEER_DISCONNECT)
+		cm_copy_peer_disconnect_ies(vdev, &resp.ap_discon_ie);
+
+	status = wlan_cm_disconnect_rsp(vdev, &resp);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+	if (resp.ap_discon_ie.len)
+		qdf_mem_free(resp.ap_discon_ie.ptr);
+
+	qdf_mem_free(ind);
+
+	return QDF_STATUS_E_FAILURE;
+}

+ 4 - 4
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -1621,10 +1621,10 @@ lim_cm_handle_disconnect_req(struct wlan_cm_vdev_discon_req *req)
 	pe_session = pe_find_session_by_bssid(mac_ctx, req->req.bssid.bytes,
 					      &req->req.vdev_id);
 	if (!pe_session) {
-		/*
-		 * TODO: Send disconnect resp from here while adding disconnect
-		 * resp handeling.
-		 */
+		pe_err("Session not found for vdev_id %d, cm_id %d, bssid",
+		       QDF_MAC_ADDR_FMT, req->cm_id, req->req.vdev_id,
+		       req->req.bssid.bytes);
+		lim_cm_send_disconnect_rsp(mac_ctx, req->req.vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
 

+ 73 - 15
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -629,21 +629,6 @@ void lim_send_sme_start_bss_rsp(struct mac_context *mac,
 	lim_sys_process_mmh_msg_api(mac, &mmhMsg);
 } /*** end lim_send_sme_start_bss_rsp() ***/
 
-void lim_send_sme_disassoc_deauth_ntf(struct mac_context *mac,
-				      QDF_STATUS status, uint32_t *pCtx)
-{
-	struct scheduler_msg mmhMsg = {0};
-	struct scheduler_msg *pMsg = (struct scheduler_msg *) pCtx;
-
-	mmhMsg.type = pMsg->type;
-	mmhMsg.bodyptr = pMsg;
-	mmhMsg.bodyval = 0;
-
-	MTRACE(mac_trace(mac, TRACE_CODE_TX_SME_MSG, NO_SESSION, mmhMsg.type));
-
-	lim_sys_process_mmh_msg_api(mac, &mmhMsg);
-}
-
 #ifdef FEATURE_CM_ENABLE
 static void lim_send_sta_disconnect_ind(struct mac_context *mac,
 					struct scheduler_msg *msg)
@@ -696,12 +681,85 @@ static void lim_send_sta_disconnect_ind(struct mac_context *mac,
 		qdf_mem_free(ind);
 	}
 }
+
+void lim_cm_send_disconnect_rsp(struct mac_context *mac_ctx, uint8_t vdev_id)
+{
+	QDF_STATUS status;
+	struct scheduler_msg rsp_msg = {0};
+	struct cm_vdev_disconnect_rsp *rsp;
+
+	rsp = qdf_mem_malloc(sizeof(*rsp));
+	if (!rsp)
+		return;
+
+	rsp->vdev_id = vdev_id;
+	rsp->psoc = mac_ctx->psoc;
+
+	rsp_msg.bodyptr = rsp;
+	rsp_msg.callback = cm_handle_disconnect_resp;
+
+	status = scheduler_post_message(QDF_MODULE_ID_PE, QDF_MODULE_ID_SME,
+					QDF_MODULE_ID_SME, &rsp_msg);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		pe_err("Failed to post disconnect rsp to sme vdev_id %d",
+		       vdev_id);
+		qdf_mem_free(rsp);
+	}
+}
+
+void lim_send_sme_disassoc_deauth_ntf(struct mac_context *mac,
+				      QDF_STATUS status, uint32_t *pCtx)
+{
+	struct scheduler_msg *msg = (struct scheduler_msg *)pCtx;
+	struct disassoc_rsp *disassoc;
+	struct deauth_rsp *deauth;
+	struct sir_sme_discon_done_ind *discon;
+	uint8_t vdev_id;
+
+	switch (msg->type) {
+	case eWNI_SME_DISASSOC_RSP:
+		disassoc = (struct disassoc_rsp *)msg->bodyptr;
+		vdev_id = disassoc->sessionId;
+		break;
+	case eWNI_SME_DEAUTH_RSP:
+		deauth = (struct deauth_rsp *)msg->bodyptr;
+		vdev_id = deauth->sessionId;
+		break;
+	case eWNI_SME_DISCONNECT_DONE_IND:
+		discon = (struct sir_sme_discon_done_ind *)msg->bodyptr;
+		vdev_id = discon->session_id;
+		break;
+	default:
+		pe_err("Received invalid disconnect rsp type %d", msg->type);
+		qdf_mem_free(msg->bodyptr);
+		return;
+	}
+
+	lim_cm_send_disconnect_rsp(mac, vdev_id);
+	qdf_mem_free(msg->bodyptr);
+}
 #else
 static void lim_send_sta_disconnect_ind(struct mac_context *mac,
 					struct scheduler_msg *msg)
 {
 	lim_sys_process_mmh_msg_api(mac, msg);
 }
+
+void lim_send_sme_disassoc_deauth_ntf(struct mac_context *mac,
+				      QDF_STATUS status, uint32_t *pCtx)
+{
+	struct scheduler_msg mmhMsg = {0};
+	struct scheduler_msg *pMsg = (struct scheduler_msg *)pCtx;
+
+	mmhMsg.type = pMsg->type;
+	mmhMsg.bodyptr = pMsg;
+	mmhMsg.bodyval = 0;
+
+	MTRACE(mac_trace(mac, TRACE_CODE_TX_SME_MSG, NO_SESSION, mmhMsg.type));
+
+	lim_sys_process_mmh_msg_api(mac, &mmhMsg);
+}
 #endif
 
 void lim_send_sme_disassoc_ntf(struct mac_context *mac,

+ 11 - 0
core/mac/src/pe/lim/lim_types.h

@@ -1150,6 +1150,17 @@ QDF_STATUS lim_deauth_tx_complete_cnf(void *context,
 				      uint32_t txCompleteSuccess,
 				      void *params);
 
+#ifdef FEATURE_CM_ENABLE
+/**
+ * lim_cm_send_disconnect_rsp() - To send disconnect rsp to CM
+ * @ctx: pointer to mac structure
+ * @vdev_id: vdev id
+ *
+ * return: None
+ */
+void lim_cm_send_disconnect_rsp(struct mac_context *mac_ctx, uint8_t vdev_id);
+#endif
+
 void lim_send_sme_disassoc_deauth_ntf(struct mac_context *mac_ctx,
 				QDF_STATUS status, uint32_t *ctx);