aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2018-06-22 09:44:15 -0400
committerDavid S. Miller <davem@davemloft.net>2018-06-22 21:46:44 -0400
commit0ce4e70ff00662ad7490e545ba0cd8c1fa179fca (patch)
tree4959b26fee49e3465efd6d73539b74d459340870
parent74174fe5634ffbf645a7ca5a261571f700b2f332 (diff)
net: dccp: switch rx_tstamp_last_feedback to monotonic clock
To compute delays, better not use time of the day which can be changed by admins or malicious programs. Also change ccid3_first_li() to use s64 type for delta variable to avoid potential overflows. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Gerrit Renker <gerrit@erg.abdn.ac.uk> Cc: dccp@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/dccp/ccids/ccid3.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c
index d57a2be1e2e0..12877a1514e7 100644
--- a/net/dccp/ccids/ccid3.c
+++ b/net/dccp/ccids/ccid3.c
@@ -600,7 +600,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk,
600{ 600{
601 struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); 601 struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk);
602 struct dccp_sock *dp = dccp_sk(sk); 602 struct dccp_sock *dp = dccp_sk(sk);
603 ktime_t now = ktime_get_real(); 603 ktime_t now = ktime_get();
604 s64 delta = 0; 604 s64 delta = 0;
605 605
606 switch (fbtype) { 606 switch (fbtype) {
@@ -632,7 +632,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk,
632 return; 632 return;
633 } 633 }
634 634
635 ccid3_pr_debug("Interval %ldusec, X_recv=%u, 1/p=%u\n", (long)delta, 635 ccid3_pr_debug("Interval %lldusec, X_recv=%u, 1/p=%u\n", delta,
636 hc->rx_x_recv, hc->rx_pinv); 636 hc->rx_x_recv, hc->rx_pinv);
637 637
638 hc->rx_tstamp_last_feedback = now; 638 hc->rx_tstamp_last_feedback = now;
@@ -679,7 +679,8 @@ static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb)
679static u32 ccid3_first_li(struct sock *sk) 679static u32 ccid3_first_li(struct sock *sk)
680{ 680{
681 struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); 681 struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk);
682 u32 x_recv, p, delta; 682 u32 x_recv, p;
683 s64 delta;
683 u64 fval; 684 u64 fval;
684 685
685 if (hc->rx_rtt == 0) { 686 if (hc->rx_rtt == 0) {
@@ -687,7 +688,9 @@ static u32 ccid3_first_li(struct sock *sk)
687 hc->rx_rtt = DCCP_FALLBACK_RTT; 688 hc->rx_rtt = DCCP_FALLBACK_RTT;
688 } 689 }
689 690
690 delta = ktime_to_us(net_timedelta(hc->rx_tstamp_last_feedback)); 691 delta = ktime_us_delta(ktime_get(), hc->rx_tstamp_last_feedback);
692 if (delta <= 0)
693 delta = 1;
691 x_recv = scaled_div32(hc->rx_bytes_recv, delta); 694 x_recv = scaled_div32(hc->rx_bytes_recv, delta);
692 if (x_recv == 0) { /* would also trigger divide-by-zero */ 695 if (x_recv == 0) { /* would also trigger divide-by-zero */
693 DCCP_WARN("X_recv==0\n"); 696 DCCP_WARN("X_recv==0\n");