From: wenxu <wenxu@xxxxxxxxx> This patch provide a meta to get the bridge vlan proto nft add rule bridge firewall zones counter meta br_vlan_proto 0x8100 Signed-off-by: wenxu <wenxu@xxxxxxxxx> --- include/uapi/linux/netfilter/nf_tables.h | 2 ++ net/netfilter/nft_meta.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h index 8859535..0b18646 100644 --- a/include/uapi/linux/netfilter/nf_tables.h +++ b/include/uapi/linux/netfilter/nf_tables.h @@ -796,6 +796,7 @@ enum nft_exthdr_attributes { * @NFT_META_IIFKIND: packet input interface kind name (dev->rtnl_link_ops->kind) * @NFT_META_OIFKIND: packet output interface kind name (dev->rtnl_link_ops->kind) * @NFT_META_BRI_PVID: packet input bridge port pvid + * @NFT_META_BRI_VLAN_PROTO: packet input bridge vlan proto */ enum nft_meta_keys { NFT_META_LEN, @@ -827,6 +828,7 @@ enum nft_meta_keys { NFT_META_IIFKIND, NFT_META_OIFKIND, NFT_META_BRI_PVID, + NFT_META_BRI_VLAN_PROTO, }; /** diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c index 4f8116d..e3adf6a 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c @@ -248,6 +248,14 @@ void nft_meta_get_eval(const struct nft_expr *expr, return; } goto err; + case NFT_META_BRI_VLAN_PROTO: + if (in == NULL || (p = br_port_get_rtnl_rcu(in)) == NULL) + goto err; + if (br_opt_get(p->br, BROPT_VLAN_ENABLED)) { + nft_reg_store16(dest, p->br->vlan_proto); + return; + } + goto err; #endif case NFT_META_IIFKIND: if (in == NULL || in->rtnl_link_ops == NULL) @@ -376,6 +384,7 @@ static int nft_meta_get_init(const struct nft_ctx *ctx, len = IFNAMSIZ; break; case NFT_META_BRI_PVID: + case NFT_META_BRI_VLAN_PROTO: if (ctx->family != NFPROTO_BRIDGE) return -EOPNOTSUPP; len = sizeof(u16); -- 1.8.3.1