summaryrefslogtreecommitdiffstats
path: root/src/statement.c
diff options
context:
space:
mode:
authorElise Lennion <elise.lennion@gmail.com>2017-02-12 10:45:34 -0200
committerPablo Neira Ayuso <pablo@netfilter.org>2017-02-12 14:52:41 +0100
commit1dd9d5ada38dae19d2e4669a14342ad637b6ca3d (patch)
treef332c9a68e1772192b26784a3774c35159cb2e0e /src/statement.c
parent862693ff30babe8613632886d0ab40f9c2628dcf (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/statement.c')
-rw-r--r--src/statement.c15
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];
}