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>
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];
}