diff options
author | Padma, Santhosh Kumar <skpadma@codeaurora.org> | 2018-02-14 16:07:21 +0530 |
---|---|---|
committer | Sunil Ravi <sunilravi@google.com> | 2018-12-21 23:51:37 +0000 |
commit | d31c055f0dc15b261c4e82c4276089258c7a01c1 (patch) | |
tree | a6ba65c344efcc5db01fc5172f995b2be5acad8b /core/wma/src/wma_mgmt.c | |
parent | f1d91c12845504f59dd84df895fd4155efc5334d (diff) | |
download | qcacld-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.c | 64 |
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; } |