From nobody Tue Apr 7 09:05:27 2026 Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D190259CB9 for ; Fri, 13 Mar 2026 22:30:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441055; cv=none; b=ASy7nxCpaEf0Rabf+/opJ8HjG0i/Ui0EeNKp+eTb40703yWEqfcD6YVisFcGmzmkLlbwgMlTfarXMaEaM7N/YVDufRN812HT1sWxdfOwBa2ZZAXfN2bvfUFTBUvzrS+3Gz3ETNMQDuy8HtdnfS5tXJeSb1WZ2TsPkGgX4WzTO5o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441055; c=relaxed/simple; bh=q92wW6u9jfkve4Jnxrkv5vS9DQpou808H07Lfmn6g9A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cr40E586FgNoGzC2aInZAsFSWjqWWhNtdBdSP9YEfkGaRYAqFTYeRS0uwlIrB/+HVIlrQqd7Hu/EULvGHWSW6DArnsWcnJH5iH8WguOszAU7XPbO9lKFpdATNj7pmapAYTseRnOnMkcVIoaFbiKIYC/qKCWhXGmpmGF8jbenPkE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=Fg67lBn6; arc=none smtp.client-ip=209.85.167.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="Fg67lBn6" Received: by mail-oi1-f174.google.com with SMTP id 5614622812f47-4670676ba03so1038349b6e.1 for ; Fri, 13 Mar 2026 15:30:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1773441053; x=1774045853; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UIfbn2R80P+GEE142tyIwDUaWaiGTo/JYywBsc0gehU=; b=Fg67lBn6VNth/bzG0G0XGngQWSejaH5rpNdNd2+0QfcFy/qko+S0kwN5JJv/WJjkDm tcV4ZOXiae8W2FHTEXABUy/IGMt3mCclSECY9ei5imBSHLDhCFyTkhZZcdEWRBqgq5+k FnJVSBU4hbz9iPHvAyf2qXarRWOtZri99lQgAwjAiJXoHPyRXQ7rz+62FZ+Y0Uehe2NW LdeJunjbjJoFaHET/OFM2QRT7jasxLJt41YeJLsDqdgMFNcah0epyE7FX06axESPfZ18 GnjRsarrVkuregBk+gt7OiA9hOybChLJn5/lKnog+uXUeFfaqJzQTexhTbq6A9Ge/oVe xo8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773441053; x=1774045853; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=UIfbn2R80P+GEE142tyIwDUaWaiGTo/JYywBsc0gehU=; b=nFrPVtEYgj7fOamUJsc+WGzlo77Yw/2bhJ2+l1Q0ugNi6/wAPXx7QlSqw0b5tvR6VJ b29ph+HUEnJLlLuSjjRUwUpvulSJwwELo2nKVN98NB1L9QVyp1qIX7Z/wni6yOkW8FYt JTLrY0IpdVmCR1CHy6G8zL4K8hIek4KN67Ftj120h45esRSV+NrVH8XQIuB+wm8HAWez eJ/mLKoGx5hUhdRQnkCDu6MobsoKPc2+WGy0FaPBvQV1jVrGCcdldWxuQ5VyGzINvcUi XrWOq1uJsNNc0FpkGTTT9MCieC4o1wtEfqoiFs0AOGjFuXJi44+NSPjh2xyJFTYDUvcV G+3Q== X-Forwarded-Encrypted: i=1; AJvYcCXx3gNYvNnz0l+362CYQx6iYDIP3VYdlrj77zIUw2jcZh0NC11zPdMOcJw+gKrDRqawrTDkhKi9E9w8cg8=@vger.kernel.org X-Gm-Message-State: AOJu0YyosDg6hC4lCScuxfY30ZMG2mQDt0vS8KfHKwZZjXn6x/TRI9i3 ipqn5labeGo/YHYyfXS5D6ElMoVvNMQItmkn0s2l1/pkXtxtZdb++/xA5uHyCWB+dMc= X-Gm-Gg: ATEYQzyYPpyjyC6kAUzeSGZpzWy1RRdGv4a7+CrlNz2SYGLCHIZjfPxem6M9wK+XPQF DtH5arYnNhzxCQvQkvcZF6Ao1nXe2jSYxVFKiM0sZqh3E/tcgnXNh11ffxtsbPeDHT5bCdPWvRo /Fuf+vQfEBBXjKKcebHdy2e+fhdvHrdDkHQBeL3st7zNycHpRE9ge95XHGkitXo18gsd/0Ajy0N e/dBOdFsSzVqRkBzUZWFfk7D0fzJ6bNXp3RN/z1rHG4OMF+J9K8/nZD7zg9RReaimnJtKmWWgFK BoJvqcbXz0YeVQqo/9aiToPdGVkuAl2lhqZEHDW4BNL92Kr/yAarOYVOF1zitZ+JDh5TVx9UlBA EMw36k8c7pnrL9ufqPN7GCuSgtHjXeyxxWHWw5980ixTh0uIHFNWTcC03LgRbDA+cDJpikKRY8k 0ZCQAEOIHram9KTEAqsG4= X-Received: by 2002:a05:6808:e8b:b0:467:21dd:aa94 with SMTP id 5614622812f47-4675762d0dbmr2499832b6e.55.1773441053170; Fri, 13 Mar 2026 15:30:53 -0700 (PDT) Received: from 20HS2G4.. ([2a09:bac1:76c0:540::22f:7d]) by smtp.gmail.com with ESMTPSA id 5614622812f47-467342fab49sm5408516b6e.16.2026.03.13.15.30.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 15:30:52 -0700 (PDT) From: Chris J Arges To: Joe Damato , Jakub Kicinski , Andy Gospodarek , Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: Chris J Arges , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH net-next v4 1/6] bnxt_en: use bnxt_xdp_buff for xdp context Date: Fri, 13 Mar 2026 17:27:31 -0500 Message-ID: <20260313223029.454755-2-carges@cloudflare.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313223029.454755-1-carges@cloudflare.com> References: <20260313223029.454755-1-carges@cloudflare.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This adds bnxt_xdp_buff which embeds the xdp_buff struct and stores pointers to hardware RX completion descriptors (rx_cmp and rx_cmp_ext) along with the completion type. Signed-off-by: Chris J Arges Reviewed-by: Joe Damato --- v4: moved bnxt_xdp declaration to follow RCT style --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 25 +++++++++++-------- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 7 ++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index c982aac714d1..1b170b9cf461 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -2115,10 +2115,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt= _cp_ring_info *cpr, struct bnxt_sw_rx_bd *rx_buf; unsigned int len; u8 *data_ptr, agg_bufs, cmp_type; + struct bnxt_xdp_buff bnxt_xdp; bool xdp_active =3D false; dma_addr_t dma_addr; struct sk_buff *skb; - struct xdp_buff xdp; u32 flags, misc; u32 cmpl_ts; void *data; @@ -2231,9 +2231,13 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_= cp_ring_info *cpr, dma_addr =3D rx_buf->mapping; =20 if (bnxt_xdp_attached(bp, rxr)) { - bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp); + bnxt_xdp.rxcmp =3D rxcmp; + bnxt_xdp.rxcmp1 =3D rxcmp1; + bnxt_xdp.cmp_type =3D cmp_type; + + bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &bnxt_xdp.xdp); if (agg_bufs) { - u32 frag_len =3D bnxt_rx_agg_netmems_xdp(bp, cpr, &xdp, + u32 frag_len =3D bnxt_rx_agg_netmems_xdp(bp, cpr, &bnxt_xdp.xdp, cp_cons, agg_bufs, false); @@ -2245,12 +2249,12 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt= _cp_ring_info *cpr, } =20 if (xdp_active) { - if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) { + if (bnxt_rx_xdp(bp, rxr, cons, &bnxt_xdp.xdp, data, &data_ptr, &len, eve= nt)) { rc =3D 1; goto next_rx; } - if (xdp_buff_has_frags(&xdp)) { - sinfo =3D xdp_get_shared_info_from_buff(&xdp); + if (xdp_buff_has_frags(&bnxt_xdp.xdp)) { + sinfo =3D xdp_get_shared_info_from_buff(&bnxt_xdp.xdp); agg_bufs =3D sinfo->nr_frags; } else { agg_bufs =3D 0; @@ -2261,7 +2265,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_c= p_ring_info *cpr, if (!xdp_active) skb =3D bnxt_copy_skb(bnapi, data_ptr, len, dma_addr); else - skb =3D bnxt_copy_xdp(bnapi, &xdp, len, dma_addr); + skb =3D bnxt_copy_xdp(bnapi, &bnxt_xdp.xdp, len, dma_addr); bnxt_reuse_rx_data(rxr, cons, data); if (!skb) { if (agg_bufs) { @@ -2269,7 +2273,7 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_c= p_ring_info *cpr, bnxt_reuse_rx_agg_bufs(cpr, cp_cons, 0, agg_bufs, false); else - bnxt_xdp_buff_frags_free(rxr, &xdp); + bnxt_xdp_buff_frags_free(rxr, &bnxt_xdp.xdp); } goto oom_next_rx; } @@ -2293,10 +2297,11 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt= _cp_ring_info *cpr, if (!skb) goto oom_next_rx; } else { - skb =3D bnxt_xdp_build_skb(bp, skb, agg_bufs, rxr, &xdp); + skb =3D bnxt_xdp_build_skb(bp, skb, agg_bufs, + rxr, &bnxt_xdp.xdp); if (!skb) { /* we should be able to free the old skb here */ - bnxt_xdp_buff_frags_free(rxr, &xdp); + bnxt_xdp_buff_frags_free(rxr, &bnxt_xdp.xdp); goto oom_next_rx; } } diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_xdp.h index 8933a0dec09a..8c66698bde11 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h @@ -12,6 +12,13 @@ =20 DECLARE_STATIC_KEY_FALSE(bnxt_xdp_locking_key); =20 +struct bnxt_xdp_buff { + struct xdp_buff xdp; + struct rx_cmp *rxcmp; + struct rx_cmp_ext *rxcmp1; + u8 cmp_type; +}; + struct bnxt_sw_tx_bd *bnxt_xmit_bd(struct bnxt *bp, struct bnxt_tx_ring_info *txr, dma_addr_t mapping, u32 len, --=20 2.43.0 From nobody Tue Apr 7 09:05:27 2026 Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DC77D38550F for ; Fri, 13 Mar 2026 22:30:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441058; cv=none; b=kby+Ut3amDbleZK1cfsEjr9dcLl/Zs1xoUL+BQc0p+sktNDgag1MIout721+q+0b85PLFqz94W/fAtp4XM5D/XLz8JwrP7H3iShqdH2ZWC0vt5WgdtIZYxIS5l2YvCzVrRfprEZWprXSzjf2g9jHCrEbh3RRnrNaVncPjrKq0TE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441058; c=relaxed/simple; bh=+1Nr0Jil7w93d9S780sxk/ZwDE85Lpd4DcR7sfP5MRg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dHn3e7Z5zB715aaeIAgAjVTMePv9hfvljvih6h1qS5lZDpVGHfO+qbqS7o4L7wpT/A4QSwZ11lsnf55GtM1vt4TGTMtaX/Re/drBBrOGAXBt1+jkSMr0Wi/lQ97/mDC4HmJcKQnA/cvNRZ6SMjLZUqR8NCp3K7ziILVa7otZR1Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=HumhbsnZ; arc=none smtp.client-ip=209.85.167.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="HumhbsnZ" Received: by mail-oi1-f174.google.com with SMTP id 5614622812f47-4672076355aso1886347b6e.2 for ; Fri, 13 Mar 2026 15:30:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1773441056; x=1774045856; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=H2JdvacgjZAGz3EP35cm2jBWXr/fY7/W6wCgdpj3LTQ=; b=HumhbsnZ0OQqImvM/FAuL+yvccY6TB3Qa+TqffYleAjmL3FMy0oE/p2MLdQepEwO6K Jl8lTK69o2R1NHuDvmhWAyw8eEzX2n4A1yk21/7Ek4r7LX+cX+8pj8e3ihmyxlJlcbQh vXAGEZhOFiLPoXFGksnppg3lFDbq0zpvaoTur5joGoCbsLHXf0+a+zbvpdkD0BaAqLP8 wBPK9M1IwnNVGMGZvfyspY9SRZgjbykn8kdCf2g07KCT9tR1kOJx7bMu6KjgKoIrwvV8 quIyHdTBfuBePYyKpT+l8GhVaorgpORG+hu7y/EDWfNr8WHT/U0OoNqkh/pLb4ZMpiic V0Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773441056; x=1774045856; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=H2JdvacgjZAGz3EP35cm2jBWXr/fY7/W6wCgdpj3LTQ=; b=GDA7dhXtfWbxX5Bzd0SQFIV8P5LcfLR2kuesc0ByNSXU0mPfZPy76VzD93SBOD+NCj S4KrAN9okSvi87atOvaoec2q2SZHn/bHr04WGv4U3mW6LOM8Jkx1dt5g3Ksn5xtd/6EC gwuMwfKH4RnZNf9WeTkBvfdjxegirsGl9giehGo64+vuTejzQC3mrdEVSMdb59RLIfuf QmuXPgFwGtCgqaiTnVo5aq8qkSlOFh9iCe3X6Z8BW96RswTiQBSCpEUrGyz/ttzaWkrP kLoUbKFc4URAkYXB0O/sctdvoM3oU3Yl1WTqgMC0R5+UOsGZMy2vVEkkVUSICcRPWoKY Vu5Q== X-Forwarded-Encrypted: i=1; AJvYcCU2JJBnaHOZ8MbxzSka6iYg7MOJ6d8RV+jlwuPk2fMRWIK6YncXJcGGiyFrzNz6K54hmM5I6SPb6oDOP/E=@vger.kernel.org X-Gm-Message-State: AOJu0YzqNqYeyY1D+YkS8qkNGGqlipo28CsnidxVc9emir5hcsvBDv80 jsrnV5XYx6UewImaubYZN8Oa8dj5DXToiiG58NABSQG4j3Eh3qMahdUdiMeookZ72q4= X-Gm-Gg: ATEYQzwLE5nTqkrHwLmlWw+UQRWRPFU/3oOHb8AVY9ZjZmfSpDTMSw/5RiNOEAnYHl6 mhtXPLubPFNXO109YbxUwFTWVKE7u7fFERRKag/0Ai/X4LmlB3p8oKOhevxgiNbQ0/I3MurvQw2 IZlEZwXrrX7kvHj1Rgp9jDP++5zgFKIGsBT7tn3HZfjDWptPacurP2Hjoi5X2B1sXeojKXtzsbn UeDpEsFHfZ+VDYztPOw+zW5imp/sCCMxHYv3TDyA9H/eMf//ueEu2fZ2fTG+fEbvo3W7Y4IvNUi 4LGATq8V7zJW1NlJmses/K1/ZXJG+oLaHe8h1j40Q+l7oN6EE0pdlaKjEqvLSndZwDXnsJdXhSm h10GJPUAtBzI4B1PPwVRW+0whnhvtsMBwqMXhYROVThvV5C3CBkGy6M5Udspri9aStoIhGGP7RA vrLDE1iRF7 X-Received: by 2002:a05:6808:4f66:b0:45e:e52c:8a9b with SMTP id 5614622812f47-46757649336mr2867556b6e.59.1773441055758; Fri, 13 Mar 2026 15:30:55 -0700 (PDT) Received: from 20HS2G4.. ([2a09:bac1:76c0:540::22f:7d]) by smtp.gmail.com with ESMTPSA id 5614622812f47-467342fab49sm5408516b6e.16.2026.03.13.15.30.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 15:30:54 -0700 (PDT) From: Chris J Arges To: Joe Damato , Jakub Kicinski , Andy Gospodarek , Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: Chris J Arges , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH net-next v4 2/6] bnxt_en: Implement XDP RSS hash metadata extraction Date: Fri, 13 Mar 2026 17:27:32 -0500 Message-ID: <20260313223029.454755-3-carges@cloudflare.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313223029.454755-1-carges@cloudflare.com> References: <20260313223029.454755-1-carges@cloudflare.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support for extracting RSS hash values and hash types from hardware completion descriptors in XDP programs for bnxt_en. Add IP_TYPE definition for determining if completion is ipv4 or ipv6. In addition add ITYPE_ICMP flag for identifying ICMP completions. Signed-off-by: Chris J Arges Reviewed-by: Joe Damato Reviewed-by: Andy Gospodarek --- v4: no changes --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 ++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 + drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 47 +++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h | 3 ++ 4 files changed, 57 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 1b170b9cf461..4881d9359549 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -15906,6 +15906,10 @@ static const struct net_device_ops bnxt_netdev_ops= =3D { .ndo_hwtstamp_set =3D bnxt_hwtstamp_set, }; =20 +static const struct xdp_metadata_ops bnxt_xdp_metadata_ops =3D { + .xmo_rx_hash =3D bnxt_xdp_rx_hash, +}; + static void bnxt_get_queue_stats_rx(struct net_device *dev, int i, struct netdev_queue_stats_rx *stats) { @@ -16790,6 +16794,7 @@ static int bnxt_init_one(struct pci_dev *pdev, cons= t struct pci_device_id *ent) goto init_err_free; =20 dev->netdev_ops =3D &bnxt_netdev_ops; + dev->xdp_metadata_ops =3D &bnxt_xdp_metadata_ops; dev->stat_ops =3D &bnxt_stat_ops; dev->watchdog_timeo =3D BNXT_TX_TIMEOUT; dev->ethtool_ops =3D &bnxt_ethtool_ops; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 90fa3e93c8d6..34bb98709f2b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -232,6 +232,7 @@ struct rx_cmp { #define RX_CMP_FLAGS_ITYPE_UDP (3 << 12) #define RX_CMP_FLAGS_ITYPE_FCOE (4 << 12) #define RX_CMP_FLAGS_ITYPE_ROCE (5 << 12) + #define RX_CMP_FLAGS_ITYPE_ICMP (7 << 12) #define RX_CMP_FLAGS_ITYPE_PTP_WO_TS (8 << 12) #define RX_CMP_FLAGS_ITYPE_PTP_W_TS (9 << 12) #define RX_CMP_LEN (0xffff << 16) @@ -311,6 +312,7 @@ struct rx_cmp_ext { #define RX_CMP_FLAGS2_T_IP_CS_CALC (0x1 << 2) #define RX_CMP_FLAGS2_T_L4_CS_CALC (0x1 << 3) #define RX_CMP_FLAGS2_META_FORMAT_VLAN (0x1 << 4) + #define RX_CMP_FLAGS2_IP_TYPE (0x1 << 8) __le32 rx_cmp_meta_data; #define RX_CMP_FLAGS2_METADATA_TCI_MASK 0xffff #define RX_CMP_FLAGS2_METADATA_VID_MASK 0xfff diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_xdp.c index 85cbeb35681c..1f920464b426 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -472,3 +472,50 @@ bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *sk= b, u8 num_frags, xdp_buff_get_skb_flags(xdp)); return skb; } + +int bnxt_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash, + enum xdp_rss_hash_type *rss_type) +{ + const struct bnxt_xdp_buff *xdp =3D (void *)ctx; + const struct rx_cmp_ext *rxcmp1 =3D xdp->rxcmp1; + const struct rx_cmp *rxcmp =3D xdp->rxcmp; + enum xdp_rss_hash_type hash_type =3D 0; + u32 itypes; + + if (!rxcmp || !RX_CMP_HASH_VALID(rxcmp)) + return -ENODATA; + + *hash =3D le32_to_cpu(rxcmp->rx_cmp_rss_hash); + + if (!rxcmp1) { + *rss_type =3D XDP_RSS_TYPE_L2; + return 0; + } + + if (xdp->cmp_type =3D=3D CMP_TYPE_RX_L2_CMP) { + itypes =3D RX_CMP_ITYPES(rxcmp); + if (rxcmp1->rx_cmp_flags2 & + cpu_to_le32(RX_CMP_FLAGS2_IP_TYPE)) { + hash_type |=3D XDP_RSS_TYPE_L3_IPV6; + } else { + hash_type |=3D XDP_RSS_TYPE_L3_IPV4; + } + + switch (itypes) { + case RX_CMP_FLAGS_ITYPE_TCP: + hash_type |=3D XDP_RSS_L4 | XDP_RSS_L4_TCP; + break; + case RX_CMP_FLAGS_ITYPE_UDP: + hash_type |=3D XDP_RSS_L4 | XDP_RSS_L4_UDP; + break; + case RX_CMP_FLAGS_ITYPE_ICMP: + hash_type |=3D XDP_RSS_L4 | XDP_RSS_L4_ICMP; + break; + default: + break; + } + } + + *rss_type =3D hash_type; + return 0; +} diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_xdp.h index 8c66698bde11..fb4f9143929f 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.h @@ -41,4 +41,7 @@ void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *r= xr, struct sk_buff *bnxt_xdp_build_skb(struct bnxt *bp, struct sk_buff *skb, u8 num_frags, struct bnxt_rx_ring_info *rxr, struct xdp_buff *xdp); +int bnxt_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash, + enum xdp_rss_hash_type *rss_type); + #endif --=20 2.43.0 From nobody Tue Apr 7 09:05:27 2026 Received: from mail-oi1-f179.google.com (mail-oi1-f179.google.com [209.85.167.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 81F16386447 for ; Fri, 13 Mar 2026 22:30:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441059; cv=none; b=Nsgax9sGNex18JYCfpP0XjQXhWqNWQ02Qvqyk12E4q0TLh7RBkop0fx2pgJIAzqDjrRMWhJ1NxQRvgKN59QB4X5lUd/6DF3dgEykhKzznXhKZH6gDeinmOBrggMj2v48qT+3W8fz/eSEwQIaabY7E4hU1PFqT4s7M8dJ514VVWA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441059; c=relaxed/simple; bh=OtHFbcpOVbLFwcytf7vnE+Hfd6w3VV2I2VNOK9waWGA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YwpfHz35abfeKj0l1/IO8gdKmlZ3Rt5mtJcDILlv31OkUW3yDZ7WfPIFePhGdAV3TJ2BdD1Y0eHqwlapqmcl0c1p8JoOIWmcdFwBDva8tAfkGkBDTEdTU2kvs3Tyz9YS0xbvDTeyxv6E59ArGIRijRdg5Srb+u2PrcG7WA0e7I4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=IZmqc4iO; arc=none smtp.client-ip=209.85.167.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="IZmqc4iO" Received: by mail-oi1-f179.google.com with SMTP id 5614622812f47-46708149af2so1486683b6e.0 for ; Fri, 13 Mar 2026 15:30:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1773441057; x=1774045857; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QLKdgna2TJg/4cf6a9WLp0moZG16XDEww02DyhezqPc=; b=IZmqc4iOxoBtUFX6VTFP8z/4pf2m6t55C5WJyM7E6R8pUwH4XcXqwqhvf40zXvYOS4 O4stlxlMA+ijEMBcRLuvuQ9ioFM2WGqHfS5QYsh21PLWbEnOl+AdAqFmzckLECew1FB4 s5MMJoBrRIdkcJUbwJX7UaId8UHl/DPDBw00dDXMSVWiQJOA8q/39OQi+b5GimCYhYrK C12qfD2xhl+4uwzOWBO8ivqS71X2UkboQ4a/+s4kft4DpPT8TWoxCKyd7aRNlXjR1pgG RjVbgWXbJiwBRQieGGyOX9Lcb2aD0NHN9/e3S11ivhMIMuOTwYF+64ba8u2mKF1zft5O nWSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773441057; x=1774045857; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=QLKdgna2TJg/4cf6a9WLp0moZG16XDEww02DyhezqPc=; b=B5wyewPN4V7iDNrtuze5JEJjY3aEtRzj3OhpFIgdjNXHzW0iilfgq83k57C9/GRVO3 WGqDYzv/+KZdIajzzQmDa9UkmcNjP0MCpOg0SGMj84aQfB/iAopI73E3mEZjHWxuwV70 uPst4NdCK4pKD+kHs8aiF6O/wc9lRdXjpXULKVV3VJENYA280i77cM9EMl2imc0fxHoe Ocm/f49/Em6MeGN5MESCvchsqisy6KyVjEa5wQLoboJ8jPshqnNuEYTTHt1J2BRTQ3R0 cbTDw54W54u3YU5rq+3lAFqkxaIEAzEF7S2Y3n3JGs96IZ+x0GjeESVva1RCSsY2QSIQ BeqA== X-Forwarded-Encrypted: i=1; AJvYcCVcslxGhOEXaWYBZJ0HQFEAPTMz9VQyXBP6jQjWG7SHxWK5BK1vF+47zfaDyALlKBnE4ubcaw+Ciep4vUk=@vger.kernel.org X-Gm-Message-State: AOJu0YzExdL6TNSfiJEwz21f0qa1WZsQvRhVHCadiu8wYZWQTD4LdthD k5Uu2/A22PrTp6Z67QmuoAuWlCdkW1KXMUwS/7Hy22f/vivSB1AvADVxSpku93f1EyA= X-Gm-Gg: ATEYQzy/Pr4jMY6/r9okDbzv5Dte+7OfgIXsSL+X/Narx9Ct+DRNyRLQ3K3Bn+foKYt UpBTQXlP0TIEcRbCMoazFQhAY77gfaABTCrzLId0QjT+/Z7LUcZcx8Jgx+oWoRtcV4kqLS033yW lKVjeJNoESTAvANZU1PCBsmo/s+SK9BkE+q54DxgVV8P2ZLf5a70ZDp6VMQPOHyri11VdQrR0S2 2eSkvjKLHmMGRVfWK9IZT6ZR4b0LIK28K81QuSD6tbt2EAqdkAT8aRH3zp8MFwfzGZRBZGglS+N CZWAe6Uxo2obEI9cyjySmQLtAUciTDI47agx8PW+nsmtUwzqMAZlDpiTGrO+lGxJ8glnzl525MR Jrtb3tqaXyLtCCM3SVWKf96TI3MdGAfEh3Vn9eqnq4DNnEBiPNm1v6uVNy7JVrsIA7cG+WJ9yCL +koLjYSWGAvDOTfBcQgNw= X-Received: by 2002:a05:6808:a550:20b0:467:2926:1252 with SMTP id 5614622812f47-46761727390mr1271145b6e.30.1773441057445; Fri, 13 Mar 2026 15:30:57 -0700 (PDT) Received: from 20HS2G4.. ([2a09:bac1:76c0:540::22f:7d]) by smtp.gmail.com with ESMTPSA id 5614622812f47-467342fab49sm5408516b6e.16.2026.03.13.15.30.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 15:30:56 -0700 (PDT) From: Chris J Arges To: Joe Damato , Jakub Kicinski , Andy Gospodarek , Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: Chris J Arges , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH net-next v4 3/6] bnxt_en: Move bnxt_rss_ext_op into header Date: Fri, 13 Mar 2026 17:27:33 -0500 Message-ID: <20260313223029.454755-4-carges@cloudflare.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313223029.454755-1-carges@cloudflare.com> References: <20260313223029.454755-1-carges@cloudflare.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This allows bnxt_rss_ext_op to be used by other functions. In addition this modifies the rxcmp argument to be const since the function only reads from this structure. Signed-off-by: Chris J Arges Reviewed-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 17 ----------------- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 4881d9359549..8176d34b3408 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -2077,23 +2077,6 @@ static struct sk_buff *bnxt_rx_vlan(struct sk_buff *= skb, u8 cmp_type, return NULL; } =20 -static enum pkt_hash_types bnxt_rss_ext_op(struct bnxt *bp, - struct rx_cmp *rxcmp) -{ - u8 ext_op; - - ext_op =3D RX_CMP_V3_HASH_TYPE(bp, rxcmp); - switch (ext_op) { - case EXT_OP_INNER_4: - case EXT_OP_OUTER_4: - case EXT_OP_INNFL_3: - case EXT_OP_OUTFL_3: - return PKT_HASH_TYPE_L4; - default: - return PKT_HASH_TYPE_L3; - } -} - /* returns the following: * 1 - 1 packet successfully received * 0 - successful TPA_START, packet not completed yet diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 34bb98709f2b..f8b8068bb47e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2902,6 +2902,23 @@ static inline bool bnxt_sriov_cfg(struct bnxt *bp) #endif } =20 +static inline enum pkt_hash_types bnxt_rss_ext_op(struct bnxt *bp, + const struct rx_cmp *rxcmp) +{ + u8 ext_op; + + ext_op =3D RX_CMP_V3_HASH_TYPE(bp, rxcmp); + switch (ext_op) { + case EXT_OP_INNER_4: + case EXT_OP_OUTER_4: + case EXT_OP_INNFL_3: + case EXT_OP_OUTFL_3: + return PKT_HASH_TYPE_L4; + default: + return PKT_HASH_TYPE_L3; + } +} + extern const u16 bnxt_bstore_to_trace[]; extern const u16 bnxt_lhint_arr[]; =20 --=20 2.43.0 From nobody Tue Apr 7 09:05:27 2026 Received: from mail-oi1-f175.google.com (mail-oi1-f175.google.com [209.85.167.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC70C386C23 for ; Fri, 13 Mar 2026 22:31:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441063; cv=none; b=GzL9Wh3n7vkKa5eK60EsFVwYbGcHr5MIgRJTY0LHG4IOH1yXso7tjcS9fvwXjnz2PBah9FxccNcbqvI0Ar6Aew3VKFxZmq6ClEhL55UyU/FmPz5ABmJSkZT2ZjFNTBjLG5rxUbZ11MbsVWKFn1yeTfFLlPAQ+jo3Ck4EH6/IKDU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441063; c=relaxed/simple; bh=4mx+e9oVG6CrcMMG3/eO6hOms8NOKTTMBQ+YcrRMFRU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Pwus1ow74L3xmfk2xsGoYnQ3KLmV4DPRAQd67yU+3yd5GGtuRSOczELRwm6G8UP7/6bh3NEHZCg4Rw9uT0u1nJT+Gh+n96F3HS+P+q/nq9iIGN0uV9Oh8FhbWgss29PGGkjoGFKNCEoTG8+lPlVvQxmRadTpsHv5yMD76rKhPF4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=TOTppMoQ; arc=none smtp.client-ip=209.85.167.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="TOTppMoQ" Received: by mail-oi1-f175.google.com with SMTP id 5614622812f47-4672076355aso1886388b6e.2 for ; Fri, 13 Mar 2026 15:31:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1773441061; x=1774045861; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=s0xGdOzKFMVP5ynlZwdIR9piZg01nlaRfSX1gpCcslY=; b=TOTppMoQ8aJarVmSBMuAdvj9iapkP7dnGWIJ0NJ7lCwzKF/Xan6tFKV9eodJ299Cse i8wPJW6SUZ9TSfOi95aeoY4CatQb/pB8CNyQmzKuXcwhnhnM2c0Wn6b42SbgG5KP33ZI eGMS9FKiOgGevk6WJGUdHXhnnfxrw2zMmLoCG+Ie7wRuWbxzEpx+WD8K8jQ/5YKcc8VY DHHLsuHS2AuBUfuCkxzinJQ6hV2QFEZvXhl3JHEoXRMYu5g/EBzEFoSCCF9NJ88MuuAD OWt0IZ+/HmcKYTbqloZMmsRQAqQckarFrAmMPvWPoTQa7Em6nLvfS38m6oUtZTkzY4IU IUug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773441061; x=1774045861; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=s0xGdOzKFMVP5ynlZwdIR9piZg01nlaRfSX1gpCcslY=; b=eCOKu3AbTkTRbsRWc5qupY/jrm5ESszbiwuLYS9kBv8L3e5HYeHGWKFcnVPVi0RRiB NlPI0PQsAkBDXYHF/sOIbi/AdKVIGva/KSG06ck7ZkyGPhAgLrvSPweAFRYFTfBKLqjB 2UnSXxDMh9oRtuvvNxkCdu8ZR2Z2kOPIqDk+tiANSo0HplbnPuymhl9TURXHUI3jvNFz n2syhO9C4D+Q2owbYdoxKZRuu597Wyi6lF4xeoKkA5dXBJ0XRZ/LyGAC0jmOZPoJrNIC hIJBKg1uiKKdwaKNhsFgGH5mx4nDF00pYIzNKy1a85x8okOeeIC/BPywHusQm//n/T5l Cpew== X-Forwarded-Encrypted: i=1; AJvYcCXdpJmGDalAAbX21i24ZIwMNiCafJIs7toSL6Df4WqekdAYiOnZt5k5Uk7ETU5H37DLcZbc8fJmu8OVqrM=@vger.kernel.org X-Gm-Message-State: AOJu0YyHA31hO8/ti0DBXml82EFH4zxnJWKRi5yF2ZTL7fPMHcS4bkaM eJtb+fJz1VmpKyWQyIm/KRj2HvPAj6NJ/bSjjcZW+IUxxm50b87AZm43XnYGhfzcmx0= X-Gm-Gg: ATEYQzxXfTL6IzMEUKQFe9/pbAEltGwoC3yci2sfflLICl0xtvb+jtBc2RPg0QPrBnC tL+TAG06GNMj7HA4oAOfV/a7t4pi+NBhBgYFr6mQO8LffIt4LMDWTuuwWaxxonBrApVHOPzwqef 9xtMpixlulbksRu1XobtpuVeTG+rkUKlzNaVMJCqQm9dI6YJev1bbxnYmfNWsujOFHpj/Mkn8rE IAlrboeIwPzejO/m4Wd06u9uJh0MRvitKNNutGTxCv8aTWZi3HFh/fk7rgavAaZx3zcaoEB3HLi 93ORfJbCMUA5ZJ+QnAdaIWxgtWffNV4KnFAk4gVYfVCZBuFfMr95SPrIzEhTgVlUkL75FQD9e8x gjL9Kmc5N4ICdJqM5fn22Epd1qZf9V9EsDhTOII/gFg73xKDdDPqZwk9LBmR0gp856LEHHPE005 3FG7WXerl/ X-Received: by 2002:a05:6808:4704:b0:467:11fa:40a1 with SMTP id 5614622812f47-46757598a6amr2320563b6e.43.1773441060705; Fri, 13 Mar 2026 15:31:00 -0700 (PDT) Received: from 20HS2G4.. ([2a09:bac1:76c0:540::22f:7d]) by smtp.gmail.com with ESMTPSA id 5614622812f47-467342fab49sm5408516b6e.16.2026.03.13.15.30.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 15:30:59 -0700 (PDT) From: Chris J Arges To: Joe Damato , Jakub Kicinski , Andy Gospodarek , Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: Chris J Arges , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Subject: [PATCH net-next v4 4/6] bnxt_en: Implement XDP RSS hash metadata extraction for V3_CMP Date: Fri, 13 Mar 2026 17:27:34 -0500 Message-ID: <20260313223029.454755-5-carges@cloudflare.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313223029.454755-1-carges@cloudflare.com> References: <20260313223029.454755-1-carges@cloudflare.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This adds another conditional when cmp_type is CMP_TYPE_RX_L2_V3_CMP for drivers that support this completion format. This re-uses bnxt_rss_ext_op to provide similar functionality. One limitation is for L4 hash-types, protocol-specific bits can't be determined. Signed-off-by: Chris J Arges Reviewed-by: Joe Damato --- v4: re-uses bnxt_rss_ext_op --- drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_xdp.c index 1f920464b426..babcd463e50e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c @@ -514,6 +514,16 @@ int bnxt_xdp_rx_hash(const struct xdp_md *ctx, u32 *ha= sh, default: break; } + } else if (xdp->cmp_type =3D=3D CMP_TYPE_RX_L2_V3_CMP) { + struct bnxt *bp =3D netdev_priv(xdp->xdp.rxq->dev); + + if (rxcmp1->rx_cmp_flags2 & cpu_to_le32(RX_CMP_FLAGS2_IP_TYPE)) + hash_type |=3D XDP_RSS_TYPE_L3_IPV6; + else + hash_type |=3D XDP_RSS_TYPE_L3_IPV4; + + if (bnxt_rss_ext_op(bp, rxcmp) =3D=3D PKT_HASH_TYPE_L4) + hash_type |=3D XDP_RSS_L4; } =20 *rss_type =3D hash_type; --=20 2.43.0 From nobody Tue Apr 7 09:05:27 2026 Received: from mail-oi1-f177.google.com (mail-oi1-f177.google.com [209.85.167.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 93219359A8C for ; Fri, 13 Mar 2026 22:31:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441088; cv=none; b=Pz3R46xRxIIPsUxgskc/ElGbwORGXPD4bDgeETs77J3z4Ljt9BjSTZj9OjO0VBJ5jwb+W0Tx/pyFSmzw+WlOyuq+z7uRClsFbM0XQ/gIhSps+JCby/SL94PXLPFyWcrtHsi373eQN01YIMp1+FpkUwmry1ZjeZIXgS/KMOVTWR0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441088; c=relaxed/simple; bh=2lzl/2RT7wIvpJF2a1jM2tWT4AtAyL3brJmMBvXZMg0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aY20WroURAKB+5yv8tvKRVrSoVGNioRRd4aOClFGgj9MI0LcXusf7gQWE0Ew8G0FFfV74Tz9UvhzWAH+WmRQ+dc92pnIJ8owz87hzkWSqwLd6R1vQo6930RkCqCM6SN+oqdO8LtGJ0AA8kwqFhiwDC4rWuXvNmUcFXQDs0SXw8A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=E7ORItEy; arc=none smtp.client-ip=209.85.167.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="E7ORItEy" Received: by mail-oi1-f177.google.com with SMTP id 5614622812f47-467166cb638so1110940b6e.2 for ; Fri, 13 Mar 2026 15:31:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1773441084; x=1774045884; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2NXcw/JA6oIFNRUPT/PH/GzRu0gFhvGGRdpsNeUi2W4=; b=E7ORItEyM52dMdxlnIexAxYhK4JI27mMzd9rrqJWPFStKar8PeLx2xdaZBWIARUu9X nhUaFpjPfByje3expdXWR9h8xloGegXmLLoy0dWwpxG9R06QqNc/UYe5Y9V4lf5qDL7D rFVAU5N316InffeHLczvveLHzSjadYPfmfRtqFJgKi3n04D1aIgyirNC8MVLMgBRPbDF yEvMvJrqaNVcE8Gba3fjCA5O6lfDLgbZrV6ooovMWxFskYk7Uhyw/6fm3c4cyLsLNIio 1MYSgyeUREGBjmzOlfvJxCvKoHBycEgtcnUK9fObO9OAwIgeciWFJ4lleCQnUHr9dVCL xuNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773441084; x=1774045884; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2NXcw/JA6oIFNRUPT/PH/GzRu0gFhvGGRdpsNeUi2W4=; b=aXB1Iztk0N3++pDO102884WnZYDQ0M1GXJFJyTRlmYXJag/8EWfEDanhiRPmHKbf2o qlk/kAqH66jT4tDamSTfG/lNw0Ys8+w3q/E2T64bgdGBDjQ7pZLfHa5vc+7E70zB1mET CdrVM4rsciCCUrBD++W4631heNU0sWB1ipHdZcKo2P61KL32vWSdUh88zEPw/BnOtn++ /eckJJfYzDm+tIVp+x6WjzmO5huV2Zm5tw3TavI6wwrzbuUgaY/KE5YvuhGjINJU9DTC hYiYSSPr6Z/jMyNLqXYnSq+AazT2cZu+Y6Q7wmZR5XwWdysrazl7PEEDO0vtu3sr78xV jHKg== X-Forwarded-Encrypted: i=1; AJvYcCVitLiOKWL6Qd/7P1WFuJSqu4ozCVyYp2GsnJNKjgqlpPFlooXMRJ5roijhLuDCgoJi+vfHyI/eaRFoY3E=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/LSLFHAbeaVaYpACNbpTco9JF2MYmjmXUEajP3V19PsCMoMTk fmWRkqrUL0ev+SunUSsiURQ5BmozkFIeTU4X3mrUSLQMCy2u0hvBnTKtBjHROvcaLN0= X-Gm-Gg: ATEYQzz8KSQvXWAAbggHOy7eR6dp8wCQEaBVC1P1rOVzQ/wai3BivGcTai1wqbK9XJp X6Gk+4WUYIFch6NcRHaK9l7KmUZmGqaeQnyFfAfLWWB9R2jwxwK4xqBZB6NXiwJAb0ReMj9lfd3 xEgm1hVIOmE/QbGx7SiUayi9aE8vi1VGWb/HeRqGcu++7eNxdVX5EL6d3CNDiq1bbXyNgw1KcV1 3PtcpZxVE4ABkMqbCxtQ53tJ7ve8+Th2NWXMI7mzErSnATiWX0gA9tgc5vWjnXzSzgeqiL/J/PN 09R82bJtpoj+xmgI7n7jvBvto36W/PT5WOEpJExESI9YPl4YxeiFP7oLK3ThzKevdwsFOFOPcpf F+BhoojF2jocv6WRS3UWV7GRD+W1hv9qVPI1lbFF7TpZ24qpsh1xcuQUOlT9p4bh1kekgaos6u8 PHy5BYX9JVA34iZs1mVFo= X-Received: by 2002:a05:6808:6f90:b0:45c:9927:3f33 with SMTP id 5614622812f47-467570a58c6mr2487530b6e.19.1773441084371; Fri, 13 Mar 2026 15:31:24 -0700 (PDT) Received: from 20HS2G4.. ([2a09:bac1:76c0:540::22f:7d]) by smtp.gmail.com with ESMTPSA id 5614622812f47-467342fab49sm5408516b6e.16.2026.03.13.15.31.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 15:31:23 -0700 (PDT) From: Chris J Arges To: Joe Damato , Jakub Kicinski , Andy Gospodarek , Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Shuah Khan , Simon Horman , Willem de Bruijn , David Wei , Daniel Zahka , Carolina Jubran , Mohsin Bashir , Chris J Arges , Dimitri Daskalakis , Nimrod Oren , Gal Pressman Cc: Petr Machata , Cosmin Ratiu , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v4 5/6] selftests: net: move common xdp.py functions into lib Date: Fri, 13 Mar 2026 17:27:35 -0500 Message-ID: <20260313223029.454755-6-carges@cloudflare.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313223029.454755-1-carges@cloudflare.com> References: <20260313223029.454755-1-carges@cloudflare.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This moves a few functions which can be useful to other python programs that manipulate XDP programs. This also refactors xdp.py to use the refactored functions. Reviewed-by: Joe Damato Signed-off-by: Chris J Arges --- v4: rebase only --- .../selftests/drivers/net/lib/py/__init__.py | 2 + tools/testing/selftests/drivers/net/xdp.py | 95 +++++-------------- .../testing/selftests/net/lib/py/__init__.py | 2 + tools/testing/selftests/net/lib/py/bpf.py | 68 +++++++++++++ 4 files changed, 95 insertions(+), 72 deletions(-) create mode 100644 tools/testing/selftests/net/lib/py/bpf.py diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools= /testing/selftests/drivers/net/lib/py/__init__.py index 374d4f08dd05..2b5ec0505672 100644 --- a/tools/testing/selftests/drivers/net/lib/py/__init__.py +++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py @@ -24,6 +24,7 @@ try: from net.lib.py import CmdExitFailure from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \ fd_read_timeout, ip, rand_port, rand_ports, wait_port_listen, wait= _file + from net.lib.py import bpf_map_set, bpf_map_dump, bpf_prog_map_ids from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \ ksft_setup, ksft_variants, KsftNamedVariant @@ -37,6 +38,7 @@ try: "bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool", "fd_read_timeout", "ip", "rand_port", "rand_ports", "wait_port_listen", "wait_file", + "bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids", "KsftSkipEx", "KsftFailEx", "KsftXfailEx", "ksft_disruptive", "ksft_exit", "ksft_pr", "ksft_run", "ksft_setup", "ksft_variants", "KsftNamedVariant", diff --git a/tools/testing/selftests/drivers/net/xdp.py b/tools/testing/sel= ftests/drivers/net/xdp.py index e54df158dfe9..10d821156db1 100755 --- a/tools/testing/selftests/drivers/net/xdp.py +++ b/tools/testing/selftests/drivers/net/xdp.py @@ -16,7 +16,8 @@ from lib.py import KsftNamedVariant, ksft_variants from lib.py import KsftFailEx, NetDrvEpEnv from lib.py import EthtoolFamily, NetdevFamily, NlError from lib.py import bkg, cmd, rand_port, wait_port_listen -from lib.py import ip, bpftool, defer +from lib.py import ip, defer +from lib.py import bpf_map_set, bpf_map_dump, bpf_prog_map_ids =20 =20 class TestConfig(Enum): @@ -122,47 +123,11 @@ def _load_xdp_prog(cfg, bpf_info): xdp_info =3D ip(f"-d link show dev {cfg.ifname}", json=3DTrue)[0] prog_info["id"] =3D xdp_info["xdp"]["prog"]["id"] prog_info["name"] =3D xdp_info["xdp"]["prog"]["name"] - prog_id =3D prog_info["id"] - - map_ids =3D bpftool(f"prog show id {prog_id}", json=3DTrue)["map_ids"] - prog_info["maps"] =3D {} - for map_id in map_ids: - name =3D bpftool(f"map show id {map_id}", json=3DTrue)["name"] - prog_info["maps"][name] =3D map_id + prog_info["maps"] =3D bpf_prog_map_ids(prog_info["id"]) =20 return prog_info =20 =20 -def format_hex_bytes(value): - """ - Helper function that converts an integer into a formatted hexadecimal = byte string. - - Args: - value: An integer representing the number to be converted. - - Returns: - A string representing hexadecimal equivalent of value, with bytes = separated by spaces. - """ - hex_str =3D value.to_bytes(4, byteorder=3D'little', signed=3DTrue) - return ' '.join(f'{byte:02x}' for byte in hex_str) - - -def _set_xdp_map(map_name, key, value): - """ - Updates an XDP map with a given key-value pair using bpftool. - - Args: - map_name: The name of the XDP map to update. - key: The key to update in the map, formatted as a hexadecimal stri= ng. - value: The value to associate with the key, formatted as a hexadec= imal string. - """ - key_formatted =3D format_hex_bytes(key) - value_formatted =3D format_hex_bytes(value) - bpftool( - f"map update name {map_name} key hex {key_formatted} value hex {va= lue_formatted}" - ) - - def _get_stats(xdp_map_id): """ Retrieves and formats statistics from an XDP map. @@ -177,25 +142,11 @@ def _get_stats(xdp_map_id): Raises: KsftFailEx: If the stats retrieval fails. """ - stats_dump =3D bpftool(f"map dump id {xdp_map_id}", json=3DTrue) - if not stats_dump: + stats =3D bpf_map_dump(xdp_map_id) + if not stats: raise KsftFailEx(f"Failed to get stats for map {xdp_map_id}") =20 - stats_formatted =3D {} - for key in range(0, 5): - val =3D stats_dump[key]["formatted"]["value"] - if stats_dump[key]["formatted"]["key"] =3D=3D XDPStats.RX.value: - stats_formatted[XDPStats.RX.value] =3D val - elif stats_dump[key]["formatted"]["key"] =3D=3D XDPStats.PASS.valu= e: - stats_formatted[XDPStats.PASS.value] =3D val - elif stats_dump[key]["formatted"]["key"] =3D=3D XDPStats.DROP.valu= e: - stats_formatted[XDPStats.DROP.value] =3D val - elif stats_dump[key]["formatted"]["key"] =3D=3D XDPStats.TX.value: - stats_formatted[XDPStats.TX.value] =3D val - elif stats_dump[key]["formatted"]["key"] =3D=3D XDPStats.ABORT.val= ue: - stats_formatted[XDPStats.ABORT.value] =3D val - - return stats_formatted + return stats =20 =20 def _test_pass(cfg, bpf_info, msg_sz): @@ -211,8 +162,8 @@ def _test_pass(cfg, bpf_info, msg_sz): prog_info =3D _load_xdp_prog(cfg, bpf_info) port =3D rand_port() =20 - _set_xdp_map("map_xdp_setup", TestConfig.MODE.value, XDPAction.PASS.va= lue) - _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port) + bpf_map_set("map_xdp_setup", TestConfig.MODE.value, XDPAction.PASS.val= ue) + bpf_map_set("map_xdp_setup", TestConfig.PORT.value, port) =20 ksft_eq(_test_udp(cfg, port, msg_sz), True, "UDP packet exchange faile= d") stats =3D _get_stats(prog_info["maps"]["map_xdp_stats"]) @@ -258,8 +209,8 @@ def _test_drop(cfg, bpf_info, msg_sz): prog_info =3D _load_xdp_prog(cfg, bpf_info) port =3D rand_port() =20 - _set_xdp_map("map_xdp_setup", TestConfig.MODE.value, XDPAction.DROP.va= lue) - _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port) + bpf_map_set("map_xdp_setup", TestConfig.MODE.value, XDPAction.DROP.val= ue) + bpf_map_set("map_xdp_setup", TestConfig.PORT.value, port) =20 ksft_eq(_test_udp(cfg, port, msg_sz), False, "UDP packet exchange shou= ld fail") stats =3D _get_stats(prog_info["maps"]["map_xdp_stats"]) @@ -305,8 +256,8 @@ def _test_xdp_native_tx(cfg, bpf_info, payload_lens): prog_info =3D _load_xdp_prog(cfg, bpf_info) port =3D rand_port() =20 - _set_xdp_map("map_xdp_setup", TestConfig.MODE.value, XDPAction.TX.valu= e) - _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port) + bpf_map_set("map_xdp_setup", TestConfig.MODE.value, XDPAction.TX.value) + bpf_map_set("map_xdp_setup", TestConfig.PORT.value, port) =20 expected_pkts =3D 0 for payload_len in payload_lens: @@ -454,15 +405,15 @@ def _test_xdp_native_tail_adjst(cfg, pkt_sz_lst, offs= et_lst): prog_info =3D _load_xdp_prog(cfg, bpf_info) =20 # Configure the XDP map for tail adjustment - _set_xdp_map("map_xdp_setup", TestConfig.MODE.value, XDPAction.TAIL_AD= JST.value) - _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port) + bpf_map_set("map_xdp_setup", TestConfig.MODE.value, XDPAction.TAIL_ADJ= ST.value) + bpf_map_set("map_xdp_setup", TestConfig.PORT.value, port) =20 for offset in offset_lst: tag =3D format(random.randint(65, 90), "02x") =20 - _set_xdp_map("map_xdp_setup", TestConfig.ADJST_OFFSET.value, offse= t) + bpf_map_set("map_xdp_setup", TestConfig.ADJST_OFFSET.value, offset) if offset > 0: - _set_xdp_map("map_xdp_setup", TestConfig.ADJST_TAG.value, int(= tag, 16)) + bpf_map_set("map_xdp_setup", TestConfig.ADJST_TAG.value, int(t= ag, 16)) =20 for pkt_sz in pkt_sz_lst: test_str =3D "".join(random.choice(string.ascii_lowercase) for= _ in range(pkt_sz)) @@ -574,8 +525,8 @@ def _test_xdp_native_head_adjst(cfg, prog, pkt_sz_lst, = offset_lst): prog_info =3D _load_xdp_prog(cfg, BPFProgInfo(prog, "xdp_native.bpf.o"= , "xdp.frags", 9000)) port =3D rand_port() =20 - _set_xdp_map("map_xdp_setup", TestConfig.MODE.value, XDPAction.HEAD_AD= JST.value) - _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port) + bpf_map_set("map_xdp_setup", TestConfig.MODE.value, XDPAction.HEAD_ADJ= ST.value) + bpf_map_set("map_xdp_setup", TestConfig.PORT.value, port) =20 hds_thresh =3D get_hds_thresh(cfg) for offset in offset_lst: @@ -595,11 +546,11 @@ def _test_xdp_native_head_adjst(cfg, prog, pkt_sz_lst= , offset_lst): test_str =3D ''.join(random.choice(string.ascii_lowercase) for= _ in range(pkt_sz)) tag =3D format(random.randint(65, 90), '02x') =20 - _set_xdp_map("map_xdp_setup", + bpf_map_set("map_xdp_setup", TestConfig.ADJST_OFFSET.value, offset) - _set_xdp_map("map_xdp_setup", TestConfig.ADJST_TAG.value, int(= tag, 16)) - _set_xdp_map("map_xdp_setup", TestConfig.ADJST_OFFSET.value, o= ffset) + bpf_map_set("map_xdp_setup", TestConfig.ADJST_TAG.value, int(t= ag, 16)) + bpf_map_set("map_xdp_setup", TestConfig.ADJST_OFFSET.value, of= fset) =20 recvd_str =3D _exchg_udp(cfg, port, test_str) =20 @@ -691,8 +642,8 @@ def test_xdp_native_qstats(cfg, act): prog_info =3D _load_xdp_prog(cfg, bpf_info) port =3D rand_port() =20 - _set_xdp_map("map_xdp_setup", TestConfig.MODE.value, act.value) - _set_xdp_map("map_xdp_setup", TestConfig.PORT.value, port) + bpf_map_set("map_xdp_setup", TestConfig.MODE.value, act.value) + bpf_map_set("map_xdp_setup", TestConfig.PORT.value, port) =20 # Discard the input, but we need a listener to avoid ICMP errors rx_udp =3D f"socat -{cfg.addr_ipver} -T 2 -u UDP-RECV:{port},reuseport= " + \ diff --git a/tools/testing/selftests/net/lib/py/__init__.py b/tools/testing= /selftests/net/lib/py/__init__.py index e0c920041a58..7c81d86a7e97 100644 --- a/tools/testing/selftests/net/lib/py/__init__.py +++ b/tools/testing/selftests/net/lib/py/__init__.py @@ -15,6 +15,7 @@ from .nsim import NetdevSim, NetdevSimDev from .utils import CmdExitFailure, fd_read_timeout, cmd, bkg, defer, \ bpftool, ip, ethtool, bpftrace, rand_port, rand_ports, wait_port_liste= n, \ wait_file, tool +from .bpf import bpf_map_set, bpf_map_dump, bpf_prog_map_ids from .ynl import NlError, NlctrlFamily, YnlFamily, \ EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily, Netlink @@ -29,6 +30,7 @@ __all__ =3D ["KSRC", "CmdExitFailure", "fd_read_timeout", "cmd", "bkg", "defer", "bpftool", "ip", "ethtool", "bpftrace", "rand_port", "rand_port= s", "wait_port_listen", "wait_file", "tool", + "bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids", "NetdevSim", "NetdevSimDev", "NetshaperFamily", "DevlinkFamily", "PSPFamily", "NlError", "YnlFamily", "EthtoolFamily", "NetdevFamily", "RtnlFamily", diff --git a/tools/testing/selftests/net/lib/py/bpf.py b/tools/testing/self= tests/net/lib/py/bpf.py new file mode 100644 index 000000000000..96b29d41c34b --- /dev/null +++ b/tools/testing/selftests/net/lib/py/bpf.py @@ -0,0 +1,68 @@ +# SPDX-License-Identifier: GPL-2.0 + +""" +BPF helper utilities for kernel selftests. + +Provides common operations for interacting with BPF maps and programs +via bpftool, used by XDP and other BPF-based test files. +""" + +from .utils import bpftool + +def format_hex_bytes(value): + """ + Helper function that converts an integer into a formatted hexadecimal = byte string. + + Args: + value: An integer representing the number to be converted. + + Returns: + A string representing hexadecimal equivalent of value, with bytes = separated by spaces. + """ + hex_str =3D value.to_bytes(4, byteorder=3D'little', signed=3DTrue) + return ' '.join(f'{byte:02x}' for byte in hex_str) + + +def bpf_map_set(map_name, key, value): + """ + Updates an XDP map with a given key-value pair using bpftool. + + Args: + map_name: The name of the XDP map to update. + key: The key to update in the map, formatted as a hexadecimal stri= ng. + value: The value to associate with the key, formatted as a hexadec= imal string. + """ + key_formatted =3D format_hex_bytes(key) + value_formatted =3D format_hex_bytes(value) + bpftool( + f"map update name {map_name} key hex {key_formatted} value hex {va= lue_formatted}" + ) + +def bpf_map_dump(map_id): + """Dump all entries of a BPF array map. + + Args: + map_id: Numeric map ID (as returned by bpftool prog show). + + Returns: + A dict mapping formatted key (int) to formatted value (int). + """ + raw =3D bpftool(f"map dump id {map_id}", json=3DTrue) + return {e["formatted"]["key"]: e["formatted"]["value"] for e in raw} + + +def bpf_prog_map_ids(prog_id): + """Get the map name-to-ID mapping for a loaded BPF program. + + Args: + prog_id: Numeric program ID. + + Returns: + A dict mapping map name (str) to map ID (int). + """ + map_ids =3D bpftool(f"prog show id {prog_id}", json=3DTrue)["map_ids"] + maps =3D {} + for mid in map_ids: + name =3D bpftool(f"map show id {mid}", json=3DTrue)["name"] + maps[name] =3D mid + return maps --=20 2.43.0 From nobody Tue Apr 7 09:05:27 2026 Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 76E4C349B02 for ; Fri, 13 Mar 2026 22:32:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441122; cv=none; b=QJep4IqjwvaLfeWWqdohWhwAAFPFxH8ey7gmkwQODr6XCigUqUlC1oNpcvoFvDdhGzJGFces+sZxwvpna+4zIEoLHCYUsb9bmbDiMkHtUyu8Cg8Wq5XbC8GIkYQeDeijVWD/bffIfXxoI03jIyIRS8ZEHrnUcFMNr4xMTpPVKso= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773441122; c=relaxed/simple; bh=wjojKKaX79Oylk4nRbk2Afn0b74BPVXORwp7GkLlWJQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q78PpfobsSkS8c/ExjqwzYF0MznEoLFZnHDnaTObIf7KJE2p6ki9bYB7KtQ3slD+OSJPWrW0Z00aL1ioi7tLEcnUxAH8mR0hIRd4lM+oTHHcVqLfWYKep3RJ0lIm1u9oovSQWOQUCuJk3r3nh4ft3IdnQh37xZcJzLDIoo4zYsI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com; spf=pass smtp.mailfrom=cloudflare.com; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b=BXRULFNf; arc=none smtp.client-ip=209.85.167.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cloudflare.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cloudflare.com header.i=@cloudflare.com header.b="BXRULFNf" Received: by mail-oi1-f174.google.com with SMTP id 5614622812f47-467166cb638so1111078b6e.2 for ; Fri, 13 Mar 2026 15:32:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cloudflare.com; s=google09082023; t=1773441119; x=1774045919; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2y5EWQGYuEN/ZCflQeFgRrVsCOx6mBcfWBilIa1oha8=; b=BXRULFNf5tftUe/TelKc+3Ff5dkLAcFvEC55K2Kc4/xs/dSSt1l5EVvqMLbl0530OY WaWWqJ7lMkXaZ4Rhqo9NPlRTKGwZwryjvZ2WfEUfpPsvIFfrTUXBahRyTa28irPtNQOj +GR+eZZJLR6EuJ7MXF6gE7b4v4CKyZnxeOa7CrkDTO5S1JfQiYl8Uh8JPOMZFaYUng9z s7sod3U9+QtWrOsN339jfwlW7YF5kCOfbvAdG6LRRhqiNS+kkU54AW3uxXfGfVXMMnh9 lRuzgXLrBw+qc0eEDYvt5gdVKI4f9THEd78Vy0kLLutQPoNfO4KDZWzzcb44ZyvKkFmO jX9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773441119; x=1774045919; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2y5EWQGYuEN/ZCflQeFgRrVsCOx6mBcfWBilIa1oha8=; b=QMApMzL3hLcd90q0yGmUoEK4EzOrdqvD+HymeMp2m2FeV5FBUmK/Rwc/kqAMrPcDSy jiubNbxNA9rxU6eqTN/a1J0QElPf9kuyuuOtlq5WdnVWe/y0FshYGXn5p1rjI/s1gh/F CQqMTUlQt4xIML+XQbSTrTWddFwOhq61pYeeJ4bo9ZhfITyENLbVFdzC0SvH9lfLOPtX odTydRHY9yFBqjuQY0mYUzhlLIsd7h2RdfsrfL7xhAgwDgC7WqgHl6iU3XdXlNAwxPLL HMNFHxPsrz7OM3EqxtORDCJtj5iFQxBfnkt/DdPbN7pN2r76TFtvcaTM7Mc6sAW4mDLJ V7dw== X-Forwarded-Encrypted: i=1; AJvYcCW+LVZ8XbWIsgtV/IcqFny1tAgAY5g9oz3dJBkAtfFQttX0t2jYJXDKtA/YMWskPIfwixA0zHTiBvnXzho=@vger.kernel.org X-Gm-Message-State: AOJu0YyMuF0gX2OqK16G6DowFE37h6wCeHDcdAdHw1aucriXGqVA9woM 33uks93SdLMunfpFifHv46xP4Orl6BmKEGxmeHbd/tvQq41E1QJXGuhm1nVUxnxSpG0= X-Gm-Gg: ATEYQzwhip6vxVHWu29DlmNVjq6TclrL0PRRfSI5bu+bdYJYZqfJamV+xOcmNW6p+Kq AjJe6nxvE180gthjEspRvfmlFCYPI0ZtSUJWFXKpiJFAeLtz4DaDKHe61Db6Fm8qAzmH7ln9NGZ AMiWGkQKBz7tPOghsH4d9tLkXBrnCyJaB2NFeYgs7eWzBmUVzYoVupOTbknoMmgT5peVtsQnrvk 2slkNJj6GBS+pjF8saFV2Xk2MDyvku+Nu8Ulv9JmrzIOYc8Bc/g6av3FDO+PcM4UEecUo95rZIu qdjbxxC+lkukOzOPMwW+dNXChdlz20X1qHAOk3gMYf7TsfVs0ajvlQwZhnkQYH4aBrlq6tqz9OX kPBcTqbnVfhoO24kan0eKyPKgmTv+kIGaKSjMQ6pr8zmI1cvsWDJp1ukMAx+IMb4IKXTs4EK5Ca 4InG77OUxT X-Received: by 2002:a05:6808:5241:b0:466:f57b:2ad2 with SMTP id 5614622812f47-467572f2c66mr2275298b6e.31.1773441119188; Fri, 13 Mar 2026 15:31:59 -0700 (PDT) Received: from 20HS2G4.. ([2a09:bac1:76c0:540::22f:7d]) by smtp.gmail.com with ESMTPSA id 5614622812f47-467342fab49sm5408516b6e.16.2026.03.13.15.31.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 15:31:57 -0700 (PDT) From: Chris J Arges To: Joe Damato , Jakub Kicinski , Andy Gospodarek , Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Shuah Khan , Simon Horman , Willem de Bruijn , Petr Machata , David Wei , Chris J Arges , Vadim Fedorenko , Carolina Jubran , Nimrod Oren , Gal Pressman , Dimitri Daskalakis Cc: Bui Quang Minh , Daniel Zahka , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v4 6/6] selftests: drv-net: xdp: Add rss_hash metadata tests Date: Fri, 13 Mar 2026 17:27:36 -0500 Message-ID: <20260313223029.454755-7-carges@cloudflare.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260313223029.454755-1-carges@cloudflare.com> References: <20260313223029.454755-1-carges@cloudflare.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This test loads xdp_metadata.bpf which calls bpf_xdp_metadata_rx_hash() on incoming packets. The metadata from that packet is then sent to a BPF map for validation. It borrows structure from xdp.py, reusing common functions. The test checks the device's xdp-rx-metadata-features via netlink before running and skips on devices that do not advertise hash support. This can be run on veth devices as well as real hardware. The test is fairly simple and just verifies that a TCP or UDP packet can be identified as an L4 flow. This minimal test also passes if run on a veth device. Signed-off-by: Chris J Arges --- .../testing/selftests/drivers/net/hw/Makefile | 1 + .../drivers/net/hw/lib/py/__init__.py | 2 + .../selftests/drivers/net/hw/xdp_metadata.py | 146 ++++++++++++++++ .../selftests/net/lib/xdp_metadata.bpf.c | 163 ++++++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 tools/testing/selftests/drivers/net/hw/xdp_metadata.py create mode 100644 tools/testing/selftests/net/lib/xdp_metadata.bpf.c diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index 91df028abfc0..fa933ce94400 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -41,6 +41,7 @@ TEST_PROGS =3D \ rss_input_xfrm.py \ toeplitz.py \ tso.py \ + xdp_metadata.py \ xsk_reconfig.py \ # =20 diff --git a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py b/to= ols/testing/selftests/drivers/net/hw/lib/py/__init__.py index b8d9ae282390..df4da5078c48 100644 --- a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py +++ b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py @@ -25,6 +25,7 @@ try: from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \ fd_read_timeout, ip, rand_port, rand_ports, wait_port_listen, \ wait_file, tool + from net.lib.py import bpf_map_set, bpf_map_dump, bpf_prog_map_ids from net.lib.py import KsftSkipEx, KsftFailEx, KsftXfailEx from net.lib.py import ksft_disruptive, ksft_exit, ksft_pr, ksft_run, \ ksft_setup, ksft_variants, KsftNamedVariant @@ -40,6 +41,7 @@ try: "bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool", "fd_read_timeout", "ip", "rand_port", "rand_ports", "wait_port_listen", "wait_file", "tool", + "bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids", "KsftSkipEx", "KsftFailEx", "KsftXfailEx", "ksft_disruptive", "ksft_exit", "ksft_pr", "ksft_run", "ksft_setup", "ksft_variants", "KsftNamedVariant", diff --git a/tools/testing/selftests/drivers/net/hw/xdp_metadata.py b/tools= /testing/selftests/drivers/net/hw/xdp_metadata.py new file mode 100644 index 000000000000..33a1985356d9 --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/xdp_metadata.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 + +""" +Tests for XDP metadata kfuncs (e.g. bpf_xdp_metadata_rx_hash). + +These tests load device-bound XDP programs from xdp_metadata.bpf.o +that call metadata kfuncs, send traffic, and verify the extracted +metadata via BPF maps. +""" +from lib.py import ksft_run, ksft_eq, ksft_exit, ksft_ge, ksft_ne, ksft_pr +from lib.py import KsftNamedVariant, ksft_variants +from lib.py import CmdExitFailure, KsftSkipEx, NetDrvEpEnv +from lib.py import NetdevFamily +from lib.py import bkg, cmd, rand_port, wait_port_listen +from lib.py import ip, bpftool, defer +from lib.py import bpf_map_set, bpf_map_dump, bpf_prog_map_ids + + +def _load_xdp_metadata_prog(cfg, prog_name, bpf_file=3D"xdp_metadata.bpf.o= "): + """Load a device-bound XDP metadata program and return prog/map info. + + Returns: + dict with 'id', 'name', and 'maps' (name -> map_id). + """ + abs_path =3D cfg.net_lib_dir / bpf_file + pin_dir =3D "/sys/fs/bpf/xdp_metadata_test" + + cmd(f"rm -rf {pin_dir}", shell=3DTrue, fail=3DFalse) + cmd(f"mkdir -p {pin_dir}", shell=3DTrue) + + try: + bpftool(f"prog loadall {abs_path} {pin_dir} type xdp " + f"xdpmeta_dev {cfg.ifname}") + except CmdExitFailure as e: + cmd(f"rm -rf {pin_dir}", shell=3DTrue, fail=3DFalse) + raise KsftSkipEx( + f"Failed to load device-bound XDP program '{prog_name}'" + ) from e + defer(cmd, f"rm -rf {pin_dir}", shell=3DTrue, fail=3DFalse) + + pin_path =3D f"{pin_dir}/{prog_name}" + ip(f"link set dev {cfg.ifname} xdpdrv pinned {pin_path}") + defer(ip, f"link set dev {cfg.ifname} xdpdrv off") + + xdp_info =3D ip(f"-d link show dev {cfg.ifname}", json=3DTrue)[0] + prog_id =3D xdp_info["xdp"]["prog"]["id"] + + return {"id": prog_id, + "name": xdp_info["xdp"]["prog"]["name"], + "maps": bpf_prog_map_ids(prog_id)} + + +def _send_probe(cfg, port, proto=3D"tcp"): + """Send a single payload from the remote end using socat. + + Args: + cfg: Configuration object containing network settings. + port: Port number for the exchange. + proto: Protocol to use, either "tcp" or "udp". + """ + cfg.require_cmd("socat", remote=3DTrue) + + if proto =3D=3D "tcp": + rx_cmd =3D f"socat -{cfg.addr_ipver} -T 2 TCP-LISTEN:{port},reusep= ort STDOUT" + tx_cmd =3D f"echo -n rss_hash_test | socat -t 2 -u STDIN TCP:{cfg.= baddr}:{port}" + else: + rx_cmd =3D f"socat -{cfg.addr_ipver} -T 2 -u UDP-RECV:{port},reuse= port STDOUT" + tx_cmd =3D f"echo -n rss_hash_test | socat -t 2 -u STDIN UDP:{cfg.= baddr}:{port}" + + with bkg(rx_cmd, exit_wait=3DTrue): + wait_port_listen(port, proto=3Dproto) + cmd(tx_cmd, host=3Dcfg.remote, shell=3DTrue) + + +# BPF map keys matching the enums in xdp_metadata.bpf.c +_SETUP_KEY_PORT =3D 1 + +_RSS_KEY_HASH =3D 0 +_RSS_KEY_TYPE =3D 1 +_RSS_KEY_PKT_CNT =3D 2 +_RSS_KEY_ERR_CNT =3D 3 + +XDP_RSS_L4 =3D 0x8 # BIT(3) from enum xdp_rss_hash_type + + +@ksft_variants([ + KsftNamedVariant("tcp", "tcp"), + KsftNamedVariant("udp", "udp"), +]) +def test_xdp_rss_hash(cfg, proto): + """Test RSS hash metadata extraction via bpf_xdp_metadata_rx_hash(). + + This test will only run on devices that support xdp-rx-metadata-featur= es. + + Loads the xdp_rss_hash program from xdp_metadata, sends a packet using + the specified protocol, and verifies that the program extracted a non-= zero + hash with an L4 hash type. + """ + dev_info =3D cfg.netnl.dev_get({"ifindex": cfg.ifindex}) + rx_meta =3D dev_info.get("xdp-rx-metadata-features", []) + if "hash" not in rx_meta: + raise KsftSkipEx("device does not support XDP rx hash metadata") + + prog_info =3D _load_xdp_metadata_prog(cfg, "xdp_rss_hash") + + port =3D rand_port() + bpf_map_set("map_xdp_setup", _SETUP_KEY_PORT, port) + + rss_map_id =3D prog_info["maps"]["map_rss"] + + _send_probe(cfg, port, proto=3Dproto) + + rss =3D bpf_map_dump(rss_map_id) + + pkt_cnt =3D rss.get(_RSS_KEY_PKT_CNT, 0) + err_cnt =3D rss.get(_RSS_KEY_ERR_CNT, 0) + hash_val =3D rss.get(_RSS_KEY_HASH, 0) + hash_type =3D rss.get(_RSS_KEY_TYPE, 0) + + ksft_ge(pkt_cnt, 1, comment=3D"should have received at least one packe= t") + ksft_eq(err_cnt, 0, comment=3Df"RSS hash error count: {err_cnt}") + + ksft_ne(hash_val, 0, + f"RSS hash should be non-zero for {proto.upper()} traffic") + ksft_pr(f" RSS hash: {hash_val:#010x}") + + ksft_pr(f" RSS hash type: {hash_type:#06x}") + ksft_ne(hash_type & XDP_RSS_L4, 0, + f"RSS hash type should include L4 for {proto.upper()} traffic") + + +def main(): + """Run XDP metadata kfunc tests against a real device.""" + with NetDrvEpEnv(__file__) as cfg: + cfg.netnl =3D NetdevFamily() + ksft_run( + [ + test_xdp_rss_hash, + ], + args=3D(cfg,)) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() diff --git a/tools/testing/selftests/net/lib/xdp_metadata.bpf.c b/tools/tes= ting/selftests/net/lib/xdp_metadata.bpf.c new file mode 100644 index 000000000000..f71f59215239 --- /dev/null +++ b/tools/testing/selftests/net/lib/xdp_metadata.bpf.c @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + XDP_PORT =3D 1, + XDP_PROTO =3D 4, +} xdp_map_setup_keys; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 5); + __type(key, __u32); + __type(value, __s32); +} map_xdp_setup SEC(".maps"); + +/* RSS hash results: key 0 =3D hash, key 1 =3D hash type, + * key 2 =3D packet count, key 3 =3D error count. + */ +enum { + RSS_KEY_HASH =3D 0, + RSS_KEY_TYPE =3D 1, + RSS_KEY_PKT_CNT =3D 2, + RSS_KEY_ERR_CNT =3D 3, +}; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __type(key, __u32); + __type(value, __u32); + __uint(max_entries, 4); +} map_rss SEC(".maps"); + +/* Mirror of enum xdp_rss_hash_type from include/net/xdp.h. + * Needed because the enum is not part of UAPI headers. + */ +enum xdp_rss_hash_type { + XDP_RSS_L3_IPV4 =3D 1U << 0, + XDP_RSS_L3_IPV6 =3D 1U << 1, + XDP_RSS_L3_DYNHDR =3D 1U << 2, + XDP_RSS_L4 =3D 1U << 3, + XDP_RSS_L4_TCP =3D 1U << 4, + XDP_RSS_L4_UDP =3D 1U << 5, + XDP_RSS_L4_SCTP =3D 1U << 6, + XDP_RSS_L4_IPSEC =3D 1U << 7, + XDP_RSS_L4_ICMP =3D 1U << 8, +}; + +extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, __u32 *hash, + enum xdp_rss_hash_type *rss_type) __ksym; + +static __always_inline __u16 get_dest_port(void *l4, void *data_end, + __u8 protocol) +{ + if (protocol =3D=3D IPPROTO_UDP) { + struct udphdr *udp =3D l4; + + if ((void *)(udp + 1) > data_end) + return 0; + return udp->dest; + } else if (protocol =3D=3D IPPROTO_TCP) { + struct tcphdr *tcp =3D l4; + + if ((void *)(tcp + 1) > data_end) + return 0; + return tcp->dest; + } + + return 0; +} + +SEC("xdp") +int xdp_rss_hash(struct xdp_md *ctx) +{ + void *data_end =3D (void *)(long)ctx->data_end; + void *data =3D (void *)(long)ctx->data; + enum xdp_rss_hash_type rss_type =3D 0; + struct ethhdr *eth =3D data; + __u8 l4_proto =3D 0; + __u32 hash =3D 0; + __u32 key, val; + void *l4 =3D NULL; + __u32 *cnt; + int ret; + + if ((void *)(eth + 1) > data_end) + return XDP_PASS; + + if (eth->h_proto =3D=3D bpf_htons(ETH_P_IP)) { + struct iphdr *iph =3D (void *)(eth + 1); + + if ((void *)(iph + 1) > data_end) + return XDP_PASS; + l4_proto =3D iph->protocol; + l4 =3D (void *)(iph + 1); + } else if (eth->h_proto =3D=3D bpf_htons(ETH_P_IPV6)) { + struct ipv6hdr *ip6h =3D (void *)(eth + 1); + + if ((void *)(ip6h + 1) > data_end) + return XDP_PASS; + l4_proto =3D ip6h->nexthdr; + l4 =3D (void *)(ip6h + 1); + } + + if (!l4) + return XDP_PASS; + + /* Filter on the configured protocol (map_xdp_setup key XDP_PROTO). + * When set, only process packets matching the requested L4 protocol. + */ + key =3D XDP_PROTO; + __s32 *proto_cfg =3D bpf_map_lookup_elem(&map_xdp_setup, &key); + + if (proto_cfg && *proto_cfg !=3D 0 && l4_proto !=3D (__u8)*proto_cfg) + return XDP_PASS; + + /* Filter on the configured port (map_xdp_setup key XDP_PORT). + * Only applies to protocols with ports (UDP, TCP). + */ + key =3D XDP_PORT; + __s32 *port_cfg =3D bpf_map_lookup_elem(&map_xdp_setup, &key); + + if (port_cfg && *port_cfg !=3D 0) { + __u16 dest =3D get_dest_port(l4, data_end, l4_proto); + + if (!dest || bpf_ntohs(dest) !=3D (__u16)*port_cfg) + return XDP_PASS; + } + + ret =3D bpf_xdp_metadata_rx_hash(ctx, &hash, &rss_type); + if (ret < 0) { + key =3D RSS_KEY_ERR_CNT; + cnt =3D bpf_map_lookup_elem(&map_rss, &key); + if (cnt) + __sync_fetch_and_add(cnt, 1); + return XDP_PASS; + } + + key =3D RSS_KEY_HASH; + bpf_map_update_elem(&map_rss, &key, &hash, BPF_ANY); + + key =3D RSS_KEY_TYPE; + val =3D (__u32)rss_type; + bpf_map_update_elem(&map_rss, &key, &val, BPF_ANY); + + key =3D RSS_KEY_PKT_CNT; + cnt =3D bpf_map_lookup_elem(&map_rss, &key); + if (cnt) + __sync_fetch_and_add(cnt, 1); + + return XDP_PASS; +} + +char _license[] SEC("license") =3D "GPL"; --=20 2.43.0