From ecec78cea5d6dcb6b9ecda41ef8567777bc2c902 Mon Sep 17 00:00:00 2001 From: Shashikala Prabhu Date: Tue, 17 Sep 2019 12:01:24 +0530 Subject: [PATCH] qcacmn: Use correct transmitter address for MIC error processing When NO_RX_PKT_HDR_TLV is disabled, host gets the 802.11 header from the RX packet header TLV (rx_pkt_hdr_tlv). When this macro is enabled, host gets the 802.11 header from the raw data frame. In case of MIC failure, host receives the decaped frame. This decaped buffer does not have 802.11 header. Upper layer uses receiver and transmitter address to process MIC failure. Therefore, get the RA and TA address from rx_mpdu_start_tlv and passed it to upper layer. Change-Id: Id5631051892d2e1b38b7833a0599fdc49ca2f6b7 CRs-Fixed: 2525613 --- dp/wifi3.0/dp_rx_err.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 54b6213785..0ce78bd621 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -1026,8 +1026,6 @@ void dp_rx_process_mic_error(struct dp_soc *soc, qdf_nbuf_t nbuf, struct dp_vdev *vdev = NULL; struct dp_pdev *pdev = NULL; struct ol_if_ops *tops = NULL; - struct ieee80211_frame *wh; - uint8_t *rx_pkt_hdr; uint16_t rx_seq, fragno; unsigned int tid; QDF_STATUS status; @@ -1036,9 +1034,6 @@ void dp_rx_process_mic_error(struct dp_soc *soc, qdf_nbuf_t nbuf, if (!hal_rx_msdu_end_first_msdu_get(rx_tlv_hdr)) return; - rx_pkt_hdr = hal_rx_pkt_hdr_get(qdf_nbuf_data(nbuf)); - wh = (struct ieee80211_frame *)rx_pkt_hdr; - if (!peer) { dp_err_rl("peer not found"); goto fail; @@ -1056,32 +1051,38 @@ void dp_rx_process_mic_error(struct dp_soc *soc, qdf_nbuf_t nbuf, goto fail; } - tid = hal_rx_mpdu_start_tid_get(soc->hal_soc, qdf_nbuf_data(nbuf)); - rx_seq = (((*(uint16_t *)wh->i_seq) & - IEEE80211_SEQ_SEQ_MASK) >> - IEEE80211_SEQ_SEQ_SHIFT); - fragno = dp_rx_frag_get_mpdu_frag_number(qdf_nbuf_data(nbuf)); - /* Can get only last fragment */ if (fragno) { + tid = hal_rx_mpdu_start_tid_get(soc->hal_soc, + qdf_nbuf_data(nbuf)); + rx_seq = hal_rx_get_rx_sequence(qdf_nbuf_data(nbuf)); + status = dp_rx_defrag_add_last_frag(soc, peer, tid, rx_seq, nbuf); dp_info_rl("Frag pkt seq# %d frag# %d consumed status %d !", rx_seq, fragno, status); - return; + return; + } + + if (hal_rx_mpdu_get_addr1(qdf_nbuf_data(nbuf), + &mic_failure_info.da_mac_addr.bytes[0])) { + dp_err_rl("Failed to get da_mac_addr"); + goto fail; + } + + if (hal_rx_mpdu_get_addr2(qdf_nbuf_data(nbuf), + &mic_failure_info.ta_mac_addr.bytes[0])) { + dp_err_rl("Failed to get ta_mac_addr"); + goto fail; } - qdf_copy_macaddr((struct qdf_mac_addr *)&mic_failure_info.da_mac_addr, - (struct qdf_mac_addr *)&wh->i_addr1); - qdf_copy_macaddr((struct qdf_mac_addr *)&mic_failure_info.ta_mac_addr, - (struct qdf_mac_addr *)&wh->i_addr2); mic_failure_info.key_id = 0; mic_failure_info.multicast = - IEEE80211_IS_MULTICAST(wh->i_addr1); + IEEE80211_IS_MULTICAST(mic_failure_info.da_mac_addr.bytes); qdf_mem_zero(mic_failure_info.tsc, MIC_SEQ_CTR_SIZE); mic_failure_info.frame_type = cdp_rx_frame_type_802_11; - mic_failure_info.data = (uint8_t *)wh; + mic_failure_info.data = NULL; mic_failure_info.vdev_id = vdev->vdev_id; tops = pdev->soc->cdp_soc.ol_ops;