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-branches
mailing list