blob: 5cc5e9e6171a03db471407c708578b4794c22b92 [file] [log] [blame]
Pablo Neira Ayusodd705072012-02-28 23:36:48 +01001#ifndef _NF_CONNTRACK_TIMEOUT_H
2#define _NF_CONNTRACK_TIMEOUT_H
3
4#include <net/net_namespace.h>
5#include <linux/netfilter/nf_conntrack_common.h>
6#include <linux/netfilter/nf_conntrack_tuple_common.h>
7#include <net/netfilter/nf_conntrack.h>
8#include <net/netfilter/nf_conntrack_extend.h>
9
10#define CTNL_TIMEOUT_NAME_MAX 32
11
12struct ctnl_timeout {
13 struct list_head head;
14 struct rcu_head rcu_head;
15 atomic_t refcnt;
16 char name[CTNL_TIMEOUT_NAME_MAX];
17 __u16 l3num;
Pablo Neira Ayusoc1ebd7d2012-03-22 23:40:01 +010018 struct nf_conntrack_l4proto *l4proto;
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010019 char data[0];
20};
21
22struct nf_conn_timeout {
Pablo Neira Ayusoae2d7082015-10-05 16:51:01 +020023 struct ctnl_timeout __rcu *timeout;
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010024};
25
Pablo Neira Ayusoae2d7082015-10-05 16:51:01 +020026static inline unsigned int *
27nf_ct_timeout_data(struct nf_conn_timeout *t)
28{
29 struct ctnl_timeout *timeout;
30
31 timeout = rcu_dereference(t->timeout);
32 if (timeout == NULL)
33 return NULL;
34
35 return (unsigned int *)timeout->data;
36}
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010037
38static inline
39struct nf_conn_timeout *nf_ct_timeout_find(const struct nf_conn *ct)
40{
41#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
42 return nf_ct_ext_find(ct, NF_CT_EXT_TIMEOUT);
43#else
44 return NULL;
45#endif
46}
47
48static inline
49struct nf_conn_timeout *nf_ct_timeout_ext_add(struct nf_conn *ct,
50 struct ctnl_timeout *timeout,
51 gfp_t gfp)
52{
53#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
54 struct nf_conn_timeout *timeout_ext;
55
56 timeout_ext = nf_ct_ext_add(ct, NF_CT_EXT_TIMEOUT, gfp);
57 if (timeout_ext == NULL)
58 return NULL;
59
Pablo Neira Ayusoae2d7082015-10-05 16:51:01 +020060 rcu_assign_pointer(timeout_ext->timeout, timeout);
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010061
62 return timeout_ext;
63#else
64 return NULL;
65#endif
66};
67
Pablo Neira Ayuso84b5ee92012-08-28 00:53:15 +000068static inline unsigned int *
69nf_ct_timeout_lookup(struct net *net, struct nf_conn *ct,
70 struct nf_conntrack_l4proto *l4proto)
71{
72#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
73 struct nf_conn_timeout *timeout_ext;
74 unsigned int *timeouts;
75
76 timeout_ext = nf_ct_timeout_find(ct);
Pablo Neira Ayusoae2d7082015-10-05 16:51:01 +020077 if (timeout_ext) {
78 timeouts = nf_ct_timeout_data(timeout_ext);
79 if (unlikely(!timeouts))
80 timeouts = l4proto->get_timeouts(net);
81 } else {
Pablo Neira Ayuso84b5ee92012-08-28 00:53:15 +000082 timeouts = l4proto->get_timeouts(net);
Pablo Neira Ayusoae2d7082015-10-05 16:51:01 +020083 }
Pablo Neira Ayuso84b5ee92012-08-28 00:53:15 +000084
85 return timeouts;
86#else
87 return l4proto->get_timeouts(net);
88#endif
89}
90
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010091#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
Joe Perches4e77be42013-09-23 11:37:48 -070092int nf_conntrack_timeout_init(void);
93void nf_conntrack_timeout_fini(void);
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010094#else
Gao feng86840942013-01-21 22:10:29 +000095static inline int nf_conntrack_timeout_init(void)
Pablo Neira Ayusodd705072012-02-28 23:36:48 +010096{
97 return 0;
98}
99
Gao feng86840942013-01-21 22:10:29 +0000100static inline void nf_conntrack_timeout_fini(void)
Pablo Neira Ayusodd705072012-02-28 23:36:48 +0100101{
102 return;
103}
104#endif /* CONFIG_NF_CONNTRACK_TIMEOUT */
105
106#ifdef CONFIG_NF_CONNTRACK_TIMEOUT
Pablo Neira19576c92015-12-09 14:07:40 +0100107extern struct ctnl_timeout *(*nf_ct_timeout_find_get_hook)(struct net *net, const char *name);
Pablo Neira Ayusodd705072012-02-28 23:36:48 +0100108extern void (*nf_ct_timeout_put_hook)(struct ctnl_timeout *timeout);
109#endif
110
111#endif /* _NF_CONNTRACK_TIMEOUT_H */