1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef _NF_CONNTRACK_ACT_CT_H 4 #define _NF_CONNTRACK_ACT_CT_H 5 6 #include <net/netfilter/nf_conntrack.h> 7 #include <linux/netfilter/nf_conntrack_common.h> 8 #include <net/netfilter/nf_conntrack_extend.h> 9 10 struct nf_conn_act_ct_ext { 11 int ifindex[IP_CT_DIR_MAX]; 12 }; 13 14 static inline struct nf_conn_act_ct_ext *nf_conn_act_ct_ext_find(const struct nf_conn *ct) 15 { 16 #if IS_ENABLED(CONFIG_NET_ACT_CT) 17 return nf_ct_ext_find(ct, NF_CT_EXT_ACT_CT); 18 #else 19 return NULL; 20 #endif 21 } 22 23 static inline void nf_conn_act_ct_ext_fill(struct sk_buff *skb, struct nf_conn *ct, 24 enum ip_conntrack_info ctinfo) 25 { 26 #if IS_ENABLED(CONFIG_NET_ACT_CT) 27 struct nf_conn_act_ct_ext *act_ct_ext; 28 29 act_ct_ext = nf_conn_act_ct_ext_find(ct); 30 if (dev_net(skb->dev) == &init_net && act_ct_ext) 31 act_ct_ext->ifindex[CTINFO2DIR(ctinfo)] = skb->dev->ifindex; 32 #endif 33 } 34 35 static inline struct 36 nf_conn_act_ct_ext *nf_conn_act_ct_ext_add(struct sk_buff *skb, 37 struct nf_conn *ct, 38 enum ip_conntrack_info ctinfo) 39 { 40 #if IS_ENABLED(CONFIG_NET_ACT_CT) 41 struct nf_conn_act_ct_ext *act_ct = nf_ct_ext_find(ct, NF_CT_EXT_ACT_CT); 42 43 if (act_ct) 44 return act_ct; 45 46 act_ct = nf_ct_ext_add(ct, NF_CT_EXT_ACT_CT, GFP_ATOMIC); 47 nf_conn_act_ct_ext_fill(skb, ct, ctinfo); 48 return act_ct; 49 #else 50 return NULL; 51 #endif 52 } 53 54 #endif /* _NF_CONNTRACK_ACT_CT_H */ 55