summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c76
-rw-r--r--CORE/SERVICES/COMMON/ieee80211_common.h3
-rw-r--r--CORE/SERVICES/WMA/wma.c79
-rw-r--r--CORE/SERVICES/WMA/wma.h14
-rw-r--r--CORE/VOSS/inc/i_vos_packet.h1
-rw-r--r--CORE/VOSS/inc/vos_utils.h5
-rw-r--r--CORE/VOSS/inc/wcnss_api.h38
-rw-r--r--CORE/VOSS/src/vos_utils.c140
8 files changed, 305 insertions, 51 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index f8f40ea86974..fb3e121ad8b4 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -43,6 +43,7 @@
#endif
#include "adf_nbuf.h"
#include "wma_api.h"
+#include "vos_utils.h"
#define ENTER() VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO, "Enter:%s", __func__)
@@ -389,13 +390,18 @@ next_nbuf:
#define TLSHIM_TGT_NOISE_FLOOR_DBM (-96)
static int tlshim_mgmt_rx_process(void *context, u_int8_t *data,
- u_int32_t data_len, bool saved_beacon)
+ u_int32_t data_len, bool saved_beacon, u_int32_t vdev_id)
{
void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL);
struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL,
vos_ctx);
WMI_MGMT_RX_EVENTID_param_tlvs *param_tlvs = NULL;
wmi_mgmt_rx_hdr *hdr = NULL;
+#ifdef WLAN_FEATURE_11W
+ struct wma_txrx_node *iface = NULL;
+ tp_wma_handle wma;
+ u_int8_t *efrm, *orig_hdr;
+#endif /* WLAN_FEATURE_11W */
vos_pkt_t *rx_pkt;
adf_nbuf_t wbuf;
@@ -515,20 +521,82 @@ static int tlshim_mgmt_rx_process(void *context, u_int8_t *data,
tl_shim->last_beacon_len = data_len;
}
}
+
+#ifdef WLAN_FEATURE_11W
+ wma = vos_get_context(VOS_MODULE_ID_WDA, vos_ctx);
+ if (wma)
+ iface = &wma->interfaces[vdev_id];
+ if (iface && iface->rmfEnabled && mgt_type == IEEE80211_FC0_TYPE_MGT &&
+ (mgt_subtype == IEEE80211_FC0_SUBTYPE_DISASSOC ||
+ mgt_subtype == IEEE80211_FC0_SUBTYPE_DEAUTH ||
+ mgt_subtype == IEEE80211_FC0_SUBTYPE_ACTION))
+ {
+ if ((wh)->i_fc[1] & IEEE80211_FC1_WEP)
+ {
+ orig_hdr = (u_int8_t*) adf_nbuf_data(wbuf);
+
+ /* Strip privacy headers (and trailer)
+ for a received frame */
+ vos_mem_move(orig_hdr + IEEE80211_CCMP_HEADERLEN,
+ wh, sizeof(*wh));
+ adf_nbuf_pull_head(wbuf, IEEE80211_CCMP_HEADERLEN);
+ adf_nbuf_trim_tail(wbuf, IEEE80211_CCMP_MICLEN);
+
+ rx_pkt->pkt_meta.mpdu_hdr_ptr = adf_nbuf_data(wbuf);
+ rx_pkt->pkt_meta.mpdu_data_ptr =
+ rx_pkt->pkt_meta.mpdu_hdr_ptr +
+ rx_pkt->pkt_meta.mpdu_hdr_len;
+ rx_pkt->pkt_buf = wbuf;
+ }
+ else
+ {
+ if (IEEE80211_IS_BROADCAST(wh->i_addr1) ||
+ IEEE80211_IS_MULTICAST(wh->i_addr1))
+ {
+ efrm = adf_nbuf_data(wbuf) + adf_nbuf_len(wbuf);
+ if (vos_is_mmie_valid(iface->key.key,
+ iface->key.ipn,
+ (u_int8_t *)wh, efrm))
+ {
+ TLSHIM_LOGD("Protected BC/MC frame MMIE"
+ " validation successful");
+
+ /* Remove MMIE */
+ adf_nbuf_trim_tail(wbuf,
+ vos_get_mmie_size());
+ }
+ else
+ {
+ TLSHIM_LOGE("BC/MC MIC error or MMIE"
+ " not present, dropping the frame");
+ vos_pkt_return_packet(rx_pkt);
+ return 0;
+ }
+ }
+ else
+ {
+ TLSHIM_LOGD("Rx unprotected unicast mgmt frame");
+ rx_pkt->pkt_meta.dpuFeedback =
+ DPU_FEEDBACK_UNPROTECTED_ERROR;
+ }
+
+ }
+ }
+#endif /* WLAN_FEATURE_11W */
return tl_shim->mgmt_rx(vos_ctx, rx_pkt);
}
static int tlshim_mgmt_rx_wmi_handler(void *context, u_int8_t *data,
u_int32_t data_len)
{
- return (tlshim_mgmt_rx_process(context, data, data_len, FALSE));
+ return (tlshim_mgmt_rx_process(context, data, data_len, FALSE, 0));
}
#endif
/*
* tlshim_mgmt_roam_event_ind() is called from WMA layer when
* BETTER_AP_FOUND event is received from roam engine.
*/
-int tlshim_mgmt_roam_event_ind(void *context)
+int tlshim_mgmt_roam_event_ind(void *context, u_int32_t vdev_id)
{
void *vos_ctx = vos_get_global_context(VOS_MODULE_ID_TL, NULL);
struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL,
@@ -536,7 +604,7 @@ int tlshim_mgmt_roam_event_ind(void *context)
VOS_STATUS ret = VOS_STATUS_SUCCESS;
if (tl_shim->last_beacon_data && tl_shim->last_beacon_len)
{
- ret = tlshim_mgmt_rx_process(context, tl_shim->last_beacon_data, tl_shim->last_beacon_len, TRUE);
+ ret = tlshim_mgmt_rx_process(context, tl_shim->last_beacon_data, tl_shim->last_beacon_len, TRUE, vdev_id);
}
return ret;
}
diff --git a/CORE/SERVICES/COMMON/ieee80211_common.h b/CORE/SERVICES/COMMON/ieee80211_common.h
index c8c6c244461e..8927feb11753 100644
--- a/CORE/SERVICES/COMMON/ieee80211_common.h
+++ b/CORE/SERVICES/COMMON/ieee80211_common.h
@@ -1862,6 +1862,9 @@ enum {
#define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */
#define IEEE80211_WEP_MICLEN 8 /* trailing MIC */
+#define IEEE80211_CCMP_HEADERLEN 8
+#define IEEE80211_CCMP_MICLEN 8
+
#define IEEE80211_CRC_LEN 4
#define IEEE80211_8021Q_HEADER_LEN 4
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index b753f7cd728b..8b59090c06fc 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -5046,6 +5046,10 @@ static int32_t wmi_unified_send_peer_assoc(tp_wma_handle wma,
cmd->peer_vht_caps = params->vht_caps;
#endif
+
+ if (params->rmfEnabled)
+ cmd->peer_flags |= WMI_PEER_PMF;
+
rx_stbc = (params->ht_caps & IEEE80211_HTCAP_C_RXSTBC) >>
IEEE80211_HTCAP_C_RXSTBC_S;
if (rx_stbc) {
@@ -6293,6 +6297,8 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
}
adf_os_mem_copy(iface->addBssStaContext, &add_bss->staContext,
sizeof(tAddStaParams));
+ // Save parameters later needed by WDA_ADD_STA_REQ
+ iface->rmfEnabled = add_bss->rmfEnabled;
iface->beaconInterval = add_bss->beaconInterval;
iface->dtimPeriod = add_bss->dtimPeriod;
iface->llbCoexist = add_bss->llbCoexist;
@@ -7015,7 +7021,9 @@ static wmi_buf_t wma_setup_install_key_cmd(tp_wma_handle wma_handle,
wmi_buf_t buf;
u_int8_t *buf_ptr;
u_int8_t *key_data;
-
+#ifdef WLAN_FEATURE_11W
+ struct wma_txrx_node *iface = NULL;
+#endif /* WLAN_FEATURE_11W */
if ((key_params->key_type == eSIR_ED_NONE &&
key_params->key_len) || (key_params->key_type != eSIR_ED_NONE &&
!key_params->key_len)) {
@@ -7085,6 +7093,11 @@ static wmi_buf_t wma_setup_install_key_cmd(tp_wma_handle wma_handle,
case eSIR_ED_CCMP:
cmd->key_cipher = WMI_CIPHER_AES_CCM;
break;
+#ifdef WLAN_FEATURE_11W
+ case eSIR_ED_AES_128_CMAC:
+ cmd->key_cipher = WMI_CIPHER_AES_CMAC;
+ break;
+#endif /* WLAN_FEATURE_11W */
default:
/* TODO: MFP ? */
WMA_LOGE("%s:Invalid encryption type:%d", __func__, key_params->key_type);
@@ -7124,6 +7137,19 @@ static wmi_buf_t wma_setup_install_key_cmd(tp_wma_handle wma_handle,
#endif
cmd->key_len = key_params->key_len;
+#ifdef WLAN_FEATURE_11W
+ if (key_params->key_type == eSIR_ED_AES_128_CMAC)
+ {
+ iface = &wma_handle->interfaces[key_params->vdev_id];
+ if (iface) {
+ iface->key.key_length = key_params->key_len;
+ vos_mem_copy (iface->key.key,
+ (const void *) key_params->key_data,
+ iface->key.key_length);
+ }
+ }
+#endif /* WLAN_FEATURE_11W */
+
WMA_LOGD("Key setup : vdev_id %d key_idx %d key_type %d key_len %d"
" unicast %d peer_mac %pM def_key_idx %d", key_params->vdev_id,
key_params->key_idx, key_params->key_type, key_params->key_len,
@@ -14007,6 +14033,14 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen,
tpSirMacFrameCtl pFc = (tpSirMacFrameCtl)(adf_nbuf_data(tx_frame));
u_int8_t use_6mbps = 0;
u_int8_t downld_comp_required = 0;
+#ifdef WLAN_FEATURE_11W
+ tANI_U8 *pFrame = NULL;
+ void *pPacket = NULL;
+ u_int16_t newFrmLen = 0;
+ struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
+ tpAniSirGlobal pMac = (tpAniSirGlobal)vos_get_context(VOS_MODULE_ID_PE,
+ wma_handle->vos_context);
+#endif /* WLAN_FEATURE_11W */
/* Get the vdev handle from vdev id */
txrx_vdev = wma_handle->interfaces[vdev_id].handle;
@@ -14021,6 +14055,12 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen,
return VOS_STATUS_E_FAILURE;
}
+#ifdef WLAN_FEATURE_11W
+ if(!pMac) {
+ WMA_LOGE("pMac Handle is NULL");
+ return VOS_STATUS_E_FAILURE;
+ }
+#endif /* WLAN_FEATURE_11W */
/*
* Currently only support to
* send 80211 Mgmt and 80211 Data are added.
@@ -14030,6 +14070,43 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen,
WMA_LOGE("No Support to send other frames except 802.11 Mgmt/Data");
return VOS_STATUS_E_FAILURE;
}
+#ifdef WLAN_FEATURE_11W
+ if ((iface && iface->rmfEnabled && pFc->wep) &&
+ (frmType == HAL_TXRX_FRM_802_11_MGMT) &&
+ (pFc->subType == SIR_MAC_MGMT_DISASSOC ||
+ pFc->subType == SIR_MAC_MGMT_DEAUTH ||
+ pFc->subType == SIR_MAC_MGMT_ACTION)) {
+ struct ieee80211_frame *wh =
+ (struct ieee80211_frame *)adf_nbuf_data(tx_frame);
+ /* Allocate extra bytes for privacy header and trailer */
+ newFrmLen = frmLen + IEEE80211_CCMP_HEADERLEN + IEEE80211_CCMP_MICLEN;
+ vos_status = palPktAlloc( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT,
+ ( tANI_U16 )newFrmLen, ( void** ) &pFrame,
+ ( void** ) &pPacket );
+
+ if (!VOS_IS_STATUS_SUCCESS(vos_status)) {
+ WMA_LOGP("Failed to allocate %d bytes for RMF"
+ " status code (%x)", newFrmLen, vos_status);
+ /* Free the original packet memory */
+ palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT,
+ ( void* ) pData, ( void* ) tx_frame );
+ goto error;
+ }
+
+ /* Initialize the frame with 0's and only fill
+ MAC header and data, Keep the CCMP header and
+ trailer as 0's, firmware shall fill this */
+ vos_mem_set( pFrame, newFrmLen , 0 );
+ vos_mem_copy( pFrame, wh, sizeof(*wh));
+ vos_mem_copy( pFrame + sizeof(*wh) + IEEE80211_CCMP_HEADERLEN,
+ pData + sizeof(*wh), frmLen - sizeof(*wh));
+
+ palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT,
+ ( void* ) pData, ( void* ) tx_frame );
+ tx_frame = pPacket;
+ frmLen = newFrmLen;
+ }
+#endif /* WLAN_FEATURE_11W */
if ((frmType == HAL_TXRX_FRM_802_11_MGMT) &&
(pFc->subType == SIR_MAC_MGMT_PROBE_RSP)) {
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 9379ccc2e0ec..f5beb7c21e82 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -354,7 +354,14 @@ struct wma_wow {
v_BOOL_t bmiss_enable;
v_BOOL_t gtk_err_enable;
};
-
+#ifdef WLAN_FEATURE_11W
+#define CMAC_IPN_LEN 6
+typedef struct {
+ u_int16_t key_length;
+ u_int8_t key[CSR_AES_KEY_LEN];
+ u_int8_t ipn[CMAC_IPN_LEN];
+} wma_igtk_key_t;
+#endif
struct wma_txrx_node {
u_int8_t addr[ETH_ALEN];
u_int8_t bssid[ETH_ALEN];
@@ -384,6 +391,11 @@ struct wma_txrx_node {
u_int64_t tsfadjust;
void *addBssStaContext;
tANI_U8 aid;
+ /* Robust Management Frame (RMF) enabled/disabled */
+ tANI_U8 rmfEnabled;
+#ifdef WLAN_FEATURE_11W
+ wma_igtk_key_t key;
+#endif /* WLAN_FEATURE_11W */
u_int32_t uapsd_cached_val;
};
diff --git a/CORE/VOSS/inc/i_vos_packet.h b/CORE/VOSS/inc/i_vos_packet.h
index 9e390736c0c8..0bdb3d572de9 100644
--- a/CORE/VOSS/inc/i_vos_packet.h
+++ b/CORE/VOSS/inc/i_vos_packet.h
@@ -62,6 +62,7 @@ typedef struct
u_int8_t offloadScanLearn:1;
u_int8_t roamCandidateInd:1;
u_int8_t scan:1;
+ u_int8_t dpuFeedback;
}t_packetmeta, *tp_packetmeta;
/* implementation specific vos packet type */
diff --git a/CORE/VOSS/inc/vos_utils.h b/CORE/VOSS/inc/vos_utils.h
index c3f0aba1cc33..1ddf2dcb8000 100644
--- a/CORE/VOSS/inc/vos_utils.h
+++ b/CORE/VOSS/inc/vos_utils.h
@@ -168,4 +168,9 @@ VOS_STATUS vos_decrypt_AES(v_U32_t cryptHandle, /* Handle */
v_U32_t vos_chan_to_freq(v_U8_t chan);
v_U8_t vos_freq_to_chan(v_U32_t freq);
+#ifdef WLAN_FEATURE_11W
+v_BOOL_t vos_is_mmie_valid(v_U8_t *key, v_U8_t *ipn,
+ v_U8_t* frm, v_U8_t* efrm);
+v_U8_t vos_get_mmie_size(void);
+#endif /* WLAN_FEATURE_11W */
#endif // #if !defined __VOSS_UTILS_H
diff --git a/CORE/VOSS/inc/wcnss_api.h b/CORE/VOSS/inc/wcnss_api.h
index b5bc45e02506..197841ea2f5b 100644
--- a/CORE/VOSS/inc/wcnss_api.h
+++ b/CORE/VOSS/inc/wcnss_api.h
@@ -86,44 +86,6 @@ static inline unsigned int wcnss_get_serial_number(void)
{
return 0;
}
-
-static inline void *wcnss_wlan_crypto_alloc_ahash(const char *alg_name,
- unsigned int type,
- unsigned int mask)
-{
- return NULL;
-}
-
-static inline int wcnss_wlan_crypto_ahash_digest(void *req)
-{
- return 0;
-}
-
-static inline void wcnss_wlan_crypto_free_ahash(void *tfm)
-{
-}
-
-static inline int wcnss_wlan_crypto_ahash_setkey(void *tfm,
- const u8 *key,
- unsigned int keylen)
-{
- return 0;
-}
-
-static inline void *wcnss_wlan_crypto_alloc_ablkcipher(const char *alg_name,
- u32 type, u32 mask)
-{
- return NULL;
-}
-
-static inline void wcnss_wlan_ablkcipher_request_free(void *req)
-{
-}
-
-static inline void wcnss_wlan_crypto_free_ablkcipher(void *tfm)
-{
-}
-
static inline int req_riva_power_on_lock(char *driver_name)
{
return 0;
diff --git a/CORE/VOSS/src/vos_utils.c b/CORE/VOSS/src/vos_utils.c
index 20b04d26cda0..4764d2693cfb 100644
--- a/CORE/VOSS/src/vos_utils.c
+++ b/CORE/VOSS/src/vos_utils.c
@@ -66,12 +66,20 @@
#include <linux/crypto.h>
#include <linux/scatterlist.h>
#include <linux/completion.h>
+#include <linux/ieee80211.h>
#include <crypto/hash.h>
+#include <crypto/aes.h>
#include <wcnss_api.h>
+#include <linux/qcomwlan_secif.h>
+#include "ieee80211_common.h"
/*----------------------------------------------------------------------------
* Preprocessor Definitions and Constants
* -------------------------------------------------------------------------*/
+#define AAD_LEN 20
+#define IV_SIZE_AES_128 16
+#define CMAC_IPN_LEN 6
+
/*----------------------------------------------------------------------------
* Type Declarations
@@ -178,6 +186,129 @@ VOS_STATUS vos_rand_get_bytes( v_U32_t cryptHandle, v_U8_t *pbBuf, v_U32_t numBy
}
+#ifdef WLAN_FEATURE_11W
+v_U8_t vos_get_mmie_size()
+{
+ return sizeof(struct ieee80211_mmie);
+}
+
+v_BOOL_t vos_is_mmie_valid(v_U8_t *igtk, v_U8_t *ipn,
+ v_U8_t* frm, v_U8_t* efrm)
+{
+ struct ieee80211_mmie *mmie;
+ struct ieee80211_frame *wh;
+ v_U8_t *rx_ipn, aad[AAD_LEN], mic[CMAC_TLEN], *input;
+ v_U16_t nBytes = 0;
+ int ret = 0;
+ struct crypto_cipher *tfm;
+
+ /* Check if frame is invalid length */
+ if ((efrm < frm) || ((efrm - frm) < sizeof(*wh))) {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "Invalid frame length");
+ return VOS_FALSE;
+ }
+
+ mmie = (struct ieee80211_mmie *)(efrm - sizeof(*mmie));
+
+ /* Check Element ID */
+ if ((mmie->element_id != IEEE80211_ELEMID_MMIE) ||
+ (mmie->length != (sizeof(*mmie)-2))) {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "IE is not Mgmt MIC IE or Invalid length");
+ /* IE is not Mgmt MIC IE or invalid length */
+ return VOS_FALSE;
+ }
+
+ /* Validate IPN */
+ rx_ipn = mmie->sequence_number;
+ if (OS_MEMCMP(rx_ipn, ipn, CMAC_IPN_LEN) <= 0)
+ {
+ /* Replay error */
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ " mmie ipn %02X %02X %02X %02X %02X %02X"
+ " drvr ipn %02X %02X %02X %02X %02X %02X",
+ rx_ipn[0], rx_ipn[1], rx_ipn[2], rx_ipn[3], rx_ipn[4], rx_ipn[5],
+ ipn[0], ipn[1], ipn[2], ipn[3], ipn[4], ipn[5]);
+ return VOS_FALSE;
+ }
+
+ tfm = wcnss_wlan_crypto_alloc_cipher( "aes", 0, CRYPTO_ALG_ASYNC);
+ if (IS_ERR(tfm)) {
+ ret = PTR_ERR(tfm);
+ VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,
+ "crypto_alloc_cipher failed (%d)", ret);
+ goto err_tfm;
+ }
+
+ ret = crypto_cipher_setkey(tfm, igtk, AES_KEYSIZE_128);
+ if (ret) {
+ VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,
+ "crypto_cipher_setkey failed (%d)", ret);
+ goto err_tfm;
+ }
+
+ /* Construct AAD */
+ wh = (struct ieee80211_frame *)frm;
+
+ /* Generate BIP AAD: FC(masked) || A1 || A2 || A3 */
+
+ /* FC type/subtype */
+ aad[0] = wh->i_fc[0];
+ /* Mask FC Retry, PwrMgt, MoreData flags to zero */
+ aad[1] = wh->i_fc[1] & ~(IEEE80211_FC1_RETRY | IEEE80211_FC1_PWR_MGT |
+ IEEE80211_FC1_MORE_DATA);
+ /* A1 || A2 || A3 */
+ vos_mem_copy(aad + 2, wh->i_addr_all, 3 * IEEE80211_ADDR_LEN);
+
+ /* MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64) */
+ nBytes = AAD_LEN + (efrm - (v_U8_t*)(wh+1));
+ input = (v_U8_t *)vos_mem_malloc(nBytes);
+ if (NULL == input)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "Memory allocation failed");
+ ret = VOS_STATUS_E_NOMEM;
+ goto err_tfm;
+ }
+
+ /* Copy the AAD, MMIE with 8 bit MIC zeroed out */
+ vos_mem_zero(input, nBytes);
+ vos_mem_copy(input, aad, AAD_LEN);
+ vos_mem_copy(input+AAD_LEN, (v_U8_t*)(wh+1), nBytes - AAD_LEN - CMAC_TLEN);
+
+ wcnss_wlan_cmac_calc_mic(tfm, input, nBytes, mic);
+ vos_mem_free(input);
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "CMAC(T)= %02X %02X %02X %02X %02X %02X %02X %02X",
+ mic[0], mic[1], mic[2], mic[3],
+ mic[4], mic[5], mic[6], mic[7]);
+
+ if (OS_MEMCMP(mic, mmie->mic, CMAC_TLEN) != 0) {
+ /* MMIE MIC mismatch */
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "BC/MC MGMT frame MMIE MIC check Failed"
+ " rmic %02X %02X %02X %02X %02X %02X %02X %02X"
+ " cmic %02X %02X %02X %02X %02X %02X %02X %02X",
+ mmie->mic[0], mmie->mic[1], mmie->mic[2], mmie->mic[3],
+ mmie->mic[4], mmie->mic[5], mmie->mic[6], mmie->mic[7],
+ mic[0], mic[1], mic[2], mic[3],
+ mic[4], mic[5], mic[6], mic[7]);
+ return VOS_FALSE;
+ }
+
+ /* Update IPN */
+ vos_mem_copy(ipn, rx_ipn, CMAC_IPN_LEN);
+
+err_tfm:
+ if (tfm)
+ wcnss_wlan_crypto_free_cipher(tfm);
+
+ return !ret?VOS_TRUE:VOS_FALSE;
+}
+
+#endif /* WLAN_FEATURE_11W */
/**
* vos_sha1_hmac_str
*
@@ -532,16 +663,11 @@ static void ecb_aes_complete(struct crypto_async_request *req, int err)
( *** return value not considered yet )
--------------------------------------------------------------------------*/
-#define IV_SIZE_AES_128 16
-#define KEY_SIZE_AES_128 16
-#define AES_BLOCK_SIZE 16
-
VOS_STATUS vos_encrypt_AES(v_U32_t cryptHandle, /* Handle */
v_U8_t *pPlainText, /* pointer to data stream */
v_U8_t *pCiphertext,
v_U8_t *pKey) /* pointer to authentication key */
{
-// VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
struct ecb_aes_result result;
struct ablkcipher_request *req;
struct crypto_ablkcipher *tfm;
@@ -572,7 +698,7 @@ VOS_STATUS vos_encrypt_AES(v_U32_t cryptHandle, /* Handle */
crypto_ablkcipher_clear_flags(tfm, ~0);
- ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128);
+ ret = crypto_ablkcipher_setkey(tfm, pKey, AES_KEYSIZE_128);
if (ret) {
VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed");
goto err_setkey;
@@ -668,7 +794,7 @@ VOS_STATUS vos_decrypt_AES(v_U32_t cryptHandle, /* Handle */
crypto_ablkcipher_clear_flags(tfm, ~0);
- ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128);
+ ret = crypto_ablkcipher_setkey(tfm, pKey, AES_KEYSIZE_128);
if (ret) {
VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed");
goto err_setkey;