qcacld-3.0: Use igtk key type from crypto to process BIP frames
Use igtk key from crypto to process BIP frames. Change-Id: I29b41205a5b91f9e17a98c2bcebe0455178318a1 CRs-Fixed: 2662365
This commit is contained in:
@@ -647,7 +647,6 @@ typedef struct {
|
|||||||
/**
|
/**
|
||||||
* struct wma_igtk_key_t - GTK key
|
* struct wma_igtk_key_t - GTK key
|
||||||
* @key_id: key id
|
* @key_id: key id
|
||||||
* @key_cipher: key type
|
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* IPN is maintained per iGTK keyID
|
/* IPN is maintained per iGTK keyID
|
||||||
@@ -655,7 +654,6 @@ typedef struct {
|
|||||||
* 1st index for iGTK KeyID = 5
|
* 1st index for iGTK KeyID = 5
|
||||||
*/
|
*/
|
||||||
wma_igtk_ipn_t key_id[2];
|
wma_igtk_ipn_t key_id[2];
|
||||||
uint32_t key_cipher;
|
|
||||||
} wma_igtk_key_t;
|
} wma_igtk_key_t;
|
||||||
|
|
||||||
struct roam_synch_frame_ind {
|
struct roam_synch_frame_ind {
|
||||||
|
@@ -5404,12 +5404,6 @@ void wma_update_set_key(uint8_t session_id, bool pairwise,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cipher_type == WLAN_CRYPTO_CIPHER_AES_GMAC ||
|
|
||||||
cipher_type == WLAN_CRYPTO_CIPHER_AES_GMAC_256 ||
|
|
||||||
cipher_type == WLAN_CRYPTO_CIPHER_AES_CMAC)
|
|
||||||
iface->key.key_cipher =
|
|
||||||
wlan_crypto_cipher_to_wmi_cipher(cipher_type);
|
|
||||||
|
|
||||||
if (iface) {
|
if (iface) {
|
||||||
wma_reset_ipn(iface, key_index);
|
wma_reset_ipn(iface, key_index);
|
||||||
iface->is_waiting_for_key = false;
|
iface->is_waiting_for_key = false;
|
||||||
|
@@ -3105,16 +3105,29 @@ int wma_process_bip(tp_wma_handle wma_handle,
|
|||||||
uint8_t *efrm;
|
uint8_t *efrm;
|
||||||
uint8_t *igtk;
|
uint8_t *igtk;
|
||||||
uint16_t key_len;
|
uint16_t key_len;
|
||||||
|
int32_t mgmtcipherset;
|
||||||
|
enum wlan_crypto_cipher_type key_cipher;
|
||||||
|
|
||||||
efrm = qdf_nbuf_data(wbuf) + qdf_nbuf_len(wbuf);
|
efrm = qdf_nbuf_data(wbuf) + qdf_nbuf_len(wbuf);
|
||||||
|
|
||||||
if (iface->key.key_cipher == WMI_CIPHER_AES_CMAC) {
|
mgmtcipherset = wlan_crypto_get_param(iface->vdev,
|
||||||
|
WLAN_CRYPTO_PARAM_MGMT_CIPHER);
|
||||||
|
if (!mgmtcipherset || mgmtcipherset < 0) {
|
||||||
|
wma_err("Invalid key cipher %d", mgmtcipherset);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mgmtcipherset & (1 << WLAN_CRYPTO_CIPHER_AES_CMAC)) {
|
||||||
|
key_cipher = WLAN_CRYPTO_CIPHER_AES_CMAC;
|
||||||
mmie_size = cds_get_mmie_size();
|
mmie_size = cds_get_mmie_size();
|
||||||
} else if (iface->key.key_cipher == WMI_CIPHER_AES_GMAC ||
|
} else if (mgmtcipherset & (1 << WLAN_CRYPTO_CIPHER_AES_GMAC)) {
|
||||||
iface->key.key_cipher == WMI_CIPHER_BIP_GMAC_256) {
|
key_cipher = WLAN_CRYPTO_CIPHER_AES_GMAC;
|
||||||
|
mmie_size = cds_get_gmac_mmie_size();
|
||||||
|
} else if (mgmtcipherset & (1 << WLAN_CRYPTO_CIPHER_AES_GMAC_256)) {
|
||||||
|
key_cipher = WLAN_CRYPTO_CIPHER_AES_GMAC_256;
|
||||||
mmie_size = cds_get_gmac_mmie_size();
|
mmie_size = cds_get_gmac_mmie_size();
|
||||||
} else {
|
} else {
|
||||||
WMA_LOGE(FL("Invalid key cipher %d"), iface->key.key_cipher);
|
wma_err("Invalid key cipher %d", mgmtcipherset);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3131,65 +3144,42 @@ int wma_process_bip(tp_wma_handle wma_handle,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
wma_debug("key_cipher %d key_id %d", iface->key.key_cipher, key_id);
|
wma_debug("key_cipher %d key_id %d", key_cipher, key_id);
|
||||||
|
|
||||||
igtk = wma_get_igtk(iface, &key_len, key_id);
|
igtk = wma_get_igtk(iface, &key_len, key_id);
|
||||||
switch (iface->key.key_cipher) {
|
switch (key_cipher) {
|
||||||
case WMI_CIPHER_AES_CMAC:
|
case WLAN_CRYPTO_CIPHER_AES_CMAC:
|
||||||
if (wmi_service_enabled(wma_handle->wmi_handle,
|
if (!wmi_service_enabled(wma_handle->wmi_handle,
|
||||||
wmi_service_sta_pmf_offload)) {
|
wmi_service_sta_pmf_offload)) {
|
||||||
/*
|
if (!cds_is_mmie_valid(igtk, iface->key.key_id[
|
||||||
* if 11w offload is enabled then mmie validation is
|
key_id -
|
||||||
* performed in firmware, host just need to trim the
|
WMA_IGTK_KEY_INDEX_4].ipn,
|
||||||
* mmie.
|
(uint8_t *)wh, efrm)) {
|
||||||
*/
|
|
||||||
qdf_nbuf_trim_tail(wbuf, cds_get_mmie_size());
|
|
||||||
} else {
|
|
||||||
if (cds_is_mmie_valid(igtk, iface->key.key_id[
|
|
||||||
key_id -
|
|
||||||
WMA_IGTK_KEY_INDEX_4].ipn,
|
|
||||||
(uint8_t *)wh, efrm)) {
|
|
||||||
wma_debug("Protected BC/MC frame MMIE validation successful");
|
|
||||||
/* Remove MMIE */
|
|
||||||
qdf_nbuf_trim_tail(wbuf, cds_get_mmie_size());
|
|
||||||
} else {
|
|
||||||
wma_debug("BC/MC MIC error or MMIE not present, dropping the frame");
|
wma_debug("BC/MC MIC error or MMIE not present, dropping the frame");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case WLAN_CRYPTO_CIPHER_AES_GMAC:
|
||||||
case WMI_CIPHER_AES_GMAC:
|
case WLAN_CRYPTO_CIPHER_AES_GMAC_256:
|
||||||
case WMI_CIPHER_BIP_GMAC_256:
|
if (!wmi_service_enabled(wma_handle->wmi_handle,
|
||||||
if (wmi_service_enabled(wma_handle->wmi_handle,
|
wmi_service_gmac_offload_support)) {
|
||||||
wmi_service_gmac_offload_support)) {
|
if (!cds_is_gmac_mmie_valid(igtk,
|
||||||
/*
|
iface->key.key_id[key_id -
|
||||||
* if gmac offload is enabled then mmie validation is
|
WMA_IGTK_KEY_INDEX_4].ipn,
|
||||||
* performed in firmware, host just need to trim the
|
(uint8_t *)wh, efrm,
|
||||||
* mmie.
|
key_len)) {
|
||||||
*/
|
|
||||||
wma_debug("Trim GMAC MMIE");
|
|
||||||
qdf_nbuf_trim_tail(wbuf, cds_get_gmac_mmie_size());
|
|
||||||
} else {
|
|
||||||
if (cds_is_gmac_mmie_valid(igtk,
|
|
||||||
iface->key.key_id[key_id - WMA_IGTK_KEY_INDEX_4].ipn,
|
|
||||||
(uint8_t *) wh, efrm, key_len)) {
|
|
||||||
wma_debug("Protected BC/MC frame GMAC MMIE validation successful");
|
|
||||||
/* Remove MMIE */
|
|
||||||
qdf_nbuf_trim_tail(wbuf,
|
|
||||||
cds_get_gmac_mmie_size());
|
|
||||||
} else {
|
|
||||||
wma_debug("BC/MC GMAC MIC error or MMIE not present, dropping the frame");
|
wma_debug("BC/MC GMAC MIC error or MMIE not present, dropping the frame");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
WMA_LOGE(FL("Unsupported key cipher %d"),
|
wma_err("Invalid key_type %d", key_cipher);
|
||||||
iface->key.key_cipher);
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qdf_nbuf_trim_tail(wbuf, mmie_size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user