The branch releng/13.0 has been updated by rscheff:

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

commit bb60a68985c8902f4061f1e3338a74e5f7d36a5d
Author:     Richard Scheffenegger <[email protected]>
AuthorDate: 2021-03-05 16:45:23 +0000
Commit:     Richard Scheffenegger <[email protected]>
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)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to