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.
prev parent reply other threads:[~2026-10-15 21:45 UTC|newest]
Thread overview: 8+ 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 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-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]
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox