| From foo@baz Thu Jul 19 10:08:15 CEST 2018 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Fri, 22 Jun 2018 06:44:15 -0700 |
| Subject: net: dccp: switch rx_tstamp_last_feedback to monotonic clock |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| [ Upstream commit 0ce4e70ff00662ad7490e545ba0cd8c1fa179fca ] |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/dccp/ccids/ccid3.c | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| --- a/net/dccp/ccids/ccid3.c |
| +++ b/net/dccp/ccids/ccid3.c |
| @@ -599,7 +599,7 @@ static void ccid3_hc_rx_send_feedback(st |
| { |
| struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); |
| struct dccp_sock *dp = dccp_sk(sk); |
| - ktime_t now = ktime_get_real(); |
| + ktime_t now = ktime_get(); |
| s64 delta = 0; |
| |
| switch (fbtype) { |
| @@ -631,7 +631,7 @@ static void ccid3_hc_rx_send_feedback(st |
| return; |
| } |
| |
| - ccid3_pr_debug("Interval %ldusec, X_recv=%u, 1/p=%u\n", (long)delta, |
| + ccid3_pr_debug("Interval %lldusec, X_recv=%u, 1/p=%u\n", delta, |
| hc->rx_x_recv, hc->rx_pinv); |
| |
| hc->rx_tstamp_last_feedback = now; |
| @@ -678,7 +678,8 @@ static int ccid3_hc_rx_insert_options(st |
| static u32 ccid3_first_li(struct sock *sk) |
| { |
| struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); |
| - u32 x_recv, p, delta; |
| + u32 x_recv, p; |
| + s64 delta; |
| u64 fval; |
| |
| if (hc->rx_rtt == 0) { |
| @@ -686,7 +687,9 @@ static u32 ccid3_first_li(struct sock *s |
| hc->rx_rtt = DCCP_FALLBACK_RTT; |
| } |
| |
| - delta = ktime_to_us(net_timedelta(hc->rx_tstamp_last_feedback)); |
| + delta = ktime_us_delta(ktime_get(), hc->rx_tstamp_last_feedback); |
| + if (delta <= 0) |
| + delta = 1; |
| x_recv = scaled_div32(hc->rx_bytes_recv, delta); |
| if (x_recv == 0) { /* would also trigger divide-by-zero */ |
| DCCP_WARN("X_recv==0\n"); |