git: bb60a68985c8 - releng/13.0 - tcp: remove incorrect reset of SACK variable in PRR tcp: Add prr_out in preparation for PRR/nonSACK and LRD

Richard Scheffenegger rscheff at FreeBSD.org
Mon Mar 8 14:17:56 UTC 2021


The branch releng/13.0 has been updated by rscheff:

URL: https://cgit.FreeBSD.org/src/commit/?id=bb60a68985c8902f4061f1e3338a74e5f7d36a5d

commit bb60a68985c8902f4061f1e3338a74e5f7d36a5d
Author:     Richard Scheffenegger <rscheff at FreeBSD.org>
AuthorDate: 2021-03-05 16:45:23 +0000
Commit:     Richard Scheffenegger <rscheff at FreeBSD.org>
CommitDate: 2021-03-08 14:17:12 +0000

    tcp: remove incorrect reset of SACK variable in PRR
    tcp: Add prr_out in preparation for PRR/nonSACK and LRD
    
    Reviewed by:   #transport, rrs, tuexen, kbowling
    Approved by:   #re (gjb)
    PR:            253848
    MFC after:     3 days
    Sponsored by:  NetApp, Inc.
    Differential Revision: https://reviews.freebsd.org/D29083
    Differential Revision: https://reviews.freebsd.org/D29058
    
    (cherry picked from commit 4a8f3aad37dd35c905e34b64b022d60844ba8d01)
    (cherry picked from commit d90bba73a2e43fa12ea19425d101df4c488c1070)
    
    (cherry picked from commit e53138694aa41c24c17847afe959225ce0eeff91)
    (cherry picked from commit 71cc98ba735283b8720c9031eb87810f3d3d96a0)
---
 sys/netinet/tcp_input.c  | 22 ++++++++--------------
 sys/netinet/tcp_output.c |  8 ++++++++
 sys/netinet/tcp_var.h    |  2 +-
 3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index f2edbecbb079..3efc100bf897 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -510,6 +510,7 @@ cc_post_recovery(struct tcpcb *tp, struct tcphdr *th)
 	}
 	/* XXXLAS: EXIT_RECOVERY ? */
 	tp->t_bytes_acked = 0;
+	tp->sackhint.prr_out = 0;
 }
 
 /*
@@ -2598,17 +2599,14 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
 								    imax(1, tp->snd_nxt - tp->snd_una);
 							snd_cnt = howmany((long)tp->sackhint.prr_delivered *
 							    tp->snd_ssthresh, tp->sackhint.recover_fs) -
-							    (tp->sackhint.sack_bytes_rexmit +
-							    (tp->snd_nxt - tp->snd_recover));
+							    tp->sackhint.prr_out;
 						} else {
 							if (V_tcp_do_prr_conservative)
 								limit = tp->sackhint.prr_delivered -
-									(tp->sackhint.sack_bytes_rexmit +
-									(tp->snd_nxt - tp->snd_recover));
+									tp->sackhint.prr_out;
 							else
 								limit = imax(tp->sackhint.prr_delivered -
-									    (tp->sackhint.sack_bytes_rexmit +
-									    (tp->snd_nxt - tp->snd_recover)),
+									    tp->sackhint.prr_out,
 									    del_data) + maxseg;
 							snd_cnt = imin(tp->snd_ssthresh - pipe, limit);
 						}
@@ -2682,7 +2680,6 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
 						 */
 						tp->sackhint.prr_delivered =
 						    tp->sackhint.sacked_bytes;
-						tp->sackhint.sack_bytes_rexmit = 0;
 						tp->sackhint.recover_fs = max(1,
 						    tp->snd_nxt - tp->snd_una);
 					}
@@ -3951,18 +3948,15 @@ tcp_prr_partialack(struct tcpcb *tp, struct tcphdr *th)
 			    imax(1, tp->snd_nxt - tp->snd_una);
 		snd_cnt = howmany((long)tp->sackhint.prr_delivered *
 			    tp->snd_ssthresh, tp->sackhint.recover_fs) -
-			    (tp->sackhint.sack_bytes_rexmit +
-			    (tp->snd_nxt - tp->snd_recover));
+			    tp->sackhint.prr_out;
 	} else {
 		if (V_tcp_do_prr_conservative)
 			limit = tp->sackhint.prr_delivered -
-			    (tp->sackhint.sack_bytes_rexmit +
-			    (tp->snd_nxt - tp->snd_recover));
+			    tp->sackhint.prr_out;
 		else
 			limit = imax(tp->sackhint.prr_delivered -
-				    (tp->sackhint.sack_bytes_rexmit +
-				    (tp->snd_nxt - tp->snd_recover)),
-				    del_data) + maxseg;
+				    tp->sackhint.prr_out, del_data) +
+				    maxseg;
 		snd_cnt = imin((tp->snd_ssthresh - pipe), limit);
 	}
 	snd_cnt = imax(snd_cnt, 0) / maxseg;
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index b4c7ab0a1ab7..d4b5a328e2a6 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -1236,6 +1236,14 @@ send:
 		p->rxmit += len;
 		tp->sackhint.sack_bytes_rexmit += len;
 	}
+	if (IN_RECOVERY(tp->t_flags)) {
+		/*
+		 * Account all bytes transmitted while
+		 * IN_RECOVERY, simplifying PRR and
+		 * Lost Retransmit Detection
+		 */
+		tp->sackhint.prr_out += len;
+	}
 	th->th_ack = htonl(tp->rcv_nxt);
 	if (optlen) {
 		bcopy(opt, th + 1, optlen);
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 6e22d75ac441..3b007fcfcc93 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -115,7 +115,7 @@ struct sackhint {
 					 */
 	uint32_t	recover_fs;	/* Flight Size at the start of Loss recovery */
 	uint32_t	prr_delivered;	/* Total bytes delivered using PRR */
-	uint32_t	_pad[1];	/* TBD */
+	uint32_t	prr_out;	/* Bytes sent during IN_RECOVERY */
 };
 
 #define SEGQ_EMPTY(tp) TAILQ_EMPTY(&(tp)->t_segq)


More information about the dev-commits-src-all mailing list