qcacmn: Add pmksa based on SSID and cache id

For FILS pmksa cache, the pmksa add/del/query is based on SSID
and cache id. The current crypto pmksa cache API dosn't support
SSID and cache ID.

1. Add SSID/Cache ID support to pmksa API
2. Add RSN IE pmkid field based on SSID/cache ID

Change-Id: I1577c6293b75d6f8e6210f314dd83462e06d8190
CRs-Fixed: 2621860
This commit is contained in:
Liangwei Dong
2020-02-05 14:26:12 +08:00
committed by nshrivas
orang tua edda5aa847
melakukan 5d64a83690
4 mengubah file dengan 135 tambahan dan 41 penghapusan

Melihat File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -320,6 +320,21 @@ QDF_STATUS wlan_crypto_rsnie_check(struct wlan_crypto_params *, uint8_t *frm);
*/
uint8_t *wlan_crypto_build_wpaie(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf);
/**
* wlan_crypto_build_rsnie_with_pmksa() - called by mlme to build rsnie
* @vdev: vdev
* @iebuf: ie buffer
* @pmksa: pmksa struct
*
* This function gets called by mlme to build rsnie from given vdev
*
* Return: end of buffer
*/
uint8_t *wlan_crypto_build_rsnie_with_pmksa(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf,
struct wlan_crypto_pmksa *pmksa);
/**
* wlan_crypto_build_rsnie - called by mlme to build rsnie
* @vdev: vdev
@@ -852,6 +867,20 @@ QDF_STATUS wlan_crypto_set_key_req(struct wlan_objmgr_vdev *vdev,
return QDF_STATUS_SUCCESS;
}
#endif /* CRYPTO_SET_KEY_CONVERGED */
/**
* wlan_crypto_get_peer_pmksa() - called to get pmksa based on pmksa parameter
* @vdev: vdev
* @pmksa: bssid
*
* This function is to get pmksa based on pmksa parameter
*
* Return: wlan_crypto_pmksa when match found else NULL.
*/
struct wlan_crypto_pmksa *
wlan_crypto_get_peer_pmksa(struct wlan_objmgr_vdev *vdev,
struct wlan_crypto_pmksa *pmksa);
/**
* wlan_crypto_get_pmksa - called to get pmksa of bssid passed.
* @vdev: vdev

Melihat File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -222,13 +222,18 @@ enum wlan_crypto_key_type {
* @pmkid: pmkid info
* @pmk: pmk info
* @pmk_len: pmk len
* @ssid_len: ssid length
* @ssid: ssid information
* @cache_id: cache id
*/
struct wlan_crypto_pmksa {
struct qdf_mac_addr bssid;
uint8_t pmkid[PMKID_LEN];
uint8_t pmk[MAX_PMK_LEN];
uint8_t pmk_len;
uint8_t ssid_len;
uint8_t ssid[WLAN_SSID_MAX_LEN];
uint8_t cache_id[WLAN_CACHE_ID_LEN];
};
/**

Melihat File

@@ -336,6 +336,19 @@ QDF_STATUS wlan_crypto_set_pmksa(struct wlan_crypto_params *crypto_params,
qdf_mem_free(crypto_params->pmksa[i]);
crypto_params->pmksa[i] = pmksa;
return QDF_STATUS_SUCCESS;
} else if (pmksa->ssid_len &&
!qdf_mem_cmp(pmksa->ssid,
crypto_params->pmksa[i]->ssid,
pmksa->ssid_len) &&
!qdf_mem_cmp(pmksa->cache_id,
crypto_params->pmksa[i]->cache_id,
WLAN_CACHE_ID_LEN)){
/* free the current pmksa and use this slot */
qdf_mem_zero(crypto_params->pmksa[i],
sizeof(struct wlan_crypto_pmksa));
qdf_mem_free(crypto_params->pmksa[i]);
crypto_params->pmksa[i] = pmksa;
return QDF_STATUS_SUCCESS;
}
}
@@ -365,10 +378,22 @@ QDF_STATUS wlan_crypto_del_pmksa(struct wlan_crypto_params *crypto_params,
qdf_mem_free(crypto_params->pmksa[i]);
crypto_params->pmksa[i] = NULL;
return QDF_STATUS_SUCCESS;
} else if (pmksa->ssid_len &&
!qdf_mem_cmp(pmksa->ssid,
crypto_params->pmksa[i]->ssid,
pmksa->ssid_len) &&
!qdf_mem_cmp(pmksa->cache_id,
crypto_params->pmksa[i]->cache_id,
WLAN_CACHE_ID_LEN)){
qdf_mem_zero(crypto_params->pmksa[i],
sizeof(struct wlan_crypto_pmksa));
qdf_mem_free(crypto_params->pmksa[i]);
crypto_params->pmksa[i] = NULL;
return QDF_STATUS_SUCCESS;
}
}
return QDF_STATUS_E_INVAL;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_crypto_pmksa_flush(struct wlan_crypto_params *crypto_params)
@@ -428,6 +453,48 @@ QDF_STATUS wlan_crypto_set_del_pmksa(struct wlan_objmgr_vdev *vdev,
return status;
}
struct wlan_crypto_pmksa *
wlan_crypto_get_peer_pmksa(struct wlan_objmgr_vdev *vdev,
struct wlan_crypto_pmksa *pmksa)
{
struct wlan_crypto_comp_priv *crypto_priv;
struct wlan_crypto_params *crypto_params;
uint8_t i;
if (!pmksa) {
crypto_err("pmksa is NULL");
return NULL;
}
crypto_priv = (struct wlan_crypto_comp_priv *)
wlan_get_vdev_crypto_obj(vdev);
if (!crypto_priv) {
crypto_err("crypto_priv NULL");
return NULL;
}
crypto_params = &crypto_priv->crypto_params;
for (i = 0; i < WLAN_CRYPTO_MAX_PMKID; i++) {
if (!crypto_params->pmksa[i])
continue;
if (qdf_is_macaddr_equal(&pmksa->bssid,
&crypto_params->pmksa[i]->bssid)) {
return crypto_params->pmksa[i];
} else if (pmksa->ssid_len &&
!qdf_mem_cmp(pmksa->ssid,
crypto_params->pmksa[i]->ssid,
pmksa->ssid_len) &&
!qdf_mem_cmp(pmksa->cache_id,
crypto_params->pmksa[i]->cache_id,
WLAN_CACHE_ID_LEN)){
return crypto_params->pmksa[i];
}
}
return NULL;
}
struct wlan_crypto_pmksa *
wlan_crypto_get_pmksa(struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr *bssid)
{
@@ -460,6 +527,7 @@ wlan_crypto_get_pmksa(struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr *bssid)
return NULL;
}
/**
* wlan_crypto_is_htallowed - called to check is HT allowed for cipher
* @vdev: vdev
@@ -2632,19 +2700,9 @@ uint8_t *wlan_crypto_build_wpaie(struct wlan_objmgr_vdev *vdev,
return frm;
}
/**
* wlan_crypto_build_rsnie - called by mlme to build rsnie
* @vdev: vdev
* @iebuf: ie buffer
* @bssid: bssid mac address to add pmkid in rsnie
*
* This function gets called by mlme to build rsnie from given vdev
*
* Return: end of buffer
*/
uint8_t *wlan_crypto_build_rsnie(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf,
struct qdf_mac_addr *bssid)
uint8_t *wlan_crypto_build_rsnie_with_pmksa(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf,
struct wlan_crypto_pmksa *pmksa)
{
uint8_t *frm = iebuf;
uint8_t *selcnt;
@@ -2796,20 +2854,13 @@ add_rsn_caps:
/* optional capabilities */
if (crypto_params->rsn_caps & WLAN_CRYPTO_RSN_CAP_MFP_ENABLED) {
/* PMK list */
if (bssid) {
struct wlan_crypto_pmksa *pmksa;
pmksa = wlan_crypto_get_pmksa(vdev, bssid);
if (pmksa) {
WLAN_CRYPTO_ADDSHORT(frm, 1);
qdf_mem_copy(frm, pmksa->pmkid, PMKID_LEN);
frm += PMKID_LEN;
} else {
WLAN_CRYPTO_ADDSHORT(frm, 0);
}
} else
if (pmksa) {
WLAN_CRYPTO_ADDSHORT(frm, 1);
qdf_mem_copy(frm, pmksa->pmkid, PMKID_LEN);
frm += PMKID_LEN;
} else {
WLAN_CRYPTO_ADDSHORT(frm, 0);
}
if (HAS_MGMT_CIPHER(crypto_params,
WLAN_CRYPTO_CIPHER_AES_CMAC)) {
@@ -2836,17 +2887,12 @@ add_rsn_caps:
}
} else {
/* PMK list */
if (bssid) {
struct wlan_crypto_pmksa *pmksa;
pmksa = wlan_crypto_get_pmksa(vdev, bssid);
if (pmksa) {
WLAN_CRYPTO_ADDSHORT(frm, 1);
qdf_mem_copy(frm, pmksa->pmkid, PMKID_LEN);
frm += PMKID_LEN;
} else {
WLAN_CRYPTO_ADDSHORT(frm, 0);
}
if (pmksa) {
WLAN_CRYPTO_ADDSHORT(frm, 1);
qdf_mem_copy(frm, pmksa->pmkid, PMKID_LEN);
frm += PMKID_LEN;
} else {
WLAN_CRYPTO_ADDSHORT(frm, 0);
}
}
@@ -2856,6 +2902,18 @@ add_rsn_caps:
return frm;
}
uint8_t *wlan_crypto_build_rsnie(struct wlan_objmgr_vdev *vdev,
uint8_t *iebuf,
struct qdf_mac_addr *bssid)
{
struct wlan_crypto_pmksa *pmksa = NULL;
if (bssid)
pmksa = wlan_crypto_get_pmksa(vdev, bssid);
return wlan_crypto_build_rsnie_with_pmksa(vdev, iebuf, pmksa);
}
bool wlan_crypto_rsn_info(struct wlan_objmgr_vdev *vdev,
struct wlan_crypto_params *crypto_params){
struct wlan_crypto_params *my_crypto_params;