From: Ilpo Järvinen <[email protected]>

Include echoed CE count into rate_sample. Replace local ecn_count
variable with it.

Co-developed-by: Olivier Tilmans <[email protected]>
Signed-off-by: Olivier Tilmans <[email protected]>
Signed-off-by: Ilpo Järvinen <[email protected]>
Signed-off-by: Chia-Yu Chang <[email protected]>
---
 include/net/tcp.h    |  1 +
 net/ipv4/tcp_input.c | 41 +++++++++++++++++++----------------------
 2 files changed, 20 insertions(+), 22 deletions(-)

diff --git a/include/net/tcp.h b/include/net/tcp.h
index 0265c27a5fd7..1838389a9d8a 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -1346,6 +1346,7 @@ struct rate_sample {
        int  losses;            /* number of packets marked lost upon ACK */
        u32  acked_sacked;      /* number of packets newly (S)ACKed upon ACK */
        u32  prior_in_flight;   /* in flight before this ACK */
+       u32  ece_delta;         /* is this ACK echoing some received CE? */
        u32  last_end_seq;      /* end_seq of most recently ACKed packet */
        bool is_app_limited;    /* is sample from packet with bubble in pipe? */
        bool is_retrans;        /* is sample from retransmission? */
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 02ec0b0116d1..a5a7302050c4 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -588,9 +588,10 @@ static u32 __tcp_accecn_process(struct sock *sk, const 
struct sk_buff *skb,
        return safe_delta;
 }
 
-static u32 tcp_accecn_process(struct sock *sk, const struct sk_buff *skb,
-                             u32 delivered_pkts, u32 delivered_bytes,
-                             u64 prior_bytes_acked, int *flag)
+static void tcp_accecn_process(struct sock *sk, struct rate_sample *rs,
+                              const struct sk_buff *skb, u32 delivered_pkts,
+                              u32 delivered_bytes, u64 prior_bytes_acked,
+                              int *flag)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        u32 delta;
@@ -600,11 +601,11 @@ static u32 tcp_accecn_process(struct sock *sk, const 
struct sk_buff *skb,
        if (delta > 0) {
                tcp_count_delivered_ce(tp, delta);
                *flag |= FLAG_ECE;
+               rs->ece_delta = delta;
                /* Recalculate header predictor */
                if (tp->pred_flags)
                        tcp_fast_path_on(tp);
        }
-       return delta;
 }
 
 /* Buffer size and advertised window tuning.
@@ -4220,8 +4221,8 @@ static void tcp_xmit_recovery(struct sock *sk, int rexmit)
 }
 
 /* Returns the number of packets newly acked or sacked by the current ACK */
-static u32 tcp_newly_delivered(struct sock *sk, u32 prior_delivered,
-                              u32 ecn_count, int flag)
+static u32 tcp_newly_delivered(struct sock *sk, struct rate_sample *rs,
+                              u32 prior_delivered, int flag)
 {
        const struct net *net = sock_net(sk);
        struct tcp_sock *tp = tcp_sk(sk);
@@ -4232,8 +4233,8 @@ static u32 tcp_newly_delivered(struct sock *sk, u32 
prior_delivered,
 
        if (flag & FLAG_ECE) {
                if (tcp_ecn_mode_rfc3168(tp))
-                       ecn_count = delivered;
-               NET_ADD_STATS(net, LINUX_MIB_TCPDELIVEREDCE, ecn_count);
+                       rs->ece_delta = delivered;
+               NET_ADD_STATS(net, LINUX_MIB_TCPDELIVEREDCE, rs->ece_delta);
        }
 
        return delivered;
@@ -4288,7 +4289,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff 
*skb, int flag)
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
        struct tcp_sacktag_state sack_state;
-       struct rate_sample rs = { .prior_delivered = 0 };
+       struct rate_sample rs = { .prior_delivered = 0, .ece_delta = 0 };
        u64 prior_bytes_acked = tp->bytes_acked;
        u32 prior_snd_una = tp->snd_una;
        bool is_sack_reneg = tp->is_sack_reneg;
@@ -4299,7 +4300,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff 
*skb, int flag)
        u32 delivered = tp->delivered;
        u32 lost = tp->lost;
        int rexmit = REXMIT_NONE; /* Flag to (re)transmit to recover losses */
-       u32 ecn_count = 0;        /* Did we receive ECE/an AccECN ACE update? */
        u32 prior_fack;
 
        sack_state.first_sackt = 0;
@@ -4414,10 +4414,9 @@ static int tcp_ack(struct sock *sk, const struct sk_buff 
*skb, int flag)
        tcp_rack_update_reo_wnd(sk, &rs);
 
        if (tcp_ecn_mode_accecn(tp))
-               ecn_count = tcp_accecn_process(sk, skb,
-                                              tp->delivered - delivered,
-                                              sack_state.delivered_bytes,
-                                              prior_bytes_acked, &flag);
+               tcp_accecn_process(sk, &rs, skb, tp->delivered - delivered,
+                                  sack_state.delivered_bytes,
+                                  prior_bytes_acked, &flag);
 
        tcp_in_ack_event(sk, flag);
 
@@ -4443,7 +4442,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff 
*skb, int flag)
        if ((flag & FLAG_FORWARD_PROGRESS) || !(flag & FLAG_NOT_DUP))
                sk_dst_confirm(sk);
 
-       delivered = tcp_newly_delivered(sk, delivered, ecn_count, flag);
+       delivered = tcp_newly_delivered(sk, &rs, delivered, flag);
 
        lost = tp->lost - lost;                 /* freshly marked lost */
        rs.is_ack_delayed = !!(flag & FLAG_ACK_MAYBE_DELAYED);
@@ -4454,17 +4453,15 @@ static int tcp_ack(struct sock *sk, const struct 
sk_buff *skb, int flag)
 
 no_queue:
        if (tcp_ecn_mode_accecn(tp))
-               ecn_count = tcp_accecn_process(sk, skb,
-                                              tp->delivered - delivered,
-                                              sack_state.delivered_bytes,
-                                              prior_bytes_acked, &flag);
-
+               tcp_accecn_process(sk, &rs, skb, tp->delivered - delivered,
+                                  sack_state.delivered_bytes,
+                                  prior_bytes_acked, &flag);
        tcp_in_ack_event(sk, flag);
        /* If data was DSACKed, see if we can undo a cwnd reduction. */
        if (flag & FLAG_DSACKING_ACK) {
                tcp_fastretrans_alert(sk, prior_snd_una, num_dupack, &flag,
                                      &rexmit);
-               tcp_newly_delivered(sk, delivered, ecn_count, flag);
+               tcp_newly_delivered(sk, &rs, delivered, flag);
        }
        /* If this ack opens up a zero window, clear backoff.  It was
         * being used to time the probes, and is probably far higher than
@@ -4491,7 +4488,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff 
*skb, int flag)
                                                &sack_state);
                tcp_fastretrans_alert(sk, prior_snd_una, num_dupack, &flag,
                                      &rexmit);
-               tcp_newly_delivered(sk, delivered, ecn_count, flag);
+               tcp_newly_delivered(sk, &rs, delivered, flag);
                tcp_xmit_recovery(sk, rexmit);
        }
 
-- 
2.34.1


Reply via email to