Commit | Line | Data |
---|---|---|
5ab11c98 PE |
1 | #ifndef __NET_FRAG_H__ |
2 | #define __NET_FRAG_H__ | |
3 | ||
ac18e750 | 4 | struct netns_frags { |
e5a2bb84 | 5 | int nqueues; |
6ddc0822 | 6 | atomic_t mem; |
3140c25c | 7 | struct list_head lru_list; |
b2fd5321 PE |
8 | |
9 | /* sysctls */ | |
10 | int timeout; | |
e31e0bdc PE |
11 | int high_thresh; |
12 | int low_thresh; | |
ac18e750 PE |
13 | }; |
14 | ||
5ab11c98 PE |
15 | struct inet_frag_queue { |
16 | struct hlist_node list; | |
ac18e750 | 17 | struct netns_frags *net; |
5ab11c98 PE |
18 | struct list_head lru_list; /* lru list member */ |
19 | spinlock_t lock; | |
20 | atomic_t refcnt; | |
21 | struct timer_list timer; /* when will this queue expire? */ | |
22 | struct sk_buff *fragments; /* list of received fragments */ | |
d6bebca9 | 23 | struct sk_buff *fragments_tail; |
5ab11c98 PE |
24 | ktime_t stamp; |
25 | int len; /* total length of orig datagram */ | |
26 | int meat; | |
27 | __u8 last_in; /* first/last segment arrived? */ | |
28 | ||
bc578a54 JP |
29 | #define INET_FRAG_COMPLETE 4 |
30 | #define INET_FRAG_FIRST_IN 2 | |
31 | #define INET_FRAG_LAST_IN 1 | |
5f2d04f1 PM |
32 | |
33 | u16 max_size; | |
5ab11c98 PE |
34 | }; |
35 | ||
7eb95156 PE |
36 | #define INETFRAGS_HASHSZ 64 |
37 | ||
38 | struct inet_frags { | |
7eb95156 PE |
39 | struct hlist_head hash[INETFRAGS_HASHSZ]; |
40 | rwlock_t lock; | |
41 | u32 rnd; | |
1e4b8287 | 42 | int qsize; |
3b4bc4a2 | 43 | int secret_interval; |
7eb95156 | 44 | struct timer_list secret_timer; |
321a3a99 PE |
45 | |
46 | unsigned int (*hashfn)(struct inet_frag_queue *); | |
c6fda282 PE |
47 | void (*constructor)(struct inet_frag_queue *q, |
48 | void *arg); | |
1e4b8287 PE |
49 | void (*destructor)(struct inet_frag_queue *); |
50 | void (*skb_free)(struct sk_buff *); | |
cbc264ca | 51 | bool (*match)(struct inet_frag_queue *q, void *arg); |
e521db9d | 52 | void (*frag_expire)(unsigned long data); |
7eb95156 PE |
53 | }; |
54 | ||
55 | void inet_frags_init(struct inet_frags *); | |
56 | void inet_frags_fini(struct inet_frags *); | |
57 | ||
e5a2bb84 | 58 | void inet_frags_init_net(struct netns_frags *nf); |
81566e83 | 59 | void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f); |
e5a2bb84 | 60 | |
277e650d | 61 | void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f); |
1e4b8287 PE |
62 | void inet_frag_destroy(struct inet_frag_queue *q, |
63 | struct inet_frags *f, int *work); | |
6b102865 | 64 | int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f, bool force); |
ac18e750 | 65 | struct inet_frag_queue *inet_frag_find(struct netns_frags *nf, |
56bca31f HE |
66 | struct inet_frags *f, void *key, unsigned int hash) |
67 | __releases(&f->lock); | |
277e650d | 68 | |
762cc408 PE |
69 | static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f) |
70 | { | |
71 | if (atomic_dec_and_test(&q->refcnt)) | |
72 | inet_frag_destroy(q, f, NULL); | |
73 | } | |
74 | ||
5ab11c98 | 75 | #endif |