svn commit: r351801 - head/sys/netinet
Michael Tuexen
tuexen at FreeBSD.org
Wed Sep 4 04:38:32 UTC 2019
Author: tuexen
Date: Wed Sep 4 04:38:31 2019
New Revision: 351801
URL: https://svnweb.freebsd.org/changeset/base/351801
Log:
Fix the SACK block generation in the base TCP stack by bringing it in
sync with the RACK stack.
Reviewed by: rrs@
MFC after: 5 days
Sponsored by: Netflix, Inc.
Differential Revision: https://reviews.freebsd.org/D21513
Modified:
head/sys/netinet/tcp_input.c
Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c Tue Sep 3 22:26:01 2019 (r351800)
+++ head/sys/netinet/tcp_input.c Wed Sep 4 04:38:31 2019 (r351801)
@@ -2264,7 +2264,8 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, stru
* DSACK - add SACK block for dropped range
*/
if (tp->t_flags & TF_SACK_PERMIT) {
- tcp_update_sack_list(tp, th->th_seq, th->th_seq+tlen);
+ tcp_update_sack_list(tp, th->th_seq,
+ th->th_seq + todrop);
/*
* ACK now, as the next in-sequence segment
* will clear the DSACK block again
@@ -3051,21 +3052,29 @@ dodata: /* XXX */
* DSACK actually handled in the fastpath
* above.
*/
- tcp_update_sack_list(tp, save_start, save_start + save_tlen);
- } else
- if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) {
+ tcp_update_sack_list(tp, save_start,
+ save_start + save_tlen);
+ } else if ((tlen > 0) && SEQ_GT(tp->rcv_nxt, save_rnxt)) {
/*
* Cleaning sackblks by using zero length
* update.
*/
- tcp_update_sack_list(tp, save_start, save_start);
- } else
- if ((tlen > 0) && (tlen >= save_tlen)) {
+ if ((tp->rcv_numsacks >= 1) &&
+ (tp->sackblks[0].end == save_start)) {
+ /* partial overlap, recorded at todrop above */
+ tcp_update_sack_list(tp, tp->sackblks[0].start,
+ tp->sackblks[0].end);
+ } else {
+ tcp_update_dsack_list(tp, save_start,
+ save_start + save_tlen);
+ }
+ } else if ((tlen > 0) && (tlen >= save_tlen)) {
/* Update of sackblks. */
- tcp_update_sack_list(tp, save_start, save_start + save_tlen);
- } else
- if (tlen > 0) {
- tcp_update_sack_list(tp, save_start, save_start+tlen);
+ tcp_update_dsack_list(tp, save_start,
+ save_start + save_tlen);
+ } else if (tlen > 0) {
+ tcp_update_dsack_list(tp, save_start,
+ save_start + tlen);
}
}
#if 0
More information about the svn-src-all
mailing list