summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan <vthiagar@qti.qualcomm.com>2013-12-26 16:42:29 -0800
committerPrakash Dhavali <pdhavali@qca.qualcomm.com>2014-01-24 19:21:47 -0800
commit70fc54041d64e09f7f7dc2ca6e878ae71bda517e (patch)
treed3cf35d3ac88889399560a9d57d2e36a9d1fb3b3
parentf56fe0ea310e03deb9ceed8db15497e73b60c31b (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.c29
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_ctrl_txrx_api.h7
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx.c25
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_defrag.c2
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_pn.c2
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_rx_reorder.c2
-rw-r--r--CORE/SERVICES/COMMON/ol_htt_rx_api.h19
-rw-r--r--CORE/SERVICES/COMMON/wdi_out.h6
-rw-r--r--CORE/SERVICES/HIF/PCIe/ar6320def.h4
-rw-r--r--CORE/SERVICES/HIF/PCIe/ar9888def.h4
-rw-r--r--CORE/SERVICES/HIF/PCIe/regtable.h4
-rw-r--r--CORE/SERVICES/WMA/wma.c40
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);
+}