diff options
| author | Vasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com> | 2013-12-26 16:42:29 -0800 |
|---|---|---|
| committer | Prakash Dhavali <pdhavali@qca.qualcomm.com> | 2014-01-24 19:21:47 -0800 |
| commit | 70fc54041d64e09f7f7dc2ca6e878ae71bda517e (patch) | |
| tree | d3cf35d3ac88889399560a9d57d2e36a9d1fb3b3 | |
| parent | f56fe0ea310e03deb9ceed8db15497e73b60c31b (diff) | |
qcacld/txrx: Process TKIP MIC failure Rx indication
Pass the necessary information for MIC failure indication
from the erroneous msdu to UMAC in SIR_HAL_MIC_FAILURE_IND.
This patch extends ol_rx_err by adding keyid and TKIP sequence
number. Also defines an API to access key index from Rx descriptor.
.
Change-Id: Ic1895a92537d073b20e9d5c471d3c00b0eae3223
CRs-Fixed: 584815
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_rx.c | 29 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h | 7 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx.c | 25 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx_defrag.c | 2 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx_pn.c | 2 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_rx_reorder.c | 2 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/ol_htt_rx_api.h | 19 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/wdi_out.h | 6 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/ar6320def.h | 4 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/ar9888def.h | 4 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/regtable.h | 4 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 40 |
12 files changed, 125 insertions, 19 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_rx.c b/CORE/CLD_TXRX/HTT/htt_rx.c index 11783cfcfad0..2d66b252d8cf 100644 --- a/CORE/CLD_TXRX/HTT/htt_rx.c +++ b/CORE/CLD_TXRX/HTT/htt_rx.c @@ -1414,6 +1414,10 @@ a_bool_t (*htt_rx_mpdu_is_encrypted)( htt_pdev_handle pdev, void *mpdu_desc); +a_bool_t (*htt_rx_msdu_desc_key_id)( + htt_pdev_handle pdev, + void *mpdu_desc, u_int8_t *key_id); + void * htt_rx_mpdu_desc_list_next_ll(htt_pdev_handle pdev, adf_nbuf_t rx_ind_msg) { @@ -1485,6 +1489,29 @@ a_bool_t htt_rx_mpdu_is_encrypted_hl(htt_pdev_handle pdev, void *mpdu_desc) } } +a_bool_t +htt_rx_msdu_desc_key_id_ll(htt_pdev_handle pdev, void *mpdu_desc, + u_int8_t *key_id) +{ + struct htt_host_rx_desc_base *rx_desc = (struct htt_host_rx_desc_base *) + mpdu_desc; + + if (!htt_rx_msdu_first_msdu_flag_ll(pdev, mpdu_desc)) + return A_FALSE; + + *key_id = ((*(((u_int32_t *) &rx_desc->msdu_end) + 1)) & + (RX_MSDU_END_1_KEY_ID_OCT_MASK >> RX_MSDU_END_1_KEY_ID_OCT_LSB)); + + return A_TRUE; +} + +a_bool_t +htt_rx_msdu_desc_key_id_hl(htt_pdev_handle htt_pdev, void *mpdu_desc, u_int8_t *key_id) +{ + /* TODO: Implement it for HL */ + return A_FALSE; +} + void htt_rx_desc_frame_free( htt_pdev_handle htt_pdev, @@ -1671,6 +1698,7 @@ htt_rx_attach(struct htt_pdev_t *pdev) htt_rx_msdu_is_frag = htt_rx_msdu_is_frag_ll; htt_rx_msdu_desc_retrieve = htt_rx_msdu_desc_retrieve_ll; htt_rx_mpdu_is_encrypted = htt_rx_mpdu_is_encrypted_ll; + htt_rx_msdu_desc_key_id = htt_rx_msdu_desc_key_id_ll; } else { pdev->rx_ring.size = HTT_RX_RING_SIZE_MIN; HTT_ASSERT2(IS_PWR2(pdev->rx_ring.size)); @@ -1690,6 +1718,7 @@ htt_rx_attach(struct htt_pdev_t *pdev) htt_rx_msdu_is_frag = htt_rx_msdu_is_frag_hl; htt_rx_msdu_desc_retrieve = htt_rx_msdu_desc_retrieve_hl; htt_rx_mpdu_is_encrypted = htt_rx_mpdu_is_encrypted_hl; + htt_rx_msdu_desc_key_id = htt_rx_msdu_desc_key_id_hl; /* * HL case, the rx descriptor can be different sizes for diff --git a/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h b/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h index 5fa0ded29853..7b9674402b9a 100644 --- a/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h +++ b/CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h @@ -114,6 +114,8 @@ void ol_rx_err_statistics(ol_pdev_handle pdev, * one of the fragments that when reassembled, constitute the rx frame * @param err_type - what kind of error occurred * @param rx_frame - the rx frame that had an error + * @pn - Packet sequence number + * @key_id - Key index octet received in IV of the frame */ void ol_rx_err( @@ -123,7 +125,9 @@ ol_rx_err( int tid, u_int32_t tsf32, enum ol_rx_err_type err_type, - adf_nbuf_t rx_frame); + adf_nbuf_t rx_frame, + u_int64_t *pn, + u_int8_t key_id); enum ol_rx_notify_type { @@ -187,7 +191,6 @@ ol_rx_notify( void ol_tx_paused_peer_data(ol_peer_handle peer, int has_tx_data); - #ifdef QCA_WIFI_ISOC /** diff --git a/CORE/CLD_TXRX/TXRX/ol_rx.c b/CORE/CLD_TXRX/TXRX/ol_rx.c index b3b3f2add740..1e40017e0340 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx.c @@ -112,16 +112,6 @@ static void ol_rx_process_inv_peer( #endif } -void ol_rx_err(ol_pdev_handle pdev, - u_int8_t vdev_id, u_int8_t *peer_mac_addr, int tid, - u_int32_t tsf32, enum ol_rx_err_type err_type, - adf_nbuf_t rx_frame) -{ - /* - * TODO: Report mic error to cfg80211 - */ -} - #ifdef QCA_SUPPORT_PEER_DATA_RX_RSSI static inline int16_t ol_rx_rssi_avg(struct ol_txrx_pdev_t *pdev, int16_t rssi_old, int16_t rssi_new) @@ -369,9 +359,18 @@ ol_rx_indication_handler( if (status == htt_rx_status_tkip_mic_err && vdev != NULL && peer != NULL) { - ol_rx_err( - pdev->ctrl_pdev, vdev->vdev_id, peer->mac_addr.raw, - tid, 0, OL_RX_ERR_TKIP_MIC, msdu); + union htt_rx_pn_t pn; + u_int8_t key_id; + htt_rx_mpdu_desc_pn(pdev->htt_pdev, + htt_rx_msdu_desc_retrieve(pdev->htt_pdev, + msdu), &pn, 48); + if (htt_rx_msdu_desc_key_id(pdev->htt_pdev, + htt_rx_msdu_desc_retrieve(pdev->htt_pdev, + msdu), &key_id) == A_TRUE) { + ol_rx_err(pdev->ctrl_pdev, vdev->vdev_id, + peer->mac_addr.raw, tid, 0, + OL_RX_ERR_TKIP_MIC, msdu, &pn.pn48, key_id); + } } #ifdef WDI_EVENT_ENABLE diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c index 2fc976e8d030..a7537056e66c 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_defrag.c @@ -502,7 +502,7 @@ ol_rx_defrag( ol_rx_err( pdev->ctrl_pdev, vdev->vdev_id, peer->mac_addr.raw, tid, 0, OL_RX_DEFRAG_ERR, - msdu); + msdu, NULL, 0); TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "\n ol_rx_defrag: TKIP demic failed\n"); return; diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_pn.c b/CORE/CLD_TXRX/TXRX/ol_rx_pn.c index 1e46ff6d4270..a7961acbb48c 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_pn.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_pn.c @@ -185,7 +185,7 @@ ol_rx_pn_check_base( pdev->ctrl_pdev, vdev->vdev_id, peer->mac_addr.raw, tid, htt_rx_mpdu_desc_tsf32(pdev->htt_pdev, rx_desc), - OL_RX_ERR_PN, mpdu); + OL_RX_ERR_PN, mpdu, NULL, 0); /* free all MSDUs within this MPDU */ do { adf_nbuf_t next_msdu; diff --git a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c index 7db868671f78..1d1156b8a4d0 100644 --- a/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c +++ b/CORE/CLD_TXRX/TXRX/ol_rx_reorder.c @@ -652,7 +652,7 @@ ol_rx_pn_ind_handler( pdev->ctrl_pdev, vdev->vdev_id, peer->mac_addr.raw, tid, htt_rx_mpdu_desc_tsf32(htt_pdev, rx_desc), - OL_RX_ERR_PN, mpdu_head); + OL_RX_ERR_PN, mpdu_head, NULL, 0); /* free all MSDUs within this MPDU */ do { next_msdu = adf_nbuf_next(msdu); diff --git a/CORE/SERVICES/COMMON/ol_htt_rx_api.h b/CORE/SERVICES/COMMON/ol_htt_rx_api.h index 8d046c08d4b8..bb867d642841 100644 --- a/CORE/SERVICES/COMMON/ol_htt_rx_api.h +++ b/CORE/SERVICES/COMMON/ol_htt_rx_api.h @@ -533,6 +533,25 @@ htt_rx_msdu_actions( int *forward, int *inspect); +/** + * @brief Get the key id sent in IV of the frame + * @details + * Provide the key index octet which is taken from IV. + * This is valid only for the first MSDU. + * + * @param pdev - the HTT instance the rx data was received on + * @param msdu_desc - the abstract descriptor for the MSDU in question + * @key_id - Key id octet + * @return indication of whether key id access is successful + * A_TRUE - Success + * A_FALSE - if this is not first msdu + */ +extern a_bool_t +(*htt_rx_msdu_desc_key_id)( + htt_pdev_handle pdev, + void *mpdu_desc, + u_int8_t *key_id); + /*====================== rx MSDU + descriptor delivery ======================*/ /** diff --git a/CORE/SERVICES/COMMON/wdi_out.h b/CORE/SERVICES/COMMON/wdi_out.h index 726ad369329a..c7a67676af31 100644 --- a/CORE/SERVICES/COMMON/wdi_out.h +++ b/CORE/SERVICES/COMMON/wdi_out.h @@ -450,6 +450,8 @@ void wdi_out_rx_err_statistics(ol_pdev_handle pdev, * one of the fragments that when reassembled, constitute the rx frame * @param err_type - what kind of error occurred * @param rx_frame - the rx frame that had an error + * @pn - Packet sequence number + * @key_id - Key index octet received in IV of the frame */ void wdi_out_rx_err( @@ -459,7 +461,9 @@ wdi_out_rx_err( int tid, u_int32_t tsf32, enum ol_rx_err_type err_type, - adf_nbuf_t rx_frame); + adf_nbuf_t rx_frame, + u_int64_t *pn, + u_int8_t key_id); enum ol_rx_notify_type { OL_RX_NOTIFY_IPV4_IGMP, diff --git a/CORE/SERVICES/HIF/PCIe/ar6320def.h b/CORE/SERVICES/HIF/PCIe/ar6320def.h index d9de7b513298..a5c2f5bf1d80 100644 --- a/CORE/SERVICES/HIF/PCIe/ar6320def.h +++ b/CORE/SERVICES/HIF/PCIe/ar6320def.h @@ -116,6 +116,8 @@ #define AR6320_RX_MPDU_START_0_SEQ_NUM_MASK 0x0fff0000 #define AR6320_RX_MPDU_START_2_PN_47_32_LSB 0 #define AR6320_RX_MPDU_START_2_PN_47_32_MASK 0x0000ffff +#define AR6320_RX_MSDU_END_1_KEY_ID_OCT_MASK 0x000000ff +#define AR6320_RX_MSDU_END_1_KEY_ID_OCT_LSB 0 #define AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB 16 #define AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK 0xffff0000 #define AR6320_RX_MSDU_END_4_LAST_MSDU_LSB 15 @@ -372,6 +374,8 @@ struct targetdef_s ar6320_targetdef = { .d_RX_MPDU_START_0_SEQ_NUM_LSB = AR6320_RX_MPDU_START_0_SEQ_NUM_LSB, .d_RX_MPDU_START_2_PN_47_32_LSB = AR6320_RX_MPDU_START_2_PN_47_32_LSB, .d_RX_MPDU_START_2_PN_47_32_MASK = AR6320_RX_MPDU_START_2_PN_47_32_MASK, + .d_RX_MSDU_END_1_KEY_ID_OCT_MASK = AR6320_RX_MSDU_END_1_KEY_ID_OCT_MASK, + .d_RX_MSDU_END_1_KEY_ID_OCT_LSB = AR6320_RX_MSDU_END_1_KEY_ID_OCT_LSB, .d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK = AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK, .d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB = AR6320_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB, .d_RX_MSDU_END_4_LAST_MSDU_MASK = AR6320_RX_MSDU_END_4_LAST_MSDU_MASK, diff --git a/CORE/SERVICES/HIF/PCIe/ar9888def.h b/CORE/SERVICES/HIF/PCIe/ar9888def.h index 2309a44d4f1c..512abf65df1a 100644 --- a/CORE/SERVICES/HIF/PCIe/ar9888def.h +++ b/CORE/SERVICES/HIF/PCIe/ar9888def.h @@ -119,6 +119,8 @@ #define AR9888_RX_MPDU_START_0_SEQ_NUM_MASK 0x0fff0000 #define AR9888_RX_MPDU_START_2_PN_47_32_LSB 0 #define AR9888_RX_MPDU_START_2_PN_47_32_MASK 0x0000ffff +#define AR9888_RX_MSDU_END_1_KEY_ID_OCT_MASK 0x000000ff +#define AR9888_RX_MSDU_END_1_KEY_ID_OCT_LSB 0 #define AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB 16 #define AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK 0xffff0000 #define AR9888_RX_MSDU_END_4_LAST_MSDU_LSB 15 @@ -374,6 +376,8 @@ struct targetdef_s ar9888_targetdef = { .d_RX_MPDU_START_2_PN_47_32_MASK = AR9888_RX_MPDU_START_2_PN_47_32_MASK, .d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK = AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK, .d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB = AR9888_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB, + .d_RX_MSDU_END_1_KEY_ID_OCT_MASK = AR9888_RX_MSDU_END_1_KEY_ID_OCT_MASK, + .d_RX_MSDU_END_1_KEY_ID_OCT_LSB = AR9888_RX_MSDU_END_1_KEY_ID_OCT_LSB, .d_RX_MSDU_END_4_LAST_MSDU_MASK = AR9888_RX_MSDU_END_4_LAST_MSDU_MASK, .d_RX_MSDU_END_4_LAST_MSDU_LSB = AR9888_RX_MSDU_END_4_LAST_MSDU_LSB, .d_RX_ATTENTION_0_MCAST_BCAST_MASK = AR9888_RX_ATTENTION_0_MCAST_BCAST_MASK, diff --git a/CORE/SERVICES/HIF/PCIe/regtable.h b/CORE/SERVICES/HIF/PCIe/regtable.h index 7f4573258dce..76320fca502b 100644 --- a/CORE/SERVICES/HIF/PCIe/regtable.h +++ b/CORE/SERVICES/HIF/PCIe/regtable.h @@ -124,6 +124,8 @@ typedef struct targetdef_s { u_int32_t d_RX_MPDU_START_2_PN_47_32_MASK; u_int32_t d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK; u_int32_t d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB; + u_int32_t d_RX_MSDU_END_1_KEY_ID_OCT_MASK; + u_int32_t d_RX_MSDU_END_1_KEY_ID_OCT_LSB; u_int32_t d_RX_MSDU_END_4_LAST_MSDU_MASK; u_int32_t d_RX_MSDU_END_4_LAST_MSDU_LSB; u_int32_t d_RX_ATTENTION_0_MCAST_BCAST_MASK; @@ -318,6 +320,8 @@ typedef struct targetdef_s { #define RX_MPDU_START_0_SEQ_NUM_LSB (pdev->targetdef->d_RX_MPDU_START_0_SEQ_NUM_LSB) #define RX_MPDU_START_2_PN_47_32_LSB (pdev->targetdef->d_RX_MPDU_START_2_PN_47_32_LSB) #define RX_MPDU_START_2_PN_47_32_MASK (pdev->targetdef->d_RX_MPDU_START_2_PN_47_32_MASK) +#define RX_MSDU_END_1_KEY_ID_OCT_MASK (pdev->targetdef->d_RX_MSDU_END_1_KEY_ID_OCT_MASK) +#define RX_MSDU_END_1_KEY_ID_OCT_LSB (pdev->targetdef->d_RX_MSDU_END_1_KEY_ID_OCT_LSB) #define RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK (pdev->targetdef->d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK) #define RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB (pdev->targetdef->d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB) #define RX_MSDU_END_4_LAST_MSDU_MASK (pdev->targetdef->d_RX_MSDU_END_4_LAST_MSDU_MASK) diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 207cd2910088..31fcdd421594 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -15998,3 +15998,43 @@ VOS_STATUS WMA_GetWcnssSoftwareVersion(v_PVOID_t pvosGCtx, snprintf(pVersion, versionBufferSize, "%x", (unsigned int)wma_handle->target_fw_version); return VOS_STATUS_SUCCESS; } + +void ol_rx_err(ol_pdev_handle pdev, u_int8_t vdev_id, + u_int8_t *peer_mac_addr, int tid, u_int32_t tsf32, + enum ol_rx_err_type err_type, adf_nbuf_t rx_frame, + u_int64_t *pn, u_int8_t key_id) +{ + void *g_vos_ctx = vos_get_global_context(VOS_MODULE_ID_WDA, NULL); + tp_wma_handle wma = vos_get_context(VOS_MODULE_ID_WDA, g_vos_ctx); + tpSirSmeMicFailureInd mic_err_ind; + struct ether_header *eth_hdr; + + if (err_type != OL_RX_ERR_TKIP_MIC) + return; + + if (adf_nbuf_len(rx_frame) < sizeof(*eth_hdr)) + return; + eth_hdr = (struct ether_header *) adf_nbuf_data(rx_frame); + mic_err_ind = adf_os_mem_alloc(NULL, sizeof(*mic_err_ind)); + if (!mic_err_ind) { + WMA_LOGE("%s: Failed to allocate memory for MIC indication message", __func__); + return; + } + adf_os_mem_set((void *) mic_err_ind, 0, sizeof(*mic_err_ind)); + + mic_err_ind->messageType = eWNI_SME_MIC_FAILURE_IND; + mic_err_ind->length = sizeof(*mic_err_ind); + adf_os_mem_copy(mic_err_ind->bssId, + (v_MACADDR_t *) wma->interfaces[vdev_id].bssid, + sizeof(tSirMacAddr)); + adf_os_mem_copy(mic_err_ind->info.taMacAddr, + (v_MACADDR_t *) peer_mac_addr, sizeof(tSirMacAddr)); + adf_os_mem_copy(mic_err_ind->info.srcMacAddr, + (v_MACADDR_t *) eth_hdr->ether_shost, sizeof(tSirMacAddr)); + adf_os_mem_copy(mic_err_ind->info.dstMacAddr, + (v_MACADDR_t *) eth_hdr->ether_dhost, sizeof(tSirMacAddr)); + mic_err_ind->info.keyId = key_id; + mic_err_ind->info.multicast = IEEE80211_IS_MULTICAST(eth_hdr->ether_dhost); + adf_os_mem_copy(mic_err_ind->info.TSC, pn, SIR_CIPHER_SEQ_CTR_SIZE); + wma_send_msg(wma, SIR_HAL_MIC_FAILURE_IND, (void *) mic_err_ind, 0); +} |
