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
This commit is contained in:
gaurank kathpalia 2020-10-26 21:45:40 +05:30 committed by snandini
parent d5a8d40514
commit e4defd9d16
6 changed files with 440 additions and 7 deletions

16
Kbuild
View File

@ -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 ########

View File

@ -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
};

View File

@ -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__ */

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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