summaryrefslogtreecommitdiff
path: root/core/wma/src/wma_mgmt.c
diff options
context:
space:
mode:
authorPadma, Santhosh Kumar <skpadma@codeaurora.org>2018-02-14 16:07:21 +0530
committerSunil Ravi <sunilravi@google.com>2018-12-21 23:51:37 +0000
commitd31c055f0dc15b261c4e82c4276089258c7a01c1 (patch)
treea6ba65c344efcc5db01fc5172f995b2be5acad8b /core/wma/src/wma_mgmt.c
parentf1d91c12845504f59dd84df895fd4155efc5334d (diff)
downloadqcacld-d31c055f0dc15b261c4e82c4276089258c7a01c1.tar.gz
qcacld-3.0: Add support for GMAC MIC validation
Add changes to validate MIC for the received protected MC/BC frames with GMAC group management cipher suite. Change-Id: Ie5f60674a452d2d930acc9ff9eb55de37645097a CRs-Fixed: 2164828
Diffstat (limited to 'core/wma/src/wma_mgmt.c')
-rw-r--r--core/wma/src/wma_mgmt.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c
index 6fa8ea84e1..c0afe11258 100644
--- a/core/wma/src/wma_mgmt.c
+++ b/core/wma/src/wma_mgmt.c
@@ -72,6 +72,7 @@
#include <cdp_txrx_cfg.h>
#include <cdp_txrx_cmn.h>
#include <cdp_txrx_misc.h>
+#include <qdf_crypto.h>
/**
* wma_send_bcn_buf_ll() - prepare and send beacon buffer to fw for LL
@@ -1715,6 +1716,7 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
iface = &wma_handle->interfaces[key_params->vdev_id];
if (iface) {
iface->key.key_length = key_params->key_len;
+ iface->key.key_cipher = params.key_cipher;
qdf_mem_copy(iface->key.key,
(const void *)key_params->key_data,
iface->key.key_length);
@@ -3249,32 +3251,64 @@ int wma_process_bip(tp_wma_handle wma_handle,
uint8_t *efrm;
efrm = qdf_nbuf_data(wbuf) + qdf_nbuf_len(wbuf);
- key_id = (uint16_t)*(efrm - cds_get_mmie_size() + 2);
+
+ if (iface->key.key_cipher == WMI_CIPHER_AES_CMAC) {
+ key_id = (uint16_t)*(efrm - cds_get_mmie_size() + 2);
+ } else if (iface->key.key_cipher == WMI_CIPHER_AES_GMAC) {
+ key_id = (uint16_t)*(efrm - cds_get_gmac_mmie_size() + 2);
+ } else {
+ WMA_LOGE(FL("Invalid key cipher %d"), iface->key.key_cipher);
+ return -EINVAL;
+ }
if (!((key_id == WMA_IGTK_KEY_INDEX_4)
|| (key_id == WMA_IGTK_KEY_INDEX_5))) {
WMA_LOGE(FL("Invalid KeyID(%d) dropping the frame"), key_id);
return -EINVAL;
}
- if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
- WMI_SERVICE_STA_PMF_OFFLOAD)) {
- /*
- * if 11w offload is enabled then mmie validation is performed
- * in firmware, host just need to trim the mmie.
- */
- qdf_nbuf_trim_tail(wbuf, cds_get_mmie_size());
- } else {
- if (cds_is_mmie_valid(iface->key.key,
- iface->key.key_id[key_id - WMA_IGTK_KEY_INDEX_4].ipn,
- (uint8_t *) wh, efrm)) {
- WMA_LOGE(FL("Protected BC/MC frame MMIE validation successful"));
- /* Remove MMIE */
+
+ switch (iface->key.key_cipher) {
+ case WMI_CIPHER_AES_CMAC:
+ if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
+ WMI_SERVICE_STA_PMF_OFFLOAD)) {
+ /*
+ * if 11w offload is enabled then mmie validation is
+ * performed in firmware, host just need to trim the
+ * mmie.
+ */
qdf_nbuf_trim_tail(wbuf, cds_get_mmie_size());
} else {
- WMA_LOGE(FL("BC/MC MIC error or MMIE not present, dropping the frame"));
+ if (cds_is_mmie_valid(iface->key.key,
+ iface->key.key_id[key_id - WMA_IGTK_KEY_INDEX_4].ipn,
+ (uint8_t *) wh, efrm)) {
+ WMA_LOGD(FL("Protected BC/MC frame MMIE validation successful"));
+ /* Remove MMIE */
+ qdf_nbuf_trim_tail(wbuf, cds_get_mmie_size());
+ } else {
+ WMA_LOGD(FL("BC/MC MIC error or MMIE not present, dropping the frame"));
+ return -EINVAL;
+ }
+ }
+ break;
+
+ case WMI_CIPHER_AES_GMAC:
+ if (cds_is_gmac_mmie_valid(iface->key.key,
+ iface->key.key_id[key_id - WMA_IGTK_KEY_INDEX_4].ipn,
+ (uint8_t *) wh, efrm, iface->key.key_length)) {
+ WMA_LOGD(FL("Protected BC/MC frame GMAC MMIE validation successful"));
+ /* Remove MMIE */
+ qdf_nbuf_trim_tail(wbuf, cds_get_gmac_mmie_size());
+ } else {
+ WMA_LOGD(FL("BC/MC GMAC MIC error or MMIE not present, dropping the frame"));
return -EINVAL;
}
+ break;
+
+ default:
+ WMA_LOGE(FL("Unsupported key cipher %d"),
+ iface->key.key_cipher);
}
+
return 0;
}