Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Mar 2021 23:42:28 GMT
From:      Richard Scheffenegger <rscheff@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: e53138694aa4 - main - tcp: Add prr_out in preparation for PRR/nonSACK and LRD
Message-ID:  <202103052342.125NgSFQ035311@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by rscheff:

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

commit e53138694aa41c24c17847afe959225ce0eeff91
Author:     Richard Scheffenegger <rscheff@FreeBSD.org>
AuthorDate: 2021-03-05 23:36:48 +0000
Commit:     Richard Scheffenegger <rscheff@FreeBSD.org>
CommitDate: 2021-03-05 23:38:22 +0000

    tcp: Add prr_out in preparation for PRR/nonSACK and LRD
    
    Reviewed By:           #transport, kbowling
    MFC after:             3 days
    Sponsored By:          Netapp, Inc.
    Differential Revision: https://reviews.freebsd.org/D29058
---
 sys/netinet/tcp_input.c  | 21 ++++++++-------------
 sys/netinet/tcp_output.c |  8 ++++++++
 sys/netinet/tcp_var.h    |  2 +-
 3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index a5d2e1676364..7dfe1dbd4e4f 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;
 }
 
 /*
@@ -2595,17 +2596,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);
 						}
@@ -3972,18 +3970,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 30009fa18205..8cd0c828ad66 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)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202103052342.125NgSFQ035311>