Commit d942fe13 authored by Meghana Malladi's avatar Meghana Malladi Committed by Jakub Kicinski
Browse files

net: ti: icssg-prueth: Fix skb handling for XDP_PASS



emac_rx_packet() is a common function for handling traffic
for both xdp and non-xdp use cases. Use common logic for
handling skb with or without xdp to prevent any incorrect
packet processing. This patch fixes ping working with
XDP_PASS for icssg driver.

Fixes: 62aa3246 ("net: ti: icssg-prueth: Add XDP support")
Signed-off-by: default avatarMeghana Malladi <m-malladi@ti.com>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250803180216.3569139-1-m-malladi@ti.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e6d76268
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -706,9 +706,9 @@ static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_state)
	struct page_pool *pool;
	struct sk_buff *skb;
	struct xdp_buff xdp;
	int headroom, ret;
	u32 *psdata;
	void *pa;
	int ret;

	*xdp_state = 0;
	pool = rx_chn->pg_pool;
@@ -757,22 +757,23 @@ static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_state)
		xdp_prepare_buff(&xdp, pa, PRUETH_HEADROOM, pkt_len, false);

		*xdp_state = emac_run_xdp(emac, &xdp, page, &pkt_len);
		if (*xdp_state == ICSSG_XDP_PASS)
			skb = xdp_build_skb_from_buff(&xdp);
		else
		if (*xdp_state != ICSSG_XDP_PASS)
			goto requeue;
		headroom = xdp.data - xdp.data_hard_start;
		pkt_len = xdp.data_end - xdp.data;
	} else {
		/* prepare skb and send to n/w stack */
		skb = napi_build_skb(pa, PAGE_SIZE);
		headroom = PRUETH_HEADROOM;
	}

	/* prepare skb and send to n/w stack */
	skb = napi_build_skb(pa, PAGE_SIZE);
	if (!skb) {
		ndev->stats.rx_dropped++;
		page_pool_recycle_direct(pool, page);
		goto requeue;
	}

	skb_reserve(skb, PRUETH_HEADROOM);
	skb_reserve(skb, headroom);
	skb_put(skb, pkt_len);
	skb->dev = ndev;