diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 471920c32b..a1a65d1610 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1252,9 +1252,8 @@ dp_rx_enqueue_rx(struct dp_peer *peer, qdf_nbuf_t rx_buf_list) struct dp_peer_cached_bufq *bufqi = &peer->bufq_info; int num_buff_elem; - QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_TXRX, "bufq->curr %d bufq->drops %d", - bufqi->entries, bufqi->dropped); - + dp_debug_rl("bufq->curr %d bufq->drops %d", bufqi->entries, + bufqi->dropped); if (!peer->valid) { bufqi->dropped = dp_rx_drop_nbuf_list(peer->vdev->pdev, rx_buf_list); @@ -1311,11 +1310,11 @@ dp_rx_enqueue_rx(struct dp_peer *peer, qdf_nbuf_t rx_buf_list) } #endif -static inline void dp_rx_deliver_to_stack(struct dp_soc *soc, - struct dp_vdev *vdev, - struct dp_peer *peer, - qdf_nbuf_t nbuf_head, - qdf_nbuf_t nbuf_tail) +void dp_rx_deliver_to_stack(struct dp_soc *soc, + struct dp_vdev *vdev, + struct dp_peer *peer, + qdf_nbuf_t nbuf_head, + qdf_nbuf_t nbuf_tail) { int num_nbuf = 0; @@ -1335,11 +1334,13 @@ static inline void dp_rx_deliver_to_stack(struct dp_soc *soc, * callback function. if so let us free the nbuf_list. */ if (qdf_unlikely(!vdev->osif_rx)) { - if (dp_rx_is_peer_cache_bufq_supported()) + if (peer && dp_rx_is_peer_cache_bufq_supported()) { dp_rx_enqueue_rx(peer, nbuf_head); - else - dp_rx_drop_nbuf_list(vdev->pdev, nbuf_head); - + } else { + num_nbuf = dp_rx_drop_nbuf_list(vdev->pdev, + nbuf_head); + DP_STATS_DEC(peer, rx.to_stack.num, num_nbuf); + } return; } @@ -1348,7 +1349,6 @@ static inline void dp_rx_deliver_to_stack(struct dp_soc *soc, vdev->osif_rsim_rx_decap(vdev->osif_vdev, &nbuf_head, &nbuf_tail, peer->mac_addr.raw); } - vdev->osif_rx(vdev->osif_vdev, nbuf_head); } diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 6f95a91eeb..f1013084e9 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -1106,4 +1106,22 @@ void dp_peer_set_rx_capture_enabled(struct dp_peer *peer_handle, bool value) { } #endif + +/** + * dp_rx_deliver_to_stack() - deliver pkts to network stack + * Caller to hold peer refcount and check for valid peer + * @soc: soc + * @vdev: vdev + * @peer: peer + * @nbuf_head: skb list head + * @nbuf_tail: skb list tail + * + * Return: None + */ +void dp_rx_deliver_to_stack(struct dp_soc *soc, + struct dp_vdev *vdev, + struct dp_peer *peer, + qdf_nbuf_t nbuf_head, + qdf_nbuf_t nbuf_tail); + #endif /* _DP_RX_H */ diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index fca1eacc3f..2f2b373700 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -666,7 +666,7 @@ dp_rx_null_q_handle_invalid_peer_id_exception(struct dp_soc *soc, } /** - * dp_rx_null_q_check_pkt_len_exception() - Check for pktlen validity + * dp_rx_check_pkt_len() - Check for pktlen validity * @soc: DP SOC context * @pkt_len: computed length of the pkt from caller in bytes * @@ -674,7 +674,7 @@ dp_rx_null_q_handle_invalid_peer_id_exception(struct dp_soc *soc, * */ static inline -bool dp_rx_null_q_check_pkt_len_exception(struct dp_soc *soc, uint32_t pkt_len) +bool dp_rx_check_pkt_len(struct dp_soc *soc, uint32_t pkt_len) { if (qdf_unlikely(pkt_len > RX_DATA_BUFFER_SIZE)) { DP_STATS_INC_PKT(soc, rx.err.rx_invalid_pkt_len, @@ -696,7 +696,7 @@ dp_rx_null_q_handle_invalid_peer_id_exception(struct dp_soc *soc, } static inline -bool dp_rx_null_q_check_pkt_len_exception(struct dp_soc *soc, uint32_t pkt_len) +bool dp_rx_check_pkt_len(struct dp_soc *soc, uint32_t pkt_len) { return false; } @@ -757,7 +757,7 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf, pkt_len = msdu_len + l2_hdr_offset + RX_PKT_TLVS_LEN; if (qdf_likely(!qdf_nbuf_is_frag(nbuf))) { - if (dp_rx_null_q_check_pkt_len_exception(soc, pkt_len)) + if (dp_rx_check_pkt_len(soc, pkt_len)) goto drop_nbuf; /* Set length in nbuf */ @@ -955,6 +955,11 @@ dp_rx_process_rxdma_err(struct dp_soc *soc, qdf_nbuf_t nbuf, msdu_len = hal_rx_msdu_start_msdu_len_get(rx_tlv_hdr); pkt_len = msdu_len + l2_hdr_offset + RX_PKT_TLVS_LEN; + if (dp_rx_check_pkt_len(soc, pkt_len)) { + /* Drop & free packet */ + qdf_nbuf_free(nbuf); + return; + } /* Set length in nbuf */ qdf_nbuf_set_pktlen(nbuf, pkt_len); @@ -1067,7 +1072,7 @@ process_rx: /* Update the flow tag in SKB based on FSE metadata */ dp_rx_update_flow_tag(soc, vdev, nbuf, rx_tlv_hdr, true); DP_STATS_INC(peer, rx.to_stack.num, 1); - vdev->osif_rx(vdev->osif_vdev, nbuf); + dp_rx_deliver_to_stack(soc, vdev, peer, nbuf, NULL); } return;