summaryrefslogtreecommitdiffstats
path: root/src/statement.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2016-08-26 11:19:18 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2016-08-29 20:30:28 +0200
commit1ed9a3726c01fda218f37b7f4555c8b7106521ef (patch)
tree6bfab3347d55dceb89f1f1845a63de6c3f4160bd /src/statement.c
parentd089630ecbc783d7f0c6df972033694b1671c009 (diff)
src: add quota statement
This new statement is stateful, so it can be used from flow tables, eg. # nft add rule filter input \ flow table http { ip saddr timeout 60s quota over 50 mbytes } drop This basically sets a quota per source IP address of 50 mbytes after which packets are dropped. Note that the timeout releases the entry if no traffic is seen from this IP after 60 seconds. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/statement.c')
-rw-r--r--src/statement.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/statement.c b/src/statement.c
index 59b133c2..8ccd4891 100644
--- a/src/statement.c
+++ b/src/statement.c
@@ -325,6 +325,32 @@ struct stmt *queue_stmt_alloc(const struct location *loc)
return stmt_alloc(loc, &queue_stmt_ops);
}
+static void quota_stmt_print(const struct stmt *stmt)
+{
+ bool inv = stmt->quota.flags & NFT_QUOTA_F_INV;
+ const char *data_unit;
+ uint64_t bytes;
+
+ data_unit = get_rate(stmt->quota.bytes, &bytes);
+ printf("quota %s%"PRIu64" %s",
+ inv ? "over " : "", bytes, data_unit);
+}
+
+static const struct stmt_ops quota_stmt_ops = {
+ .type = STMT_QUOTA,
+ .name = "quota",
+ .print = quota_stmt_print,
+};
+
+struct stmt *quota_stmt_alloc(const struct location *loc)
+{
+ struct stmt *stmt;
+
+ stmt = stmt_alloc(loc, &quota_stmt_ops);
+ stmt->flags |= STMT_F_STATEFUL;
+ return stmt;
+}
+
static void reject_stmt_print(const struct stmt *stmt)
{
printf("reject");