1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _NF_CONNTRACK_TIMEOUT_H 3 #define _NF_CONNTRACK_TIMEOUT_H 4 5 #include <net/net_namespace.h> 6 #include <linux/netfilter/nf_conntrack_common.h> 7 #include <linux/netfilter/nf_conntrack_tuple_common.h> 8 #include <linux/refcount.h> 9 #include <net/netfilter/nf_conntrack.h> 10 #include <net/netfilter/nf_conntrack_extend.h> 11 12 #define CTNL_TIMEOUT_NAME_MAX 32 13 14 struct nf_ct_timeout { 15 __u16 l3num; 16 const struct nf_conntrack_l4proto *l4proto; 17 char data[]; 18 }; 19 20 struct ctnl_timeout { 21 struct list_head head; 22 struct rcu_head rcu_head; 23 refcount_t refcnt; 24 char name[CTNL_TIMEOUT_NAME_MAX]; 25 struct nf_ct_timeout timeout; 26 }; 27 28 struct nf_conn_timeout { 29 struct nf_ct_timeout __rcu *timeout; 30 }; 31 32 static inline unsigned int * 33 nf_ct_timeout_data(const struct nf_conn_timeout *t) 34 { 35 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT 36 struct nf_ct_timeout *timeout; 37 38 timeout = rcu_dereference(t->timeout); 39 if (timeout == NULL) 40 return NULL; 41 42 return (unsigned int *)timeout->data; 43 #else 44 return NULL; 45 #endif 46 } 47 48 static inline 49 struct nf_conn_timeout *nf_ct_timeout_find(const struct nf_conn *ct) 50 { 51 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT 52 return nf_ct_ext_find(ct, NF_CT_EXT_TIMEOUT); 53 #else 54 return NULL; 55 #endif 56 } 57 58 static inline 59 struct nf_conn_timeout *nf_ct_timeout_ext_add(struct nf_conn *ct, 60 struct nf_ct_timeout *timeout, 61 gfp_t gfp) 62 { 63 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT 64 struct nf_conn_timeout *timeout_ext; 65 66 timeout_ext = nf_ct_ext_add(ct, NF_CT_EXT_TIMEOUT, gfp); 67 if (timeout_ext == NULL) 68 return NULL; 69 70 rcu_assign_pointer(timeout_ext->timeout, timeout); 71 72 return timeout_ext; 73 #else 74 return NULL; 75 #endif 76 }; 77 78 static inline unsigned int *nf_ct_timeout_lookup(const struct nf_conn *ct) 79 { 80 unsigned int *timeouts = NULL; 81 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT 82 struct nf_conn_timeout *timeout_ext; 83 84 timeout_ext = nf_ct_timeout_find(ct); 85 if (timeout_ext) 86 timeouts = nf_ct_timeout_data(timeout_ext); 87 #endif 88 return timeouts; 89 } 90 91 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT 92 void nf_ct_untimeout(struct net *net, struct nf_ct_timeout *timeout); 93 int nf_ct_set_timeout(struct net *net, struct nf_conn *ct, u8 l3num, u8 l4num, 94 const char *timeout_name); 95 void nf_ct_destroy_timeout(struct nf_conn *ct); 96 #else 97 static inline int nf_ct_set_timeout(struct net *net, struct nf_conn *ct, 98 u8 l3num, u8 l4num, 99 const char *timeout_name) 100 { 101 return -EOPNOTSUPP; 102 } 103 104 static inline void nf_ct_destroy_timeout(struct nf_conn *ct) 105 { 106 return; 107 } 108 #endif /* CONFIG_NF_CONNTRACK_TIMEOUT */ 109 110 #ifdef CONFIG_NF_CONNTRACK_TIMEOUT 111 struct nf_ct_timeout_hooks { 112 struct nf_ct_timeout *(*timeout_find_get)(struct net *net, const char *name); 113 void (*timeout_put)(struct nf_ct_timeout *timeout); 114 }; 115 116 extern const struct nf_ct_timeout_hooks *nf_ct_timeout_hook; 117 #endif 118 119 #endif /* _NF_CONNTRACK_TIMEOUT_H */ 120