netlink_linearize: skip set element expression in set statement key
PATCH 1/1 netlink_linearize: skip set element expression in set statement key
From: Anders K. Pedersen <[email protected]>
Before this patch the following fails:
# nft add rule ip6 filter x \ set add ip6 saddr . ip6 daddr @test nft: netlink_linearize.c:648: netlink_gen_expr: Assertion `dreg < ctx->reg_low' failed. Aborted
This is was previously fixed for flow statements in fbea4a6f4449 ("netlink_linearize: skip set element expression in flow table key"), and this patch implements the same change for set statements by using the set element key in netlink_gen_set_stmt().
nft-test.py is updated to support set types with concatenated data types in order to support testing of this.
---
Resent because the original submission didn't make it to patchwork.
src/netlink_linearize.c +3 -3
@@ -1208,9 +1208,9 @@ static void netlink_gen_set_stmt(struct netlink_linearize_ctx *ctx,struct nftnl_expr *nle;enum nft_registers sreg_key; - sreg_key =get_register (ctx, stmt->set.key); -netlink_gen_expr (ctx, stmt->set.key, sreg_key); -release_register (ctx, stmt->set.key); + sreg_key =get_register (ctx, stmt->set.key->key); +netlink_gen_expr (ctx, stmt->set.key->key, sreg_key); +release_register (ctx, stmt->set.key->key); nle =alloc_nft_expr ("dynset" );netlink_put_register (nle,NFTNL_EXPR_DYNSET_SREG_KEY , sreg_key);
tests/py/ip/sets.t +4 -0
@@ -47,6 +47,10 @@ ip saddr != @set33 drop;fail ?set4 192.168.1.1;fail ?set4 192.168.3.0/24;ok +!set5 type ipv4_addr . ipv4_addr;ok +ip saddr . ip daddr @set5 drop;ok +set add ip saddr . ip daddr @set5;ok + # test nested anonymous sets ip saddr { { 1.1.1.0, 3.3.3.0 }, 2.2.2.0 };ok;ip saddr { 1.1.1.0, 2.2.2.0, 3.3.3.0 } ip saddr { { 1.1.1.0/24, 3.3.3.0/24 }, 2.2.2.0/24 };ok;ip saddr { 1.1.1.0/24, 2.2.2.0/24, 3.3.3.0/24 }
tests/py/ip/sets.t.payload.inet +17 -0
@@ -30,6 +30,23 @@ inet test-inet input [ lookup reg 1 set set2 0x1 ] [ immediate reg 0 drop ] +# ip saddr . ip daddr @set5 drop +inet test-inet input + [ meta load nfproto => reg 1 ] + [ cmp eq reg 1 0x00000002 ] + [ payload load 4b @ network header + 12 => reg 1 ] + [ payload load 4b @ network header + 16 => reg 9 ] + [ lookup reg 1 set set5 ] + [ immediate reg 0 drop ] + +# set add ip saddr . ip daddr @set5 +inet test-inet input + [ meta load nfproto => reg 1 ] + [ cmp eq reg 1 0x00000002 ] + [ payload load 4b @ network header + 12 => reg 1 ] + [ payload load 4b @ network header + 16 => reg 9 ] + [ dynset add reg_key 1 set set5 ] + # ip saddr { { 1.1.1.0, 3.3.3.0 }, 2.2.2.0 } __set%d t 3 __set%d t 0
tests/py/ip/sets.t.payload.ip +13 -0
@@ -22,6 +22,19 @@ ip test-ip4 input [ lookup reg 1 set set2 0x1 ] [ immediate reg 0 drop ] +# ip saddr . ip daddr @set5 drop +ip test-ip4 input + [ payload load 4b @ network header + 12 => reg 1 ] + [ payload load 4b @ network header + 16 => reg 9 ] + [ lookup reg 1 set set5 ] + [ immediate reg 0 drop ] + +# set add ip saddr . ip daddr @set5 +ip test-ip4 input + [ payload load 4b @ network header + 12 => reg 1 ] + [ payload load 4b @ network header + 16 => reg 9 ] + [ dynset add reg_key 1 set set5 ] + # ip saddr { { 1.1.1.0, 3.3.3.0 }, 2.2.2.0 } __set%d test-ip4 3 __set%d test-ip4 0
tests/py/ip/sets.t.payload.netdev +17 -0
@@ -30,6 +30,23 @@ netdev test-netdev ingress [ lookup reg 1 set set2 0x1 ] [ immediate reg 0 drop ] +# ip saddr . ip daddr @set5 drop +netdev test-netdev ingress + [ meta load protocol => reg 1 ] + [ cmp eq reg 1 0x00000008 ] + [ payload load 4b @ network header + 12 => reg 1 ] + [ payload load 4b @ network header + 16 => reg 9 ] + [ lookup reg 1 set set5 ] + [ immediate reg 0 drop ] + +# set add ip saddr . ip daddr @set5 +netdev test-netdev ingress + [ meta load protocol => reg 1 ] + [ cmp eq reg 1 0x00000008 ] + [ payload load 4b @ network header + 12 => reg 1 ] + [ payload load 4b @ network header + 16 => reg 9 ] + [ dynset add reg_key 1 set set5 ] + # ip saddr { { 1.1.1.0, 3.3.3.0 }, 2.2.2.0 } __set%d test-netdev 3 __set%d test-netdev 0
tests/py/ip6/sets.t +4 -0
@@ -36,3 +36,7 @@ ip6 saddr != @set33 drop;fail !set4 type ipv6_addr flags interval;ok ?set4 1234:1234:1234:1234::/64 4321:1234:1234:1234::/64;ok ?set4 4321:1234:1234:1234:1234:1234::/96;fail + +!set5 type ipv6_addr . ipv6_addr;ok +ip6 saddr . ip6 daddr @set5 drop;ok +set add ip6 saddr . ip6 daddr @set5;ok
tests/py/ip6/sets.t.payload.inet +17 -0
@@ -14,3 +14,20 @@ inet test-inet input [ lookup reg 1 set set2 0x1 ] [ immediate reg 0 drop ] +# ip6 saddr . ip6 daddr @set5 drop +inet test-inet input + [ meta load nfproto => reg 1 ] + [ cmp eq reg 1 0x0000000a ] + [ payload load 16b @ network header + 8 => reg 1 ] + [ payload load 16b @ network header + 24 => reg 2 ] + [ lookup reg 1 set set5 ] + [ immediate reg 0 drop ] + +# set add ip6 saddr . ip6 daddr @set5 +inet test-inet input + [ meta load nfproto => reg 1 ] + [ cmp eq reg 1 0x0000000a ] + [ payload load 16b @ network header + 8 => reg 1 ] + [ payload load 16b @ network header + 24 => reg 2 ] + [ dynset add reg_key 1 set set5 ] +
tests/py/ip6/sets.t.payload.ip6 +13 -0
@@ -10,3 +10,16 @@ ip6 test-ip6 input [ lookup reg 1 set set2 0x1 ] [ immediate reg 0 drop ] +# ip6 saddr . ip6 daddr @set5 drop +ip6 test-ip6 input + [ payload load 16b @ network header + 8 => reg 1 ] + [ payload load 16b @ network header + 24 => reg 2 ] + [ lookup reg 1 set set5 ] + [ immediate reg 0 drop ] + +# set add ip6 saddr . ip6 daddr @set5 +ip6 test-ip6 input + [ payload load 16b @ network header + 8 => reg 1 ] + [ payload load 16b @ network header + 24 => reg 2 ] + [ dynset add reg_key 1 set set5 ] +
tests/py/ip6/sets.t.payload.netdev +17 -0
@@ -14,3 +14,20 @@ netdev test-netdev ingress [ lookup reg 1 set set2 0x1 ] [ immediate reg 0 drop ] +# ip6 saddr . ip6 daddr @set5 drop +netdev test-netdev ingress + [ meta load protocol => reg 1 ] + [ cmp eq reg 1 0x0000dd86 ] + [ payload load 16b @ network header + 8 => reg 1 ] + [ payload load 16b @ network header + 24 => reg 2 ] + [ lookup reg 1 set set5 ] + [ immediate reg 0 drop ] + +# set add ip6 saddr . ip6 daddr @set5 +netdev test-netdev ingress + [ meta load protocol => reg 1 ] + [ cmp eq reg 1 0x0000dd86 ] + [ payload load 16b @ network header + 8 => reg 1 ] + [ payload load 16b @ network header + 24 => reg 2 ] + [ dynset add reg_key 1 set set5 ] +
tests/py/nft-test.py +7 -2
@@ -866,8 +866,13 @@ def set_process(set_line, filename, lineno): set_name = tokens[0] set_type = tokens[2] - if len(tokens) == 5 and tokens[3] == "flags": - set_flags = tokens[4] + i = 3 + while len(tokens) > i and tokens[i] == ".": + set_type += " . " + tokens[i+1] + i += 2 + + if len(tokens) == i+2 and tokens[i] == "flags": + set_flags = tokens[i+1] else: set_flags = ""
Quoted 9 lines · Anders K. Pedersen | Cohaesio
From: Anders K. Pedersen <[email protected]>
Before this patch the following fails:
# nft add rule ip6 filter x \ set add ip6 saddr . ip6 daddr @test nft: netlink_linearize.c:648: netlink_gen_expr: Assertion `dreg < ctx->reg_low' failed. Aborted
Quoted 7 lines
This is was previously fixed for flow statements in
fbea4a6f4449("netlink_linearize: skip set element expression in flow table key"), and this patch implements the same change for set statements by using the set element key innetlink_gen_set_stmt().
nft-test.pyis updated to support set types with concatenated data types in order to support testing of this.
Applied, thanks Anders.