qcacld-3.0: Move sme_ft_api to connection manager ucfg api

Move sme_ft_api to connection manager ucfg apis.

Change-Id: If710be0d8a4a9d45d37f588389e40f66c62c7487
CRs-Fixed: 2990112
This commit is contained in:
Utkarsh Bhatnagar 2021-07-13 14:40:29 +05:30 committed by Madan Koyyalamudi
parent d8cb4f5401
commit 7f9ad91112
13 changed files with 319 additions and 445 deletions

1
Kbuild
View File

@ -736,7 +736,6 @@ SME_CSR_OBJS := $(SME_SRC_DIR)/csr/csr_api_roam.o \
SME_QOS_OBJS := $(SME_SRC_DIR)/qos/sme_qos.o
SME_CMN_OBJS := $(SME_SRC_DIR)/common/sme_api.o \
$(SME_SRC_DIR)/common/sme_ft_api.o \
$(SME_SRC_DIR)/common/sme_power_save.o \
$(SME_SRC_DIR)/common/sme_trace.o

View File

@ -162,4 +162,75 @@ ucfg_cm_update_fils_config(struct wlan_objmgr_psoc *psoc,
}
#endif
#ifdef WLAN_FEATURE_HOST_ROAM
void ucfg_cm_ft_reset(struct wlan_objmgr_vdev *vdev);
/**
* ucfg_cm_set_ft_ies() - to set FT IEs
* @pdev: pdev ctx
* @vdev_id: vdev identifier
* @ft_ies: pointer to FT IEs
* @ft_ies_length: length of FT IEs
*
* Each time the supplicant sends down the FT IEs to the driver. This function
* is called in SME. This function packages and sends the FT IEs to PE.
*
* Return: none
*/
void ucfg_cm_set_ft_ies(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
const uint8_t *ft_ies, uint16_t ft_ies_length);
/**
* ucfg_cm_check_ft_status() - Check for key wait status in FT mode
* @pdev: pdev ctx
* @vdev_id: vdev identifier
*
* Return: QDF_STATUS
*/
QDF_STATUS ucfg_cm_check_ft_status(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id);
/**
* ucfg_cm_ft_key_ready_for_install() - API to check ft key ready for install
* @vdev: pdev handle
*
* It is only applicable for LFR2.0 enabled
*
* Return: true when ft key is ready otherwise false
*/
bool ucfg_cm_ft_key_ready_for_install(struct wlan_objmgr_vdev *vdev);
void ucfg_cm_set_ft_pre_auth_state(struct wlan_objmgr_vdev *vdev, bool state);
#else /* WLAN_FEATURE_HOST_ROAM */
static inline void ucfg_cm_ft_reset(struct wlan_objmgr_vdev *vdev) {}
static inline
void ucfg_cm_set_ft_ies(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
const uint8_t *ft_ies, uint16_t ft_ies_length) {}
static inline
QDF_STATUS ucfg_cm_check_ft_status(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id)
{
return QDF_STATUS_E_FAILURE;
}
static inline void ucfg_cm_set_ft_pre_auth_state(struct wlan_objmgr_vdev *vdev,
bool state) {}
#endif /* WLAN_FEATURE_HOST_ROAM */
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* ucfg_cm_reset_key() -Reset key information
* @pdev: pdev handle
* @vdev_id: vdev identifier
*
* Return: None
*/
void ucfg_cm_reset_key(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id);
#else
static inline void
ucfg_cm_reset_key(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id) {}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
#endif /* _WLAN_CM_ROAM_UCFG_API_H_ */

View File

