Commit 8ffde671 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[NETFILTER]: Fix div64_64 in ipt_connbytes

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9d810fd2
...@@ -22,23 +22,19 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>"); ...@@ -22,23 +22,19 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
MODULE_DESCRIPTION("iptables match for matching number of pkts/bytes per connection"); MODULE_DESCRIPTION("iptables match for matching number of pkts/bytes per connection");
/* 64bit divisor, dividend and result. dynamic precision */ /* 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; u_int32_t d = divisor;
if (dividend > 0xffffffff) { if (divisor > 0xffffffffULL) {
int first_bit = find_first_bit((unsigned long *) &dividend, sizeof(dividend)); unsigned int shift = fls(divisor >> 32);
/* 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;
}
do_div(divisor, dividend); d = divisor >> shift;
dividend >>= shift;
}
return divisor; do_div(dividend, d);
return dividend;
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment