Browse Source

qcacmn: Fix intraBSS issue between legacy and MLO clients

Fix intraBSS MCAST traffic issue between legacy and MLO
clients. Fix includes below changes

1. Change get_mcast_primary_vdev to return correct value
in case current VDEV is mcast primary
2. Avoid checking vdev->mlo_dev as it is set only for
mcast primary VDEV
3. In intraBSS ucast case use destination SOC to get the
destination peer with da_peer_id

Change-Id: I0d7a890bc62f703cd92e7c9edc20768a9a487d06
CRs-Fixed: 3456458
Chaithanya Garrepalli 2 years ago
parent
commit
fdc228f338
2 changed files with 25 additions and 14 deletions
  1. 16 14
      dp/wifi3.0/be/dp_be_rx.c
  2. 9 0
      dp/wifi3.0/be/mlo/dp_mlo.c

+ 16 - 14
dp/wifi3.0/be/dp_be_rx.c

@@ -1311,9 +1311,19 @@ dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 	if (!qdf_nbuf_is_intra_bss(nbuf))
 	if (!qdf_nbuf_is_intra_bss(nbuf))
 		return false;
 		return false;
 
 
+	hal_rx_tlv_get_dest_chip_pmac_id(rx_tlv_hdr,
+					 &dest_chip_id,
+					 &dest_chip_pmac_id);
+
+	params->dest_soc =
+		dp_mlo_get_soc_ref_by_chip_id(be_soc->ml_ctxt,
+					      dest_chip_id);
+	if (!params->dest_soc)
+		return false;
+
 	da_peer_id = HAL_RX_PEER_ID_GET(msdu_metadata);
 	da_peer_id = HAL_RX_PEER_ID_GET(msdu_metadata);
 
 
-	da_peer = dp_peer_get_tgt_peer_by_id(&be_soc->soc, da_peer_id,
+	da_peer = dp_peer_get_tgt_peer_by_id(params->dest_soc, da_peer_id,
 					     DP_MOD_ID_RX);
 					     DP_MOD_ID_RX);
 	if (da_peer) {
 	if (da_peer) {
 		if (da_peer->bss_peer || (da_peer->txrx_peer == ta_peer)) {
 		if (da_peer->bss_peer || (da_peer->txrx_peer == ta_peer)) {
@@ -1323,10 +1333,6 @@ dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 		dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
 		dp_peer_unref_delete(da_peer, DP_MOD_ID_RX);
 	}
 	}
 
 
-	hal_rx_tlv_get_dest_chip_pmac_id(rx_tlv_hdr,
-					 &dest_chip_id,
-					 &dest_chip_pmac_id);
-
 	qdf_assert_always(dest_chip_id <= (DP_MLO_MAX_DEST_CHIP_ID - 1));
 	qdf_assert_always(dest_chip_id <= (DP_MLO_MAX_DEST_CHIP_ID - 1));
 
 
 	if (dest_chip_id == be_soc->mlo_chip_id) {
 	if (dest_chip_id == be_soc->mlo_chip_id) {
@@ -1342,12 +1348,6 @@ dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 	params->tx_vdev_id =
 	params->tx_vdev_id =
 		be_vdev->partner_vdev_list[dest_chip_id][dest_chip_pmac_id];
 		be_vdev->partner_vdev_list[dest_chip_id][dest_chip_pmac_id];
 
 
-	params->dest_soc =
-		dp_mlo_get_soc_ref_by_chip_id(be_soc->ml_ctxt,
-					      dest_chip_id);
-	if (!params->dest_soc)
-		return false;
-
 	return true;
 	return true;
 }
 }
 #else
 #else
@@ -1560,10 +1560,12 @@ bool dp_rx_intrabss_mlo_mcbc_fwd(struct dp_soc *soc, struct dp_vdev *vdev,
 	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
 	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
 	struct cdp_tx_exception_metadata tx_exc_metadata = {0};
 	struct cdp_tx_exception_metadata tx_exc_metadata = {0};
 
 
-	if (!vdev->mlo_vdev)
-		return false;
-
 	tx_exc_metadata.is_mlo_mcast = 1;
 	tx_exc_metadata.is_mlo_mcast = 1;
+	tx_exc_metadata.tx_encap_type = CDP_INVALID_TX_ENCAP_TYPE;
+	tx_exc_metadata.sec_type = CDP_INVALID_SEC_TYPE;
+	tx_exc_metadata.peer_id = CDP_INVALID_PEER;
+	tx_exc_metadata.tid = CDP_INVALID_TID;
+
 	mcast_primary_vdev = dp_mlo_get_mcast_primary_vdev(be_soc,
 	mcast_primary_vdev = dp_mlo_get_mcast_primary_vdev(be_soc,
 							   be_vdev,
 							   be_vdev,
 							   DP_MOD_ID_RX);
 							   DP_MOD_ID_RX);

+ 9 - 0
dp/wifi3.0/be/mlo/dp_mlo.c

@@ -923,6 +923,15 @@ struct dp_vdev *dp_mlo_get_mcast_primary_vdev(struct dp_soc_be *be_soc,
 	int i = 0;
 	int i = 0;
 	int j = 0;
 	int j = 0;
 	struct dp_mlo_ctxt *dp_mlo = be_soc->ml_ctxt;
 	struct dp_mlo_ctxt *dp_mlo = be_soc->ml_ctxt;
+	struct dp_vdev *vdev = (struct dp_vdev *)be_vdev;
+
+	if (be_vdev->mcast_primary) {
+		if (dp_vdev_get_ref((struct dp_soc *)be_soc, vdev, mod_id) !=
+					QDF_STATUS_SUCCESS)
+			return NULL;
+
+		return vdev;
+	}
 
 
 	for (i = 0; i < WLAN_MAX_MLO_CHIPS ; i++) {
 	for (i = 0; i < WLAN_MAX_MLO_CHIPS ; i++) {
 		struct dp_soc *ptnr_soc =
 		struct dp_soc *ptnr_soc =