]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
nat: transform range to prefix expression when possible
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 29 Apr 2020 12:11:13 +0000 (14:11 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 30 Apr 2020 12:01:30 +0000 (14:01 +0200)
This patch transform a range of IP addresses to prefix when listing the
ruleset.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/expression.h
src/netlink.c
src/netlink_delinearize.c
tests/py/ip6/dnat.t

index 359348275a0443833382e89a9a483e3fc2a4caee..8135a516cf3ac16360753b42432251c6affd3045 100644 (file)
@@ -452,6 +452,7 @@ extern struct expr *prefix_expr_alloc(const struct location *loc,
 
 extern struct expr *range_expr_alloc(const struct location *loc,
                                     struct expr *low, struct expr *high);
+struct expr *range_expr_to_prefix(struct expr *range);
 
 extern struct expr *compound_expr_alloc(const struct location *loc,
                                        enum expr_types etypes);
index 10964720f5d46fefbd91a8b2e5943379d725c3c7..bb014320ea6cb227056901c611df7309918fdcbc 100644 (file)
@@ -949,7 +949,7 @@ static uint32_t mpz_bitmask_to_prefix(mpz_t bitmask, uint32_t len)
        return len - mpz_scan0(bitmask, 0);
 }
 
-static struct expr *expr_range_to_prefix(struct expr *range)
+struct expr *range_expr_to_prefix(struct expr *range)
 {
        struct expr *left = range->left, *right = range->right, *prefix;
        uint32_t len = left->len, prefix_len;
@@ -989,7 +989,7 @@ static struct expr *netlink_parse_interval_elem(const struct datatype *dtype,
        range = range_expr_alloc(&expr->location, left, right);
        expr_free(expr);
 
-       return expr_range_to_prefix(range);
+       return range_expr_to_prefix(range);
 }
 
 static struct expr *netlink_parse_concat_elem(const struct datatype *dtype,
index 772559c838f51dde7d1bb6644eed16c20b673480..f721d15c330fda6b0309094042503508f7873df7 100644 (file)
@@ -1103,8 +1103,10 @@ static void netlink_parse_nat(struct netlink_parse_ctx *ctx,
                else
                        expr_set_type(addr, &ip6addr_type,
                                      BYTEORDER_BIG_ENDIAN);
-               if (stmt->nat.addr != NULL)
+               if (stmt->nat.addr != NULL) {
                        addr = range_expr_alloc(loc, stmt->nat.addr, addr);
+                       addr = range_expr_to_prefix(addr);
+               }
                stmt->nat.addr = addr;
        }
 
@@ -2296,6 +2298,8 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp)
        case EXPR_RANGE:
                expr_postprocess(ctx, &expr->left);
                expr_postprocess(ctx, &expr->right);
+       case EXPR_PREFIX:
+               expr_postprocess(ctx, &expr->prefix);
                break;
        case EXPR_SET_ELEM:
                expr_postprocess(ctx, &expr->key);
index db5fde58e60603f6002ad28473b80b29eeeb5f2f..28bd7ef97859eadf6320df83d126bb84a70619b7 100644 (file)
@@ -5,5 +5,5 @@
 tcp dport 80-90 dnat to [2001:838:35f:1::]-[2001:838:35f:2::]:80-100;ok
 tcp dport 80-90 dnat to [2001:838:35f:1::]-[2001:838:35f:2::]:100;ok;tcp dport 80-90 dnat to [2001:838:35f:1::]-[2001:838:35f:2::]:100
 tcp dport 80-90 dnat to [2001:838:35f:1::]:80;ok
-dnat to [2001:838:35f:1::]/64;ok;dnat to 2001:838:35f:1::-2001:838:35f:1:ffff:ffff:ffff:ffff
-dnat to 2001:838:35f:1::-2001:838:35f:1:ffff:ffff:ffff:ffff;ok
+dnat to [2001:838:35f:1::]/64;ok;dnat to 2001:838:35f:1::/64
+dnat to 2001:838:35f:1::-2001:838:35f:1:ffff:ffff:ffff:ffff;ok;dnat to 2001:838:35f:1::/64