qcacld-3.0: Add pairwise key for all the link

Currently, we are storing all the keys based on vdev
object. However, with n link mlo there is a need to
add all the keys based on psoc level.

This change is to add pairwise key based on psoc level.

Change-Id: Ib2b53f800eeec0694514239a5d87052accadbc33
CRs-Fixed: 3565190
This commit is contained in:
Aasir Rasheed
2023-07-17 19:02:34 +05:30
committed by Rahul Choudhary
parent d37e4a04d4
commit dccc97079b
2 changed files with 83 additions and 69 deletions

View File

@@ -1642,12 +1642,6 @@ cm_install_link_vdev_keys(struct wlan_objmgr_vdev *vdev)
return;
}
if (!mlo_get_keys_saved(vdev, wlan_peer_get_macaddr(peer))) {
mlo_debug("keys are not saved for vdev_id %d", vdev_id);
wlan_objmgr_peer_release_ref(peer, WLAN_MLME_CM_ID);
return;
}
for (i = 0; i < max_key_index; i++) {
crypto_key = wlan_crypto_get_key(vdev, i);
if (!crypto_key)
@@ -1659,9 +1653,7 @@ cm_install_link_vdev_keys(struct wlan_objmgr_vdev *vdev)
mlme_cm_osif_send_keys(vdev, i, pairwise,
crypto_key->cipher_type);
}
mlo_set_keys_saved(vdev,
(struct qdf_mac_addr *)wlan_peer_get_macaddr(peer),
false);
wlan_objmgr_peer_release_ref(peer, WLAN_MLME_CM_ID);
}

View File

