From: Daniel Zahka <daniel.zahka@gmail.com>
To: Eric Dumazet <edumazet@google.com>,
"David S . Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>
Cc: Simon Horman <horms@kernel.org>,
netdev@vger.kernel.org, eric.dumazet@gmail.com,
Raed Salem <raeds@nvidia.com>,
Rahul Rameshbabu <rrameshbabu@nvidia.com>,
Cosmin Ratiu <cratiu@nvidia.com>,
Willem de Bruijn <willemb@google.com>
Subject: Re: [PATCH net] psp: use sk->sk_hash in psp_write_headers()
Date: Wed, 18 Feb 2026 12:55:09 -0500 [thread overview]
Message-ID: <24fb96ca-042c-46ce-93cd-a6c2ce710795@gmail.com> (raw)
In-Reply-To: <20260218141337.999945-1-edumazet@google.com>
On 2/18/26 9:13 AM, Eric Dumazet wrote:
> udp_flow_src_port() is indirectly using sk->sk_txhash as a base,
> because __tcp_transmit_skb() uses skb_set_hash_from_sk().
>
> This is problematic because this field can change over the
> lifetime of a TCP flow, thanks to calls to sk_rethink_txhash().
>
> Problem is that some NIC might (ab)use the PSP UDP source port in their
> RSS computation, and PSP packets for a given flow could jump
> from one queue to another.
>
> In order to avoid surprises, it is safer to let Protective Load
> Balancing (PLB) get its entropy from the IPv6 flowlabel,
> and change psp_write_headers() to use sk->sk_hash which
> does not change for the duration of the flow.
>
> We might add a sysctl to select the behavior, if there
> is a need for it.
>
> Fixes: fc724515741a ("psp: provide encapsulation helper for drivers")
> Signed-off-by: Eric Dumazet <edumazet@google.com>
> ---
> Cc: Raed Salem <raeds@nvidia.com>
> Cc: Rahul Rameshbabu <rrameshbabu@nvidia.com>
> Cc: Cosmin Ratiu <cratiu@nvidia.com>
> Cc: Daniel Zahka <daniel.zahka@gmail.com>
> Cc: Willem de Bruijn <willemb@google.com>
> ---
> net/psp/psp_main.c | 39 ++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/net/psp/psp_main.c b/net/psp/psp_main.c
> index a8534124f62669cf8b3611d5352e3827982d871d..066222eb56c4af187791445f30a70443aef8a6d8 100644
> --- a/net/psp/psp_main.c
> +++ b/net/psp/psp_main.c
> @@ -166,9 +166,46 @@ static void psp_write_headers(struct net *net, struct sk_buff *skb, __be32 spi,
> {
> struct udphdr *uh = udp_hdr(skb);
> struct psphdr *psph = (struct psphdr *)(uh + 1);
> + const struct sock *sk = skb->sk;
>
> uh->dest = htons(PSP_DEFAULT_UDP_PORT);
> - uh->source = udp_flow_src_port(net, skb, 0, 0, false);
> +
> + /* A bit of theory: Selection of the source port.
> + *
> + * We need some entropy, so that multiple flows use different
> + * source ports for better RSS spreading at the receiver.
> + *
> + * We also need that all packets belonging to one TCP flow
> + * use the same source port through their duration,
> + * so that all these packets land in the same receive queue.
> + *
> + * udp_flow_src_port() is using sk_txhash, inherited from
> + * skb_set_hash_from_sk() call in __tcp_transmit_skb().
> + * This field is subject to reshuffling, thanks to
> + * sk_rethink_txhash() calls in various TCP functions.
> + *
> + * Instead, use sk->sk_hash which is constant through
> + * the whole flow duration.
> + */
> + if (likely(sk)) {
> + u32 hash = sk->sk_hash;
> + int min, max;
> +
> + /* These operations are cheap, no need to cache the result
> + * in another socket field.
> + */
> + inet_get_local_port_range(net, &min, &max);
> + /* Since this is being sent on the wire obfuscate hash a bit
> + * to minimize possibility that any useful information to an
> + * attacker is leaked. Only upper 16 bits are relevant in the
> + * computation for 16 bit port value because we use a
> + * reciprocal divide.
> + */
> + hash ^= hash << 16;
> + uh->source = htons((((u64)hash * (max - min)) >> 32) + min);
> + } else {
> + uh->source = udp_flow_src_port(net, skb, 0, 0, false);
> + }
> uh->check = 0;
> uh->len = htons(udp_len);
>
Thanks. The PSP spec suggests in multiple places the that udp sport be a
hash derived from "inner header fields", so sk->sk_hash fits that
description better than sk->sk_txhash regardless of RSS use/abuse
categorization.
It occurs to me now that fc724515741a ("psp: provide encapsulation
helper for drivers") also has a bug of unused udp sport parameter. I can
send a fix for that later, unless you want to remove that as well.
Reviewed-By: Daniel Zahka <daniel.zahka@gmail.com>
next prev parent reply other threads:[~2026-02-18 17:55 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-18 14:13 [PATCH net] psp: use sk->sk_hash in psp_write_headers() Eric Dumazet
2026-02-18 17:55 ` Daniel Zahka [this message]
2026-02-18 18:02 ` Eric Dumazet
2026-02-19 22:30 ` patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=24fb96ca-042c-46ce-93cd-a6c2ce710795@gmail.com \
--to=daniel.zahka@gmail.com \
--cc=cratiu@nvidia.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eric.dumazet@gmail.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=raeds@nvidia.com \
--cc=rrameshbabu@nvidia.com \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox