diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index c80fb766c7c9..71387488ad71 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1734,9 +1734,9 @@ static void dp_vdev_register_wifi3(struct cdp_vdev *vdev_handle, #if ATH_SUPPORT_WAPI vdev->osif_check_wai = txrx_ops->rx.wai_check; #endif -#if UMAC_SUPPORT_PROXY_ARP - vdev->osif_proxy_arp = txrx_ops->proxy_arp; #endif +#ifdef UMAC_SUPPORT_PROXY_ARP + vdev->osif_proxy_arp = txrx_ops->proxy_arp; #endif vdev->me_convert = txrx_ops->me_convert; diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 33ea6380727a..f434b73290a5 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1423,22 +1423,71 @@ static void dp_tx_reinject_handler(struct dp_tx_desc_s *tx_desc, uint8_t *status) { struct dp_vdev *vdev; + struct dp_peer *peer = NULL; + uint32_t peer_id = HTT_INVALID_PEER; + qdf_nbuf_t nbuf = tx_desc->nbuf; + qdf_nbuf_t nbuf_copy = NULL; + struct dp_tx_msdu_info_s msdu_info; vdev = tx_desc->vdev; qdf_assert(vdev); + qdf_mem_set(&msdu_info, sizeof(msdu_info), 0x0); + + dp_tx_get_queue(vdev, nbuf, &msdu_info.tx_queue); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "%s Tx reinject path\n", __func__); DP_STATS_INC_PKT(vdev, tx_i.reinject_pkts, 1, qdf_nbuf_len(tx_desc->nbuf)); + if (!vdev->osif_proxy_arp) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "function pointer to proxy arp not present\n"); + return; + } + if (qdf_unlikely(vdev->mesh_vdev)) { DP_TX_FREE_SINGLE_BUF(vdev->pdev->soc, tx_desc->nbuf); - } else - dp_tx_send(vdev, tx_desc->nbuf); + } else { + TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { + if ((peer->peer_ids[0] != HTT_INVALID_PEER) && + (peer->bss_peer || peer->nawds_enabled) + && !(vdev->osif_proxy_arp( + vdev->osif_vdev, + nbuf))) { + nbuf_copy = qdf_nbuf_copy(nbuf); + if (!nbuf_copy) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + FL("nbuf copy failed")); + break; + } + + if (peer->nawds_enabled) + peer_id = peer->peer_ids[0]; + else + peer_id = HTT_INVALID_PEER; + + nbuf_copy = dp_tx_send_msdu_single(vdev, + nbuf_copy, msdu_info.tid, + &msdu_info.tx_queue, + msdu_info.meta_data, peer_id); + + if (nbuf_copy) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + FL("pkt send failed")); + qdf_nbuf_free(nbuf_copy); + } + } + } + } + + qdf_nbuf_free(nbuf); dp_tx_desc_release(tx_desc, tx_desc->pool_id); }