@ -260,3 +260,216 @@ ucfg_wlan_cm_roam_invoke(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
{
return wlan_cm_roam_invoke(pdev, vdev_id, bssid, ch_freq, source);
}
#ifdef WLAN_FEATURE_HOST_ROAM
void ucfg_cm_set_ft_pre_auth_state(struct wlan_objmgr_vdev *vdev, bool state)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
return;
mlme_priv->connect_info.ft_info.set_ft_preauth_state = state;
}
static bool ucfg_cm_get_ft_pre_auth_state(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
return false;
return mlme_priv->connect_info.ft_info.set_ft_preauth_state;
}
void ucfg_cm_set_ft_ies(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
const uint8_t *ft_ies, uint16_t ft_ies_length)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
if (!ft_ies) {
mlme_err("ft ies is NULL");
return;
}
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
WLAN_MLME_CM_ID);
if (!vdev)
return;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
status = cm_roam_acquire_lock(vdev);
if (QDF_IS_STATUS_ERROR(status))
goto end;
mlme_debug("FT IEs Req is received in state %d",
mlme_priv->connect_info.ft_info.ft_state);
/* Global Station FT State */
switch (mlme_priv->connect_info.ft_info.ft_state) {
case FT_START_READY:
case FT_AUTH_REQ_READY:
mlme_debug("ft_ies_length: %d", ft_ies_length);
ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
mlme_priv->connect_info.ft_info.auth_ie_len = ft_ies_length;
qdf_mem_copy(mlme_priv->connect_info.ft_info.auth_ft_ie,
ft_ies, ft_ies_length);
mlme_priv->connect_info.ft_info.ft_state = FT_AUTH_REQ_READY;
break;
case FT_REASSOC_REQ_WAIT:
/*
* We are done with pre-auth, hence now waiting for
* reassoc req. This is the new FT Roaming in place At
* this juncture we'r ready to start sending Reassoc req
*/
ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
mlme_debug("New Reassoc Req: %pK in state %d",
ft_ies, mlme_priv->connect_info.ft_info.ft_state);
mlme_priv->connect_info.ft_info.reassoc_ie_len =
ft_ies_length;
qdf_mem_copy(mlme_priv->connect_info.ft_info.reassoc_ft_ie,
ft_ies, ft_ies_length);
mlme_priv->connect_info.ft_info.ft_state = FT_SET_KEY_WAIT;
mlme_debug("ft_ies_length: %d state: %d", ft_ies_length,
mlme_priv->connect_info.ft_info.ft_state);
break;
default:
mlme_warn("Unhandled state: %d",
mlme_priv->connect_info.ft_info.ft_state);
break;
}
cm_roam_release_lock(vdev);
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
}
QDF_STATUS ucfg_cm_check_ft_status(struct wlan_objmgr_pdev *pdev,
uint8_t vdev_id)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
WLAN_MLME_CM_ID);
if (!vdev)
return status;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
status = cm_roam_acquire_lock(vdev);
if (QDF_IS_STATUS_ERROR(status))
goto end;
mlme_debug("FT update key is received in state %d",
mlme_priv->connect_info.ft_info.ft_state);
/* Global Station FT State */
switch (mlme_priv->connect_info.ft_info.ft_state) {
case FT_SET_KEY_WAIT:
if (ucfg_cm_get_ft_pre_auth_state(vdev)) {
mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
mlme_debug("state changed to %d",
mlme_priv->connect_info.ft_info.ft_state);
break;
}
/* fallthrough */
default:
mlme_debug("Unhandled state:%d",
mlme_priv->connect_info.ft_info.ft_state);
status = QDF_STATUS_E_FAILURE;
break;
}
cm_roam_release_lock(vdev);
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
return status;
}
bool ucfg_cm_ft_key_ready_for_install(struct wlan_objmgr_vdev *vdev)
{
bool ret = false;
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
return ret;
if (ucfg_cm_get_ft_pre_auth_state(vdev) &&
mlme_priv->connect_info.ft_info.ft_state == FT_START_READY) {
ret = true;
ucfg_cm_set_ft_pre_auth_state(vdev, false);
}
return ret;
}
void ucfg_cm_ft_reset(struct wlan_objmgr_vdev *vdev)
{
struct mlme_legacy_priv *mlme_priv;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
return;
qdf_mem_zero(&mlme_priv->connect_info.ft_info,
sizeof(struct ft_context));
mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
}
#endif /* WLAN_FEATURE_HOST_ROAM */
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
#ifdef FEATURE_WLAN_ESE
static void
ucfg_cm_reset_esecckm_info(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
{
struct wlan_objmgr_vdev *vdev;
struct rso_config *rso_cfg;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
WLAN_MLME_CM_ID);
if (!vdev) {
mlme_err("vdev object is NULL for vdev %d", vdev_id);
return;
}
rso_cfg = wlan_cm_get_rso_config(vdev);
if (!rso_cfg) {
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
return;
}
qdf_mem_zero(rso_cfg->krk, WMI_KRK_KEY_LEN);
qdf_mem_zero(rso_cfg->btk, WMI_BTK_KEY_LEN);
rso_cfg->is_ese_assoc = false;
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
}
#else
static inline
void ucfg_cm_reset_esecckm_info(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
{
}
#endif
void ucfg_cm_reset_key(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
{
wlan_cm_set_psk_pmk(pdev, vdev_id, NULL, 0);
ucfg_cm_reset_esecckm_info(pdev, vdev_id);
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */

View File

@ -525,16 +525,14 @@ bool hdd_is_roam_sync_in_progress(struct hdd_context *hdd_ctx, uint8_t vdev_id);
#ifdef WLAN_FEATURE_HOST_ROAM
/**
* wlan_hdd_ft_set_key_delay() - hdd set key delayed for FT mode
* @mac_handle: mac handler
* @adapter: pointer to adapter context
* @vdev: vdev
*
* Return: void
*/
void
wlan_hdd_ft_set_key_delay(mac_handle_t mac_handle, struct hdd_adapter *adapter);
void wlan_hdd_ft_set_key_delay(struct wlan_objmgr_vdev *vdev);
#else
static inline void
wlan_hdd_ft_set_key_delay(mac_handle_t mac_handle, struct hdd_adapter *adapter)
wlan_hdd_ft_set_key_delay(struct wlan_objmgr_vdev *vdev)
{
}
#endif

View File

@ -89,6 +89,7 @@
#include "wlan_roam_debug.h"
#include "wlan_hdd_twt.h"
#include "wlan_cm_roam_ucfg_api.h"
/* These are needed to recognize WPA and RSN suite types */
#define HDD_WPA_OUI_SIZE 4
@ -2056,24 +2057,15 @@ static void hdd_roam_channel_switch_handler(struct hdd_adapter *adapter,
}
#ifdef WLAN_FEATURE_HOST_ROAM
void
wlan_hdd_ft_set_key_delay(mac_handle_t mac_handle, struct hdd_adapter *adapter)
void wlan_hdd_ft_set_key_delay(struct wlan_objmgr_vdev *vdev)
{
int errno = 0;
uint32_t session_id = adapter->vdev_id;
struct wlan_objmgr_vdev *vdev;
vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_ID);
if (!vdev)
return;
if (sme_ft_key_ready_for_install(mac_handle, session_id))
if (ucfg_cm_ft_key_ready_for_install(vdev))
errno =
wlan_cfg80211_crypto_add_key(vdev,
WLAN_CRYPTO_KEY_TYPE_UNICAST,
0, false);
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
if (errno)
hdd_err("ft set key failed");
}

View File

@ -18363,9 +18363,9 @@ static int wlan_hdd_add_key_sap(struct hdd_adapter *adapter,
return errno;
}
static int wlan_hdd_add_key_sta(struct hdd_adapter *adapter,
bool pairwise, u8 key_index,
mac_handle_t mac_handle, bool *ft_mode)
static int wlan_hdd_add_key_sta(struct wlan_objmgr_pdev *pdev,
struct hdd_adapter *adapter,
bool pairwise, u8 key_index, bool *ft_mode)
{
struct wlan_objmgr_vdev *vdev;
int errno;
@ -18375,7 +18375,7 @@ static int wlan_hdd_add_key_sta(struct hdd_adapter *adapter,
* pre-authentication is done. Save the key in the
* UMAC and install it after association
*/
status = sme_check_ft_status(mac_handle, adapter->vdev_id);
status = ucfg_cm_check_ft_status(pdev, adapter->vdev_id);
if (status == QDF_STATUS_SUCCESS) {
*ft_mode = true;
return 0;
@ -18482,8 +18482,8 @@ static int __wlan_hdd_cfg80211_add_key(struct wiphy *wiphy,
break;
case QDF_STA_MODE:
case QDF_P2P_CLIENT_MODE:
errno = wlan_hdd_add_key_sta(adapter, pairwise, key_index,
mac_handle, &ft_mode);
errno = wlan_hdd_add_key_sta(hdd_ctx->pdev, adapter, pairwise,
key_index, &ft_mode);
if (ft_mode)
return 0;
break;
@ -20143,7 +20143,6 @@ __wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy,
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
int status;
mac_handle_t mac_handle;
hdd_enter();
@ -20171,10 +20170,8 @@ __wlan_hdd_cfg80211_update_ft_ies(struct wiphy *wiphy,
}
hdd_debug("called with Ie of length = %zu", ftie->ie_len);
/* Pass the received FT IEs to SME */
mac_handle = hdd_ctx->mac_handle;
sme_set_ft_ies(mac_handle, adapter->vdev_id,
(const u8 *)ftie->ie, ftie->ie_len);
ucfg_cm_set_ft_ies(hdd_ctx->pdev, adapter->vdev_id,
(const u8 *)ftie->ie, ftie->ie_len);
hdd_exit();
return 0;
}

View File

@ -26,6 +26,7 @@
#include <net/cfg80211.h>
#include "wlan_cm_public_struct.h"
#include "osif_cm_util.h"
#include "wlan_cm_roam_ucfg_api.h"
/**
* wlan_hdd_cm_connect() - cfg80211 connect api
@ -191,10 +192,13 @@ void __hdd_cm_disconnect_handler_pre_user_update(struct hdd_adapter *adapter);
* __hdd_cm_disconnect_handler_post_user_update() - Handle disconnect indication
* after updating to user space
* @adapter: Pointer to adapter
* @vdev: vdev ptr
*
* Return: None
*/
void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter);
void
__hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev);
/**
* hdd_cm_set_peer_authenticate() - set peer as authenticated

View File

@ -480,7 +480,7 @@ hdd_cm_connect_failure_post_user_update(struct wlan_objmgr_vdev *vdev,
}
hdd_clear_roam_profile_ie(adapter);
sme_reset_key(hdd_ctx->mac_handle, adapter->vdev_id);
ucfg_cm_reset_key(hdd_ctx->pdev, adapter->vdev_id);
hdd_wmm_dscp_initial_state(adapter);
hdd_debug("Disabling queues");
wlan_hdd_netif_queue_control(adapter,
@ -848,7 +848,7 @@ hdd_cm_connect_success_pre_user_update(struct wlan_objmgr_vdev *vdev,
sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
mac_handle = hdd_adapter_get_mac_handle(adapter);
wlan_hdd_ft_set_key_delay(mac_handle, adapter);
wlan_hdd_ft_set_key_delay(vdev);
hdd_cm_update_rssi_snr_by_bssid(adapter);
hdd_cm_save_connect_status(adapter, rsp->status_code);
@ -1352,7 +1352,7 @@ QDF_STATUS hdd_cm_ft_preauth_complete(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_E_FAILURE;
}
sme_set_ft_pre_auth_state(mac_handle, wlan_vdev_get_id(vdev), true);
ucfg_cm_set_ft_pre_auth_state(vdev, true);
ft_event.target_ap = ft_ie;
ft_event.ies = (u8 *)(ft_ie + QDF_MAC_ADDR_SIZE);

View File

@ -141,32 +141,27 @@ void __hdd_cm_disconnect_handler_pre_user_update(struct hdd_adapter *adapter)
hdd_place_marker(adapter, "DISCONNECTED", NULL);
}
void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter)
void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
mac_handle_t mac_handle;
struct wlan_objmgr_vdev *vdev;
mac_handle = hdd_ctx->mac_handle;
/* update P2P connection status */
ucfg_p2p_status_disconnect(adapter->vdev);
ucfg_p2p_status_disconnect(vdev);
hdd_wmm_adapter_clear(adapter);
mac_handle = hdd_ctx->mac_handle;
sme_ft_reset(mac_handle, adapter->vdev_id);
sme_reset_key(mac_handle, adapter->vdev_id);
ucfg_cm_ft_reset(vdev);
ucfg_cm_reset_key(hdd_ctx->pdev, adapter->vdev_id);
hdd_clear_roam_profile_ie(adapter);
if (adapter->device_mode == QDF_STA_MODE) {
vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_ID);
if (vdev) {
wlan_crypto_reset_vdev_params(vdev);
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
}
}
if (adapter->device_mode == QDF_STA_MODE)
wlan_crypto_reset_vdev_params(vdev);
hdd_remove_beacon_filter(adapter);
if (sme_is_beacon_report_started(mac_handle, adapter->vdev_id)) {
hdd_debug("Sending beacon pause indication to userspace");
hdd_beacon_recv_pause_indication((hdd_handle_t)hdd_ctx,
@ -185,7 +180,7 @@ void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter)
hdd_debug("Failed to set RTS_PROFILE");
hdd_init_scan_reject_params(hdd_ctx);
ucfg_pmo_flush_gtk_offload_req(adapter->vdev);
ucfg_pmo_flush_gtk_offload_req(vdev);
if ((QDF_STA_MODE == adapter->device_mode) ||
(QDF_P2P_CLIENT_MODE == adapter->device_mode)) {
@ -352,7 +347,7 @@ hdd_cm_disconnect_complete_post_user_update(struct wlan_objmgr_vdev *vdev,
adapter, FTM_TIME_SYNC_STA_DISCONNECTED);
}
__hdd_cm_disconnect_handler_post_user_update(adapter);
__hdd_cm_disconnect_handler_post_user_update(adapter, vdev);
wlan_twt_concurrency_update(hdd_ctx);
return QDF_STATUS_SUCCESS;

View File

@ -7807,8 +7807,8 @@ static int __iw_set_fties(struct net_device *dev, struct iw_request_info *info,
hdd_debug("called with Ie of length = %d", wrqu->data.length);
/* Pass the received FT IEs to SME */
sme_set_ft_ies(hdd_ctx->mac_handle, adapter->vdev_id,
extra, wrqu->data.length);
ucfg_cm_set_ft_ies(hdd_ctx->pdev, adapter->vdev_id,
extra, wrqu->data.length);
hdd_exit();
return 0;
}

View File

@ -30,7 +30,6 @@
#include "sir_api.h"
#include "csr_api.h"
#include "sme_ft_api.h"
#include "csr_support.h"
#include "sme_internal.h"
#include "sap_api.h"

View File

@ -1,105 +0,0 @@
/*
* Copyright (c) 2013-2016, 2018, 2019-2021 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.
*/
#if !defined(__SME_FTAPI_H)
#define __SME_FTAPI_H
#ifdef WLAN_FEATURE_HOST_ROAM
void sme_ft_reset(mac_handle_t mac_handle, uint8_t sessionId);
/**
* sme_set_ft_ies() - to set FT IEs
* @mac_handle: opaque handle to the global MAC context
* @session_id: sme session id
* @ft_ies: pointer to FT IEs
* @ft_ies_length: length of FT IEs
*
* Each time the supplicant sends down the FT IEs to the driver. This function
* is called in SME. This function packages and sends the FT IEs to PE.
*
* Return: none
*/
void sme_set_ft_ies(mac_handle_t mac_handle, uint8_t sessionId,
const uint8_t *ft_ies, uint16_t ft_ies_length);
/**
* sme_check_ft_status() - Check for key wait status in FT mode
* @mac_handle: MAC handle
* @session_id: vdev identifier
*
* Return: QDF_STATUS
*/
QDF_STATUS sme_check_ft_status(mac_handle_t mac_handle, uint8_t session_id);
/**
* sme_ft_key_ready_for_install() - API to check ft key ready for install
* @mac_handle: MAC handle
* @session_id: vdev identifier
*
* It is only applicable for LFR2.0 enabled
*
* Return: true when ft key is ready otherwise false
*/
bool sme_ft_key_ready_for_install(mac_handle_t mac_handle, uint8_t session_id);
void sme_set_ft_pre_auth_state(mac_handle_t mac_handle, uint8_t sessionId,
bool state);
bool sme_get_ft_pre_auth_state(mac_handle_t mac_handle, uint8_t sessionId);
#else /* WLAN_FEATURE_HOST_ROAM */
static inline void sme_ft_reset(mac_handle_t mac_handle, uint8_t sessionId) {}
static inline
void sme_set_ft_ies(mac_handle_t mac_handle, uint8_t sessionId,
const uint8_t *ft_ies, uint16_t ft_ies_length) {}
static inline QDF_STATUS sme_check_ft_status(mac_handle_t mac_handle,
uint8_t session_id)
{
return QDF_STATUS_E_FAILURE;
}
static inline bool
sme_ft_key_ready_for_install(mac_handle_t mac_handle, uint8_t session_id)
{
return false;
}
static inline void sme_set_ft_pre_auth_state(mac_handle_t mac_handle,
uint8_t sessionId, bool state) {}
static inline bool sme_get_ft_pre_auth_state(mac_handle_t mac_handle,
uint8_t sessionId)
{
return false;
}
#endif /* WLAN_FEATURE_HOST_ROAM */
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
/**
* sme_reset_key() -Reset key information
* @mac_handle: MAC handle
* @vdev_id: vdev identifier
*
* Return: None
*/
void sme_reset_key(mac_handle_t mac_handle, uint8_t vdev_id);
#else
static inline void sme_reset_key(mac_handle_t mac_handle, uint8_t vdev_id) {}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
#endif

View File

@ -1,289 +0,0 @@
/*
* Copyright (c) 2012-2021 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.
*/
#include <sir_common.h>
#include <ani_global.h>
#include <csr_inside_api.h>
#include "wlan_cm_roam_api.h"
#include <sir_api.h>
#ifdef WLAN_FEATURE_HOST_ROAM
void sme_set_ft_pre_auth_state(mac_handle_t mac_handle, uint8_t sessionId,
bool state)
{
struct mac_context *mac = MAC_CONTEXT(mac_handle);
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
WLAN_LEGACY_SME_ID);
if (!vdev)
return;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
mlme_priv->connect_info.ft_info.set_ft_preauth_state = state;
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
}
bool sme_get_ft_pre_auth_state(mac_handle_t mac_handle, uint8_t sessionId)
{
struct mac_context *mac = MAC_CONTEXT(mac_handle);
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
bool val = false;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
WLAN_LEGACY_SME_ID);
if (!vdev)
return val;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
val = mlme_priv->connect_info.ft_info.set_ft_preauth_state;
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
return val;
}
void sme_set_ft_ies(mac_handle_t mac_handle, uint8_t session_id,
const uint8_t *ft_ies, uint16_t ft_ies_length)
{
struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
if (!ft_ies) {
sme_err("ft ies is NULL");
return;
}
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac_ctx->pdev, session_id,
WLAN_LEGACY_SME_ID);
if (!vdev)
return;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
status = sme_acquire_global_lock(&mac_ctx->sme);
if (QDF_IS_STATUS_ERROR(status))
goto end;
sme_debug("FT IEs Req is received in state %d",
mlme_priv->connect_info.ft_info.ft_state);
/* Global Station FT State */
switch (mlme_priv->connect_info.ft_info.ft_state) {
case FT_START_READY:
case FT_AUTH_REQ_READY:
sme_debug("ft_ies_length: %d", ft_ies_length);
ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
mlme_priv->connect_info.ft_info.auth_ie_len = ft_ies_length;
qdf_mem_copy(mlme_priv->connect_info.ft_info.auth_ft_ie,
ft_ies, ft_ies_length);
mlme_priv->connect_info.ft_info.ft_state = FT_AUTH_REQ_READY;
break;
case FT_REASSOC_REQ_WAIT:
/*
* We are done with pre-auth, hence now waiting for
* reassoc req. This is the new FT Roaming in place At
* this juncture we'r ready to start sending Reassoc req
*/
ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
sme_debug("New Reassoc Req: %pK in state %d",
ft_ies, mlme_priv->connect_info.ft_info.ft_state);
mlme_priv->connect_info.ft_info.reassoc_ie_len =
ft_ies_length;
qdf_mem_copy(mlme_priv->connect_info.ft_info.reassoc_ft_ie,
ft_ies, ft_ies_length);
mlme_priv->connect_info.ft_info.ft_state = FT_SET_KEY_WAIT;
sme_debug("ft_ies_length: %d state: %d", ft_ies_length,
mlme_priv->connect_info.ft_info.ft_state);
break;
default:
sme_warn("Unhandled state: %d",
mlme_priv->connect_info.ft_info.ft_state);
break;
}
sme_release_global_lock(&mac_ctx->sme);
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
}
QDF_STATUS sme_check_ft_status(mac_handle_t mac_handle, uint8_t session_id)
{
struct mac_context *mac = MAC_CONTEXT(mac_handle);
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, session_id,
WLAN_LEGACY_SME_ID);
if (!vdev)
return status;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
status = sme_acquire_global_lock(&mac->sme);
if (QDF_IS_STATUS_ERROR(status))
goto end;
sme_debug("FT update key is received in state %d",
mlme_priv->connect_info.ft_info.ft_state);
/* Global Station FT State */
switch (mlme_priv->connect_info.ft_info.ft_state) {
case FT_SET_KEY_WAIT:
if (sme_get_ft_pre_auth_state(mac_handle, session_id)) {
mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
sme_debug("state changed to %d",
mlme_priv->connect_info.ft_info.ft_state);
break;
}
/* fallthrough */
default:
sme_debug("Unhandled state:%d",
mlme_priv->connect_info.ft_info.ft_state);
status = QDF_STATUS_E_FAILURE;
break;
}
sme_release_global_lock(&mac->sme);
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
return status;
}
bool sme_ft_key_ready_for_install(mac_handle_t mac_handle, uint8_t session_id)
{
bool ret = false;
struct mac_context *mac = MAC_CONTEXT(mac_handle);
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, session_id,
WLAN_LEGACY_SME_ID);
if (!vdev)
return ret;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
if (sme_get_ft_pre_auth_state(mac_handle, session_id) &&
mlme_priv->connect_info.ft_info.ft_state == FT_START_READY) {
ret = true;
sme_set_ft_pre_auth_state(mac_handle, session_id, false);
}
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
return ret;
}
/* Reset the FT context. */
void sme_ft_reset(mac_handle_t mac_handle, uint8_t sessionId)
{
struct mac_context *mac = MAC_CONTEXT(mac_handle);
struct csr_roam_session *pSession = NULL;
struct wlan_objmgr_vdev *vdev;
struct mlme_legacy_priv *mlme_priv;
pSession = CSR_GET_SESSION(mac, sessionId);
if (!pSession)
return;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, sessionId,
WLAN_LEGACY_SME_ID);
if (!vdev)
return;
mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
if (!mlme_priv)
goto end;
qdf_mem_zero(&mlme_priv->connect_info.ft_info,
sizeof(struct ft_context));
mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
end:
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
}
#endif /* WLAN_FEATURE_HOST_ROAM */
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
#ifdef FEATURE_WLAN_ESE
static void sme_reset_esecckm_info(struct mac_context *mac, uint8_t vdev_id)
{
struct wlan_objmgr_vdev *vdev;
struct rso_config *rso_cfg;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, vdev_id,
WLAN_LEGACY_SME_ID);
if (!vdev) {
sme_err("vdev object is NULL for vdev %d", vdev_id);
return;
}
rso_cfg = wlan_cm_get_rso_config(vdev);
if (!rso_cfg) {
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
return;
}
qdf_mem_zero(rso_cfg->krk, WMI_KRK_KEY_LEN);
qdf_mem_zero(rso_cfg->btk, WMI_BTK_KEY_LEN);
rso_cfg->is_ese_assoc = false;
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
}
#else
static void sme_reset_esecckm_info(struct mac_context *mac, uint8_t vdev_id)
{
}
#endif
void sme_reset_key(mac_handle_t mac_handle, uint8_t vdev_id)
{
struct mac_context *mac = MAC_CONTEXT(mac_handle);
if (!mac) {
sme_err("mac is NULL");
return;
}
wlan_cm_set_psk_pmk(mac->pdev, vdev_id, NULL, 0);
sme_reset_esecckm_info(mac, vdev_id);
}
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */