2 * connection tracking event cache.
5 #ifndef _NF_CONNTRACK_ECACHE_H
6 #define _NF_CONNTRACK_ECACHE_H
7 #include <net/netfilter/nf_conntrack.h>
9 #include <linux/notifier.h>
10 #include <linux/interrupt.h>
11 #include <net/net_namespace.h>
12 #include <net/netfilter/nf_conntrack_expect.h>
14 /* Connection tracking event bits */
15 enum ip_conntrack_events
19 IPCT_NEW = (1 << IPCT_NEW_BIT),
21 /* Expected connection */
23 IPCT_RELATED = (1 << IPCT_RELATED_BIT),
25 /* Destroyed conntrack */
27 IPCT_DESTROY = (1 << IPCT_DESTROY_BIT),
29 /* Timer has been refreshed */
31 IPCT_REFRESH = (1 << IPCT_REFRESH_BIT),
33 /* Status has changed */
35 IPCT_STATUS = (1 << IPCT_STATUS_BIT),
37 /* Update of protocol info */
38 IPCT_PROTOINFO_BIT = 5,
39 IPCT_PROTOINFO = (1 << IPCT_PROTOINFO_BIT),
41 /* Volatile protocol info */
42 IPCT_PROTOINFO_VOLATILE_BIT = 6,
43 IPCT_PROTOINFO_VOLATILE = (1 << IPCT_PROTOINFO_VOLATILE_BIT),
45 /* New helper for conntrack */
47 IPCT_HELPER = (1 << IPCT_HELPER_BIT),
49 /* Update of helper info */
50 IPCT_HELPINFO_BIT = 8,
51 IPCT_HELPINFO = (1 << IPCT_HELPINFO_BIT),
53 /* Volatile helper info */
54 IPCT_HELPINFO_VOLATILE_BIT = 9,
55 IPCT_HELPINFO_VOLATILE = (1 << IPCT_HELPINFO_VOLATILE_BIT),
58 IPCT_NATINFO_BIT = 10,
59 IPCT_NATINFO = (1 << IPCT_NATINFO_BIT),
61 /* Counter highest bit has been set, unused */
62 IPCT_COUNTER_FILLING_BIT = 11,
63 IPCT_COUNTER_FILLING = (1 << IPCT_COUNTER_FILLING_BIT),
67 IPCT_MARK = (1 << IPCT_MARK_BIT),
69 /* NAT sequence adjustment */
70 IPCT_NATSEQADJ_BIT = 13,
71 IPCT_NATSEQADJ = (1 << IPCT_NATSEQADJ_BIT),
74 IPCT_SECMARK_BIT = 14,
75 IPCT_SECMARK = (1 << IPCT_SECMARK_BIT),
78 enum ip_conntrack_expect_events {
80 IPEXP_NEW = (1 << IPEXP_NEW_BIT),
83 #ifdef CONFIG_NF_CONNTRACK_EVENTS
84 struct nf_conntrack_ecache {
89 /* This structure is passed to event handler */
96 extern struct atomic_notifier_head nf_conntrack_chain;
97 extern int nf_conntrack_register_notifier(struct notifier_block *nb);
98 extern int nf_conntrack_unregister_notifier(struct notifier_block *nb);
100 extern void nf_ct_deliver_cached_events(const struct nf_conn *ct);
101 extern void __nf_ct_event_cache_init(struct nf_conn *ct);
102 extern void nf_ct_event_cache_flush(struct net *net);
105 nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct)
107 struct net *net = nf_ct_net(ct);
108 struct nf_conntrack_ecache *ecache;
111 ecache = per_cpu_ptr(net->ct.ecache, raw_smp_processor_id());
112 if (ct != ecache->ct)
113 __nf_ct_event_cache_init(ct);
114 ecache->events |= event;
119 nf_conntrack_event_report(enum ip_conntrack_events event,
124 struct nf_ct_event item = {
129 if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))
130 atomic_notifier_call_chain(&nf_conntrack_chain, event, &item);
134 nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct)
136 nf_conntrack_event_report(event, ct, 0, 0);
139 struct nf_exp_event {
140 struct nf_conntrack_expect *exp;
145 extern struct atomic_notifier_head nf_ct_expect_chain;
146 extern int nf_ct_expect_register_notifier(struct notifier_block *nb);
147 extern int nf_ct_expect_unregister_notifier(struct notifier_block *nb);
150 nf_ct_expect_event_report(enum ip_conntrack_expect_events event,
151 struct nf_conntrack_expect *exp,
155 struct nf_exp_event item = {
160 atomic_notifier_call_chain(&nf_ct_expect_chain, event, &item);
164 nf_ct_expect_event(enum ip_conntrack_expect_events event,
165 struct nf_conntrack_expect *exp)
167 nf_ct_expect_event_report(event, exp, 0, 0);
170 extern int nf_conntrack_ecache_init(struct net *net);
171 extern void nf_conntrack_ecache_fini(struct net *net);
173 #else /* CONFIG_NF_CONNTRACK_EVENTS */
175 static inline void nf_conntrack_event_cache(enum ip_conntrack_events event,
176 struct nf_conn *ct) {}
177 static inline void nf_conntrack_event(enum ip_conntrack_events event,
178 struct nf_conn *ct) {}
179 static inline void nf_conntrack_event_report(enum ip_conntrack_events event,
183 static inline void nf_ct_deliver_cached_events(const struct nf_conn *ct) {}
184 static inline void nf_ct_expect_event(enum ip_conntrack_expect_events event,
185 struct nf_conntrack_expect *exp) {}
186 static inline void nf_ct_expect_event_report(enum ip_conntrack_expect_events e,
187 struct nf_conntrack_expect *exp,
190 static inline void nf_ct_event_cache_flush(struct net *net) {}
192 static inline int nf_conntrack_ecache_init(struct net *net)
197 static inline void nf_conntrack_ecache_fini(struct net *net)
200 #endif /* CONFIG_NF_CONNTRACK_EVENTS */
202 #endif /*_NF_CONNTRACK_ECACHE_H*/