]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
meta: introduce meta broute support
authorSriram Yagnaraman <sriram.yagnaraman@est.tech>
Sun, 26 Feb 2023 09:52:04 +0000 (10:52 +0100)
committerFlorian Westphal <fw@strlen.de>
Sat, 29 Apr 2023 14:49:11 +0000 (16:49 +0200)
Can be used in bridge prerouting hook to divert a packet
to the ip stack for routing.

This is a replacement for "ebtables -t broute" functionality.

Link: https://patchwork.ozlabs.org/project/netfilter-devel/patch/20230224095251.11249-1-sriram.yagnaraman@est.tech/
Signed-off-by: Sriram Yagnaraman <sriram.yagnaraman@est.tech>
Signed-off-by: Florian Westphal <fw@strlen.de>
doc/statements.txt
include/linux/netfilter/nf_tables.h
src/meta.c
tests/py/bridge/meta.t
tests/py/bridge/redirect.t [new file with mode: 0644]
tests/py/bridge/redirect.t.json [new file with mode: 0644]
tests/py/bridge/redirect.t.payload [new file with mode: 0644]

index b2794bcd682114f04c2dcda088edceefcbf73979..3fc70f863f4a889d7f9e7908b736c1113c760bb1 100644 (file)
@@ -296,7 +296,7 @@ A meta statement sets the value of a meta expression. The existing meta fields
 are: priority, mark, pkttype, nftrace. +
 
 [verse]
-*meta* {*mark* | *priority* | *pkttype* | *nftrace*} *set* 'value'
+*meta* {*mark* | *priority* | *pkttype* | *nftrace* | *broute*} *set* 'value'
 
 A meta statement sets meta data associated with a packet. +
 
@@ -316,6 +316,9 @@ pkt_type
 |nftrace |
 ruleset packet tracing on/off. Use *monitor trace* command to watch traces|
 0, 1
+|broute |
+broute on/off. packets are routed instead of being bridged|
+0, 1
 |==========================
 
 LIMIT STATEMENT
index ff677f3a6cadbe831ddff2d2996dc61c51e350d8..9c6f02c26054ade2efd43a67f1b10b4b6a276f5b 100644 (file)
@@ -931,6 +931,7 @@ enum nft_exthdr_attributes {
  * @NFT_META_TIME_HOUR: hour of day (in seconds)
  * @NFT_META_SDIF: slave device interface index
  * @NFT_META_SDIFNAME: slave device interface name
+ * @NFT_META_BRI_BROUTE: packet br_netfilter_broute bit
  */
 enum nft_meta_keys {
        NFT_META_LEN,
@@ -969,6 +970,7 @@ enum nft_meta_keys {
        NFT_META_TIME_HOUR,
        NFT_META_SDIF,
        NFT_META_SDIFNAME,
+       NFT_META_BRI_BROUTE,
        __NFT_META_IIFTYPE,
 };
 
index 3be270a4253cf7dbac5df1efb4d16b9c185714be..822c2fd12b6f60fd9455d8ac71ff54b8e9ee3320 100644 (file)
@@ -698,6 +698,8 @@ const struct meta_template meta_templates[] = {
        [NFT_META_SDIFNAME]     = META_TEMPLATE("sdifname", &ifname_type,
                                                IFNAMSIZ * BITS_PER_BYTE,
                                                BYTEORDER_HOST_ENDIAN),
+       [NFT_META_BRI_BROUTE]   = META_TEMPLATE("broute",   &integer_type,
+                                               1    , BYTEORDER_HOST_ENDIAN),
 };
 
 static bool meta_key_is_unqualified(enum nft_meta_keys key)
index d77ebd899f1859ecd2f0e097c9257500c6303671..171aa610204e4fcf8af33132c333ca41cc35bfdc 100644 (file)
@@ -9,3 +9,5 @@ meta ibrpvid 100;ok
 
 meta protocol ip udp dport 67;ok
 meta protocol ip6 udp dport 67;ok
+
+meta broute set 1;fail
diff --git a/tests/py/bridge/redirect.t b/tests/py/bridge/redirect.t
new file mode 100644 (file)
index 0000000..5181e79
--- /dev/null
@@ -0,0 +1,5 @@
+:prerouting;type filter hook prerouting priority 0
+
+*bridge;test-bridge;prerouting
+
+meta broute set 1;ok
diff --git a/tests/py/bridge/redirect.t.json b/tests/py/bridge/redirect.t.json
new file mode 100644 (file)
index 0000000..7e32b32
--- /dev/null
@@ -0,0 +1,12 @@
+# meta broute set 1
+[
+    {
+        "mangle": {
+            "key": {
+                "meta": { "key": "broute" }
+            },
+            "value": 1
+        }
+    }
+]
+
diff --git a/tests/py/bridge/redirect.t.payload b/tests/py/bridge/redirect.t.payload
new file mode 100644 (file)
index 0000000..1fcfa5f
--- /dev/null
@@ -0,0 +1,4 @@
+# meta broute set 1
+bridge test-bridge prerouting
+  [ immediate reg 1 0x00000001 ]
+  [ meta set broute with reg 1 ]