From 30ba70be7d18672ef4cc161b1f7817583a7b00fd Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Sat, 13 Aug 2005 13:57:58 -0700 Subject: [PATCH] --- yaml --- r: 6346 b: refs/heads/master c: 8ffde671730df0b392ca478643b88ef7153244c0 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/ipv4/netfilter/ipt_connbytes.c | 24 ++++++++++-------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 6a646da2ef79..579328ec87b1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9d810fd2d28a9d672eca3136476af1a54a380bb2 +refs/heads/master: 8ffde671730df0b392ca478643b88ef7153244c0 diff --git a/trunk/net/ipv4/netfilter/ipt_connbytes.c b/trunk/net/ipv4/netfilter/ipt_connbytes.c index 0dfb52c0e808..47128c073d85 100644 --- a/trunk/net/ipv4/netfilter/ipt_connbytes.c +++ b/trunk/net/ipv4/netfilter/ipt_connbytes.c @@ -22,23 +22,19 @@ MODULE_AUTHOR("Harald Welte "); MODULE_DESCRIPTION("iptables match for matching number of pkts/bytes per connection"); /* 64bit divisor, dividend and result. dynamic precision */ -static u_int64_t div64_64(u_int64_t divisor, u_int64_t dividend) +static u_int64_t div64_64(u_int64_t dividend, u_int64_t divisor) { - u_int64_t result = divisor; - - if (dividend > 0xffffffff) { - int first_bit = find_first_bit((unsigned long *) ÷nd, sizeof(dividend)); - /* calculate number of bits to shift. shift exactly enough - * bits to make dividend fit in 32bits. */ - int num_shift = (64 - 32 - first_bit); - /* first bit has to be < 32, since dividend was > 0xffffffff */ - result = result >> num_shift; - dividend = dividend >> num_shift; - } + u_int32_t d = divisor; + + if (divisor > 0xffffffffULL) { + unsigned int shift = fls(divisor >> 32); - do_div(divisor, dividend); + d = divisor >> shift; + dividend >>= shift; + } - return divisor; + do_div(dividend, d); + return dividend; } static int