Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef __LINUX_BRIDGE_NETFILTER_H 3 : : #define __LINUX_BRIDGE_NETFILTER_H 4 : : 5 : : #include <uapi/linux/netfilter_bridge.h> 6 : : #include <linux/skbuff.h> 7 : : 8 : : struct nf_bridge_frag_data { 9 : : char mac[ETH_HLEN]; 10 : : bool vlan_present; 11 : : u16 vlan_tci; 12 : : __be16 vlan_proto; 13 : : }; 14 : : 15 : : #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) 16 : : 17 : : int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb); 18 : : 19 : : static inline void br_drop_fake_rtable(struct sk_buff *skb) 20 : : { 21 : : struct dst_entry *dst = skb_dst(skb); 22 : : 23 : : if (dst && (dst->flags & DST_FAKE_RTABLE)) 24 : : skb_dst_drop(skb); 25 : : } 26 : : 27 : : static inline struct nf_bridge_info * 28 : : nf_bridge_info_get(const struct sk_buff *skb) 29 : : { 30 : : return skb_ext_find(skb, SKB_EXT_BRIDGE_NF); 31 : : } 32 : : 33 : : static inline bool nf_bridge_info_exists(const struct sk_buff *skb) 34 : : { 35 : : return skb_ext_exist(skb, SKB_EXT_BRIDGE_NF); 36 : : } 37 : : 38 : : static inline int nf_bridge_get_physinif(const struct sk_buff *skb) 39 : : { 40 : : const struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); 41 : : 42 : : if (!nf_bridge) 43 : : return 0; 44 : : 45 : : return nf_bridge->physindev ? nf_bridge->physindev->ifindex : 0; 46 : : } 47 : : 48 : : static inline int nf_bridge_get_physoutif(const struct sk_buff *skb) 49 : : { 50 : : const struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); 51 : : 52 : : if (!nf_bridge) 53 : : return 0; 54 : : 55 : : return nf_bridge->physoutdev ? nf_bridge->physoutdev->ifindex : 0; 56 : : } 57 : : 58 : : static inline struct net_device * 59 : : nf_bridge_get_physindev(const struct sk_buff *skb) 60 : : { 61 : : const struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); 62 : : 63 : 0 : return nf_bridge ? nf_bridge->physindev : NULL; 64 : : } 65 : : 66 : : static inline struct net_device * 67 : : nf_bridge_get_physoutdev(const struct sk_buff *skb) 68 : : { 69 : : const struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); 70 : : 71 : 0 : return nf_bridge ? nf_bridge->physoutdev : NULL; 72 : : } 73 : : 74 : : static inline bool nf_bridge_in_prerouting(const struct sk_buff *skb) 75 : : { 76 : : const struct nf_bridge_info *nf_bridge = nf_bridge_info_get(skb); 77 : : 78 : 0 : return nf_bridge && nf_bridge->in_prerouting; 79 : : } 80 : : #else 81 : : #define br_drop_fake_rtable(skb) do { } while (0) 82 : : static inline bool nf_bridge_in_prerouting(const struct sk_buff *skb) 83 : : { 84 : : return false; 85 : : } 86 : : #endif /* CONFIG_BRIDGE_NETFILTER */ 87 : : 88 : : #endif