diff options
author | Elise Lennion <elise.lennion@gmail.com> | 2017-02-12 10:45:34 -0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2017-02-12 14:52:41 +0100 |
commit | 1dd9d5ada38dae19d2e4669a14342ad637b6ca3d (patch) | |
tree | f332c9a68e1772192b26784a3774c35159cb2e0e /src | |
parent | 862693ff30babe8613632886d0ab40f9c2628dcf (diff) |
statement: Avoid rounding bytes in get_rate()
get_rate() is used to print quotas and limits and currently rounds the
number of bytes:
$ nft add quota filter https-quota 4000 kbytes
$ nft list ruleset
table ip filter {
quota https-quota {
3 mbytes
}
}
This may be a problem when loading your configuration after saving it
with 'list ruleset'. With this patch the values are represented in a
greater unit only when there is no rest in the conversion:
$ nft add quota filter https-quota2 2048 kbytes
$ nft list ruleset
table ip filter {
quota https-quota {
4000 kbytes
}
quota https-quota2 {
2 mbytes
}
}
Signed-off-by: Elise Lennion <elise.lennion@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/statement.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/src/statement.c b/src/statement.c index 3beb86ab..7ffd25f9 100644 --- a/src/statement.c +++ b/src/statement.c @@ -300,20 +300,15 @@ static const char *data_unit[] = { const char *get_rate(uint64_t byte_rate, uint64_t *rate) { - uint64_t res, prev, rest; int i; - res = prev = byte_rate; - for (i = 0;; i++) { - rest = res % 1024; - res /= 1024; - if (res <= 1 && rest != 0) + for (i = 0; data_unit[i + 1] != NULL; i++) { + if (byte_rate % 1024) break; - if (data_unit[i + 1] == NULL) - break; - prev = res; + byte_rate /= 1024; } - *rate = prev; + + *rate = byte_rate; return data_unit[i]; } |