From: wenxu <wenxu@xxxxxxxxx> This patch provide a meta to get the bridge vlan proto nft add rule bridge firewall zones counter meta br_iifvproto 0x8100 Signed-off-by: wenxu <wenxu@xxxxxxxxx> --- include/uapi/linux/netfilter/nf_tables.h | 4 ++++ net/netfilter/nft_meta.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h index 8859535..0f75a6d 100644 --- a/include/uapi/linux/netfilter/nf_tables.h +++ b/include/uapi/linux/netfilter/nf_tables.h @@ -796,6 +796,8 @@ 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_IIFVPROTO: packet input bridge port vlan proto + * @NFT_META_BRI_OIFVPROTO: packet output bridge port vlan proto */ enum nft_meta_keys { NFT_META_LEN, @@ -827,6 +829,8 @@ enum nft_meta_keys { NFT_META_IIFKIND, NFT_META_OIFKIND, NFT_META_BRI_PVID, + NFT_META_BRI_IIFVPROTO, + NFT_META_BRI_OIFVPROTO, }; /** diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c index 4f8116d..e7e10fb 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c @@ -248,6 +248,22 @@ void nft_meta_get_eval(const struct nft_expr *expr, return; } goto err; + case NFT_META_BRI_IIFVPROTO: + 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; + case NFT_META_BRI_OIFVPROTO: + if (out == NULL || (p = br_port_get_rtnl_rcu(out)) == 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 +392,8 @@ static int nft_meta_get_init(const struct nft_ctx *ctx, len = IFNAMSIZ; break; case NFT_META_BRI_PVID: + case NFT_META_BRI_IIFVPROTO: + case NFT_META_BRI_OIFVPROTO: if (ctx->family != NFPROTO_BRIDGE) return -EOPNOTSUPP; len = sizeof(u16); -- 1.8.3.1