This patch sets the pktinfo for IPv4/IPv6 traffic. Therefore, we can check the meta l4proto for IPv4/IPv6 traffic in bridge, before we don't have enough information to do it. Example: nft add rule bridge filter input ether type {ip, ip6} meta l4proto udp counter and nft add rule bridge filter input ether type {ip, ip6} meta l4proto tcp counter With this patch, we can filter the traffic using the transport context that we want. Signed-off-by: Alvaro Neira Ayuso <alvaroneay@xxxxxxxxx> --- [changes in v2] * Refactor the code to make it more clear * Make sure that IPv6 is enabled net/bridge/netfilter/nf_tables_bridge.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/net/bridge/netfilter/nf_tables_bridge.c b/net/bridge/netfilter/nf_tables_bridge.c index d468c19..f4471d7 100644 --- a/net/bridge/netfilter/nf_tables_bridge.c +++ b/net/bridge/netfilter/nf_tables_bridge.c @@ -16,6 +16,8 @@ #include <net/netfilter/nf_tables_bridge.h> #include <linux/ip.h> #include <linux/ipv6.h> +#include <net/netfilter/nf_tables_ipv4.h> +#include <net/netfilter/nf_tables_ipv6.h> int nft_bridge_iphdr_validate(struct sk_buff *skb) { @@ -71,7 +73,24 @@ nft_do_chain_bridge(const struct nf_hook_ops *ops, { struct nft_pktinfo pkt; - nft_set_pktinfo(&pkt, ops, skb, in, out); + switch (eth_hdr(skb)->h_proto) { + case htons(ETH_P_IP): + if (!nft_bridge_iphdr_validate(skb)) + nft_set_pktinfo(&pkt, ops, skb, in, out); + else + nft_set_pktinfo_ipv4(&pkt, ops, skb, in, out); + break; + case htons(ETH_P_IPV6): + #if IS_ENABLED(CONFIG_IPV6) + if (!nft_bridge_ip6hdr_validate(skb) || + nft_set_pktinfo_ipv6(&pkt, ops, skb, in, out) < 0) + nft_set_pktinfo(&pkt, ops, skb, in, out); + break; + #endif + default: + nft_set_pktinfo(&pkt, ops, skb, in, out); + break; + } return nft_do_chain(&pkt, ops); } -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html