Line data Source code
1 : #ifndef __NET_FRAG_H__
2 : #define __NET_FRAG_H__
3 :
4 : struct netns_frags {
5 : int nqueues;
6 : atomic_t mem;
7 : struct list_head lru_list;
8 :
9 : /* sysctls */
10 : int timeout;
11 : int high_thresh;
12 : int low_thresh;
13 : };
14 :
15 : struct inet_frag_queue {
16 : struct hlist_node list;
17 : struct netns_frags *net;
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 */
23 : ktime_t stamp;
24 : int len; /* total length of orig datagram */
25 : int meat;
26 : __u8 last_in; /* first/last segment arrived? */
27 :
28 : #define INET_FRAG_COMPLETE 4
29 : #define INET_FRAG_FIRST_IN 2
30 : #define INET_FRAG_LAST_IN 1
31 : };
32 :
33 : #define INETFRAGS_HASHSZ 64
34 :
35 : struct inet_frags {
36 : struct hlist_head hash[INETFRAGS_HASHSZ];
37 : rwlock_t lock;
38 : u32 rnd;
39 : int qsize;
40 : int secret_interval;
41 : struct timer_list secret_timer;
42 :
43 : unsigned int (*hashfn)(struct inet_frag_queue *);
44 : void (*constructor)(struct inet_frag_queue *q,
45 : void *arg);
46 : void (*destructor)(struct inet_frag_queue *);
47 : void (*skb_free)(struct sk_buff *);
48 : int (*match)(struct inet_frag_queue *q,
49 : void *arg);
50 : void (*frag_expire)(unsigned long data);
51 : };
52 :
53 : void inet_frags_init(struct inet_frags *);
54 : void inet_frags_fini(struct inet_frags *);
55 :
56 : void inet_frags_init_net(struct netns_frags *nf);
57 : void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f);
58 :
59 : void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f);
60 : void inet_frag_destroy(struct inet_frag_queue *q,
61 : struct inet_frags *f, int *work);
62 : int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f);
63 : struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,
64 : struct inet_frags *f, void *key, unsigned int hash)
65 : __releases(&f->lock);
66 :
67 : static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f)
68 : {
69 : if (atomic_dec_and_test(&q->refcnt))
70 : inet_frag_destroy(q, f, NULL);
71 : }
72 1 :
73 : #endif
|