Since psp_sk_overhead() is added to icsk->icsk_ext_hdr_len,
which is subtracted after clamping in __tcp_mtu_to_mss(),
it is impossible to configure a route that both PSP and
non-PSP achieve 4K MSS for TCP_ZEROCOPY_RECEIVE.
mtu 4220 advmss 4108
-> non-PSP gets 4K MSS, but PSP gets 4056, breaking
TCP_ZEROCOPY_RECEIVE
mtu 4220 advmss 4148
-> PSP gets 4K MSS, but non-PSP gets 4136, spilling over
4K and also breaking TCP_ZEROCOPY_RECEIVE
This series subtracts the PSP overhead before clamping to
let both flows share the same mtu and advmss to get 4K MSS.
Google's original PSP implementation has been doing that for
years to allow both flows to coexist on the same machine.
Kuniyuki Iwashima (2):
psp: Check pas->tx.spi in psp_sk_overhead().
tcp: Subtract psp_sk_overhead() in __tcp_mtu_to_mss() and
tcp_mss_to_mtu().
include/net/psp/functions.h | 4 ++--
net/ipv4/tcp_output.c | 14 +++++++++-----
net/ipv6/ipv6_sockglue.c | 2 --
net/psp/psp_sock.c | 2 +-
4 files changed, 12 insertions(+), 10 deletions(-)
--
2.56.0.385.gac671c819a-goog