Hi, this series implements the receiver-side requirements for TCP window retraction as specified in RFC 7323 and adds packetdrill tests to cover the new behavior.
It addresses a regression with somewhat complex causes; see my message "Re: [regression] [PATCH net-next 7/8] tcp: stronger sk_rcvbuf checks" (https://lkml.kernel.org/netdev/[email protected]/). Please see the first patch for background and implementation details. This is an RFC because a few open questions remain: - Placement of the new rcv_mwnd_seq field in tcp_sock: rcv_mwnd_seq is updated together with rcv_wup and rcv_wnd in tcp_select_window(). However, rcv_wup is documented as RX read_write only (even though it is updated in tcp_select_window()), and rcv_wnd is TX read_write / RX read_mostly. rcv_mwnd_seq is only updated in tcp_select_window(). If we count tcp_sequence() as fast path, it is read in the fast path. Therefore, the proposal is to put rcv_mwnd_seq in rcv_wnd's cacheline group. - In tcp_minisocks.c, it is not clear to me whether we should change "tcptw->tw_rcv_wnd = tcp_receive_window(tp)" to "tcptw->tw_rcv_wnd = tcp_max_receive_window(tp)". I could not find a case where this makes a practical difference and have left the existing behavior unchanged. - MPTCP seems to modify tp->rcv_wnd of subflows. And the modifications look odd: 1. It is updated in the RX path. Since we never advertised that value, we shouldn't need to update rcv_mwnd_seq. 2. In the TX path, there is: tp->rcv_wnd = min_t(u64, win, U32_MAX); To me, that looks very wrong and that code might need to be fixed first. - Although this series addresses a regression triggered by commit d2fbaad7cd8 ("tcp: stronger sk_rcvbuf checks") the underlying problem is shrinking the window. Thus, I added "Fixes" headers for the commits that introduced window shrinking. I would appreciate feedback on the overall approach and on these questions. Signed-off-by: Simon Baatz <[email protected]> --- Changes in v2: - tcp_rcv_wnd_shrink_nomem.pkt tests more RX code paths using various segment types. It also uses a more drastic rcv. buffer reduction (1MB to 16KB). - Setting the TCP_REPAIR_WINDOW socket option initializes rcv_mwnd_seq. - SKB_DROP_REASON_TCP_OVERWINDOW increases LINUX_MIB_BEYOND_WINDOW now. - Moved rcv_mwnd_seq into rcv_wnd's cacheline group. - Small editorial changes - Link to v1: https://lore.kernel.org/r/[email protected] --- Simon Baatz (5): tcp: implement RFC 7323 window retraction receiver requirements tcp: increase LINUX_MIB_BEYOND_WINDOW for SKB_DROP_REASON_TCP_OVERWINDOW selftests/net: packetdrill: add tcp_rcv_wnd_shrink_nomem.pkt selftests/net: packetdrill: add tcp_rcv_wnd_shrink_allowed.pkt selftests/net: packetdrill: add tcp_rcv_neg_window.pkt .../networking/net_cachelines/tcp_sock.rst | 1 + include/linux/tcp.h | 3 + include/net/tcp.h | 13 ++ net/ipv4/tcp.c | 1 + net/ipv4/tcp_fastopen.c | 1 + net/ipv4/tcp_input.c | 7 +- net/ipv4/tcp_minisocks.c | 1 + net/ipv4/tcp_output.c | 12 ++ .../net/packetdrill/tcp_rcv_big_endseq.pkt | 2 +- .../net/packetdrill/tcp_rcv_neg_window.pkt | 26 ++++ .../net/packetdrill/tcp_rcv_wnd_shrink_allowed.pkt | 40 ++++++ .../net/packetdrill/tcp_rcv_wnd_shrink_nomem.pkt | 141 +++++++++++++++++++++ 12 files changed, 245 insertions(+), 3 deletions(-) --- base-commit: 2f61f38a217462411fed950e843b82bc119884cf change-id: 20260220-tcp_rfc7323_retract_wnd_rfc-c8a2d2baebde Best regards, -- Simon Baatz <[email protected]>

