From: Stanislav Fomichev <sdf.kernel@gmail.com>
To: Willem Ferguson <wferguson@cloudflare.com>
Cc: netdev@vger.kernel.org, davem@davemloft.net, edumazet@kernel.org,
kuba@kernel.org, pabeni@redhat.com, ncardwell@google.com,
bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net,
andrii@kernel.org, eddyz87@gmail.com, memxor@gmail.com,
linux-doc@vger.kernel.org, corbet@lwn.net,
linux-kselftest@vger.kernel.org, shuah@kernel.org,
linux-kernel@vger.kernel.org, kernel-team@cloudflare.com
Subject: Re: [RFC PATCH net-next 0/4] tcp: carry a BPF-chosen identifier in TSval low bits
Date: Thu, 15 Oct 2026 14:45:02 -0700 [thread overview]
Message-ID: <atFI9vl5hy09Dc0t@devvm7509.cco0.facebook.com> (raw)
In-Reply-To: <20261013103906.2660384-1-wferguson@cloudflare.com>
On 10/13, Willem Ferguson wrote:
> This series lets a listener encode a small per-connection identifier in
> the low bits of the TCP timestamp values it sends. The peer echoes TSval
> back in TSecr, so every segment the peer sends after the handshake
> carries the identifier in its TSecr.
>
> In Anycast networks, mid-stream path changes caused by BGP route flapping
> or ECMP shifts frequently deliver active TCP packets to an ingress Point
> of Presence (PoP) that lacks the flow's socket state, resulting in abrupt
> connection resets (RST). While protocols like QUIC avoid this using explicit
> Connection IDs, TCP lacks an in-band routing token to help ingress
> nodes identify where a flow actually lives. To address this problem,
> we propose embedding an N-bit data center ID into the lower-order bits
> of the TCP Timestamp option (TSval, RFC 7323), allowing edge load balancers
> to recognize misdirected packets and steer them to the correct origin data
> center holding the active session.
>
> How it works:
>
> - tcp_ts_id_bits (per netns, 0..8, default 0) sets how many low TSval
> bits are reserved. The millisecond clock is shifted up by that many
> bits.
> - A sock_ops program opts a listener in with
> BPF_SOCK_OPS_TCP_TS_ID_CB_FLAG and is called with
> BPF_SOCK_OPS_TCP_TS_ID_CB for each SYN, before the SYN-ACK is sent.
> It sees the SYN and optionally returns the identifier
> - The identifier and width are stored in the request socket, then in
> the full and timewait sockets. Incoming TSecr values are decoded
> before RTT estimation and PAWS use them.
> - TCP_TS_ID reads back the identifier, and /proc/net/netstat gains
> TCPTSIdAssigned, TCPTSIdDeclined, TCPTSIdSkipped and
> TCPTSIdEchoMismatch.
>
> RTT estimation on the encoding host sees the same decoded timestamps
> as before, so they are unchanged. On the peer, PAWS keeps working too;
> the only effects are a shorter idle limit and a narrower tolerance for
> reordered segments, both described below.
>
> Scope and limitations:
>
> - Passive opens only. SYN cookies, microsecond timestamps and peers
> without timestamps are left unencoded.
> - The peer sees a clock running 2^bits times faster. That narrows the
> real-time span of its PAWS window, so the width should be no larger
> than the identifiers need.
> - Peers that keep ts_recent for the RFC 7323 24 days (e.g. FreeBSD,
> macOS) stall connections that stay idle longer than 24.8/2^bits days
> (about 37 hours at 4 bits). Linux peers stop enforcing PAWS after
> TCP_PAWS_WRAP and are unaffected.
> - TCP_REPAIR cannot restore the identifier, so hosts that migrate
> established connections should leave the feature off.
>
> All of this is documented under tcp_ts_id_bits in ip-sysctl.rst. With
> the sysctl at 0 (the default) the only new cost on the established fast
> path is one likely() branch when parsing TSecr.
>
> Questions for reviewers:
>
> 1. Is encoding an identifier in the low bits of TSval acceptable in
> principle, given the trade-offs above?
> 2. If so, what feedback do you have on the implementation?
Don't see any feedback yet, so from the top of my head: looks like you
control two sides of the communication, so why not a custom (bpf) tcp option?
Would you need that on every packet and it makes it expensive?
Or any other field you can abuse maybe? IPv6 Flow label?
Implementation-wise, the sock_ops is going away in favor of bpf_tcp_ops,
so BPF_SOCK_OPS_TCP_TS_ID_CB_FLAG is a no go.
next prev parent reply other threads:[~2026-10-15 21:45 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 10:39 [RFC PATCH net-next 0/4] tcp: carry a BPF-chosen identifier in TSval low bits Willem Ferguson
2026-10-13 10:39 ` [RFC PATCH net-next 1/4] tcp: add plumbing to carry an " Willem Ferguson
2026-10-13 10:39 ` [RFC PATCH net-next 2/4] tcp: add BPF_SOCK_OPS_TCP_TS_ID_CB to assign a TSval identifier Willem Ferguson
2026-10-14 10:39 ` sashiko-bot
2026-10-14 17:50 ` Jakub Sitnicki
2026-10-15 12:12 ` Jason Xing
2026-10-13 10:39 ` [RFC PATCH net-next 3/4] tcp: add TCP_TS_ID socket option Willem Ferguson
2026-10-14 10:39 ` sashiko-bot
2026-10-13 10:39 ` [RFC PATCH net-next 4/4] selftests/bpf: add tcp_ts_id test Willem Ferguson
2026-10-15 21:45 ` Stanislav Fomichev [this message]
2026-10-19 9:20 ` [RFC PATCH net-next 0/4] tcp: carry a BPF-chosen identifier in TSval low bits Jakub Sitnicki
2026-10-20 17:58 ` Stanislav Fomichev
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=atFI9vl5hy09Dc0t@devvm7509.cco0.facebook.com \
--to=sdf.kernel@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=eddyz87@gmail.com \
--cc=edumazet@kernel.org \
--cc=kernel-team@cloudflare.com \
--cc=kuba@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=memxor@gmail.com \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
--cc=wferguson@cloudflare.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.