浏览代码

qcacld-3.0: Add connect and disconnect support in connection manager

Add support for connect and disconnect path
in legacy cld files with respect to connection
manager.

Change-Id: Ia42dd45d943de20d91279c0197b0f17a5c0326eb
CRs-Fixed: 2805807
gaurank kathpalia 4 年之前
父节点
当前提交
e4defd9d16

+ 9 - 7
Kbuild

@@ -1276,13 +1276,15 @@ CM_INC := -I$(WLAN_ROOT)/$(CM_DIR)/dispatcher/inc \
 
 MLME_INC += $(CM_INC)
 
-CM_ROAM_OBJS :=    $(CM_DIR)/dispatcher/src/wlan_cm_tgt_if_tx_api.o \
-			$(CM_DIR)/dispatcher/src/wlan_cm_roam_api.o \
-			$(CM_DIR)/dispatcher/src/wlan_cm_roam_ucfg_api.o \
-			$(CM_TGT_IF_DIR)/src/target_if_cm_roam_offload.o \
-			$(CM_DIR)/core/src/wlan_cm_roam_offload.o
-
-MLME_OBJS += $(CM_ROAM_OBJS)
+MLME_OBJS +=    $(CM_DIR)/dispatcher/src/wlan_cm_tgt_if_tx_api.o \
+		$(CM_DIR)/dispatcher/src/wlan_cm_roam_api.o \
+		$(CM_DIR)/dispatcher/src/wlan_cm_roam_ucfg_api.o \
+		$(CM_TGT_IF_DIR)/src/target_if_cm_roam_offload.o \
+		$(CM_DIR)/core/src/wlan_cm_roam_offload.o
+ifeq ($(CONFIG_CM_ENABLE), y)
+MLME_OBJS +=    $(CM_DIR)/core/src/wlan_cm_vdev_connect.o \
+		$(CM_DIR)/core/src/wlan_cm_vdev_disconnect.o
+endif
 
 ####### WFA_CONFIG ########
 

+ 10 - 0
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c

@@ -30,6 +30,7 @@
 #include "target_if_cm_roam_offload.h"
 #include "wlan_crypto_global_api.h"
 #include "target_if_wfa_testcmd.h"
+#include <../../core/src/wlan_cm_vdev_api.h>
 
 static struct vdev_mlme_ops sta_mlme_ops;
 static struct vdev_mlme_ops ap_mlme_ops;
@@ -1663,4 +1664,13 @@ static struct mlme_ext_ops ext_ops = {
 	.mlme_vdev_ext_hdl_destroy = vdevmgr_mlme_ext_hdl_destroy,
 	.mlme_vdev_ext_hdl_post_create = vdevmgr_mlme_ext_post_hdl_create,
 	.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
+#ifdef FEATURE_CM_ENABLE
+	.mlme_cm_ext_connect_req_cb = cm_handle_connect_req,
+	.mlme_cm_ext_bss_peer_create_req_cb = cm_send_bss_peer_create_req,
+	.mlme_cm_ext_connect_complete_ind_cb = cm_handle_connect_complete,
+	.mlme_cm_ext_disconnect_req_cb = cm_handle_disconnect_req,
+	.mlme_cm_ext_bss_peer_delete_req_cb = cm_send_bss_peer_delete_req,
+	.mlme_cm_ext_disconnect_complete_ind_cb = cm_disconnect_complete_ind,
+	.mlme_cm_ext_vdev_down_req_cb = cm_send_vdev_down_req,
+#endif
 };

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

@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2012-2015, 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: wlan_cm_vdev_api.h
+ *
+ * This header file maintain legacy connect, disconnect APIs of connection
+ * manager to initiate vdev manager operations
+ */
+
+#ifndef __WLAN_CM_VDEV_API_H__
+#define __WLAN_CM_VDEV_API_H__
+
+#ifdef FEATURE_CM_ENABLE
+#include <wlan_cm_public_struct.h>
+#include "scheduler_api.h"
+
+/**
+ * struct cm_vdev_join_req - connect req from legacy CM to peer manager
+ * @vdev_id: vdev id
+ * @cm_id: Connect manager id
+ * @force_rsne_override: force the arbitrary rsne received in connect req to be
+ * used with out validation, used for the scenarios where the device is used
+ * as a testbed device with special functionality and not recommended
+ * for production.
+ * @assoc_ie: assoc ie to be used in assoc req
+ * @scan_ie: Default scan ie to be used in the uncast probe req
+ * @entry: scan entry for the candidate
+ */
+struct cm_vdev_join_req {
+	uint8_t vdev_id;
+	wlan_cm_id cm_id;
+	bool force_rsne_override;
+	struct element_info assoc_ie;
+	struct element_info scan_ie;
+	struct scan_cache_entry *entry;
+};
+
+/**
+ * cm_handle_connect_req() - Connection manager ext connect request to start
+ * vdev and peer assoc state machine
+ * @vdev: VDEV object
+ * @req: Vdev connect request
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+cm_handle_connect_req(struct wlan_objmgr_vdev *vdev,
+		      struct wlan_cm_vdev_connect_req *req);
+
+/**
+ * cm_send_bss_peer_create_req() - Connection manager ext bss peer create
+ * request
+ * @vdev: VDEV object
+ * @peer_mac: Peer mac address
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+cm_send_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
+			    struct qdf_mac_addr *peer_mac);
+
+/**
+ * cm_handle_connect_complete() - Connection manager ext connect complete
+ * indication
+ * @vdev: VDEV object
+ * @rsp: Connection manager connect response
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+cm_handle_connect_complete(struct wlan_objmgr_vdev *vdev,
+			   struct wlan_cm_connect_rsp *rsp);
+
+/**
+ * cm_handle_disconnect_req() - Connection manager ext disconnect
+ * req to vdev and peer sm
+ * @vdev: VDEV object
+ * @req: vdev disconnect request
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
+			 struct wlan_cm_vdev_discon_req *req);
+
+/**
+ * cm_send_bss_peer_delete_req() - Connection manager ext bss peer delete
+ * request
+ * @vdev: VDEV object
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+cm_send_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * cm_disconnect_complete_ind() - Connection manager ext disconnect
+ * complete indication
+ * @vdev: VDEV object
+ * @rsp: Connection manager disconnect response
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+cm_disconnect_complete_ind(struct wlan_objmgr_vdev *vdev,
+			   struct wlan_cm_discon_rsp *rsp);
+
+/**
+ * cm_send_vdev_down_req() - Connection manager ext req to send vdev down
+ * to FW
+ * @vdev: VDEV object
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cm_send_vdev_down_req(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * cm_free_join_req() - Free cm vdev connect req params
+ * @join_req: join request
+ *
+ * Return: void
+ */
+void cm_free_join_req(struct cm_vdev_join_req *join_req);
+
+/**
+ * cm_process_join_req() - Process vdev join req
+ * @msg: scheduler message
+ *
+ * Process connect request in LIM and copy all join req params.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cm_process_join_req(struct scheduler_msg *msg);
+
+/**
+ * cm_process_disconnect_req() - Process vdev disconnect request
+ * @msg: scheduler message
+ *
+ * Process disconnect request in LIM.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS cm_process_disconnect_req(struct scheduler_msg *msg);
+
+
+#endif /* FEATURE_CM_ENABLE */
+#endif /* __WLAN_CM_VDEV_API_H__ */

