tcp: Fix an issue with the PUSH bit as well as fill in the missing mtu change for fsb's

The push bit itself was also not actually being properly moved to
the right edge. The FIN bit was incorrectly on the left edge. We
fix these two issues as well as plumb in the mtu_change for
alternate stacks.

Reviewed by: mtuexen
Sponsored by: Netflix Inc
Differential Revision:	https://reviews.freebsd.org/D30413
This commit is contained in:
Randall Stewart 2021-05-24 14:42:15 -04:00
parent 4483fb4773
commit 631449d5d0
2 changed files with 15 additions and 2 deletions

View File

@ -6058,8 +6058,12 @@ rack_clone_rsm(struct tcp_rack *rack, struct rack_sendmap *nrsm,
if (nrsm->r_flags & RACK_HAS_SYN) if (nrsm->r_flags & RACK_HAS_SYN)
nrsm->r_flags &= ~RACK_HAS_SYN; nrsm->r_flags &= ~RACK_HAS_SYN;
/* Now if we have a FIN flag we keep it on the right edge */ /* Now if we have a FIN flag we keep it on the right edge */
if (nrsm->r_flags & RACK_HAS_FIN) if (rsm->r_flags & RACK_HAS_FIN)
nrsm->r_flags &= ~RACK_HAS_FIN; rsm->r_flags &= ~RACK_HAS_FIN;
/* Push bit must go to the right edge as well */
if (rsm->r_flags & RACK_HAD_PUSH)
rsm->r_flags &= ~RACK_HAD_PUSH;
/* /*
* Now we need to find nrsm's new location in the mbuf chain * Now we need to find nrsm's new location in the mbuf chain
* we basically calculate a new offset, which is soff + * we basically calculate a new offset, which is soff +

View File

@ -3407,6 +3407,15 @@ tcp_mtudisc(struct inpcb *inp, int mtuoffer)
tp->snd_recover = tp->snd_max; tp->snd_recover = tp->snd_max;
if (tp->t_flags & TF_SACK_PERMIT) if (tp->t_flags & TF_SACK_PERMIT)
EXIT_FASTRECOVERY(tp->t_flags); EXIT_FASTRECOVERY(tp->t_flags);
if (tp->t_fb->tfb_tcp_mtu_chg != NULL) {
/*
* Conceptually the snd_nxt setting
* and freeing sack holes should
* be done by the default stacks
* own tfb_tcp_mtu_chg().
*/
tp->t_fb->tfb_tcp_mtu_chg(tp);
}
tp->t_fb->tfb_tcp_output(tp); tp->t_fb->tfb_tcp_output(tp);
} }