From 0f5280024c5066300e5e064e5269addc72ba35fa Mon Sep 17 00:00:00 2001 From: KARTHIK KUMAR T Date: Thu, 22 Jun 2023 16:45:39 +0530 Subject: [PATCH] qcacmn: Add addr conversion logic for raw mode packets In case MLO HW will do the link mac address to mld mac address conversion in RX path, But currently HW is supporting only for 802.3 mode. For RAW mode(802.11) this conversion not happening on HW so added this address conversion logic on SW. Change-Id: Ibd794510e9d0ebdca884ed2e4043e0c48052156e CRs-Fixed: 3537914 --- dp/wifi3.0/dp_rx.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 35fbaedcc9..bbda5dd20a 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -2344,6 +2344,52 @@ dp_rx_validate_rx_callbacks(struct dp_soc *soc, return QDF_STATUS_SUCCESS; } +#if defined(WLAN_FEATURE_11BE_MLO) && defined(RAW_PKT_MLD_ADDR_CONVERSION) +static void dp_rx_raw_pkt_mld_addr_conv(struct dp_soc *soc, + struct dp_vdev *vdev, + struct dp_txrx_peer *txrx_peer, + qdf_nbuf_t nbuf_head) +{ + qdf_nbuf_t nbuf, next; + struct dp_peer *peer = NULL; + struct ieee80211_frame *wh = NULL; + + if (vdev->rx_decap_type == htt_cmn_pkt_type_native_wifi) + return; + + peer = dp_peer_get_ref_by_id(soc, txrx_peer->peer_id, + DP_MOD_ID_RX); + + if (!peer) + return; + + if (!IS_MLO_DP_MLD_PEER(peer)) { + dp_peer_unref_delete(peer, DP_MOD_ID_RX); + return; + } + + nbuf = nbuf_head; + while (nbuf) { + next = nbuf->next; + wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf); + qdf_mem_copy(wh->i_addr1, vdev->mld_mac_addr.raw, + QDF_MAC_ADDR_SIZE); + qdf_mem_copy(wh->i_addr2, peer->mac_addr.raw, + QDF_MAC_ADDR_SIZE); + nbuf = next; + } + + dp_peer_unref_delete(peer, DP_MOD_ID_RX); +} +#else +static inline +void dp_rx_raw_pkt_mld_addr_conv(struct dp_soc *soc, + struct dp_vdev *vdev, + struct dp_txrx_peer *txrx_peer, + qdf_nbuf_t nbuf_head) +{ } +#endif + QDF_STATUS dp_rx_deliver_to_stack(struct dp_soc *soc, struct dp_vdev *vdev, struct dp_txrx_peer *txrx_peer, @@ -2356,6 +2402,7 @@ QDF_STATUS dp_rx_deliver_to_stack(struct dp_soc *soc, if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw) || (vdev->rx_decap_type == htt_cmn_pkt_type_native_wifi)) { + dp_rx_raw_pkt_mld_addr_conv(soc, vdev, txrx_peer, nbuf_head); vdev->osif_rsim_rx_decap(vdev->osif_vdev, &nbuf_head, &nbuf_tail); }