qcacmn: Add support for WMI_ROAM_SYNCH_KEY_EVENTID

Add support to handle WMI_ROAM_SYNCH_KEY_EVENTID.
WMI_ROAM_SYNCH_KEY_EVENTID is received after roaming to 3 Link
MLO AP when standby link is supported.

Add changes to register handler function pointers and parse
the event.

Change-Id: Iee17560f9f1f3242ef512a550764a9c64319b67f
CRs-Fixed: 3571673
This commit is contained in:
Pragaspathi Thilagaraj
2023-07-26 15:17:18 +05:30
committed by Rahul Choudhary
parent 6e1fe7f344
commit cbefdcb9f0
7 changed files with 128 additions and 86 deletions

View File

@@ -977,6 +977,16 @@ QDF_STATUS wlan_crypto_set_key_req(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);
/**
* wlan_crypto_free_key() - Free the given key
* @crypto_key: pointer to the key
*
* This function frees keys stored in vdev crypto object.
*
* Return: None
*/
void wlan_crypto_free_key(struct wlan_crypto_keys *crypto_key);
/** /**
* wlan_crypto_free_vdev_key() - Free keys for vdev * wlan_crypto_free_vdev_key() - Free keys for vdev
* @vdev: vdev object * @vdev: vdev object

View File

@@ -476,6 +476,64 @@ struct wlan_crypto_key {
+ WLAN_CRYPTO_RXMIC_OFFSET) + WLAN_CRYPTO_RXMIC_OFFSET)
}; };
/**
* struct wlan_crypto_keys - crypto keys structure
* @key: key buffers for this peer
* @igtk_key: igtk key buffer for this peer
* @bigtk_key: bigtk key buffer for this peer
* @ltf_key_seed: LTF Key Seed buffer
* @igtk_key_type: igtk key type
* @def_tx_keyid: default key used for this peer
* @def_igtk_tx_keyid: default igtk key used for this peer
* @def_bigtk_tx_keyid: default bigtk key used for this peer
*/
struct wlan_crypto_keys {
struct wlan_crypto_key *key[WLAN_CRYPTO_MAX_VLANKEYIX];
struct wlan_crypto_key *igtk_key[WLAN_CRYPTO_MAXIGTKKEYIDX];
struct wlan_crypto_key *bigtk_key[WLAN_CRYPTO_MAXBIGTKKEYIDX];
struct wlan_crypto_ltf_keyseed_data ltf_key_seed;
enum wlan_crypto_cipher_type igtk_key_type;
uint8_t def_tx_keyid;
uint8_t def_igtk_tx_keyid;
uint8_t def_bigtk_tx_keyid;
};
union crypto_align_mac_addr {
uint8_t raw[QDF_MAC_ADDR_SIZE];
struct {
uint16_t bytes_ab;
uint16_t bytes_cd;
uint16_t bytes_ef;
} align2;
struct {
uint32_t bytes_abcd;
uint16_t bytes_ef;
} align4;
struct __packed {
uint16_t bytes_ab;
uint32_t bytes_cdef;
} align4_2;
};
/**
* struct wlan_crypto_key_entry - crypto key entry structure
* @mac_addr: mac addr
* @is_active: active key entry
* @link_id: link id
* @vdev_id: vdev id
* @keys: crypto keys
* @hash_list_elem: hash list element
*/
struct wlan_crypto_key_entry {
union crypto_align_mac_addr mac_addr;
bool is_active;
uint8_t link_id;
uint8_t vdev_id;
struct wlan_crypto_keys keys;
TAILQ_ENTRY(wlan_crypto_key_entry) hash_list_elem;
};
/** /**
* struct wlan_crypto_req_key - key request structure * struct wlan_crypto_req_key - key request structure
* @type: key/cipher type * @type: key/cipher type

View File

@@ -24,11 +24,12 @@
#define _WLAN_CRYPTO_DEF_I_H_ #define _WLAN_CRYPTO_DEF_I_H_
#include <wlan_cmn_ieee80211.h> #include <wlan_cmn_ieee80211.h>
#include "wlan_objmgr_pdev_obj.h"
#include "wlan_crypto_global_def.h"
#ifdef WLAN_CRYPTO_AES #ifdef WLAN_CRYPTO_AES
#include "wlan_crypto_aes_i.h" #include "wlan_crypto_aes_i.h"
#endif #endif
/* Number of bits per byte */ /* Number of bits per byte */
#define CRYPTO_NBBY 8 #define CRYPTO_NBBY 8
/* Default link id for legacy connection */ /* Default link id for legacy connection */
@@ -393,29 +394,6 @@ struct crypto_add_key_result {
typedef void (*crypto_add_key_callback)(void *context, typedef void (*crypto_add_key_callback)(void *context,
struct crypto_add_key_result *result); struct crypto_add_key_result *result);
/**
* struct wlan_crypto_keys - crypto keys structure
* @key: key buffers for this peer
* @igtk_key: igtk key buffer for this peer
* @bigtk_key: bigtk key buffer for this peer
* @ltf_key_seed: LTF Key Seed buffer
* @igtk_key_type: igtk key type
* @def_tx_keyid: default key used for this peer
* @def_igtk_tx_keyid: default igtk key used for this peer
* @def_bigtk_tx_keyid: default bigtk key used for this peer
*
*/
struct wlan_crypto_keys {
struct wlan_crypto_key *key[WLAN_CRYPTO_MAX_VLANKEYIX];
struct wlan_crypto_key *igtk_key[WLAN_CRYPTO_MAXIGTKKEYIDX];
struct wlan_crypto_key *bigtk_key[WLAN_CRYPTO_MAXBIGTKKEYIDX];
struct wlan_crypto_ltf_keyseed_data ltf_key_seed;
enum wlan_crypto_cipher_type igtk_key_type;
uint8_t def_tx_keyid;
uint8_t def_igtk_tx_keyid;
uint8_t def_bigtk_tx_keyid;
};
/** /**
* struct wlan_crypto_comp_priv - crypto component private structure * struct wlan_crypto_comp_priv - crypto component private structure
* @crypto_params: crypto params for the peer * @crypto_params: crypto params for the peer
@@ -567,42 +545,6 @@ static inline int wlan_get_tid(const void *data)
return WLAN_NONQOS_SEQ; return WLAN_NONQOS_SEQ;
} }
union crypto_align_mac_addr {
uint8_t raw[QDF_MAC_ADDR_SIZE];
struct {
uint16_t bytes_ab;
uint16_t bytes_cd;
uint16_t bytes_ef;
} align2;
struct {
uint32_t bytes_abcd;
uint16_t bytes_ef;
} align4;
struct __packed {
uint16_t bytes_ab;
uint32_t bytes_cdef;
} align4_2;
};
/**
* struct wlan_crypto_key_entry - crypto key entry structure
* @mac_addr: mac addr
* @is_active: active key entry
* @link_id: link id
* @vdev_id: vdev id
* @keys: crypto keys
* @hash_list_elem: hash list element
*/
struct wlan_crypto_key_entry {
union crypto_align_mac_addr mac_addr;
bool is_active;
uint8_t link_id;
uint8_t vdev_id;
struct wlan_crypto_keys keys;
TAILQ_ENTRY(wlan_crypto_key_entry) hash_list_elem;
};
struct crypto_psoc_priv_obj { struct crypto_psoc_priv_obj {
/** @crypto_key_lock: lock for crypto key table */ /** @crypto_key_lock: lock for crypto key table */
qdf_mutex_t crypto_key_lock; qdf_mutex_t crypto_key_lock;

View File

@@ -205,9 +205,15 @@ QDF_STATUS wlan_crypto_add_key_entry(struct wlan_objmgr_psoc *psoc,
(struct qdf_mac_addr *)new_entry->mac_addr.raw, (struct qdf_mac_addr *)new_entry->mac_addr.raw,
link_id); link_id);
crypto_hash_add(crypto_psoc_obj, new_entry, link_id); crypto_entry = qdf_mem_malloc(sizeof(*crypto_entry));
if (!crypto_entry)
return QDF_STATUS_E_NOMEM;
*crypto_entry = *new_entry;
crypto_hash_add(crypto_psoc_obj, crypto_entry, link_id);
qdf_atomic_inc(&crypto_psoc_obj->crypto_key_cnt); qdf_atomic_inc(&crypto_psoc_obj->crypto_key_cnt);
new_entry->is_active = 1; crypto_entry->is_active = 1;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }
@@ -280,9 +286,8 @@ static void crypto_remove_entry(struct crypto_psoc_priv_obj *psoc,
crypto_entry->link_id); crypto_entry->link_id);
TAILQ_HEAD(, wlan_crypto_key_entry) * free_list = ptr; TAILQ_HEAD(, wlan_crypto_key_entry) * free_list = ptr;
crypto_debug("crypto remove entry key index %d link id %d crypto_entry %pK ", crypto_info("crypto remove entry key index %d link id %d",
index, crypto_entry->link_id, index, crypto_entry->link_id);
crypto_entry);
for (i = 0; i < WLAN_CRYPTO_MAX_VLANKEYIX; i++) { for (i = 0; i < WLAN_CRYPTO_MAX_VLANKEYIX; i++) {
if (crypto_entry->keys.key[i]) { if (crypto_entry->keys.key[i]) {
@@ -617,39 +622,40 @@ static QDF_STATUS wlan_crypto_peer_obj_create_handler(
return status; return status;
} }
static void wlan_crypto_free_key(struct wlan_crypto_comp_priv *crypto_priv) void wlan_crypto_free_key(struct wlan_crypto_keys *crypto_key)
{ {
uint8_t i; uint8_t i;
if (!crypto_priv) { if (!crypto_key) {
crypto_err("crypto_priv NULL"); crypto_err("given key ptr is NULL");
return; return;
} }
for (i = 0; i < WLAN_CRYPTO_MAX_VLANKEYIX; i++) { for (i = 0; i < WLAN_CRYPTO_MAX_VLANKEYIX; i++) {
if (crypto_priv->crypto_key.key[i]) { if (crypto_key->key[i]) {
qdf_mem_free(crypto_priv->crypto_key.key[i]); qdf_mem_free(crypto_key->key[i]);
crypto_priv->crypto_key.key[i] = NULL; crypto_key->key[i] = NULL;
} }
} }
for (i = 0; i < WLAN_CRYPTO_MAXIGTKKEYIDX; i++) { for (i = 0; i < WLAN_CRYPTO_MAXIGTKKEYIDX; i++) {
if (crypto_priv->crypto_key.igtk_key[i]) { if (crypto_key->igtk_key[i]) {
qdf_mem_free(crypto_priv->crypto_key.igtk_key[i]); qdf_mem_free(crypto_key->igtk_key[i]);
crypto_priv->crypto_key.igtk_key[i] = NULL; crypto_key->igtk_key[i] = NULL;
} }
} }
for (i = 0; i < WLAN_CRYPTO_MAXBIGTKKEYIDX; i++) { for (i = 0; i < WLAN_CRYPTO_MAXBIGTKKEYIDX; i++) {
if (crypto_priv->crypto_key.bigtk_key[i]) { if (crypto_key->bigtk_key[i]) {
qdf_mem_free(crypto_priv->crypto_key.bigtk_key[i]); qdf_mem_free(crypto_key->bigtk_key[i]);
crypto_priv->crypto_key.bigtk_key[i] = NULL; crypto_key->bigtk_key[i] = NULL;
} }
} }
/* Reset All key index as well */ /* Reset All key index as well */
crypto_priv->crypto_key.def_tx_keyid = 0; crypto_key->def_tx_keyid = 0;
crypto_priv->crypto_key.def_igtk_tx_keyid = 0; crypto_key->def_igtk_tx_keyid = 0;
crypto_priv->crypto_key.def_bigtk_tx_keyid = 0; crypto_key->def_bigtk_tx_keyid = 0;
} }
#ifdef CRYPTO_SET_KEY_CONVERGED #ifdef CRYPTO_SET_KEY_CONVERGED
@@ -663,7 +669,7 @@ void wlan_crypto_free_vdev_key(struct wlan_objmgr_vdev *vdev)
return; return;
} }
wlan_crypto_free_key(crypto_priv); wlan_crypto_free_key(&crypto_priv->crypto_key);
} }
#endif #endif
@@ -732,7 +738,7 @@ static QDF_STATUS wlan_crypto_vdev_obj_destroy_handler(
(void *)crypto_priv); (void *)crypto_priv);
wlan_crypto_pmksa_flush(&crypto_priv->crypto_params); wlan_crypto_pmksa_flush(&crypto_priv->crypto_params);
wlan_crypto_free_key(crypto_priv); wlan_crypto_free_key(&crypto_priv->crypto_key);
qdf_mem_free(crypto_priv); qdf_mem_free(crypto_priv);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
@@ -758,7 +764,7 @@ static QDF_STATUS wlan_crypto_peer_obj_destroy_handler(
wlan_objmgr_peer_component_obj_detach(peer, wlan_objmgr_peer_component_obj_detach(peer,
WLAN_UMAC_COMP_CRYPTO, WLAN_UMAC_COMP_CRYPTO,
(void *)crypto_priv); (void *)crypto_priv);
wlan_crypto_free_key(crypto_priv); wlan_crypto_free_key(&crypto_priv->crypto_key);
qdf_mem_free(crypto_priv); qdf_mem_free(crypto_priv);
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;

View File

@@ -5343,6 +5343,9 @@ typedef enum {
#ifdef WLAN_FEATURE_11BE_MLO #ifdef WLAN_FEATURE_11BE_MLO
wmi_mlo_link_state_info_eventid, wmi_mlo_link_state_info_eventid,
#endif #endif
#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(WLAN_FEATURE_11BE_MLO)
wmi_roam_synch_key_event_id,
#endif
#ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
wmi_peer_ptqm_migration_response_eventid, wmi_peer_ptqm_migration_response_eventid,
#endif #endif

View File

@@ -402,6 +402,7 @@ QDF_STATUS
(*extract_roam_event)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t len, (*extract_roam_event)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t len,
struct roam_offload_roam_event *roam_event); struct roam_offload_roam_event *roam_event);
#endif #endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD #ifdef WLAN_FEATURE_ROAM_OFFLOAD
QDF_STATUS QDF_STATUS
(*extract_roam_btm_response_stats)(wmi_unified_t wmi_handle, void *evt_buf, (*extract_roam_btm_response_stats)(wmi_unified_t wmi_handle, void *evt_buf,
@@ -487,7 +488,28 @@ QDF_STATUS
uint8_t *event, uint32_t data_len, uint8_t *event, uint32_t data_len,
struct roam_vendor_handoff_params **vendor_handoff_params); struct roam_vendor_handoff_params **vendor_handoff_params);
#endif #endif
#ifdef WLAN_FEATURE_11BE_MLO
/**
* extract_roam_synch_key_event() - Extract Roam synch key event
* @wmi_handle: WMI Handle
* @event: Event buffer
* @data_len: Event data length
* @keys: Destination buffer to fill the keys
* @num_keys: Number of keys
* @mld_addr: Peer MLD address
*
* Return: QDF_STATUS
*/
QDF_STATUS
(*extract_roam_synch_key_event) (wmi_unified_t wmi_handle, uint8_t *event,
uint32_t data_len,
struct wlan_crypto_key_entry **keys,
uint8_t *num_keys,
struct qdf_mac_addr *mld_addr);
#endif #endif
#endif
#ifdef FEATURE_MEC_OFFLOAD #ifdef FEATURE_MEC_OFFLOAD
QDF_STATUS QDF_STATUS
(*send_pdev_set_mec_timer_cmd)(struct wmi_unified *wmi_handle, (*send_pdev_set_mec_timer_cmd)(struct wmi_unified *wmi_handle,

View File

@@ -22139,9 +22139,10 @@ static void populate_tlv_events_id(WMI_EVT_ID *event_ids)
event_ids[wmi_vdev_standalone_sound_complete_eventid] = event_ids[wmi_vdev_standalone_sound_complete_eventid] =
WMI_VDEV_STANDALONE_SOUND_COMPLETE_EVENTID; WMI_VDEV_STANDALONE_SOUND_COMPLETE_EVENTID;
#endif #endif
event_ids[wmi_csa_ie_received_event_id] = event_ids[wmi_csa_ie_received_event_id] = WMI_CSA_IE_RECEIVED_EVENTID;
WMI_CSA_IE_RECEIVED_EVENTID; #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(WLAN_FEATURE_11BE_MLO)
event_ids[wmi_roam_synch_key_event_id] = WMI_ROAM_SYNCH_KEY_EVENTID;
#endif
#ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
event_ids[wmi_peer_ptqm_migration_response_eventid] = event_ids[wmi_peer_ptqm_migration_response_eventid] =
WMI_MLO_PRIMARY_LINK_PEER_MIGRATION_EVENTID; WMI_MLO_PRIMARY_LINK_PEER_MIGRATION_EVENTID;