aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2021-03-22 14:58:49 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2021-06-02 21:20:26 +0000
commit15077bc4b91fc9c98eb5cd743d8386de2d3c1336 (patch)
tree68a104e72263de8919e29d92aa7ce5ce17016c31 /sys
parent7a9c6cbae91307b152f45a3d38c9a3f895c53f66 (diff)
downloadsrc-15077bc4b91fc9c98eb5cd743d8386de2d3c1336.tar.gz
src-15077bc4b91fc9c98eb5cd743d8386de2d3c1336.zip
tcp: improve handling of SYN segments in SYN-SENT state
Ensure that the stack does not generate a DSACK block for user data received on a SYN segment in SYN-SENT state. Reviewed by: rscheff Differential Revision: https://reviews.freebsd.org/D29376 Sponsored by: Netflix, Inc. (cherry picked from commit 40f41ece765dc0b0907ca90796a1af4f4f89b2a0)
Diffstat (limited to 'sys')
-rw-r--r--sys/netinet/tcp_input.c4
-rw-r--r--sys/netinet/tcp_stacks/bbr.c4
-rw-r--r--sys/netinet/tcp_stacks/rack.c4
3 files changed, 9 insertions, 3 deletions
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index b3d4ef5cf5de..397cbc5084e6 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -3157,7 +3157,9 @@ dodata: /* XXX */
thflags = tcp_reass(tp, th, &temp, &tlen, m);
tp->t_flags |= TF_ACKNOW;
}
- if ((tp->t_flags & TF_SACK_PERMIT) && (save_tlen > 0)) {
+ if ((tp->t_flags & TF_SACK_PERMIT) &&
+ (save_tlen > 0) &&
+ TCPS_HAVEESTABLISHED(tp->t_state)) {
if ((tlen == 0) && (SEQ_LT(save_start, save_rnxt))) {
/*
* DSACK actually handled in the fastpath
diff --git a/sys/netinet/tcp_stacks/bbr.c b/sys/netinet/tcp_stacks/bbr.c
index 49ed7e992fba..cc20d6bf52ca 100644
--- a/sys/netinet/tcp_stacks/bbr.c
+++ b/sys/netinet/tcp_stacks/bbr.c
@@ -8371,7 +8371,9 @@ bbr_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
thflags = tcp_reass(tp, th, &temp, &tlen, m);
tp->t_flags |= TF_ACKNOW;
}
- if ((tp->t_flags & TF_SACK_PERMIT) && (save_tlen > 0)) {
+ if ((tp->t_flags & TF_SACK_PERMIT) &&
+ (save_tlen > 0) &&
+ TCPS_HAVEESTABLISHED(tp->t_state)) {
if ((tlen == 0) && (SEQ_LT(save_start, save_rnxt))) {
/*
* DSACK actually handled in the fastpath
diff --git a/sys/netinet/tcp_stacks/rack.c b/sys/netinet/tcp_stacks/rack.c
index 4a883ee32c79..0ee73a95a6d7 100644
--- a/sys/netinet/tcp_stacks/rack.c
+++ b/sys/netinet/tcp_stacks/rack.c
@@ -8683,7 +8683,9 @@ rack_process_data(struct mbuf *m, struct tcphdr *th, struct socket *so,
thflags = tcp_reass(tp, th, &temp, &tlen, m);
tp->t_flags |= TF_ACKNOW;
}
- if ((tp->t_flags & TF_SACK_PERMIT) && (save_tlen > 0)) {
+ if ((tp->t_flags & TF_SACK_PERMIT) &&
+ (save_tlen > 0) &&
+ TCPS_HAVEESTABLISHED(tp->t_state)) {
if ((tlen == 0) && (SEQ_LT(save_start, save_rnxt))) {
/*
* DSACK actually handled in the fastpath