Correctly set up the initial TCP congestion window
in all cases, by adjust snd_una right after the connection initialization, to include the one byte in sequence space occupied by the SYN bit. This does not change the regular ACK processing, while making the BYTES_THIS_ACK macro to work properly. PR: 235256 Reviewed by: tuexen (mentor), rgrimes (mentor) Approved by: tuexen (mentor), rgrimes (mentor) MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D19000
This commit is contained in:
parent
59dafcde62
commit
73b7696693
@ -2374,12 +2374,6 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
if (IS_FASTOPEN(tp->t_flags) && tp->t_tfo_pending) {
|
||||
tcp_fastopen_decrement_counter(tp->t_tfo_pending);
|
||||
tp->t_tfo_pending = NULL;
|
||||
|
||||
/*
|
||||
* Account for the ACK of our SYN prior to
|
||||
* regular ACK processing below.
|
||||
*/
|
||||
tp->snd_una++;
|
||||
}
|
||||
if (tp->t_flags & TF_NEEDFIN) {
|
||||
tcp_state_change(tp, TCPS_FIN_WAIT_1);
|
||||
@ -2399,6 +2393,12 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
cc_conn_init(tp);
|
||||
tcp_timer_activate(tp, TT_KEEP, TP_KEEPIDLE(tp));
|
||||
}
|
||||
if (SEQ_GT(th->th_ack, tp->snd_una))
|
||||
/*
|
||||
* Account for the ACK of our SYN prior to
|
||||
* regular ACK processing below.
|
||||
*/
|
||||
tp->snd_una++;
|
||||
/*
|
||||
* If segment contains data or ACK, will call tcp_reass()
|
||||
* later; if not, do so now to pass queued data to user.
|
||||
|
@ -9325,11 +9325,6 @@ bbr_do_syn_recv(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
|
||||
tcp_fastopen_decrement_counter(tp->t_tfo_pending);
|
||||
tp->t_tfo_pending = NULL;
|
||||
/*
|
||||
* Account for the ACK of our SYN prior to regular
|
||||
* ACK processing below.
|
||||
*/
|
||||
tp->snd_una++;
|
||||
}
|
||||
/*
|
||||
* Make transitions: SYN-RECEIVED -> ESTABLISHED SYN-RECEIVED* ->
|
||||
@ -9352,6 +9347,12 @@ bbr_do_syn_recv(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
if (!IS_FASTOPEN(tp->t_flags))
|
||||
cc_conn_init(tp);
|
||||
}
|
||||
if (SEQ_GT(th->th_ack, tp->snd_una))
|
||||
/*
|
||||
* Account for the ACK of our SYN prior to
|
||||
* regular ACK processing below.
|
||||
*/
|
||||
tp->snd_una++;
|
||||
/*
|
||||
* If segment contains data or ACK, will call tcp_reass() later; if
|
||||
* not, do so now to pass queued data to user.
|
||||
|
@ -6539,12 +6539,6 @@ rack_do_syn_recv(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
if (IS_FASTOPEN(tp->t_flags) && tp->t_tfo_pending) {
|
||||
tcp_fastopen_decrement_counter(tp->t_tfo_pending);
|
||||
tp->t_tfo_pending = NULL;
|
||||
|
||||
/*
|
||||
* Account for the ACK of our SYN prior to
|
||||
* regular ACK processing below.
|
||||
*/
|
||||
tp->snd_una++;
|
||||
}
|
||||
if (tp->t_flags & TF_NEEDFIN) {
|
||||
tcp_state_change(tp, TCPS_FIN_WAIT_1);
|
||||
@ -6562,6 +6556,12 @@ rack_do_syn_recv(struct mbuf *m, struct tcphdr *th, struct socket *so,
|
||||
if (!IS_FASTOPEN(tp->t_flags))
|
||||
cc_conn_init(tp);
|
||||
}
|
||||
if (SEQ_GT(th->th_ack, tp->snd_una))
|
||||
/*
|
||||
* Account for the ACK of our SYN prior to
|
||||
* regular ACK processing below.
|
||||
*/
|
||||
tp->snd_una++;
|
||||
/*
|
||||
* If segment contains data or ACK, will call tcp_reass() later; if
|
||||
* not, do so now to pass queued data to user.
|
||||
|
Loading…
x
Reference in New Issue
Block a user