diff options
Diffstat (limited to 'net/dccp/ccids/lib/tfrc.h')
-rw-r--r-- | net/dccp/ccids/lib/tfrc.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/net/dccp/ccids/lib/tfrc.h b/net/dccp/ccids/lib/tfrc.h index 45f30f59ea2a..faf5f7e219e3 100644 --- a/net/dccp/ccids/lib/tfrc.h +++ b/net/dccp/ccids/lib/tfrc.h | |||
@@ -13,8 +13,29 @@ | |||
13 | * the Free Software Foundation; either version 2 of the License, or | 13 | * the Free Software Foundation; either version 2 of the License, or |
14 | * (at your option) any later version. | 14 | * (at your option) any later version. |
15 | */ | 15 | */ |
16 | |||
17 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <asm/div64.h> | ||
18 | |||
19 | /* integer-arithmetic divisions of type (a * 1000000)/b */ | ||
20 | static inline u64 scaled_div(u64 a, u32 b) | ||
21 | { | ||
22 | BUG_ON(b==0); | ||
23 | a *= 1000000; | ||
24 | do_div(a, b); | ||
25 | return a; | ||
26 | } | ||
27 | |||
28 | static inline u32 scaled_div32(u64 a, u32 b) | ||
29 | { | ||
30 | u64 result = scaled_div(a, b); | ||
31 | |||
32 | if (result > UINT_MAX) { | ||
33 | DCCP_CRIT("Overflow: a(%llu)/b(%u) > ~0U", | ||
34 | (unsigned long long)a, b); | ||
35 | return UINT_MAX; | ||
36 | } | ||
37 | return result; | ||
38 | } | ||
18 | 39 | ||
19 | extern u32 tfrc_calc_x(u16 s, u32 R, u32 p); | 40 | extern u32 tfrc_calc_x(u16 s, u32 R, u32 p); |
20 | extern u32 tfrc_calc_x_reverse_lookup(u32 fvalue); | 41 | extern u32 tfrc_calc_x_reverse_lookup(u32 fvalue); |