Commit 77a4fdf4 authored by Ilpo Järvinen's avatar Ilpo Järvinen Committed by Paolo Abeni
Browse files

tcp: sack option handling improvements



1) Don't early return when sack doesn't fit. AccECN code will be
   placed after this fragment so no early returns please.

2) Make sure opts->num_sack_blocks is not left undefined. E.g.,
   tcp_current_mss() does not memset its opts struct to zero.
   AccECN code checks if SACK option is present and may even
   alter it to make room for AccECN option when many SACK blocks
   are present. Thus, num_sack_blocks needs to be always valid.

Signed-off-by: default avatarIlpo Järvinen <ij@kernel.org>
Signed-off-by: default avatarChia-Yu Chang <chia-yu.chang@nokia-bell-labs.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20250916082434.100722-6-chia-yu.chang@nokia-bell-labs.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent a92543d5
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -985,10 +985,8 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb
	eff_sacks = tp->rx_opt.num_sacks + tp->rx_opt.dsack;
	if (unlikely(eff_sacks)) {
		const unsigned int remaining = MAX_TCP_OPTION_SPACE - size;
		if (unlikely(remaining < TCPOLEN_SACK_BASE_ALIGNED +
					 TCPOLEN_SACK_PERBLOCK))
			return size;

		if (likely(remaining >= TCPOLEN_SACK_BASE_ALIGNED +
					TCPOLEN_SACK_PERBLOCK)) {
			opts->num_sack_blocks =
				min_t(unsigned int, eff_sacks,
				      (remaining - TCPOLEN_SACK_BASE_ALIGNED) /
@@ -996,6 +994,11 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb

			size += TCPOLEN_SACK_BASE_ALIGNED +
				opts->num_sack_blocks * TCPOLEN_SACK_PERBLOCK;
		} else {
			opts->num_sack_blocks = 0;
		}
	} else {
		opts->num_sack_blocks = 0;
	}

	if (unlikely(BPF_SOCK_OPS_TEST_FLAG(tp,