From 10826afad51772334bb18179641526345d2d55a8 Mon Sep 17 00:00:00 2001 From: Sai Rupesh Chevuru Date: Tue, 14 Feb 2023 20:36:11 +0530 Subject: [PATCH] qcacmn: Adding NAWDS support along with WDS-EXT Adding NAWDS support along with WDS-EXT Change-Id: I19d277fa575750d3194afc9ec9af3180a8c936ad CRs-Fixed: 3406151 --- dp/wifi3.0/be/dp_be_rx.c | 14 ++++++++++++-- dp/wifi3.0/be/dp_be_tx.c | 10 ++++++++++ dp/wifi3.0/dp_peer.h | 21 +++++++++++++++++++++ dp/wifi3.0/dp_tx.c | 10 ++++++---- dp/wifi3.0/dp_tx.h | 6 ++++++ 5 files changed, 55 insertions(+), 6 deletions(-) diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index a452a4cd98..7989196c60 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -111,8 +111,18 @@ static inline void dp_wds_ext_peer_learn_be(struct dp_soc *soc, qdf_atomic_test_and_set_bit(WDS_EXT_PEER_INIT_BIT, &ta_txrx_peer->wds_ext.init); - ta_base_peer = dp_peer_get_ref_by_id(soc, ta_txrx_peer->peer_id, - DP_MOD_ID_RX); + if (qdf_unlikely(ta_txrx_peer->nawds_enabled && + ta_txrx_peer->mld_peer)) { + ta_base_peer = dp_get_primary_link_peer_by_id( + soc, + ta_txrx_peer->peer_id, + DP_MOD_ID_RX); + } else { + ta_base_peer = dp_peer_get_ref_by_id( + soc, + ta_txrx_peer->peer_id, + DP_MOD_ID_RX); + } if (!ta_base_peer) return; diff --git a/dp/wifi3.0/be/dp_be_tx.c b/dp/wifi3.0/be/dp_be_tx.c index 6a2ced4c6d..7e587ca019 100644 --- a/dp/wifi3.0/be/dp_be_tx.c +++ b/dp/wifi3.0/be/dp_be_tx.c @@ -749,6 +749,16 @@ dp_tx_mlo_mcast_pkt_send(struct dp_vdev_be *be_vdev, nbuf_clone = nbuf; } + /* NAWDS clients will accepts on 4 addr format MCAST packets + * This will ensure to send packets in 4 addr format to NAWDS clients. + */ + if (qdf_unlikely(ptnr_vdev->nawds_enabled)) { + qdf_mem_zero(&msdu_info, sizeof(msdu_info)); + dp_tx_get_queue(ptnr_vdev, nbuf_clone, &msdu_info.tx_queue); + dp_tx_nawds_handler(ptnr_vdev->pdev->soc, ptnr_vdev, + &msdu_info, nbuf_clone, DP_INVALID_PEER); + } + qdf_mem_zero(&msdu_info, sizeof(msdu_info)); dp_tx_get_queue(ptnr_vdev, nbuf_clone, &msdu_info.tx_queue); msdu_info.gsn = be_vdev->seq_num; diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index f3080259a9..c5a741059c 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -67,6 +67,27 @@ struct ast_del_ctxt { int del_count; }; +#ifdef QCA_SUPPORT_WDS_EXTENDED +/** + * dp_peer_is_wds_ext_peer() - peer is WDS_EXT peer + * + * @peer: DP peer context + * + * This API checks whether the peer is WDS_EXT peer or not + * + * Return: true in the wds_ext peer else flase + */ +static inline bool dp_peer_is_wds_ext_peer(struct dp_txrx_peer *peer) +{ + return qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT, &peer->wds_ext.init); +} +#else +static inline bool dp_peer_is_wds_ext_peer(struct dp_txrx_peer *peer) +{ + return false; +} +#endif + typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer, void *arg); /** diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 992d44a589..8f60bd2364 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -64,9 +64,6 @@ /* disable TQM_BYPASS */ #define TQM_BYPASS_WAR 0 -/* invalid peer id for reinject*/ -#define DP_INVALID_PEER 0XFFFE - #define DP_RETRY_COUNT 7 #ifdef WLAN_PEER_JITTER #define DP_AVG_JITTER_WEIGHT_DENOM 4 @@ -3154,7 +3151,6 @@ dp_tx_per_pkt_vdev_id_check(qdf_nbuf_t nbuf, struct dp_vdev *vdev) * Return: none */ -static inline void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev, struct dp_tx_msdu_info_s *msdu_info, qdf_nbuf_t nbuf, uint16_t sa_peer_id) @@ -3182,6 +3178,12 @@ void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev, if (!dp_peer_is_primary_link_peer(peer)) continue; + /* In the case of wds ext peer mcast traffic will be + * sent as part of VLAN interface + */ + if (dp_peer_is_wds_ext_peer(txrx_peer)) + continue; + /* Multicast packets needs to be * dropped in case of intra bss forwarding */ diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 399c4edfac..04cd189c5c 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -41,6 +41,12 @@ #define DP_TX_MAX_NUM_FRAGS 6 +/* invalid peer id for reinject*/ +#define DP_INVALID_PEER 0XFFFE + +void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev, + struct dp_tx_msdu_info_s *msdu_info, + qdf_nbuf_t nbuf, uint16_t sa_peer_id); /* * DP_TX_DESC_FLAG_FRAG flags should always be defined to 0x1 * please do not change this flag's definition