qcacmn: Add support to send PASN commands
Add support to send below PASN commands: WMI_RTT_PASN_AUTH_STATUS_CMD WMI_RTT_PASN_DEAUTH_CMD WMI_VDEV_SET_LTF_KEY_SEED_CMDID Change-Id: I5a50a634317d0a692feee5be5a36da22b4c5d713 CRs-Fixed: 3154530
This commit is contained in:

committed by
Madan Koyyalamudi

parent
e3e178489d
commit
b7fa703306
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -35,6 +36,24 @@
|
|||||||
int wlan_cfg80211_set_default_key(struct wlan_objmgr_vdev *vdev,
|
int wlan_cfg80211_set_default_key(struct wlan_objmgr_vdev *vdev,
|
||||||
uint8_t key_index,
|
uint8_t key_index,
|
||||||
struct qdf_mac_addr *bssid);
|
struct qdf_mac_addr *bssid);
|
||||||
|
/**
|
||||||
|
* wlan_cfg80211_translate_key() - Translate the cfg80211 keys to
|
||||||
|
* internal
|
||||||
|
* @vdev: Pointer to vdev object
|
||||||
|
* @key_index: Key index
|
||||||
|
* @key_type: key type
|
||||||
|
* @mac_addr: mac address
|
||||||
|
* @params: Params
|
||||||
|
* @crypto_key: Crypto keys
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void wlan_cfg80211_translate_key(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t key_index,
|
||||||
|
enum wlan_crypto_key_type key_type,
|
||||||
|
const u8 *mac_addr,
|
||||||
|
struct key_params *params,
|
||||||
|
struct wlan_crypto_key *crypto_key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlan_cfg80211_store_key() - Store the key
|
* wlan_cfg80211_store_key() - Store the key
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -33,7 +34,7 @@
|
|||||||
#include <wlan_cfg80211.h>
|
#include <wlan_cfg80211.h>
|
||||||
#include <wlan_osif_request_manager.h>
|
#include <wlan_osif_request_manager.h>
|
||||||
|
|
||||||
static void wlan_cfg80211_translate_key(struct wlan_objmgr_vdev *vdev,
|
void wlan_cfg80211_translate_key(struct wlan_objmgr_vdev *vdev,
|
||||||
uint8_t key_index,
|
uint8_t key_index,
|
||||||
enum wlan_crypto_key_type key_type,
|
enum wlan_crypto_key_type key_type,
|
||||||
const u8 *mac_addr,
|
const u8 *mac_addr,
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -45,4 +46,16 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
|||||||
struct wlan_crypto_key *req,
|
struct wlan_crypto_key *req,
|
||||||
enum wlan_crypto_key_type key_type);
|
enum wlan_crypto_key_type key_type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_crypto_vdev_set_param() - Set crypto related vdev params to fw
|
||||||
|
* @psoc: Pointer to psoc
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
* @param_id: param id
|
||||||
|
* @param_value: param value
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
target_if_crypto_vdev_set_param(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
|
||||||
|
uint32_t param_id, uint32_t param_value);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -131,6 +132,31 @@ static inline void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
|
|||||||
}
|
}
|
||||||
#endif /* FEATURE_WLAN_WAPI */
|
#endif /* FEATURE_WLAN_WAPI */
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
target_if_crypto_vdev_set_param(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
|
||||||
|
uint32_t param_id, uint32_t param_value)
|
||||||
|
{
|
||||||
|
wmi_unified_t wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
|
||||||
|
struct vdev_set_params param = {0};
|
||||||
|
|
||||||
|
if (!wmi_handle) {
|
||||||
|
target_if_err("Invalid wmi handle");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vdev_id >= WLAN_MAX_VDEVS) {
|
||||||
|
target_if_err("vdev_id: %d is invalid, reject the req: param id %d val %d",
|
||||||
|
vdev_id, param_id, param_value);
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
param.vdev_id = vdev_id;
|
||||||
|
param.param_id = param_id;
|
||||||
|
param.param_value = param_value;
|
||||||
|
|
||||||
|
return wmi_unified_vdev_set_param_send(wmi_handle, ¶m);
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
||||||
struct wlan_crypto_key *req,
|
struct wlan_crypto_key *req,
|
||||||
enum wlan_crypto_key_type key_type)
|
enum wlan_crypto_key_type key_type)
|
||||||
@@ -138,7 +164,9 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
|||||||
struct set_key_params params = {0};
|
struct set_key_params params = {0};
|
||||||
struct wlan_objmgr_psoc *psoc;
|
struct wlan_objmgr_psoc *psoc;
|
||||||
struct wlan_objmgr_pdev *pdev;
|
struct wlan_objmgr_pdev *pdev;
|
||||||
|
struct wlan_objmgr_peer *peer;
|
||||||
enum cdp_sec_type sec_type = cdp_sec_type_none;
|
enum cdp_sec_type sec_type = cdp_sec_type_none;
|
||||||
|
enum wlan_peer_type peer_type = 0;
|
||||||
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
|
||||||
uint32_t pn[4] = {0, 0, 0, 0};
|
uint32_t pn[4] = {0, 0, 0, 0};
|
||||||
bool peer_exist = false;
|
bool peer_exist = false;
|
||||||
@@ -185,6 +213,15 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
|||||||
|
|
||||||
peer_exist = cdp_find_peer_exist(soc, pdev->pdev_objmgr.wlan_pdev_id,
|
peer_exist = cdp_find_peer_exist(soc, pdev->pdev_objmgr.wlan_pdev_id,
|
||||||
req->macaddr);
|
req->macaddr);
|
||||||
|
peer = wlan_objmgr_get_peer_by_mac(psoc, req->macaddr, WLAN_CRYPTO_ID);
|
||||||
|
if (peer) {
|
||||||
|
peer_type = wlan_peer_get_peer_type(peer);
|
||||||
|
if (peer_type == WLAN_PEER_RTT_PASN &&
|
||||||
|
key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST)
|
||||||
|
peer_exist = true;
|
||||||
|
|
||||||
|
wlan_objmgr_peer_release_ref(peer, WLAN_CRYPTO_ID);
|
||||||
|
}
|
||||||
target_if_debug("key_type %d, mac: %02x:%02x:%02x:%02x:%02x:%02x",
|
target_if_debug("key_type %d, mac: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
key_type, req->macaddr[0], req->macaddr[1],
|
key_type, req->macaddr[0], req->macaddr[1],
|
||||||
req->macaddr[2], req->macaddr[3], req->macaddr[4],
|
req->macaddr[2], req->macaddr[3], req->macaddr[4],
|
||||||
@@ -223,6 +260,10 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
|||||||
|
|
||||||
/* Set PN check & security type in data path */
|
/* Set PN check & security type in data path */
|
||||||
qdf_mem_copy(&pn[0], ¶ms.key_rsc_ctr, sizeof(uint64_t));
|
qdf_mem_copy(&pn[0], ¶ms.key_rsc_ctr, sizeof(uint64_t));
|
||||||
|
|
||||||
|
if (peer_type == WLAN_PEER_RTT_PASN)
|
||||||
|
goto send_install_key;
|
||||||
|
|
||||||
cdp_set_pn_check(soc, vdev->vdev_objmgr.vdev_id, req->macaddr,
|
cdp_set_pn_check(soc, vdev->vdev_objmgr.vdev_id, req->macaddr,
|
||||||
sec_type, pn);
|
sec_type, pn);
|
||||||
|
|
||||||
@@ -232,7 +273,7 @@ QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
|
|||||||
cdp_set_key(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, pairwise,
|
cdp_set_key(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, pairwise,
|
||||||
(uint32_t *)(req->keyval + WLAN_CRYPTO_IV_SIZE +
|
(uint32_t *)(req->keyval + WLAN_CRYPTO_IV_SIZE +
|
||||||
WLAN_CRYPTO_MIC_LEN));
|
WLAN_CRYPTO_MIC_LEN));
|
||||||
|
send_install_key:
|
||||||
target_if_debug("vdev_id:%d, key: idx:%d,len:%d", params.vdev_id,
|
target_if_debug("vdev_id:%d, key: idx:%d,len:%d", params.vdev_id,
|
||||||
params.key_idx, params.key_len);
|
params.key_idx, params.key_len);
|
||||||
target_if_debug("peer mac "QDF_MAC_ADDR_FMT,
|
target_if_debug("peer mac "QDF_MAC_ADDR_FMT,
|
||||||
@@ -366,6 +407,25 @@ target_if_crypto_deregister_events(struct wlan_objmgr_psoc *psoc)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QDF_STATUS
|
||||||
|
target_if_crypto_set_ltf_keyseed(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
wmi_unified_t wmi = GET_WMI_HDL_FROM_PSOC(psoc);
|
||||||
|
|
||||||
|
if (!psoc || !wmi) {
|
||||||
|
target_if_err("%s is null", !psoc ? "psoc" : "wmi_handle");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = wmi_send_vdev_set_ltf_key_seed_cmd(wmi, data);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
target_if_err("set LTF keyseed failed");
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS target_if_crypto_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
|
QDF_STATUS target_if_crypto_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
|
||||||
{
|
{
|
||||||
struct wlan_lmac_if_crypto_tx_ops *crypto;
|
struct wlan_lmac_if_crypto_tx_ops *crypto;
|
||||||
@@ -377,6 +437,8 @@ QDF_STATUS target_if_crypto_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
|
|||||||
crypto = &tx_ops->crypto_tx_ops;
|
crypto = &tx_ops->crypto_tx_ops;
|
||||||
|
|
||||||
crypto->set_key = target_if_crypto_set_key;
|
crypto->set_key = target_if_crypto_set_key;
|
||||||
|
crypto->set_ltf_keyseed = target_if_crypto_set_ltf_keyseed;
|
||||||
|
crypto->set_vdev_param = target_if_crypto_vdev_set_param;
|
||||||
crypto->register_events = target_if_crypto_register_events;
|
crypto->register_events = target_if_crypto_register_events;
|
||||||
crypto->deregister_events = target_if_crypto_deregister_events;
|
crypto->deregister_events = target_if_crypto_deregister_events;
|
||||||
|
|
||||||
|
@@ -102,6 +102,59 @@ target_if_wifi_pos_parse_measreq_chan_info(struct wlan_objmgr_pdev *pdev,
|
|||||||
}
|
}
|
||||||
#endif /* WLAN_RTT_MEASUREMENT_NOTIFICATION */
|
#endif /* WLAN_RTT_MEASUREMENT_NOTIFICATION */
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_RTT_11AZ_SUPPORT
|
||||||
|
static QDF_STATUS
|
||||||
|
target_if_wifi_pos_send_rtt_pasn_auth_status(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_pasn_auth_status *data)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
wmi_unified_t wmi = GET_WMI_HDL_FROM_PSOC(psoc);
|
||||||
|
|
||||||
|
if (!psoc || !wmi) {
|
||||||
|
target_if_err("%s is null", !psoc ? "psoc" : "wmi_handle");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = wmi_send_rtt_pasn_auth_status_cmd(wmi, data);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
target_if_err("send pasn auth status cmd failed");
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QDF_STATUS
|
||||||
|
target_if_wifi_pos_send_rtt_pasn_deauth(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct qdf_mac_addr *peer_mac)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
wmi_unified_t wmi = GET_WMI_HDL_FROM_PSOC(psoc);
|
||||||
|
|
||||||
|
if (!psoc || !wmi) {
|
||||||
|
target_if_err("%s is null", !psoc ? "psoc" : "wmi_handle");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = wmi_send_rtt_pasn_deauth_cmd(wmi, peer_mac);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
target_if_err("send pasn deauth cmd failed");
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void target_if_wifi_pos_register_11az_ops(
|
||||||
|
struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops)
|
||||||
|
{
|
||||||
|
tx_ops->send_rtt_pasn_auth_status =
|
||||||
|
target_if_wifi_pos_send_rtt_pasn_auth_status;
|
||||||
|
tx_ops->send_rtt_pasn_deauth = target_if_wifi_pos_send_rtt_pasn_deauth;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
void target_if_wifi_pos_register_11az_ops(
|
||||||
|
struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops)
|
||||||
|
{}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WIFI_POS_CONVERGED
|
#ifdef WIFI_POS_CONVERGED
|
||||||
#ifdef WLAN_FEATURE_RTT_11AZ_SUPPORT
|
#ifdef WLAN_FEATURE_RTT_11AZ_SUPPORT
|
||||||
static QDF_STATUS
|
static QDF_STATUS
|
||||||
@@ -258,5 +311,7 @@ void target_if_wifi_pos_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
|
|||||||
wifi_pos_tx_ops->data_req_tx = target_if_wifi_pos_oem_data_req;
|
wifi_pos_tx_ops->data_req_tx = target_if_wifi_pos_oem_data_req;
|
||||||
wifi_pos_tx_ops->wifi_pos_parse_measreq_chan_info =
|
wifi_pos_tx_ops->wifi_pos_parse_measreq_chan_info =
|
||||||
target_if_wifi_pos_parse_measreq_chan_info;
|
target_if_wifi_pos_parse_measreq_chan_info;
|
||||||
|
|
||||||
|
target_if_wifi_pos_register_11az_ops(wifi_pos_tx_ops);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1019,6 +1019,9 @@ enum wlan_status_code {
|
|||||||
#define KCK_192BIT_KEY_LEN 24
|
#define KCK_192BIT_KEY_LEN 24
|
||||||
#define KEK_256BIT_KEY_LEN 32
|
#define KEK_256BIT_KEY_LEN 32
|
||||||
|
|
||||||
|
#define WLAN_MAX_SECURE_LTF_KEYSEED_LEN 48
|
||||||
|
#define WLAN_MIN_SECURE_LTF_KEYSEED_LEN 32
|
||||||
|
|
||||||
#define WLAN_WPA_OUI 0xf25000
|
#define WLAN_WPA_OUI 0xf25000
|
||||||
#define WLAN_WPA_OUI_TYPE 0x01
|
#define WLAN_WPA_OUI_TYPE 0x01
|
||||||
#define WPA_VERSION 1
|
#define WPA_VERSION 1
|
||||||
|
@@ -967,6 +967,19 @@ static inline void wlan_crypto_reset_vdev_prarams(struct wlan_objmgr_vdev *vdev)
|
|||||||
}
|
}
|
||||||
#endif /* CRYPTO_SET_KEY_CONVERGED */
|
#endif /* CRYPTO_SET_KEY_CONVERGED */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_crypto_vdev_set_param() - Send vdev set param to firmware.
|
||||||
|
* @psoc: Pointer to PSOC object
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
* @param_id: Param id
|
||||||
|
* @param_value: Param value
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_crypto_vdev_set_param(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
|
||||||
|
uint32_t param_id, uint32_t param_value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlan_crypto_get_peer_pmksa() - called to get pmksa based on pmksa parameter
|
* wlan_crypto_get_peer_pmksa() - called to get pmksa based on pmksa parameter
|
||||||
* @vdev: vdev
|
* @vdev: vdev
|
||||||
@@ -1101,6 +1114,19 @@ wlan_crypto_set_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_crypto_set_ltf_keyseed(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data);
|
||||||
|
#else
|
||||||
|
static inline QDF_STATUS
|
||||||
|
wlan_crypto_set_ltf_keyseed(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_FILS_SK
|
#ifdef WLAN_FEATURE_FILS_SK
|
||||||
/**
|
/**
|
||||||
* lim_create_fils_rik()- This API create rik using rrk coming from
|
* lim_create_fils_rik()- This API create rik using rrk coming from
|
||||||
|
@@ -193,6 +193,22 @@ enum wlan_crypto_rsnx_cap {
|
|||||||
WLAN_CRYPTO_RSNX_CAP_PROTECTED_TWT = 0x10,
|
WLAN_CRYPTO_RSNX_CAP_PROTECTED_TWT = 0x10,
|
||||||
WLAN_CRYPTO_RSNX_CAP_SAE_H2E = 0x20,
|
WLAN_CRYPTO_RSNX_CAP_SAE_H2E = 0x20,
|
||||||
WLAN_CRYPTO_RSNX_CAP_SAE_PK = 0x40,
|
WLAN_CRYPTO_RSNX_CAP_SAE_PK = 0x40,
|
||||||
|
WLAN_CRYPTO_RSNX_CAP_SECURE_LTF = 0x400,
|
||||||
|
WLAN_CRYPTO_RSNX_CAP_SECURE_RTT = 0x1000,
|
||||||
|
WLAN_CRYPTO_RSNX_CAP_URNM_MFPR = 0x2000,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_crypto_vdev_pasn_caps - PASN peer related vdev
|
||||||
|
* crypto parameters
|
||||||
|
* @WLAN_CRYPTO_URNM_MFPR: URNM MFP required in RSNXE
|
||||||
|
* @WLAN_CRYPTO_MFPC: MFP capable bit from RSN IE
|
||||||
|
* @WLAN_CRYPTO_MFPR: MFP required from RSNIE
|
||||||
|
*/
|
||||||
|
enum wlan_crypto_vdev_pasn_caps {
|
||||||
|
WLAN_CRYPTO_URNM_MFPR = BIT(0),
|
||||||
|
WLAN_CRYPTO_MFPC = BIT(1),
|
||||||
|
WLAN_CRYPTO_MFPR = BIT(2),
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum wlan_crypto_key_mgmt {
|
typedef enum wlan_crypto_key_mgmt {
|
||||||
@@ -323,6 +339,24 @@ struct wlan_crypto_params {
|
|||||||
uint16_t rsn_caps;
|
uint16_t rsn_caps;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct wlan_crypto_ltf_keyseed_data - LTF keyseed parameters
|
||||||
|
* @vdev_id: Vdev id
|
||||||
|
* @peer_mac_addr: Peer mac address
|
||||||
|
* @src_mac_addr: Source mac address
|
||||||
|
* @rsn_authmode: Cipher suite
|
||||||
|
* @key_seed: Secure LTF key seed
|
||||||
|
* @key_seed_len: Key seed length
|
||||||
|
*/
|
||||||
|
struct wlan_crypto_ltf_keyseed_data {
|
||||||
|
uint8_t vdev_id;
|
||||||
|
struct qdf_mac_addr peer_mac_addr;
|
||||||
|
struct qdf_mac_addr src_mac_addr;
|
||||||
|
uint8_t rsn_authmode;
|
||||||
|
uint8_t key_seed[WLAN_MAX_SECURE_LTF_KEYSEED_LEN];
|
||||||
|
uint16_t key_seed_len;
|
||||||
|
};
|
||||||
|
|
||||||
typedef enum wlan_crypto_param_type {
|
typedef enum wlan_crypto_param_type {
|
||||||
WLAN_CRYPTO_PARAM_AUTH_MODE,
|
WLAN_CRYPTO_PARAM_AUTH_MODE,
|
||||||
WLAN_CRYPTO_PARAM_UCAST_CIPHER,
|
WLAN_CRYPTO_PARAM_UCAST_CIPHER,
|
||||||
@@ -342,6 +376,7 @@ typedef enum wlan_crypto_param_type {
|
|||||||
* @keyix: key id
|
* @keyix: key id
|
||||||
* @cipher_type: cipher type being used for this key
|
* @cipher_type: cipher type being used for this key
|
||||||
* @mac_addr: MAC address of the peer
|
* @mac_addr: MAC address of the peer
|
||||||
|
* @src_addr: Source mac address associated with the key
|
||||||
* @cipher_table: table which stores cipher related info
|
* @cipher_table: table which stores cipher related info
|
||||||
* @private: private pointer to save cipher context
|
* @private: private pointer to save cipher context
|
||||||
* @keylock: spin lock
|
* @keylock: spin lock
|
||||||
@@ -363,6 +398,7 @@ struct wlan_crypto_key {
|
|||||||
uint16_t keyix;
|
uint16_t keyix;
|
||||||
enum wlan_crypto_cipher_type cipher_type;
|
enum wlan_crypto_cipher_type cipher_type;
|
||||||
uint8_t macaddr[QDF_MAC_ADDR_SIZE];
|
uint8_t macaddr[QDF_MAC_ADDR_SIZE];
|
||||||
|
struct qdf_mac_addr src_addr;
|
||||||
void *cipher_table;
|
void *cipher_table;
|
||||||
void *private;
|
void *private;
|
||||||
qdf_spinlock_t keylock;
|
qdf_spinlock_t keylock;
|
||||||
@@ -423,6 +459,8 @@ struct wlan_crypto_req_key {
|
|||||||
* @defaultkey: function pointer to set default key
|
* @defaultkey: function pointer to set default key
|
||||||
* @set_key: converged function pointer to set key in hw
|
* @set_key: converged function pointer to set key in hw
|
||||||
* @getpn: function pointer to get current pn value of peer
|
* @getpn: function pointer to get current pn value of peer
|
||||||
|
* @set_ltf_keyseed: Set LTF keyseed
|
||||||
|
* @set_vdev_param: Set the vdev crypto parameter
|
||||||
* @register_events: function pointer to register wmi event handler
|
* @register_events: function pointer to register wmi event handler
|
||||||
* @deregister_events: function pointer to deregister wmi event handler
|
* @deregister_events: function pointer to deregister wmi event handler
|
||||||
*/
|
*/
|
||||||
@@ -444,6 +482,11 @@ struct wlan_lmac_if_crypto_tx_ops {
|
|||||||
enum wlan_crypto_key_type key_type);
|
enum wlan_crypto_key_type key_type);
|
||||||
QDF_STATUS(*getpn)(struct wlan_objmgr_vdev *vdev,
|
QDF_STATUS(*getpn)(struct wlan_objmgr_vdev *vdev,
|
||||||
uint8_t *macaddr, uint32_t key_type);
|
uint8_t *macaddr, uint32_t key_type);
|
||||||
|
QDF_STATUS (*set_ltf_keyseed)(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *ks);
|
||||||
|
QDF_STATUS (*set_vdev_param)(struct wlan_objmgr_psoc *psoc,
|
||||||
|
uint32_t vdev_id, uint32_t param_id,
|
||||||
|
uint32_t param_value);
|
||||||
QDF_STATUS (*register_events)(struct wlan_objmgr_psoc *psoc);
|
QDF_STATUS (*register_events)(struct wlan_objmgr_psoc *psoc);
|
||||||
QDF_STATUS (*deregister_events)(struct wlan_objmgr_psoc *psoc);
|
QDF_STATUS (*deregister_events)(struct wlan_objmgr_psoc *psoc);
|
||||||
};
|
};
|
||||||
|
@@ -104,8 +104,12 @@ static inline void wlan_crypto_put_be64(u8 *a, u64 val)
|
|||||||
((tx_ops)->crypto_tx_ops.defaultkey)
|
((tx_ops)->crypto_tx_ops.defaultkey)
|
||||||
#define WLAN_CRYPTO_TX_OPS_SET_KEY(tx_ops) \
|
#define WLAN_CRYPTO_TX_OPS_SET_KEY(tx_ops) \
|
||||||
((tx_ops)->crypto_tx_ops.set_key)
|
((tx_ops)->crypto_tx_ops.set_key)
|
||||||
|
#define WLAN_CRYPTO_TX_OPS_SET_VDEV_PARAM(tx_ops) \
|
||||||
|
((tx_ops)->crypto_tx_ops.set_vdev_param)
|
||||||
#define WLAN_CRYPTO_TX_OPS_GETPN(tx_ops) \
|
#define WLAN_CRYPTO_TX_OPS_GETPN(tx_ops) \
|
||||||
((tx_ops)->crypto_tx_ops.getpn)
|
((tx_ops)->crypto_tx_ops.getpn)
|
||||||
|
#define WLAN_CRYPTO_TX_OPS_SET_LTF_KEYSEED(tx_ops) \
|
||||||
|
((tx_ops)->crypto_tx_ops.set_ltf_keyseed)
|
||||||
#define WLAN_CRYPTO_TX_OPS_REGISTER_EVENTS(tx_ops) \
|
#define WLAN_CRYPTO_TX_OPS_REGISTER_EVENTS(tx_ops) \
|
||||||
((tx_ops)->crypto_tx_ops.register_events)
|
((tx_ops)->crypto_tx_ops.register_events)
|
||||||
#define WLAN_CRYPTO_TX_OPS_DEREGISTER_EVENTS(tx_ops) \
|
#define WLAN_CRYPTO_TX_OPS_DEREGISTER_EVENTS(tx_ops) \
|
||||||
|
@@ -4803,3 +4803,46 @@ QDF_STATUS wlan_crypto_create_fils_rik(uint8_t *rrk, uint8_t rrk_len,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif /* WLAN_FEATURE_FILS_SK */
|
#endif /* WLAN_FEATURE_FILS_SK */
|
||||||
|
|
||||||
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_crypto_set_ltf_keyseed(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data)
|
||||||
|
{
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
struct wlan_lmac_if_tx_ops *tx_ops;
|
||||||
|
|
||||||
|
tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
|
||||||
|
if (!tx_ops) {
|
||||||
|
crypto_err("tx_ops is NULL");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WLAN_CRYPTO_TX_OPS_SET_LTF_KEYSEED(tx_ops))
|
||||||
|
status = WLAN_CRYPTO_TX_OPS_SET_LTF_KEYSEED(tx_ops)(psoc, data);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_crypto_vdev_set_param(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
|
||||||
|
uint32_t param_id, uint32_t param_value)
|
||||||
|
{
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
struct wlan_lmac_if_tx_ops *tx_ops;
|
||||||
|
|
||||||
|
tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
|
||||||
|
if (!tx_ops) {
|
||||||
|
crypto_err("tx_ops is NULL");
|
||||||
|
return QDF_STATUS_E_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WLAN_CRYPTO_TX_OPS_SET_VDEV_PARAM(tx_ops))
|
||||||
|
status = WLAN_CRYPTO_TX_OPS_SET_VDEV_PARAM(tx_ops) (psoc,
|
||||||
|
vdev_id,
|
||||||
|
param_id,
|
||||||
|
param_value);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@@ -890,6 +890,8 @@ struct wlan_lmac_if_iot_sim_tx_ops {
|
|||||||
* @wifi_pos_get_vht_ch_width: Function pointer to get max supported bw by FW
|
* @wifi_pos_get_vht_ch_width: Function pointer to get max supported bw by FW
|
||||||
* @wifi_pos_parse_measreq_chan_info: Parse channel info from LOWI measurement
|
* @wifi_pos_parse_measreq_chan_info: Parse channel info from LOWI measurement
|
||||||
* request buffer.
|
* request buffer.
|
||||||
|
* @send_rtt_pasn_auth_status: Send PASN peers authentication status
|
||||||
|
* @send_rtt_pasn_deauth: Send PASN peer deauth command
|
||||||
*/
|
*/
|
||||||
struct wlan_lmac_if_wifi_pos_tx_ops {
|
struct wlan_lmac_if_wifi_pos_tx_ops {
|
||||||
QDF_STATUS (*wifi_pos_register_events)(struct wlan_objmgr_psoc *psoc);
|
QDF_STATUS (*wifi_pos_register_events)(struct wlan_objmgr_psoc *psoc);
|
||||||
@@ -907,7 +909,11 @@ struct wlan_lmac_if_wifi_pos_tx_ops {
|
|||||||
QDF_STATUS (*wifi_pos_parse_measreq_chan_info)(
|
QDF_STATUS (*wifi_pos_parse_measreq_chan_info)(
|
||||||
struct wlan_objmgr_pdev *pdev, uint32_t data_len,
|
struct wlan_objmgr_pdev *pdev, uint32_t data_len,
|
||||||
uint8_t *data, struct rtt_channel_info *chinfo);
|
uint8_t *data, struct rtt_channel_info *chinfo);
|
||||||
|
QDF_STATUS (*send_rtt_pasn_auth_status)
|
||||||
|
(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_pasn_auth_status *data);
|
||||||
|
QDF_STATUS (*send_rtt_pasn_deauth)(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct qdf_mac_addr *peer_mac);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -640,6 +640,15 @@ QDF_STATUS wifi_pos_convert_host_pdev_id_to_target(
|
|||||||
uint32_t *target_pdev_id);
|
uint32_t *target_pdev_id);
|
||||||
|
|
||||||
#ifdef WIFI_POS_CONVERGED
|
#ifdef WIFI_POS_CONVERGED
|
||||||
|
/**
|
||||||
|
* wifi_pos_get_peer_private_object() - Wifi Pos get peer private object
|
||||||
|
* @peer: Peer object pointer
|
||||||
|
*
|
||||||
|
* Return: Peer private object pointer
|
||||||
|
*/
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *
|
||||||
|
wifi_pos_get_peer_private_object(struct wlan_objmgr_peer *peer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wifi_pos_register_osif_callbacks() - Register OSIF callbacks
|
* wifi_pos_register_osif_callbacks() - Register OSIF callbacks
|
||||||
* @psoc: Pointer to psoc object
|
* @psoc: Pointer to psoc object
|
||||||
|
@@ -27,6 +27,26 @@
|
|||||||
#include "wifi_pos_public_struct.h"
|
#include "wifi_pos_public_struct.h"
|
||||||
|
|
||||||
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
/**
|
||||||
|
* wifi_pos_set_peer_ltf_keyseed_required() - Set LTF keyseed required
|
||||||
|
* for the peer
|
||||||
|
* @peer: Peer object
|
||||||
|
* @value: Value to set
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_set_peer_ltf_keyseed_required(struct wlan_objmgr_peer *peer,
|
||||||
|
bool value);
|
||||||
|
/**
|
||||||
|
* wifi_pos_is_ltf_keyseed_required_for_peer() - Is LTF keyseed required for
|
||||||
|
* the given peer
|
||||||
|
* @peer: Peer object
|
||||||
|
*
|
||||||
|
* Return: true or false
|
||||||
|
*/
|
||||||
|
bool wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer *peer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wifi_pos_handle_ranging_peer_create() - Handle ranging peer create
|
* wifi_pos_handle_ranging_peer_create() - Handle ranging peer create
|
||||||
* @psoc: Pointer to PSOC
|
* @psoc: Pointer to PSOC
|
||||||
@@ -92,6 +112,28 @@ wifi_pos_handle_ranging_peer_delete(struct wlan_objmgr_psoc *psoc,
|
|||||||
struct wlan_pasn_request *req,
|
struct wlan_pasn_request *req,
|
||||||
uint8_t vdev_id,
|
uint8_t vdev_id,
|
||||||
uint8_t total_entries);
|
uint8_t total_entries);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wifi_pos_send_pasn_auth_status - Send PASN auth status to firmware
|
||||||
|
* @psoc: Pointer to PSOC object
|
||||||
|
* @data: pointer to auth status data
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_send_pasn_auth_status(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_pasn_auth_status *data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wifi_pos_send_pasn_peer_deauth - Send PASN peer deauth
|
||||||
|
* @psoc: Pointer to PSOC object
|
||||||
|
* @peer_mac: Peer mac address
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct qdf_mac_addr *peer_mac);
|
||||||
#else
|
#else
|
||||||
static inline
|
static inline
|
||||||
QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc,
|
QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc,
|
||||||
@@ -130,5 +172,12 @@ wifi_pos_handle_ranging_peer_delete(struct wlan_objmgr_psoc *psoc,
|
|||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct qdf_mac_addr *peer_mac)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
#endif /* WIFI_POS_CONVERGED && WLAN_FEATURE_RTT_11AZ_SUPPORT */
|
#endif /* WIFI_POS_CONVERGED && WLAN_FEATURE_RTT_11AZ_SUPPORT */
|
||||||
#endif /* _WIFI_POS_PASN_API_H_ */
|
#endif /* _WIFI_POS_PASN_API_H_ */
|
||||||
|
@@ -67,6 +67,7 @@ enum wifi_pos_pasn_peer_delete_actions {
|
|||||||
* derivation
|
* derivation
|
||||||
* @force_self_mac_usage: If this flag is true, the supplicant
|
* @force_self_mac_usage: If this flag is true, the supplicant
|
||||||
* should use the provided self mac address
|
* should use the provided self mac address
|
||||||
|
* @is_ltf_keyseed_required: Is set LTF keyseed required
|
||||||
* @control_flags: Control flags to indicate if its required to flush
|
* @control_flags: Control flags to indicate if its required to flush
|
||||||
* the keys
|
* the keys
|
||||||
*/
|
*/
|
||||||
@@ -75,6 +76,7 @@ struct wlan_pasn_request {
|
|||||||
enum wifi_pos_pasn_peer_type peer_type;
|
enum wifi_pos_pasn_peer_type peer_type;
|
||||||
struct qdf_mac_addr self_mac;
|
struct qdf_mac_addr self_mac;
|
||||||
bool force_self_mac_usage;
|
bool force_self_mac_usage;
|
||||||
|
bool is_ltf_keyseed_required;
|
||||||
uint16_t control_flags;
|
uint16_t control_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -106,4 +108,54 @@ struct wifi_pos_11az_context {
|
|||||||
struct wifi_pos_vdev_priv_obj {
|
struct wifi_pos_vdev_priv_obj {
|
||||||
struct wifi_pos_11az_context pasn_context;
|
struct wifi_pos_11az_context pasn_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum wlan_pasn_auth_status_code - PASN auth status code
|
||||||
|
* @WLAN_PASN_AUTH_STATUS_SUCCESS: PASN auth is successful
|
||||||
|
* @WLAN_PASN_AUTH_STATUS_PASN_FAILED: PASN authentication failed
|
||||||
|
* @WLAN_PASN_AUTH_STATUS_PEER_CREATE_FAILED: PASN peer create confirm received
|
||||||
|
* with failure status.
|
||||||
|
* @WLAN_PASN_AUTH_STATUS_PEER_ALREADY_EXISTS: Peer already exists
|
||||||
|
* @WLAN_PASN_AUTH_STATUS_HOST_INTERNAL_ERROR: WLAN driver internal error
|
||||||
|
*/
|
||||||
|
enum wlan_pasn_auth_status_code {
|
||||||
|
WLAN_PASN_AUTH_STATUS_SUCCESS = 0,
|
||||||
|
WLAN_PASN_AUTH_STATUS_PASN_FAILED = 1,
|
||||||
|
WLAN_PASN_AUTH_STATUS_PEER_CREATE_FAILED = 2,
|
||||||
|
WLAN_PASN_AUTH_STATUS_PEER_ALREADY_EXISTS = 3,
|
||||||
|
WLAN_PASN_AUTH_STATUS_HOST_INTERNAL_ERROR = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct wlan_pasn_auth_status_peer_info - PASN authentication status peer
|
||||||
|
* info
|
||||||
|
* @peer_mac: Peer mac address
|
||||||
|
* @self_mac: Self mac address
|
||||||
|
* @status: PASN auth status code
|
||||||
|
*/
|
||||||
|
struct wlan_pasn_auth_status_peer_info {
|
||||||
|
struct qdf_mac_addr peer_mac;
|
||||||
|
struct qdf_mac_addr self_mac;
|
||||||
|
enum wlan_pasn_auth_status_code status;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct wlan_pasn_auth_status - PASN authentication status
|
||||||
|
* @vdev_id: vdev_id
|
||||||
|
* @num_peers: Number of peers for which auth status is to be sent
|
||||||
|
* @auth_status: Auth status details
|
||||||
|
*/
|
||||||
|
struct wlan_pasn_auth_status {
|
||||||
|
uint8_t vdev_id;
|
||||||
|
uint8_t num_peers;
|
||||||
|
struct wlan_pasn_auth_status_peer_info auth_status[WLAN_MAX_11AZ_PEERS];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct wlan_wifi_pos_peer_priv_obj - WLAN wifi pos peer private object
|
||||||
|
* @is_ltf_keyseed_required: Is LTF keyseed required for peer
|
||||||
|
*/
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj {
|
||||||
|
bool is_ltf_keyseed_required;
|
||||||
|
};
|
||||||
#endif /* _WIFI_POS_PUBLIC_STRUCT_H_ */
|
#endif /* _WIFI_POS_PUBLIC_STRUCT_H_ */
|
||||||
|
@@ -144,8 +144,36 @@ QDF_STATUS wifi_pos_init(void)
|
|||||||
goto fail_vdev_destroy_handler;
|
goto fail_vdev_destroy_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
status = wlan_objmgr_register_peer_create_handler(
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
wifi_pos_peer_object_created_notification,
|
||||||
|
NULL);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
wifi_pos_err("peer create register notification failed");
|
||||||
|
goto fail_peer_create_handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = wlan_objmgr_register_peer_destroy_handler(
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
wifi_pos_peer_object_destroyed_notification,
|
||||||
|
NULL);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
wifi_pos_err("peer destroy register notification failed");
|
||||||
|
goto fail_peer_destroy_handler;
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
fail_peer_destroy_handler:
|
||||||
|
wlan_objmgr_unregister_peer_create_handler(
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
wifi_pos_peer_object_created_notification,
|
||||||
|
NULL);
|
||||||
|
fail_peer_create_handler:
|
||||||
|
wlan_objmgr_unregister_vdev_destroy_handler(
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
wifi_pos_vdev_destroyed_notification, NULL);
|
||||||
|
|
||||||
fail_vdev_destroy_handler:
|
fail_vdev_destroy_handler:
|
||||||
wlan_objmgr_unregister_vdev_create_handler(
|
wlan_objmgr_unregister_vdev_create_handler(
|
||||||
WLAN_UMAC_COMP_WIFI_POS,
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
@@ -168,6 +196,20 @@ QDF_STATUS wifi_pos_deinit(void)
|
|||||||
{
|
{
|
||||||
QDF_STATUS status;
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
status = wlan_objmgr_unregister_peer_destroy_handler(
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
wifi_pos_peer_object_destroyed_notification,
|
||||||
|
NULL);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
wifi_pos_err("unable to unregister peer destroy handle");
|
||||||
|
|
||||||
|
status = wlan_objmgr_unregister_peer_create_handler(
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
wifi_pos_peer_object_created_notification,
|
||||||
|
NULL);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
wifi_pos_err("unable to unregister peer create handle");
|
||||||
|
|
||||||
status = wlan_objmgr_unregister_vdev_destroy_handler(
|
status = wlan_objmgr_unregister_vdev_destroy_handler(
|
||||||
WLAN_UMAC_COMP_WIFI_POS,
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
wifi_pos_vdev_destroyed_notification, NULL);
|
wifi_pos_vdev_destroyed_notification, NULL);
|
||||||
@@ -246,6 +288,23 @@ QDF_STATUS wifi_pos_psoc_disable(struct wlan_objmgr_psoc *psoc)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *
|
||||||
|
wifi_pos_get_peer_private_object(struct wlan_objmgr_peer *peer)
|
||||||
|
{
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *peer_priv;
|
||||||
|
|
||||||
|
if (!peer) {
|
||||||
|
wifi_pos_err("Peer is NULL");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv =
|
||||||
|
wlan_objmgr_peer_get_comp_private_obj(peer,
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS);
|
||||||
|
|
||||||
|
return peer_priv;
|
||||||
|
}
|
||||||
|
|
||||||
void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val)
|
void wifi_pos_set_oem_target_type(struct wlan_objmgr_psoc *psoc, uint32_t val)
|
||||||
{
|
{
|
||||||
struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
|
struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include "wlan_objmgr_vdev_obj.h"
|
#include "wlan_objmgr_vdev_obj.h"
|
||||||
#include "wlan_ptt_sock_svc.h"
|
#include "wlan_ptt_sock_svc.h"
|
||||||
#include "target_if.h"
|
#include "target_if.h"
|
||||||
|
#include "wlan_objmgr_peer_obj.h"
|
||||||
|
|
||||||
#ifndef CNSS_GENL
|
#ifndef CNSS_GENL
|
||||||
#include <wlan_objmgr_global_obj_i.h>
|
#include <wlan_objmgr_global_obj_i.h>
|
||||||
@@ -993,7 +994,8 @@ QDF_STATUS wifi_pos_psoc_obj_destroyed_notification(
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
void
|
||||||
wifi_pos_init_11az_context(struct wifi_pos_vdev_priv_obj *vdev_pos_obj)
|
wifi_pos_init_11az_context(struct wifi_pos_vdev_priv_obj *vdev_pos_obj)
|
||||||
{
|
{
|
||||||
struct wifi_pos_11az_context *pasn_context;
|
struct wifi_pos_11az_context *pasn_context;
|
||||||
@@ -1016,6 +1018,7 @@ wifi_pos_init_11az_context(struct wifi_pos_vdev_priv_obj *vdev_pos_obj)
|
|||||||
pasn_context->num_unsecure_peers = 0;
|
pasn_context->num_unsecure_peers = 0;
|
||||||
pasn_context->num_failed_peers = 0;
|
pasn_context->num_failed_peers = 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
wifi_pos_vdev_created_notification(struct wlan_objmgr_vdev *vdev,
|
wifi_pos_vdev_created_notification(struct wlan_objmgr_vdev *vdev,
|
||||||
@@ -1067,6 +1070,64 @@ wifi_pos_vdev_destroyed_notification(struct wlan_objmgr_vdev *vdev,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_peer_object_created_notification(struct wlan_objmgr_peer *peer,
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *peer_priv;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
if (!peer) {
|
||||||
|
wifi_pos_err("Peer is NULL");
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv = qdf_mem_malloc(sizeof(*peer_priv));
|
||||||
|
if (!peer_priv)
|
||||||
|
return QDF_STATUS_E_NOMEM;
|
||||||
|
|
||||||
|
status = wlan_objmgr_peer_component_obj_attach(peer,
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
(void *)peer_priv,
|
||||||
|
QDF_STATUS_SUCCESS);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
wifi_pos_err("unable to attach peer_priv obj to peer obj");
|
||||||
|
qdf_mem_free(peer_priv);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_peer_object_destroyed_notification(struct wlan_objmgr_peer *peer,
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *peer_priv;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
if (!peer) {
|
||||||
|
wifi_pos_err("Peer is NULL");
|
||||||
|
return QDF_STATUS_E_NULL_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS);
|
||||||
|
if (!peer_priv) {
|
||||||
|
wifi_pos_err("peer MLME component object is NULL");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = wlan_objmgr_peer_component_obj_detach(peer,
|
||||||
|
WLAN_UMAC_COMP_WIFI_POS,
|
||||||
|
(void *)peer_priv);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
wifi_pos_err("unable to dettach peer_priv obj to peer obj");
|
||||||
|
|
||||||
|
qdf_mem_free(peer_priv);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
int wifi_pos_oem_rsp_handler(struct wlan_objmgr_psoc *psoc,
|
int wifi_pos_oem_rsp_handler(struct wlan_objmgr_psoc *psoc,
|
||||||
struct oem_data_rsp *oem_rsp)
|
struct oem_data_rsp *oem_rsp)
|
||||||
{
|
{
|
||||||
|
@@ -34,6 +34,21 @@
|
|||||||
/* forward reference */
|
/* forward reference */
|
||||||
struct wlan_objmgr_psoc;
|
struct wlan_objmgr_psoc;
|
||||||
|
|
||||||
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
/**
|
||||||
|
* wifi_pos_init_11az_context - Initialize 11az context
|
||||||
|
* @vdev_pos_obj: Vdev private object of WIFI Pos component
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
wifi_pos_init_11az_context(struct wifi_pos_vdev_priv_obj *vdev_pos_obj);
|
||||||
|
#else
|
||||||
|
static inline void
|
||||||
|
wifi_pos_init_11az_context(struct wifi_pos_vdev_priv_obj *vdev_pos_obj)
|
||||||
|
{}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wifi_pos_psoc_obj_created_notification: callback registered to be called when
|
* wifi_pos_psoc_obj_created_notification: callback registered to be called when
|
||||||
* psoc object is created.
|
* psoc object is created.
|
||||||
@@ -85,6 +100,30 @@ QDF_STATUS
|
|||||||
wifi_pos_vdev_destroyed_notification(struct wlan_objmgr_vdev *vdev,
|
wifi_pos_vdev_destroyed_notification(struct wlan_objmgr_vdev *vdev,
|
||||||
void *arg_list);
|
void *arg_list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wifi_pos_peer_object_created_notification() - Handle peer object created
|
||||||
|
* notification.
|
||||||
|
* @peer: Objmgr peer
|
||||||
|
* @arg: Argument
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_peer_object_created_notification(struct wlan_objmgr_peer *peer,
|
||||||
|
void *arg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wifi_pos_peer_object_destroyed_notification() - Handler for peer object
|
||||||
|
* deleted notification
|
||||||
|
* @peer: Objmgr peer
|
||||||
|
* @arg: Argument
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_peer_object_destroyed_notification(struct wlan_objmgr_peer *peer,
|
||||||
|
void *arg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wifi_pos_oem_rsp_handler: lmac rx ops registered
|
* wifi_pos_oem_rsp_handler: lmac rx ops registered
|
||||||
* @psoc: pointer to psoc object
|
* @psoc: pointer to psoc object
|
||||||
|
@@ -369,6 +369,18 @@ QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (req[i].is_ltf_keyseed_required) {
|
||||||
|
peer = wlan_objmgr_get_peer_by_mac(psoc,
|
||||||
|
req[i].peer_mac.bytes,
|
||||||
|
WLAN_WIFI_POS_CORE_ID);
|
||||||
|
if (peer) {
|
||||||
|
wifi_pos_set_peer_ltf_keyseed_required(peer,
|
||||||
|
true);
|
||||||
|
wlan_objmgr_peer_release_ref(peer,
|
||||||
|
WLAN_WIFI_POS_CORE_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Track the peers only for I-STA mode */
|
/* Track the peers only for I-STA mode */
|
||||||
if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
|
if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
|
||||||
wifi_pos_add_peer_to_list(vdev, &req[i], true);
|
wifi_pos_add_peer_to_list(vdev, &req[i], true);
|
||||||
@@ -523,3 +535,108 @@ no_peer:
|
|||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_send_pasn_auth_status(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wlan_pasn_auth_status *data)
|
||||||
|
{
|
||||||
|
struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops;
|
||||||
|
QDF_STATUS status;
|
||||||
|
uint8_t vdev_id = data->vdev_id;
|
||||||
|
struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
||||||
|
struct wifi_pos_11az_context *pasn_context;
|
||||||
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
uint8_t i, failed_peers_counter = 0, total_peers_to_fill = 0;
|
||||||
|
|
||||||
|
tx_ops = wifi_pos_get_tx_ops(psoc);
|
||||||
|
if (!tx_ops || !tx_ops->send_rtt_pasn_auth_status) {
|
||||||
|
wifi_pos_err("%s is null",
|
||||||
|
tx_ops ? "Tx_ops" : "send_auth_status cb");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
||||||
|
WLAN_WIFI_POS_CORE_ID);
|
||||||
|
if (!vdev) {
|
||||||
|
wifi_pos_err("vdev obj is null");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
|
||||||
|
if (!vdev_pos_obj) {
|
||||||
|
wifi_pos_err("Wifi pos vdev priv obj is null");
|
||||||
|
wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pasn_context = &vdev_pos_obj->pasn_context;
|
||||||
|
total_peers_to_fill = data->num_peers + pasn_context->num_failed_peers;
|
||||||
|
for (i = data->num_peers; i < total_peers_to_fill; i++) {
|
||||||
|
data->auth_status[i].peer_mac =
|
||||||
|
pasn_context->failed_peer_list[failed_peers_counter];
|
||||||
|
data->auth_status[i].status =
|
||||||
|
WLAN_PASN_AUTH_STATUS_PEER_CREATE_FAILED;
|
||||||
|
|
||||||
|
failed_peers_counter++;
|
||||||
|
if (failed_peers_counter >= pasn_context->num_failed_peers)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = tx_ops->send_rtt_pasn_auth_status(psoc, data);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status))
|
||||||
|
wifi_pos_err("Failed to send PASN authentication status");
|
||||||
|
|
||||||
|
wifi_pos_init_11az_context(vdev_pos_obj);
|
||||||
|
wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct qdf_mac_addr *peer_mac)
|
||||||
|
{
|
||||||
|
struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
tx_ops = wifi_pos_get_tx_ops(psoc);
|
||||||
|
if (!tx_ops || !tx_ops->send_rtt_pasn_deauth) {
|
||||||
|
wifi_pos_err("%s is null",
|
||||||
|
tx_ops ? "Tx_ops" : "send_pasn deauth cb");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = tx_ops->send_rtt_pasn_deauth(psoc, peer_mac);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wifi_pos_set_peer_ltf_keyseed_required(struct wlan_objmgr_peer *peer,
|
||||||
|
bool value)
|
||||||
|
{
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *peer_priv;
|
||||||
|
|
||||||
|
peer_priv = wifi_pos_get_peer_private_object(peer);
|
||||||
|
if (!peer_priv) {
|
||||||
|
wifi_pos_err("peer private object is null");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_priv->is_ltf_keyseed_required = value;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer *peer)
|
||||||
|
{
|
||||||
|
struct wlan_wifi_pos_peer_priv_obj *peer_priv;
|
||||||
|
|
||||||
|
peer_priv = wifi_pos_get_peer_private_object(peer);
|
||||||
|
if (!peer_priv) {
|
||||||
|
wifi_pos_err("peer private object is null");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return peer_priv->is_ltf_keyseed_required;
|
||||||
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017, 2020 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017, 2020 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -27,6 +28,9 @@
|
|||||||
|
|
||||||
#include "qdf_types.h"
|
#include "qdf_types.h"
|
||||||
#include "qdf_status.h"
|
#include "qdf_status.h"
|
||||||
|
#include "os_if_wifi_pos_utils.h"
|
||||||
|
#include "wifi_pos_pasn_api.h"
|
||||||
|
#include "wifi_pos_api.h"
|
||||||
|
|
||||||
struct wlan_objmgr_psoc;
|
struct wlan_objmgr_psoc;
|
||||||
struct wifi_pos_req_msg;
|
struct wifi_pos_req_msg;
|
||||||
@@ -44,4 +48,47 @@ QDF_STATUS ucfg_wifi_pos_process_req(struct wlan_objmgr_psoc *psoc,
|
|||||||
struct wifi_pos_req_msg *req,
|
struct wifi_pos_req_msg *req,
|
||||||
wifi_pos_send_rsp_handler send_rsp_cb);
|
wifi_pos_send_rsp_handler send_rsp_cb);
|
||||||
|
|
||||||
|
#ifdef WIFI_POS_CONVERGED
|
||||||
|
/**
|
||||||
|
* ucfg_wifi_pos_register_osif_callbacks() - Register WIFI pos module OSIF
|
||||||
|
* callbacks
|
||||||
|
* @psoc: Pointer to PSOC object
|
||||||
|
* @osif_ops: Pointer to OSIF callbacks
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
static inline QDF_STATUS
|
||||||
|
ucfg_wifi_pos_register_osif_callbacks(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct wifi_pos_osif_ops *osif_ops)
|
||||||
|
{
|
||||||
|
return wifi_pos_register_osif_callbacks(psoc, osif_ops);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_wifi_pos_deregister_osif_callbacks() - De-Register WIFI pos module OSIF
|
||||||
|
* callbacks
|
||||||
|
* @psoc: Pointer to PSOC object
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
static inline QDF_STATUS
|
||||||
|
ucfg_wifi_pos_deregister_osif_callbacks(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
return wifi_pos_register_osif_callbacks(psoc, NULL);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline QDF_STATUS
|
||||||
|
ucfg_wifi_pos_deregister_osif_callbacks(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif /* WIFI_POS_CONVERGED */
|
||||||
|
|
||||||
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
static inline bool
|
||||||
|
ucfg_wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer *peer)
|
||||||
|
{
|
||||||
|
return wifi_pos_is_ltf_keyseed_required_for_peer(peer);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif /* _WIFI_POS_UCFG_H_ */
|
#endif /* _WIFI_POS_UCFG_H_ */
|
||||||
|
@@ -4411,6 +4411,28 @@ wmi_extract_pasn_peer_create_req(wmi_unified_t wmi, void *evt_buf,
|
|||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
wmi_extract_pasn_peer_delete_req(wmi_unified_t wmi, void *evt_buf,
|
wmi_extract_pasn_peer_delete_req(wmi_unified_t wmi, void *evt_buf,
|
||||||
struct wifi_pos_pasn_peer_data *dst);
|
struct wifi_pos_pasn_peer_data *dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wmi_send_rtt_pasn_auth_status_cmd - Send PASN authentication status of all
|
||||||
|
* the PASN peers.
|
||||||
|
* @wmi: WMI handle
|
||||||
|
* @data: Auth status data
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_send_rtt_pasn_auth_status_cmd(wmi_unified_t wmi,
|
||||||
|
struct wlan_pasn_auth_status *data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wmi_send_rtt_pasn_deauth_cmd - Send RTT pasn deauthentication command
|
||||||
|
* @wmi: WMI handle
|
||||||
|
* @peer_mac: peer mac address
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_send_rtt_pasn_deauth_cmd(wmi_unified_t wmi, struct qdf_mac_addr *peer_mac);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -48,5 +49,17 @@ QDF_STATUS
|
|||||||
wmi_extract_install_key_comp_event(wmi_unified_t wmi_handle,
|
wmi_extract_install_key_comp_event(wmi_unified_t wmi_handle,
|
||||||
void *evt_buf, uint32_t len,
|
void *evt_buf, uint32_t len,
|
||||||
struct wmi_install_key_comp_event *param);
|
struct wmi_install_key_comp_event *param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wmi_send_vdev_set_ltf_key_seed_cmd - Set LTF key seed for PASN key
|
||||||
|
* derivation.
|
||||||
|
* @wmi: WMI handle
|
||||||
|
* @data: LTF Keyseed data
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_send_vdev_set_ltf_key_seed_cmd(wmi_unified_t wmi,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -2735,6 +2735,13 @@ QDF_STATUS (*extract_pasn_peer_delete_req_event)
|
|||||||
(wmi_unified_t wmi_handle,
|
(wmi_unified_t wmi_handle,
|
||||||
void *evt_buf,
|
void *evt_buf,
|
||||||
struct wifi_pos_pasn_peer_data *dst);
|
struct wifi_pos_pasn_peer_data *dst);
|
||||||
|
|
||||||
|
QDF_STATUS (*send_rtt_pasn_auth_status_cmd)
|
||||||
|
(wmi_unified_t wmi_handle,
|
||||||
|
struct wlan_pasn_auth_status *data);
|
||||||
|
|
||||||
|
QDF_STATUS (*send_rtt_pasn_deauth_cmd)(wmi_unified_t wmi_handle,
|
||||||
|
struct qdf_mac_addr *peer_mac);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QDF_STATUS (*extract_hw_mode_resp_event)(wmi_unified_t wmi_handle,
|
QDF_STATUS (*extract_hw_mode_resp_event)(wmi_unified_t wmi_handle,
|
||||||
@@ -2905,6 +2912,10 @@ QDF_STATUS
|
|||||||
void *evt_buf, uint32_t len,
|
void *evt_buf, uint32_t len,
|
||||||
struct wmi_install_key_comp_event *param);
|
struct wmi_install_key_comp_event *param);
|
||||||
|
|
||||||
|
QDF_STATUS (*send_vdev_set_ltf_key_seed_cmd)
|
||||||
|
(wmi_unified_t wmi_handle,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data);
|
||||||
|
|
||||||
#ifdef WLAN_ENH_CFR_ENABLE
|
#ifdef WLAN_ENH_CFR_ENABLE
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
(*extract_cfr_phase_param)(wmi_unified_t wmi_handle,
|
(*extract_cfr_phase_param)(wmi_unified_t wmi_handle,
|
||||||
|
@@ -3460,6 +3460,25 @@ wmi_extract_pasn_peer_delete_req(wmi_unified_t wmi, void *evt_buf,
|
|||||||
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_send_rtt_pasn_auth_status_cmd(wmi_unified_t wmi,
|
||||||
|
struct wlan_pasn_auth_status *data)
|
||||||
|
{
|
||||||
|
if (wmi->ops->send_rtt_pasn_auth_status_cmd)
|
||||||
|
return wmi->ops->send_rtt_pasn_auth_status_cmd(wmi, data);
|
||||||
|
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_send_rtt_pasn_deauth_cmd(wmi_unified_t wmi, struct qdf_mac_addr *peer_mac)
|
||||||
|
{
|
||||||
|
if (wmi->ops->send_rtt_pasn_deauth_cmd)
|
||||||
|
return wmi->ops->send_rtt_pasn_deauth_cmd(wmi, peer_mac);
|
||||||
|
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QDF_STATUS wmi_unified_extract_hw_mode_resp(wmi_unified_t wmi,
|
QDF_STATUS wmi_unified_extract_hw_mode_resp(wmi_unified_t wmi,
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for any
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -32,3 +33,13 @@ wmi_extract_install_key_comp_event(wmi_unified_t wmi_handle, void *evt_buf,
|
|||||||
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_send_vdev_set_ltf_key_seed_cmd(wmi_unified_t wmi,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data)
|
||||||
|
{
|
||||||
|
if (wmi->ops->send_vdev_set_ltf_key_seed_cmd)
|
||||||
|
return wmi->ops->send_vdev_set_ltf_key_seed_cmd(wmi, data);
|
||||||
|
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include "wmi_version.h"
|
#include "wmi_version.h"
|
||||||
#include "wmi_unified_priv.h"
|
#include "wmi_unified_priv.h"
|
||||||
#include "wmi_version_allowlist.h"
|
#include "wmi_version_allowlist.h"
|
||||||
|
#include "wifi_pos_public_struct.h"
|
||||||
#include <qdf_module.h>
|
#include <qdf_module.h>
|
||||||
#include <wlan_defs.h>
|
#include <wlan_defs.h>
|
||||||
#include <wlan_cmn.h>
|
#include <wlan_cmn.h>
|
||||||
@@ -4926,7 +4927,6 @@ static QDF_STATUS send_setup_install_key_cmd_tlv(wmi_unified_t wmi_handle,
|
|||||||
cmd->group_key_ix = key_params->group_key_idx;
|
cmd->group_key_ix = key_params->group_key_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WMI_CHAR_ARRAY_TO_MAC_ADDR(key_params->peer_mac, &cmd->peer_macaddr);
|
WMI_CHAR_ARRAY_TO_MAC_ADDR(key_params->peer_mac, &cmd->peer_macaddr);
|
||||||
cmd->key_flags |= key_params->key_flags;
|
cmd->key_flags |= key_params->key_flags;
|
||||||
cmd->key_cipher = key_params->key_cipher;
|
cmd->key_cipher = key_params->key_cipher;
|
||||||
@@ -16251,6 +16251,8 @@ extract_oem_response_param_tlv(wmi_unified_t wmi_handle, void *resp_buf,
|
|||||||
#endif /* WIFI_POS_CONVERGED */
|
#endif /* WIFI_POS_CONVERGED */
|
||||||
|
|
||||||
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||||
|
#define WLAN_PASN_LTF_KEY_SEED_REQUIRED 0x2
|
||||||
|
|
||||||
static QDF_STATUS
|
static QDF_STATUS
|
||||||
extract_pasn_peer_create_req_event_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
extract_pasn_peer_create_req_event_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
||||||
struct wifi_pos_pasn_peer_data *dst)
|
struct wifi_pos_pasn_peer_data *dst)
|
||||||
@@ -16307,6 +16309,8 @@ extract_pasn_peer_create_req_event_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|||||||
else
|
else
|
||||||
dst->peer_info[i].peer_type =
|
dst->peer_info[i].peer_type =
|
||||||
WLAN_WIFI_POS_PASN_UNSECURE_PEER;
|
WLAN_WIFI_POS_PASN_UNSECURE_PEER;
|
||||||
|
if (security_mode & WLAN_PASN_LTF_KEY_SEED_REQUIRED)
|
||||||
|
dst->peer_info[i].is_ltf_keyseed_required = true;
|
||||||
|
|
||||||
dst->peer_info[i].force_self_mac_usage =
|
dst->peer_info[i].force_self_mac_usage =
|
||||||
WMI_RTT_PASN_PEER_CREATE_FORCE_SELF_MAC_USE_GET(
|
WMI_RTT_PASN_PEER_CREATE_FORCE_SELF_MAC_USE_GET(
|
||||||
@@ -16372,8 +16376,151 @@ extract_pasn_peer_delete_req_event_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QDF_STATUS
|
||||||
|
send_rtt_pasn_auth_status_cmd_tlv(wmi_unified_t wmi_handle,
|
||||||
|
struct wlan_pasn_auth_status *data)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
wmi_buf_t buf;
|
||||||
|
wmi_rtt_pasn_auth_status_cmd_fixed_param *fixed_param;
|
||||||
|
uint8_t *buf_ptr;
|
||||||
|
uint8_t i;
|
||||||
|
size_t len = sizeof(*fixed_param) +
|
||||||
|
data->num_peers * sizeof(wmi_rtt_pasn_auth_status_param) +
|
||||||
|
WMI_TLV_HDR_SIZE;
|
||||||
|
|
||||||
|
buf = wmi_buf_alloc(wmi_handle, len);
|
||||||
|
if (!buf) {
|
||||||
|
wmi_err("wmi_buf_alloc failed");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
buf_ptr = (uint8_t *)wmi_buf_data(buf);
|
||||||
|
fixed_param =
|
||||||
|
(wmi_rtt_pasn_auth_status_cmd_fixed_param *)wmi_buf_data(buf);
|
||||||
|
WMITLV_SET_HDR(&fixed_param->tlv_header,
|
||||||
|
WMITLV_TAG_STRUC_wmi_rtt_pasn_auth_status_cmd_fixed_param,
|
||||||
|
WMITLV_GET_STRUCT_TLVLEN(
|
||||||
|
wmi_rtt_pasn_auth_status_cmd_fixed_param));
|
||||||
|
buf_ptr += sizeof(*fixed_param);
|
||||||
|
|
||||||
|
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
|
||||||
|
(data->num_peers *
|
||||||
|
sizeof(wmi_rtt_pasn_auth_status_param)));
|
||||||
|
buf_ptr += WMI_TLV_HDR_SIZE;
|
||||||
|
|
||||||
|
for (i = 0; i < data->num_peers; i++) {
|
||||||
|
wmi_rtt_pasn_auth_status_param *auth_status_tlv =
|
||||||
|
(wmi_rtt_pasn_auth_status_param *)buf_ptr;
|
||||||
|
|
||||||
|
WMITLV_SET_HDR(&auth_status_tlv->tlv_header,
|
||||||
|
WMITLV_TAG_STRUC_wmi_rtt_pasn_auth_status_param,
|
||||||
|
WMITLV_GET_STRUCT_TLVLEN(wmi_rtt_pasn_auth_status_param));
|
||||||
|
|
||||||
|
WMI_CHAR_ARRAY_TO_MAC_ADDR(data->auth_status[i].peer_mac.bytes,
|
||||||
|
&auth_status_tlv->peer_mac_addr);
|
||||||
|
WMI_CHAR_ARRAY_TO_MAC_ADDR(data->auth_status[i].self_mac.bytes,
|
||||||
|
&auth_status_tlv->source_mac_addr);
|
||||||
|
auth_status_tlv->status = data->auth_status[i].status;
|
||||||
|
|
||||||
|
buf_ptr += sizeof(wmi_rtt_pasn_auth_status_param);
|
||||||
|
}
|
||||||
|
|
||||||
|
wmi_mtrace(WMI_RTT_PASN_AUTH_STATUS_CMD, 0, 0);
|
||||||
|
status = wmi_unified_cmd_send(wmi_handle, buf, len,
|
||||||
|
WMI_RTT_PASN_AUTH_STATUS_CMD);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
wmi_err("Failed to send Auth status command ret = %d", status);
|
||||||
|
wmi_buf_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static QDF_STATUS
|
||||||
|
send_rtt_pasn_deauth_cmd_tlv(wmi_unified_t wmi_handle,
|
||||||
|
struct qdf_mac_addr *peer_mac)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
wmi_buf_t buf;
|
||||||
|
wmi_rtt_pasn_deauth_cmd_fixed_param *fixed_param;
|
||||||
|
size_t len = sizeof(*fixed_param);
|
||||||
|
|
||||||
|
buf = wmi_buf_alloc(wmi_handle, len);
|
||||||
|
if (!buf) {
|
||||||
|
wmi_err("wmi_buf_alloc failed");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
fixed_param =
|
||||||
|
(wmi_rtt_pasn_deauth_cmd_fixed_param *)wmi_buf_data(buf);
|
||||||
|
WMITLV_SET_HDR(&fixed_param->tlv_header,
|
||||||
|
WMITLV_TAG_STRUC_wmi_rtt_pasn_deauth_cmd_fixed_param,
|
||||||
|
WMITLV_GET_STRUCT_TLVLEN(
|
||||||
|
wmi_rtt_pasn_deauth_cmd_fixed_param));
|
||||||
|
WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_mac->bytes,
|
||||||
|
&fixed_param->peer_mac_addr);
|
||||||
|
|
||||||
|
wmi_mtrace(WMI_RTT_PASN_DEAUTH_CMD, 0, 0);
|
||||||
|
status = wmi_unified_cmd_send(wmi_handle, buf, len,
|
||||||
|
WMI_RTT_PASN_DEAUTH_CMD);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
wmi_err("Failed to send pasn deauth command ret = %d", status);
|
||||||
|
wmi_buf_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
#endif /* WLAN_FEATURE_RTT_11AZ_SUPPORT */
|
#endif /* WLAN_FEATURE_RTT_11AZ_SUPPORT */
|
||||||
|
|
||||||
|
static QDF_STATUS
|
||||||
|
send_vdev_set_ltf_key_seed_cmd_tlv(wmi_unified_t wmi_handle,
|
||||||
|
struct wlan_crypto_ltf_keyseed_data *data)
|
||||||
|
{
|
||||||
|
QDF_STATUS status;
|
||||||
|
wmi_buf_t buf;
|
||||||
|
wmi_vdev_set_ltf_key_seed_cmd_fixed_param *fixed_param;
|
||||||
|
uint8_t *buf_ptr;
|
||||||
|
size_t len = sizeof(*fixed_param) + data->key_seed_len +
|
||||||
|
WMI_TLV_HDR_SIZE;
|
||||||
|
|
||||||
|
buf = wmi_buf_alloc(wmi_handle, len);
|
||||||
|
if (!buf) {
|
||||||
|
wmi_err("wmi_buf_alloc failed");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf_ptr = (uint8_t *)wmi_buf_data(buf);
|
||||||
|
fixed_param =
|
||||||
|
(wmi_vdev_set_ltf_key_seed_cmd_fixed_param *)wmi_buf_data(buf);
|
||||||
|
WMITLV_SET_HDR(&fixed_param->tlv_header,
|
||||||
|
WMITLV_TAG_STRUC_wmi_vdev_set_ltf_key_seed_cmd_fixed_param,
|
||||||
|
WMITLV_GET_STRUCT_TLVLEN(
|
||||||
|
wmi_vdev_set_ltf_key_seed_cmd_fixed_param));
|
||||||
|
|
||||||
|
fixed_param->vdev_id = data->vdev_id;
|
||||||
|
WMI_CHAR_ARRAY_TO_MAC_ADDR(data->peer_mac_addr.bytes,
|
||||||
|
&fixed_param->peer_macaddr);
|
||||||
|
fixed_param->key_seed_len = data->key_seed_len;
|
||||||
|
fixed_param->rsn_authmode = data->rsn_authmode;
|
||||||
|
|
||||||
|
buf_ptr += sizeof(*fixed_param);
|
||||||
|
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
|
||||||
|
(fixed_param->key_seed_len * sizeof(A_UINT8)));
|
||||||
|
buf_ptr += WMI_TLV_HDR_SIZE;
|
||||||
|
|
||||||
|
qdf_mem_copy(buf_ptr, data->key_seed, fixed_param->key_seed_len);
|
||||||
|
|
||||||
|
wmi_mtrace(WMI_VDEV_SET_LTF_KEY_SEED_CMDID, 0, 0);
|
||||||
|
status = wmi_unified_cmd_send(wmi_handle, buf, len,
|
||||||
|
WMI_VDEV_SET_LTF_KEY_SEED_CMDID);
|
||||||
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
|
wmi_err("Failed to send ltf keyseed command ret = %d", status);
|
||||||
|
wmi_buf_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* extract_hw_mode_resp_event_status_tlv() - Extract HW mode change status
|
* extract_hw_mode_resp_event_status_tlv() - Extract HW mode change status
|
||||||
* @wmi_handle: wmi handle
|
* @wmi_handle: wmi handle
|
||||||
@@ -18380,6 +18527,10 @@ struct wmi_ops tlv_ops = {
|
|||||||
extract_pasn_peer_create_req_event_tlv,
|
extract_pasn_peer_create_req_event_tlv,
|
||||||
.extract_pasn_peer_delete_req_event =
|
.extract_pasn_peer_delete_req_event =
|
||||||
extract_pasn_peer_delete_req_event_tlv,
|
extract_pasn_peer_delete_req_event_tlv,
|
||||||
|
.send_rtt_pasn_auth_status_cmd =
|
||||||
|
send_rtt_pasn_auth_status_cmd_tlv,
|
||||||
|
.send_rtt_pasn_deauth_cmd =
|
||||||
|
send_rtt_pasn_deauth_cmd_tlv,
|
||||||
#endif
|
#endif
|
||||||
#ifdef WLAN_MWS_INFO_DEBUGFS
|
#ifdef WLAN_MWS_INFO_DEBUGFS
|
||||||
.send_mws_coex_status_req_cmd = send_mws_coex_status_req_cmd_tlv,
|
.send_mws_coex_status_req_cmd = send_mws_coex_status_req_cmd_tlv,
|
||||||
@@ -18429,6 +18580,8 @@ struct wmi_ops tlv_ops = {
|
|||||||
#endif
|
#endif
|
||||||
.extract_dpd_status_ev_param = extract_dpd_status_ev_param_tlv,
|
.extract_dpd_status_ev_param = extract_dpd_status_ev_param_tlv,
|
||||||
.extract_install_key_comp_event = extract_install_key_comp_event_tlv,
|
.extract_install_key_comp_event = extract_install_key_comp_event_tlv,
|
||||||
|
.send_vdev_set_ltf_key_seed_cmd =
|
||||||
|
send_vdev_set_ltf_key_seed_cmd_tlv,
|
||||||
.extract_halphy_cal_status_ev_param = extract_halphy_cal_status_ev_param_tlv,
|
.extract_halphy_cal_status_ev_param = extract_halphy_cal_status_ev_param_tlv,
|
||||||
.send_set_halphy_cal = send_set_halphy_cal_tlv,
|
.send_set_halphy_cal = send_set_halphy_cal_tlv,
|
||||||
.extract_halphy_cal_ev_param = extract_halphy_cal_ev_param_tlv,
|
.extract_halphy_cal_ev_param = extract_halphy_cal_ev_param_tlv,
|
||||||
|
Reference in New Issue
Block a user