1 /* Expectation handling for nf_conntrack. */
3 /* (C) 1999-2001 Paul `Rusty' Russell
4 * (C) 2002-2006 Netfilter Core Team <coreteam@netfilter.org>
5 * (C) 2003,2004 USAGI/WIDE Project <http://www.linux-ipv6.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/types.h>
13 #include <linux/netfilter.h>
14 #include <linux/skbuff.h>
15 #include <linux/proc_fs.h>
16 #include <linux/seq_file.h>
17 #include <linux/stddef.h>
18 #include <linux/slab.h>
19 #include <linux/err.h>
20 #include <linux/percpu.h>
21 #include <linux/kernel.h>
22 #include <linux/jhash.h>
24 #include <net/netfilter/nf_conntrack.h>
25 #include <net/netfilter/nf_conntrack_core.h>
26 #include <net/netfilter/nf_conntrack_expect.h>
27 #include <net/netfilter/nf_conntrack_helper.h>
28 #include <net/netfilter/nf_conntrack_tuple.h>
30 LIST_HEAD(nf_ct_expect_list);
31 EXPORT_SYMBOL_GPL(nf_ct_expect_list);
33 struct hlist_head *nf_ct_expect_hash __read_mostly;
34 EXPORT_SYMBOL_GPL(nf_ct_expect_hash);
36 unsigned int nf_ct_expect_hsize __read_mostly;
37 EXPORT_SYMBOL_GPL(nf_ct_expect_hsize);
39 static unsigned int nf_ct_expect_hash_rnd __read_mostly;
40 static unsigned int nf_ct_expect_count;
41 static int nf_ct_expect_hash_rnd_initted __read_mostly;
42 static int nf_ct_expect_vmalloc;
44 static struct kmem_cache *nf_ct_expect_cachep __read_mostly;
45 static unsigned int nf_ct_expect_next_id;
47 /* nf_conntrack_expect helper functions */
48 void nf_ct_unlink_expect(struct nf_conntrack_expect *exp)
50 struct nf_conn_help *master_help = nfct_help(exp->master);
52 NF_CT_ASSERT(master_help);
53 NF_CT_ASSERT(!timer_pending(&exp->timeout));
56 hlist_del(&exp->hnode);
59 NF_CT_STAT_INC(expect_delete);
60 master_help->expecting--;
61 nf_ct_expect_put(exp);
63 EXPORT_SYMBOL_GPL(nf_ct_unlink_expect);
65 static void nf_ct_expectation_timed_out(unsigned long ul_expect)
67 struct nf_conntrack_expect *exp = (void *)ul_expect;
69 write_lock_bh(&nf_conntrack_lock);
70 nf_ct_unlink_expect(exp);
71 write_unlock_bh(&nf_conntrack_lock);
72 nf_ct_expect_put(exp);
75 static unsigned int nf_ct_expect_dst_hash(const struct nf_conntrack_tuple *tuple)
77 if (unlikely(!nf_ct_expect_hash_rnd_initted)) {
78 get_random_bytes(&nf_ct_expect_hash_rnd, 4);
79 nf_ct_expect_hash_rnd_initted = 1;
82 return jhash2(tuple->dst.u3.all, ARRAY_SIZE(tuple->dst.u3.all),
83 (((tuple->dst.protonum ^ tuple->src.l3num) << 16) |
84 tuple->dst.u.all) ^ nf_ct_expect_hash_rnd) %
88 struct nf_conntrack_expect *
89 __nf_ct_expect_find(const struct nf_conntrack_tuple *tuple)
91 struct nf_conntrack_expect *i;
95 if (!nf_ct_expect_count)
98 h = nf_ct_expect_dst_hash(tuple);
99 hlist_for_each_entry(i, n, &nf_ct_expect_hash[h], hnode) {
100 if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask))
105 EXPORT_SYMBOL_GPL(__nf_ct_expect_find);
107 /* Just find a expectation corresponding to a tuple. */
108 struct nf_conntrack_expect *
109 nf_ct_expect_find_get(const struct nf_conntrack_tuple *tuple)
111 struct nf_conntrack_expect *i;
113 read_lock_bh(&nf_conntrack_lock);
114 i = __nf_ct_expect_find(tuple);
117 read_unlock_bh(&nf_conntrack_lock);
121 EXPORT_SYMBOL_GPL(nf_ct_expect_find_get);
123 /* If an expectation for this connection is found, it gets delete from
124 * global list then returned. */
125 struct nf_conntrack_expect *
126 nf_ct_find_expectation(const struct nf_conntrack_tuple *tuple)
128 struct nf_conntrack_expect *exp;
130 exp = __nf_ct_expect_find(tuple);
134 /* If master is not in hash table yet (ie. packet hasn't left
135 this machine yet), how can other end know about expected?
136 Hence these are not the droids you are looking for (if
137 master ct never got confirmed, we'd hold a reference to it
138 and weird things would happen to future packets). */
139 if (!nf_ct_is_confirmed(exp->master))
142 if (exp->flags & NF_CT_EXPECT_PERMANENT) {
143 atomic_inc(&exp->use);
145 } else if (del_timer(&exp->timeout)) {
146 nf_ct_unlink_expect(exp);
153 /* delete all expectations for this conntrack */
154 void nf_ct_remove_expectations(struct nf_conn *ct)
156 struct nf_conntrack_expect *i, *tmp;
157 struct nf_conn_help *help = nfct_help(ct);
159 /* Optimization: most connection never expect any others. */
160 if (!help || help->expecting == 0)
163 list_for_each_entry_safe(i, tmp, &nf_ct_expect_list, list) {
164 if (i->master == ct && del_timer(&i->timeout)) {
165 nf_ct_unlink_expect(i);
170 EXPORT_SYMBOL_GPL(nf_ct_remove_expectations);
172 /* Would two expected things clash? */
173 static inline int expect_clash(const struct nf_conntrack_expect *a,
174 const struct nf_conntrack_expect *b)
176 /* Part covered by intersection of masks must be unequal,
177 otherwise they clash */
178 struct nf_conntrack_tuple_mask intersect_mask;
181 intersect_mask.src.u.all = a->mask.src.u.all & b->mask.src.u.all;
183 for (count = 0; count < NF_CT_TUPLE_L3SIZE; count++){
184 intersect_mask.src.u3.all[count] =
185 a->mask.src.u3.all[count] & b->mask.src.u3.all[count];
188 return nf_ct_tuple_mask_cmp(&a->tuple, &b->tuple, &intersect_mask);
191 static inline int expect_matches(const struct nf_conntrack_expect *a,
192 const struct nf_conntrack_expect *b)
194 return a->master == b->master
195 && nf_ct_tuple_equal(&a->tuple, &b->tuple)
196 && nf_ct_tuple_mask_equal(&a->mask, &b->mask);
199 /* Generally a bad idea to call this: could have matched already. */
200 void nf_ct_unexpect_related(struct nf_conntrack_expect *exp)
202 write_lock_bh(&nf_conntrack_lock);
203 if (del_timer(&exp->timeout)) {
204 nf_ct_unlink_expect(exp);
205 nf_ct_expect_put(exp);
207 write_unlock_bh(&nf_conntrack_lock);
209 EXPORT_SYMBOL_GPL(nf_ct_unexpect_related);
211 /* We don't increase the master conntrack refcount for non-fulfilled
212 * conntracks. During the conntrack destruction, the expectations are
213 * always killed before the conntrack itself */
214 struct nf_conntrack_expect *nf_ct_expect_alloc(struct nf_conn *me)
216 struct nf_conntrack_expect *new;
218 new = kmem_cache_alloc(nf_ct_expect_cachep, GFP_ATOMIC);
223 atomic_set(&new->use, 1);
226 EXPORT_SYMBOL_GPL(nf_ct_expect_alloc);
228 void nf_ct_expect_init(struct nf_conntrack_expect *exp, int family,
229 union nf_conntrack_address *saddr,
230 union nf_conntrack_address *daddr,
231 u_int8_t proto, __be16 *src, __be16 *dst)
235 if (family == AF_INET)
241 exp->expectfn = NULL;
243 exp->tuple.src.l3num = family;
244 exp->tuple.dst.protonum = proto;
247 memcpy(&exp->tuple.src.u3, saddr, len);
248 if (sizeof(exp->tuple.src.u3) > len)
249 /* address needs to be cleared for nf_ct_tuple_equal */
250 memset((void *)&exp->tuple.src.u3 + len, 0x00,
251 sizeof(exp->tuple.src.u3) - len);
252 memset(&exp->mask.src.u3, 0xFF, len);
253 if (sizeof(exp->mask.src.u3) > len)
254 memset((void *)&exp->mask.src.u3 + len, 0x00,
255 sizeof(exp->mask.src.u3) - len);
257 memset(&exp->tuple.src.u3, 0x00, sizeof(exp->tuple.src.u3));
258 memset(&exp->mask.src.u3, 0x00, sizeof(exp->mask.src.u3));
262 exp->tuple.src.u.all = (__force u16)*src;
263 exp->mask.src.u.all = 0xFFFF;
265 exp->tuple.src.u.all = 0;
266 exp->mask.src.u.all = 0;
269 memcpy(&exp->tuple.dst.u3, daddr, len);
270 if (sizeof(exp->tuple.dst.u3) > len)
271 /* address needs to be cleared for nf_ct_tuple_equal */
272 memset((void *)&exp->tuple.dst.u3 + len, 0x00,
273 sizeof(exp->tuple.dst.u3) - len);
275 exp->tuple.dst.u.all = (__force u16)*dst;
277 EXPORT_SYMBOL_GPL(nf_ct_expect_init);
279 void nf_ct_expect_put(struct nf_conntrack_expect *exp)
281 if (atomic_dec_and_test(&exp->use))
282 kmem_cache_free(nf_ct_expect_cachep, exp);
284 EXPORT_SYMBOL_GPL(nf_ct_expect_put);
286 static void nf_ct_expect_insert(struct nf_conntrack_expect *exp)
288 struct nf_conn_help *master_help = nfct_help(exp->master);
289 unsigned int h = nf_ct_expect_dst_hash(&exp->tuple);
291 atomic_inc(&exp->use);
292 master_help->expecting++;
294 list_add(&exp->list, &nf_ct_expect_list);
295 hlist_add_head(&exp->hnode, &nf_ct_expect_hash[h]);
296 nf_ct_expect_count++;
298 setup_timer(&exp->timeout, nf_ct_expectation_timed_out,
300 exp->timeout.expires = jiffies + master_help->helper->timeout * HZ;
301 add_timer(&exp->timeout);
303 exp->id = ++nf_ct_expect_next_id;
304 atomic_inc(&exp->use);
305 NF_CT_STAT_INC(expect_create);
308 /* Race with expectations being used means we could have none to find; OK. */
309 static void evict_oldest_expect(struct nf_conn *master)
311 struct nf_conntrack_expect *i;
313 list_for_each_entry_reverse(i, &nf_ct_expect_list, list) {
314 if (i->master == master) {
315 if (del_timer(&i->timeout)) {
316 nf_ct_unlink_expect(i);
324 static inline int refresh_timer(struct nf_conntrack_expect *i)
326 struct nf_conn_help *master_help = nfct_help(i->master);
328 if (!del_timer(&i->timeout))
331 i->timeout.expires = jiffies + master_help->helper->timeout*HZ;
332 add_timer(&i->timeout);
336 int nf_ct_expect_related(struct nf_conntrack_expect *expect)
338 struct nf_conntrack_expect *i;
339 struct nf_conn *master = expect->master;
340 struct nf_conn_help *master_help = nfct_help(master);
341 struct hlist_node *n;
345 NF_CT_ASSERT(master_help);
347 write_lock_bh(&nf_conntrack_lock);
348 if (!master_help->helper) {
352 h = nf_ct_expect_dst_hash(&expect->tuple);
353 hlist_for_each_entry(i, n, &nf_ct_expect_hash[h], hnode) {
354 if (expect_matches(i, expect)) {
355 /* Refresh timer: if it's dying, ignore.. */
356 if (refresh_timer(i)) {
360 } else if (expect_clash(i, expect)) {
365 /* Will be over limit? */
366 if (master_help->helper->max_expected &&
367 master_help->expecting >= master_help->helper->max_expected)
368 evict_oldest_expect(master);
370 nf_ct_expect_insert(expect);
371 nf_ct_expect_event(IPEXP_NEW, expect);
374 write_unlock_bh(&nf_conntrack_lock);
377 EXPORT_SYMBOL_GPL(nf_ct_expect_related);
379 #ifdef CONFIG_PROC_FS
380 static void *exp_seq_start(struct seq_file *s, loff_t *pos)
382 struct list_head *e = &nf_ct_expect_list;
385 /* strange seq_file api calls stop even if we fail,
386 * thus we need to grab lock since stop unlocks */
387 read_lock_bh(&nf_conntrack_lock);
392 for (i = 0; i <= *pos; i++) {
394 if (e == &nf_ct_expect_list)
400 static void *exp_seq_next(struct seq_file *s, void *v, loff_t *pos)
402 struct list_head *e = v;
407 if (e == &nf_ct_expect_list)
413 static void exp_seq_stop(struct seq_file *s, void *v)
415 read_unlock_bh(&nf_conntrack_lock);
418 static int exp_seq_show(struct seq_file *s, void *v)
420 struct nf_conntrack_expect *expect = v;
422 if (expect->timeout.function)
423 seq_printf(s, "%ld ", timer_pending(&expect->timeout)
424 ? (long)(expect->timeout.expires - jiffies)/HZ : 0);
427 seq_printf(s, "l3proto = %u proto=%u ",
428 expect->tuple.src.l3num,
429 expect->tuple.dst.protonum);
430 print_tuple(s, &expect->tuple,
431 __nf_ct_l3proto_find(expect->tuple.src.l3num),
432 __nf_ct_l4proto_find(expect->tuple.src.l3num,
433 expect->tuple.dst.protonum));
434 return seq_putc(s, '\n');
437 static struct seq_operations exp_seq_ops = {
438 .start = exp_seq_start,
439 .next = exp_seq_next,
440 .stop = exp_seq_stop,
444 static int exp_open(struct inode *inode, struct file *file)
446 return seq_open(file, &exp_seq_ops);
449 const struct file_operations exp_file_ops = {
450 .owner = THIS_MODULE,
454 .release = seq_release
456 #endif /* CONFIG_PROC_FS */
458 static int __init exp_proc_init(void)
460 #ifdef CONFIG_PROC_FS
461 struct proc_dir_entry *proc;
463 proc = proc_net_fops_create("nf_conntrack_expect", 0440, &exp_file_ops);
466 #endif /* CONFIG_PROC_FS */
470 static void exp_proc_remove(void)
472 #ifdef CONFIG_PROC_FS
473 proc_net_remove("nf_conntrack_expect");
474 #endif /* CONFIG_PROC_FS */
477 module_param_named(expect_hashsize, nf_ct_expect_hsize, uint, 0600);
479 int __init nf_conntrack_expect_init(void)
483 if (!nf_ct_expect_hsize) {
484 nf_ct_expect_hsize = nf_conntrack_htable_size / 256;
485 if (!nf_ct_expect_hsize)
486 nf_ct_expect_hsize = 1;
489 nf_ct_expect_hash = nf_ct_alloc_hashtable(&nf_ct_expect_hsize,
490 &nf_ct_expect_vmalloc);
491 if (nf_ct_expect_hash == NULL)
494 nf_ct_expect_cachep = kmem_cache_create("nf_conntrack_expect",
495 sizeof(struct nf_conntrack_expect),
497 if (!nf_ct_expect_cachep)
500 err = exp_proc_init();
507 nf_ct_free_hashtable(nf_ct_expect_hash, nf_ct_expect_vmalloc,
510 kmem_cache_destroy(nf_ct_expect_cachep);
515 void nf_conntrack_expect_fini(void)
518 kmem_cache_destroy(nf_ct_expect_cachep);
519 nf_ct_free_hashtable(nf_ct_expect_hash, nf_ct_expect_vmalloc,