Browse Source

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
Shashikala Prabhu 5 years ago
parent
commit
ecec78cea5
1 changed files with 19 additions and 18 deletions
  1. 19 18
      dp/wifi3.0/dp_rx_err.c

+ 19 - 18
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;