summaryrefslogtreecommitdiffstats
path: root/src/netlink_delinearize.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2016-01-24 13:37:10 +0100
committerFlorian Westphal <fw@strlen.de>2016-01-26 14:31:30 +0100
commit7ecca3b785a67c5783ca61119d4490963837b0f0 (patch)
tree26b3eb2da217dbf6b76e0067b9c0506dadc9caff /src/netlink_delinearize.c
parent1441728b56f3ed8288b7b3bab0422adf1f90cecc (diff)
netlink: do binop postprocessing also for map lookups
old nft list: mark set unknown unknown & 0xfff [invalid type] map { 3 : 0x00000017, 1 : 0x0000002a} new: mark set vlan id map { 3 : 0x00000017, 1 : 0x0000002a} Signed-off-by: Florian Westphal <fw@strlen.de> Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/netlink_delinearize.c')
-rw-r--r--src/netlink_delinearize.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
index 724d52f7..76d598ca 100644
--- a/src/netlink_delinearize.c
+++ b/src/netlink_delinearize.c
@@ -1204,6 +1204,18 @@ static void binop_postprocess(struct rule_pp_ctx *ctx, struct expr *expr)
}
}
+static void map_binop_postprocess(struct rule_pp_ctx *ctx, struct expr *expr)
+{
+ struct expr *binop = expr->left;
+
+ if (binop->op != OP_AND)
+ return;
+
+ if (binop->left->ops->type == EXPR_PAYLOAD &&
+ binop->right->ops->type == EXPR_VALUE)
+ binop_postprocess(ctx, expr);
+}
+
static void relational_binop_postprocess(struct rule_pp_ctx *ctx, struct expr *expr)
{
struct expr *binop = expr->left, *value = expr->right;
@@ -1356,6 +1368,14 @@ static void expr_postprocess(struct rule_pp_ctx *ctx, struct expr **exprp)
switch (expr->ops->type) {
case EXPR_MAP:
+ switch (expr->map->ops->type) {
+ case EXPR_BINOP:
+ map_binop_postprocess(ctx, expr);
+ break;
+ default:
+ break;
+ }
+
expr_postprocess(ctx, &expr->map);
expr_postprocess(ctx, &expr->mappings);
break;