Procházet zdrojové kódy

qca-wifi: Fix WDS header fields

Fix address fields in WDS case.

Change-Id: I0f94bcd42783a6840a714ca0f5541e7299de1d81
Manoj Ekbote před 4 roky
rodič
revize
717a95065e
1 změnil soubory, kde provedl 30 přidání a 10 odebrání
  1. 30 10
      dp/wifi3.0/dp_tx_capture.c

+ 30 - 10
dp/wifi3.0/dp_tx_capture.c

@@ -63,6 +63,8 @@
 #define DP_NOACK_STOKEN_POS_SHIFT (2)
 #define DP_NDPA_TOKEN_POS (16)
 
+#define IEEE80211_FC1_SHIFT (8)
+
 /* Macros to handle sequence number bitmaps */
 
 /* HW generated rts frame flag */
@@ -2281,12 +2283,27 @@ void dp_ppdu_desc_debug_print(struct cdp_tx_completion_ppdu *ppdu_desc,
 static
 void dp_peer_tx_wds_addr_add(struct dp_peer *peer, uint8_t *addr4_mac_addr)
 {
-	struct ieee80211_frame_addr4 *ptr_wh;
+	struct ieee80211_frame_addr4 *ptr_wh = NULL;
+	struct dp_vdev *vdev = NULL;
 
-	if (!peer)
+	if (!peer) {
+		qdf_err("peer is NULL!");
 		return;
+	}
+
+	vdev = peer->vdev;
+	if (!vdev) {
+		qdf_err("vdev is NULL!");
+		return;
+	}
 
 	ptr_wh = &peer->tx_capture.tx_wifi_addr4_hdr;
+	qdf_mem_copy(ptr_wh->i_addr1,
+		     peer->mac_addr.raw,
+		     QDF_MAC_ADDR_SIZE);
+	qdf_mem_copy(ptr_wh->i_addr2,
+		     vdev->mac_addr.raw,
+		     QDF_MAC_ADDR_SIZE);
 	qdf_mem_copy(ptr_wh->i_addr4,
 		     addr4_mac_addr,
 		     QDF_MAC_ADDR_SIZE);
@@ -2309,7 +2326,7 @@ static uint32_t dp_tx_update_80211_wds_hdr(struct dp_pdev *pdev,
 					   void *data,
 					   qdf_nbuf_t nbuf,
 					   uint16_t ether_type,
-					   uint8_t *src_addr,
+					   uint8_t *dst_addr,
 					   uint8_t usr_idx)
 {
 	struct cdp_tx_completion_ppdu *ppdu_desc;
@@ -2338,8 +2355,9 @@ static uint32_t dp_tx_update_80211_wds_hdr(struct dp_pdev *pdev,
 
 		ptr_wh->i_qos[1] = (user->qos_ctrl & 0xFF00) >> 8;
 		ptr_wh->i_qos[0] = (user->qos_ctrl & 0xFF);
-		/* Update Addr 3 (SA) with SA derived from ether packet */
-		qdf_mem_copy(ptr_wh->i_addr3, src_addr, QDF_MAC_ADDR_SIZE);
+
+		/* Update Addr 3 (DA) with DA derived from ether packet */
+		qdf_mem_copy(ptr_wh->i_addr3, dst_addr, QDF_MAC_ADDR_SIZE);
 
 		peer->tx_capture.tx_wifi_ppdu_id = ppdu_desc->ppdu_id;
 	}
@@ -2522,8 +2540,9 @@ dp_tx_mon_restitch_mpdu(struct dp_pdev *pdev, struct dp_peer *peer,
 
 		if ((qdf_likely((peer->vdev->tx_encap_type !=
 				 htt_cmn_pkt_type_raw))) &&
-		    ((ppdu_desc->frame_ctrl & IEEE80211_FC1_DIR_MASK) &&
-		     (IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_DIR_FROMDS)))
+			(((ppdu_desc->frame_ctrl >> IEEE80211_FC1_SHIFT) &
+			  IEEE80211_FC1_DIR_MASK) ==
+			 (IEEE80211_FC1_DIR_TODS | IEEE80211_FC1_DIR_FROMDS)))
 			dp_peer_tx_wds_addr_add(peer, eh->ether_shost);
 
 		if (first_msdu && first_msdu_not_seen) {
@@ -2596,13 +2615,14 @@ dp_tx_mon_restitch_mpdu(struct dp_pdev *pdev, struct dp_peer *peer,
 				goto free_ppdu_desc_mpdu_q;
 			}
 
-			if (((ppdu_desc->frame_ctrl & IEEE80211_FC1_DIR_MASK) &&
+			if (((ppdu_desc->frame_ctrl >> IEEE80211_FC1_SHIFT) &
+				 IEEE80211_FC1_DIR_MASK) ==
 			     (IEEE80211_FC1_DIR_TODS |
-			      IEEE80211_FC1_DIR_FROMDS))) {
+			      IEEE80211_FC1_DIR_FROMDS)) {
 				dp_tx_update_80211_wds_hdr(pdev, peer,
 							   ppdu_desc, mpdu_nbuf,
 							   ether_type,
-							   eh->ether_shost,
+							   eh->ether_dhost,
 							   usr_idx);
 			} else {
 				dp_tx_update_80211_hdr(pdev, peer,