+ 136 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2012-2015, 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Implements legacy connect specific APIs of connection manager to
+ * initiate vdev manager operations
+ */
+
+#include "wlan_cm_vdev_api.h"
+#include "wlan_scan_utils_api.h"
+#include "wlan_mlme_dbg.h"
+
+void cm_free_join_req(struct cm_vdev_join_req *join_req)
+{
+	if (!join_req)
+		return;
+
+	util_scan_free_cache_entry(join_req->entry);
+	join_req->entry = NULL;
+	qdf_mem_free(join_req->assoc_ie.ptr);
+	qdf_mem_free(join_req->scan_ie.ptr);
+	join_req->assoc_ie.ptr = NULL;
+	join_req->scan_ie.ptr = NULL;
+	qdf_mem_free(join_req);
+}
+
+static QDF_STATUS cm_flush_join_req(struct scheduler_msg *msg)
+{
+	struct cm_vdev_join_req *join_req;
+
+	if (!msg || !msg->bodyptr) {
+		mlme_err("msg or msg->bodyptr is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	join_req = msg->bodyptr;
+	cm_free_join_req(join_req);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS
+cm_copy_join_params(struct cm_vdev_join_req *join_req,
+		    struct wlan_cm_vdev_connect_req *req)
+{
+	join_req->assoc_ie.ptr = qdf_mem_malloc(req->assoc_ie.len);
+
+	if (!join_req->assoc_ie.ptr)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_mem_copy(join_req->assoc_ie.ptr, req->assoc_ie.ptr,
+		     req->assoc_ie.len);
+
+	join_req->scan_ie.ptr = qdf_mem_malloc(req->scan_ie.len);
+
+	if (!join_req->scan_ie.ptr)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_mem_copy(join_req->scan_ie.ptr, req->scan_ie.ptr,
+		     req->scan_ie.len);
+
+	join_req->entry = util_scan_copy_cache_entry(req->bss->entry);
+
+	if (!join_req->entry)
+		return QDF_STATUS_E_NOMEM;
+
+	join_req->vdev_id = req->vdev_id;
+	join_req->cm_id = req->cm_id;
+	join_req->force_rsne_override = req->force_rsne_override;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+cm_handle_connect_req(struct wlan_objmgr_vdev *vdev,
+		      struct wlan_cm_vdev_connect_req *req)
+{
+	struct cm_vdev_join_req *join_req;
+	struct scheduler_msg msg;
+	QDF_STATUS status;
+
+	if (!vdev || !req)
+		return QDF_STATUS_E_FAILURE;
+
+	qdf_mem_zero(&msg, sizeof(msg));
+	join_req = qdf_mem_malloc(sizeof(*join_req));
+
+	if (!join_req)
+		return QDF_STATUS_E_NOMEM;
+
+	status = cm_copy_join_params(join_req, req);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		cm_free_join_req(join_req);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	msg.bodyptr = join_req;
+	msg.callback = cm_process_join_req;
+	msg.flush_callback = cm_flush_join_req;
+
+	status = scheduler_post_message(QDF_MODULE_ID_MLME,
+					QDF_MODULE_ID_PE,
+					QDF_MODULE_ID_PE, &msg);
+	if (QDF_IS_STATUS_ERROR(status))
+		cm_free_join_req(join_req);
+
+	return status;
+}
+
+QDF_STATUS
+cm_send_bss_peer_create_req(struct wlan_objmgr_vdev *vdev,
+			    struct qdf_mac_addr *peer_mac)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+cm_handle_connect_complete(struct wlan_objmgr_vdev *vdev,
+			   struct wlan_cm_connect_rsp *rsp)
+{
+	return QDF_STATUS_SUCCESS;
+}

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

@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2012-2015, 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: Implements leagcy disconnect connect specific APIs of
+ * connection mgr to initiate vdev manager operations
+ */
+
+#include "wlan_cm_vdev_api.h"
+
+QDF_STATUS
+cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
+			 struct wlan_cm_vdev_discon_req *req)
+{
+	struct wlan_cm_vdev_discon_req *discon_req;
+	struct scheduler_msg msg;
+	QDF_STATUS status;
+
+	if (!vdev || !req)
+		return QDF_STATUS_E_FAILURE;
+
+	qdf_mem_zero(&msg, sizeof(msg));
+
+	discon_req = qdf_mem_malloc(sizeof(*discon_req));
+
+	if (!discon_req)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_mem_copy(discon_req, req, sizeof(*req));
+	msg.bodyptr = discon_req;
+	msg.callback = cm_process_disconnect_req;
+
+	status = scheduler_post_message(QDF_MODULE_ID_MLME,
+					QDF_MODULE_ID_PE,
+					QDF_MODULE_ID_PE, &msg);
+	if (QDF_IS_STATUS_ERROR(status))
+		qdf_mem_free(discon_req);
+
+	return status;
+}
+
+QDF_STATUS
+cm_send_bss_peer_delete_req(struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+cm_disconnect_complete_ind(struct wlan_objmgr_vdev *vdev,
+			   struct wlan_cm_discon_rsp *rsp)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS cm_send_vdev_down_req(struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
+}

+ 53 - 0
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -56,6 +56,7 @@
 #include <wlan_crypto_global_api.h>
 #include "../../core/src/vdev_mgr_ops.h"
 #include "wma.h"
+#include <../../core/src/wlan_cm_vdev_api.h>
 
 /* SME REQ processing function templates */
 static bool __lim_process_sme_sys_ready_ind(struct mac_context *, uint32_t *);
@@ -1166,6 +1167,58 @@ lim_get_vdev_rmf_capable(struct mac_context *mac, struct pe_session *session)
 }
 #endif
 
+#ifdef FEATURE_CM_ENABLE
+static QDF_STATUS
+lim_cm_handle_join_req(struct cm_vdev_join_req *req)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS cm_process_join_req(struct scheduler_msg *msg)
+{
+	struct cm_vdev_join_req *req;
+	QDF_STATUS status;
+
+	if (!msg || !msg->bodyptr) {
+		mlme_err("msg or msg->bodyptr is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	req = msg->bodyptr;
+
+	status = lim_cm_handle_join_req(req);
+
+	cm_free_join_req(req);
+
+	return status;
+}
+
+static QDF_STATUS
+lim_cm_handle_disconnect_req(struct wlan_cm_vdev_discon_req *req)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS cm_process_disconnect_req(struct scheduler_msg *msg)
+{
+	struct wlan_cm_vdev_discon_req *req;
+	QDF_STATUS status;
+
+	if (!msg || !msg->bodyptr) {
+		mlme_err("msg or msg->bodyptr is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	req = msg->bodyptr;
+
+	status = lim_cm_handle_disconnect_req(req);
+
+	qdf_mem_free(req);
+
+	return status;
+}
+#endif
+
 /**
  * __lim_process_sme_join_req() - process SME_JOIN_REQ message
  * @mac_ctx: Pointer to Global MAC structure