From f3417a607e515c491be2363dd7ab1b86d96d9f6c Mon Sep 17 00:00:00 2001 From: Varsha Mishra Date: Sun, 11 Aug 2019 11:51:34 +0530 Subject: [PATCH] qca-wifi: Handle vlan tagged duplicate skb for multipass phrase feature Duplicate vlan tagged frames which need to be sent to repeater should have unique check to avoid infinite iteration. Infinite iteration leads to creation of nbuf every time loop is executed. Change-Id: I2601461edc9e144f1058ed031ba14410563d0755 --- dp/wifi3.0/dp_txrx_wds.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/dp/wifi3.0/dp_txrx_wds.c b/dp/wifi3.0/dp_txrx_wds.c index e5e3552269..05ecca265b 100644 --- a/dp/wifi3.0/dp_txrx_wds.c +++ b/dp/wifi3.0/dp_txrx_wds.c @@ -477,7 +477,7 @@ uint8_t dp_tx_need_multipass_process(struct dp_soc *soc, struct dp_vdev *vdev, peer = dp_peer_find_hash_find(soc, eh->ether_dhost, 0, DP_VDEV_ALL); if (qdf_unlikely(peer == NULL)) - goto unref_and_return; + return DP_VLAN_UNTAGGED; /* * Do not drop the frame when vlan_id doesn't match. @@ -488,8 +488,6 @@ uint8_t dp_tx_need_multipass_process(struct dp_soc *soc, struct dp_vdev *vdev, return DP_VLAN_TAGGED_UNICAST; } -unref_and_return: - dp_peer_unref_delete(peer); return DP_VLAN_UNTAGGED; } @@ -506,10 +504,14 @@ bool dp_tx_multipass_process(struct dp_soc *soc, struct dp_vdev *vdev, qdf_nbuf_t nbuf, struct dp_tx_msdu_info_s *msdu_info) { - uint16_t vlan_id; - qdf_nbuf_t nbuf_copy; - uint16_t group_key; + uint16_t vlan_id = 0; + uint16_t group_key = 0; uint8_t is_spcl_peer = DP_VLAN_UNTAGGED; + qdf_nbuf_t nbuf_copy = NULL; + + if (HTT_TX_MSDU_EXT2_DESC_FLAG_VALID_KEY_FLAGS_GET(msdu_info->meta_data[0])) { + return true; + } is_spcl_peer = dp_tx_need_multipass_process(soc, vdev, nbuf, &vlan_id); @@ -540,8 +542,16 @@ bool dp_tx_multipass_process(struct dp_soc *soc, struct dp_vdev *vdev, * Send multicast frame to special peers even * if pass through to classic repeater fails. */ - if (nbuf_copy && dp_tx_send((struct cdp_vdev *)vdev, nbuf_copy)) { - qdf_nbuf_free(nbuf_copy); + if (nbuf_copy) { + struct dp_tx_msdu_info_s msdu_info_copy; + qdf_mem_zero(&msdu_info_copy, sizeof(msdu_info_copy)); + msdu_info_copy.tid = HTT_TX_EXT_TID_INVALID; + HTT_TX_MSDU_EXT2_DESC_FLAG_VALID_KEY_FLAGS_SET(msdu_info_copy.meta_data[0], 1); + nbuf_copy = dp_tx_send_msdu_single(vdev, nbuf_copy, &msdu_info_copy, HTT_INVALID_PEER, NULL); + if (nbuf_copy) { + qdf_nbuf_free(nbuf_copy); + qdf_err("nbuf_copy send failed"); + } } group_key = vdev->iv_vlan_map[vlan_id];