Commit | Line | Data |
---|---|---|
7eb95156 PE |
1 | /* |
2 | * inet fragments management | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version | |
7 | * 2 of the License, or (at your option) any later version. | |
8 | * | |
9 | * Authors: Pavel Emelyanov <xemul@openvz.org> | |
10 | * Started as consolidation of ipv4/ip_fragment.c, | |
11 | * ipv6/reassembly. and ipv6 nf conntrack reassembly | |
12 | */ | |
13 | ||
14 | #include <linux/list.h> | |
15 | #include <linux/spinlock.h> | |
16 | #include <linux/module.h> | |
17 | #include <linux/timer.h> | |
18 | #include <linux/mm.h> | |
19 | ||
20 | #include <net/inet_frag.h> | |
21 | ||
22 | void inet_frags_init(struct inet_frags *f) | |
23 | { | |
24 | int i; | |
25 | ||
26 | for (i = 0; i < INETFRAGS_HASHSZ; i++) | |
27 | INIT_HLIST_HEAD(&f->hash[i]); | |
28 | ||
29 | INIT_LIST_HEAD(&f->lru_list); | |
30 | rwlock_init(&f->lock); | |
31 | ||
32 | f->rnd = (u32) ((num_physpages ^ (num_physpages>>7)) ^ | |
33 | (jiffies ^ (jiffies >> 6))); | |
34 | ||
35 | f->nqueues = 0; | |
36 | atomic_set(&f->mem, 0); | |
37 | ||
38 | } | |
39 | EXPORT_SYMBOL(inet_frags_init); | |
40 | ||
41 | void inet_frags_fini(struct inet_frags *f) | |
42 | { | |
43 | } | |
44 | EXPORT_SYMBOL(inet_frags_fini); | |
277e650d PE |
45 | |
46 | static inline void fq_unlink(struct inet_frag_queue *fq, struct inet_frags *f) | |
47 | { | |
48 | write_lock(&f->lock); | |
49 | hlist_del(&fq->list); | |
50 | list_del(&fq->lru_list); | |
51 | f->nqueues--; | |
52 | write_unlock(&f->lock); | |
53 | } | |
54 | ||
55 | void inet_frag_kill(struct inet_frag_queue *fq, struct inet_frags *f) | |
56 | { | |
57 | if (del_timer(&fq->timer)) | |
58 | atomic_dec(&fq->refcnt); | |
59 | ||
60 | if (!(fq->last_in & COMPLETE)) { | |
61 | fq_unlink(fq, f); | |
62 | atomic_dec(&fq->refcnt); | |
63 | fq->last_in |= COMPLETE; | |
64 | } | |
65 | } | |
66 | ||
67 | EXPORT_SYMBOL(inet_frag_kill); |