diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 4c9dd0ff92..54d401d7bf 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -499,6 +499,8 @@ dp_rx_intrabss_fwd(struct dp_soc *soc, len = QDF_NBUF_CB_RX_PKT_LEN(nbuf); memset(nbuf_copy->cb, 0x0, sizeof(nbuf_copy->cb)); + /* Set cb->ftype to intrabss FWD */ + qdf_nbuf_set_tx_ftype(nbuf_copy, CB_FTYPE_INTRABSS_FWD); if (dp_tx_send(dp_vdev_to_cdp_vdev(ta_peer->vdev), nbuf_copy)) { DP_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1, len); tid_stats->fail_cnt[INTRABSS_DROP]++; diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 921c757280..799d4e8488 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1505,6 +1505,39 @@ static inline void dp_non_std_tx_comp_free_buff(struct dp_tx_desc_s *tx_desc, } #endif +/** + * dp_tx_frame_is_drop() - checks if the packet is loopback + * @vdev: DP vdev handle + * @nbuf: skb + * + * Return: 1 if frame needs to be dropped else 0 + */ +int dp_tx_frame_is_drop(struct dp_vdev *vdev, uint8_t *srcmac, uint8_t *dstmac) +{ + struct dp_pdev *pdev = NULL; + struct dp_ast_entry *src_ast_entry = NULL; + struct dp_ast_entry *dst_ast_entry = NULL; + struct dp_soc *soc = NULL; + + qdf_assert(vdev); + pdev = vdev->pdev; + qdf_assert(pdev); + soc = pdev->soc; + + dst_ast_entry = dp_peer_ast_hash_find_by_pdevid + (soc, dstmac, vdev->pdev->pdev_id); + + src_ast_entry = dp_peer_ast_hash_find_by_pdevid + (soc, srcmac, vdev->pdev->pdev_id); + if (dst_ast_entry && src_ast_entry) { + if (dst_ast_entry->peer->peer_ids[0] == + src_ast_entry->peer->peer_ids[0]) + return 1; + } + + return 0; +} + /** * dp_tx_send_msdu_single() - Setup descriptor and enqueue single MSDU to TCL * @vdev: DP vdev handle diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 1c436e59f8..b58ac82388 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -216,6 +216,7 @@ qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf, qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list); #endif +int dp_tx_frame_is_drop(struct dp_vdev *vdev, uint8_t *srcmac, uint8_t *dstmac); /** * dp_tx_comp_handler() - Tx completion handler