From 3a0005c21009dca10789f36ee08db6abe0ffe0b0 Mon Sep 17 00:00:00 2001 From: Tallapragada Kalyan Date: Fri, 10 Mar 2017 15:22:57 +0530 Subject: [PATCH] qcacmn: skip wds handling for raw mode pkts avoid wds source port learning for RAW pkts Change-Id: I38e27890bd4cd12b812a584a32de10499ef736fe --- dp/wifi3.0/dp_rx.c | 8 +++-- dp/wifi3.0/dp_rx.h | 2 ++ dp/wifi3.0/dp_rx_err.c | 71 ++++++++++++++++++++++-------------------- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 4122e7e60e60..6721014b3efa 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -196,7 +196,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, * * Return: void */ -static void +void dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list) { qdf_nbuf_t deliver_list_head = NULL; @@ -284,6 +284,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc, } } #endif + /** * dp_rx_intrabss_fwd() - Implements the Intra-BSS forwarding logic * @@ -902,7 +903,10 @@ done: #endif /* NAPIER_EMULATION */ /* WDS Source Port Learning */ - dp_rx_wds_srcport_learn(soc, rx_tlv_hdr, peer, nbuf); + if (qdf_likely(vdev->rx_decap_type == + htt_cmn_pkt_type_ethernet)) + dp_rx_wds_srcport_learn(soc, rx_tlv_hdr, peer, + nbuf); /* Intrabss-fwd */ if (vdev->opmode != wlan_op_mode_sta) diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 4cc2b515e8e5..f730e9ca63d2 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -180,6 +180,8 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id, struct rx_desc_pool *rx_desc_pool); +void dp_rx_deliver_raw(struct dp_vdev *vdev, qdf_nbuf_t nbuf_list); + /** * dp_rx_add_to_free_desc_list() - Adds to a local free descriptor list * diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index d94ec8f5a3ac..e25283c09d09 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -234,7 +234,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, uint16_t peer_id = 0xFFFF; struct dp_peer *peer = NULL; uint32_t sgi, rate_mcs, tid; - uint32_t peer_mdata; rx_bufs_used++; @@ -279,6 +278,17 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, goto fail; } + vdev = peer->vdev; + if (!vdev) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("INVALID vdev %p OR osif_rx"), vdev); + /* Drop & free packet */ + qdf_nbuf_free(nbuf); + DP_STATS_INC(soc, rx.err.invalid_vdev, 1); + goto fail; + } + + sgi = hal_rx_msdu_start_sgi_get(rx_desc->rx_buf_start); rate_mcs = hal_rx_msdu_start_rate_mcs_get(rx_desc->rx_buf_start); tid = hal_rx_mpdu_start_tid_get(rx_desc->rx_buf_start); @@ -287,14 +297,9 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, "%s: %d, SGI: %d, rate_mcs: %d, tid: %d", __func__, __LINE__, sgi, rate_mcs, tid); - peer_mdata = hal_rx_mpdu_peer_meta_data_get(rx_desc->rx_buf_start); - peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata); - peer = dp_peer_find_by_id(soc, peer_id); - - if (!peer) { - qdf_nbuf_free(nbuf); - goto fail; - } + /* WDS Source Port Learning */ + if (qdf_likely(vdev->rx_decap_type == htt_cmn_pkt_type_ethernet)) + dp_rx_wds_srcport_learn(soc, rx_desc->rx_buf_start, peer, nbuf); /* * Advance the packet start pointer by total size of @@ -330,33 +335,33 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, struct dp_rx_desc *rx_desc, qdf_nbuf_data(nbuf), 128, false); #endif /* NAPIER_EMULATION */ - if (qdf_unlikely(peer->bss_peer)) { - QDF_TRACE(QDF_MODULE_ID_DP, - QDF_TRACE_LEVEL_INFO, - FL("received pkt with same src MAC")); - - /* Drop & free packet */ - qdf_nbuf_free(nbuf); - /* Statistics */ - goto fail; - } - - vdev = peer->vdev; - - if (vdev && vdev->osif_rx) { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, - FL("vdev %p osif_rx %p"), vdev, - vdev->osif_rx); - + if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) { qdf_nbuf_set_next(nbuf, NULL); - vdev->osif_rx(vdev->osif_vdev, nbuf); - DP_STATS_INC(vdev->pdev, rx.to_stack.num, 1); + dp_rx_deliver_raw(vdev, nbuf); } else { - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("INVALID vdev %p OR osif_rx"), vdev); - DP_STATS_INC(soc, rx.err.invalid_vdev, 1); - } + if (qdf_unlikely(peer->bss_peer)) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_INFO, + FL("received pkt with same src MAC")); + /* Drop & free packet */ + qdf_nbuf_free(nbuf); + goto fail; + } + if (vdev->osif_rx) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, + FL("vdev %p osif_rx %p"), vdev, + vdev->osif_rx); + + qdf_nbuf_set_next(nbuf, NULL); + vdev->osif_rx(vdev->osif_vdev, nbuf); + DP_STATS_INC(vdev->pdev, rx.to_stack.num, 1); + } else { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("INVALID vdev %p OR osif_rx"), vdev); + DP_STATS_INC(soc, rx.err.invalid_vdev, 1); + } + } fail: dp_rx_add_to_free_desc_list(head, tail, rx_desc);