@@ -22347,53 +22347,38 @@ static int wlan_hdd_add_key_sta(struct wlan_objmgr_pdev *pdev,
#ifdef WLAN_FEATURE_11BE_MLO
static void
wlan_hdd_mlo_link_free_keys(struct hdd_adapter *adapter,
wlan_hdd_mlo_link_free_keys(struct wlan_objmgr_psoc *psoc,
struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev,
bool pairwise)
{
struct qdf_mac_addr *link_addr;
uint8_t link_id;
if (adapter->device_mode != QDF_STA_MODE)
return;
if (pairwise &&
wlan_vdev_mlme_is_mlo_link_vdev(vdev) &&
mlo_roam_is_auth_status_connected(adapter->hdd_ctx->psoc,
wlan_vdev_get_id(vdev)))
wlan_crypto_free_vdev_key(vdev);
}
static bool
wlan_hdd_mlo_set_keys_saved(struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_address)
{
if (!adapter)
return false;
wlan_vdev_get_id(vdev))) {
link_addr =
(struct qdf_mac_addr *)wlan_vdev_mlme_get_linkaddr(vdev);
if (!vdev)
return false;
if ((adapter->device_mode == QDF_STA_MODE) &&
((!wlan_cm_is_vdev_connected(vdev)) ||
(wlan_vdev_mlme_is_mlo_link_vdev(vdev) &&
mlo_roam_is_auth_status_connected(adapter->hdd_ctx->psoc,
wlan_vdev_get_id(vdev))))) {
hdd_debug("MLO:Save keys for vdev %d", wlan_vdev_get_id(vdev));
mlo_set_keys_saved(vdev, mac_address, true);
return true;
if (!link_addr) {
crypto_err("link_addr NULL");
return;
}
link_id = wlan_vdev_get_link_id(vdev);
wlan_crypto_free_key_by_link_id(psoc, link_addr, link_id);
}
}
return false;
}
#else
static bool
wlan_hdd_mlo_set_keys_saved(struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev,
struct qdf_mac_addr *mac_address)
{
return false;
}
static void
wlan_hdd_mlo_link_free_keys(struct hdd_adapter *adapter,
wlan_hdd_mlo_link_free_keys(struct wlan_objmgr_psoc *psoc,
struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev,
bool pairwise)
{
@@ -22540,6 +22525,44 @@ wlan_hdd_add_vlan(struct wlan_objmgr_vdev *vdev, struct sap_context *sap_ctx,
}
#endif
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
static void wlan_hdd_mlo_link_add_pairwise_key(struct wlan_objmgr_vdev *vdev,
struct hdd_context *hdd_ctx,
u8 key_index, bool pairwise,
struct key_params *params)
{
struct mlo_link_info *mlo_link_info;
uint8_t link_info_iter = 0;
mlo_link_info = &vdev->mlo_dev_ctx->link_ctx->links_info[0];
for (link_info_iter = 0; link_info_iter < WLAN_MAX_ML_BSS_LINKS;
link_info_iter++) {
if (qdf_is_macaddr_zero(&mlo_link_info->ap_link_addr) ||
mlo_link_info->link_id == 0xFF)
continue;
hdd_debug(" Add pairwise key link id %d ",
mlo_link_info->link_id);
wlan_cfg80211_store_link_key(
hdd_ctx->psoc, key_index,
(pairwise ? WLAN_CRYPTO_KEY_TYPE_UNICAST :
WLAN_CRYPTO_KEY_TYPE_GROUP),
(uint8_t *)mlo_link_info->ap_link_addr.bytes,
params, &mlo_link_info->link_addr,
mlo_link_info->link_id);
mlo_link_info++;
}
}
#else
static void wlan_hdd_mlo_link_add_pairwise_key(struct wlan_objmgr_vdev *vdev,
struct hdd_context *hdd_ctx,
u8 key_index, bool pairwise,
struct key_params *params)
{
}
#endif
static int wlan_hdd_add_key_vdev(mac_handle_t mac_handle,
struct wlan_objmgr_vdev *vdev, u8 key_index,
bool pairwise, const u8 *mac_addr,
@@ -22551,7 +22574,7 @@ static int wlan_hdd_add_key_vdev(mac_handle_t mac_handle,
struct hdd_context *hdd_ctx;
struct qdf_mac_addr mac_address;
int32_t cipher_cap, ucast_cipher = 0;
int errno;
int errno = 0;
enum wlan_crypto_cipher_type cipher;
bool ft_mode = false;
uint8_t keyidx;
@@ -22618,16 +22641,20 @@ static int wlan_hdd_add_key_vdev(mac_handle_t mac_handle,
}
done:
wlan_hdd_mlo_link_free_keys(adapter, vdev, pairwise);
wlan_hdd_mlo_link_free_keys(hdd_ctx->psoc, adapter, vdev, pairwise);
if (pairwise && adapter->device_mode == QDF_STA_MODE &&
wlan_vdev_mlme_is_mlo_vdev(vdev)) {
wlan_hdd_mlo_link_add_pairwise_key(vdev, hdd_ctx, key_index,
pairwise, params);
errno = wlan_cfg80211_store_key(vdev, key_index,
} else {
errno = wlan_cfg80211_store_key(
vdev, key_index,
(pairwise ?
WLAN_CRYPTO_KEY_TYPE_UNICAST :
WLAN_CRYPTO_KEY_TYPE_GROUP),
mac_address.bytes, params);
if (wlan_hdd_mlo_set_keys_saved(adapter, vdev, &mac_address))
return 0;
}
cipher_cap = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_CIPHER_CAP);
if (errno)
@@ -22900,34 +22927,29 @@ add_key:
return errno;
}
static int wlan_add_key_inactive_link(struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev,
int link_id, u8 key_index,
bool pairwise, struct key_params *params)
static int wlan_add_key_standby_link(struct hdd_adapter *adapter,
struct wlan_objmgr_vdev *vdev,
int link_id, u8 key_index,
bool pairwise, struct key_params *params)
{
int errno = 0;
struct hdd_context *hdd_ctx;
struct wlan_crypto_key *crypto_key = NULL;
struct mlo_link_info *ml_link_info;
struct mlo_link_info *mlo_link_info;
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
ml_link_info = mlo_mgr_get_ap_link_by_link_id(vdev, link_id);
if (!ml_link_info)
mlo_link_info = mlo_mgr_get_ap_link_by_link_id(vdev, link_id);
if (!mlo_link_info)
return QDF_STATUS_E_FAILURE;
crypto_key = qdf_mem_malloc(sizeof(*crypto_key));
if (!crypto_key)
return QDF_STATUS_E_NOMEM;
wlan_cfg80211_translate_ml_sta_key(
key_index,
(pairwise ? WLAN_CRYPTO_KEY_TYPE_UNICAST : WLAN_CRYPTO_KEY_TYPE_GROUP),
(uint8_t *)ml_link_info->link_addr.bytes, params, crypto_key);
errno = wlan_crypto_save_ml_sta_key(hdd_ctx->psoc, key_index,
crypto_key,
&ml_link_info->link_addr,
link_id);
errno = wlan_cfg80211_store_link_key(
hdd_ctx->psoc, key_index,
(pairwise ? WLAN_CRYPTO_KEY_TYPE_UNICAST :
WLAN_CRYPTO_KEY_TYPE_GROUP),
(uint8_t *)mlo_link_info->ap_link_addr.bytes,
params,
&mlo_link_info->link_addr,
link_id);
return errno;
}
@@ -23002,8 +23024,8 @@ static int wlan_hdd_add_key_mlo_vdev(mac_handle_t mac_handle,
link_vdev = wlan_key_get_link_vdev(adapter, WLAN_MLO_MGR_ID, link_id);
if (!link_vdev) {
hdd_err("couldn't get vdev for link_id :%d", link_id);
errno = wlan_add_key_inactive_link(adapter, vdev, link_id,
key_index, pairwise, params);
errno = wlan_add_key_standby_link(adapter, vdev, link_id,
key_index, pairwise, params);
return errno;
}