diff options
author | Eric Dumazet <edumazet@google.com> | 2018-06-22 09:44:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-06-22 21:46:44 -0400 |
commit | 0ce4e70ff00662ad7490e545ba0cd8c1fa179fca (patch) | |
tree | 4959b26fee49e3465efd6d73539b74d459340870 | |
parent | 74174fe5634ffbf645a7ca5a261571f700b2f332 (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.c | 11 |
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) | |||
679 | static u32 ccid3_first_li(struct sock *sk) | 679 | static 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"); |