1 /* SPDX-License-Identifier: GPL-2.0 */
5 #include <linux/rhashtable-types.h>
6 #include <linux/completion.h>
8 /* Per netns frag queues directory */
19 struct rhashtable rhashtable ____cacheline_aligned_in_smp
;
21 /* Keep atomic mem on separate cachelines in structs that include it */
22 atomic_long_t mem ____cacheline_aligned_in_smp
;
23 struct work_struct destroy_work
;
24 struct llist_node free_list
;
28 * fragment queue flags
30 * @INET_FRAG_FIRST_IN: first fragment has arrived
31 * @INET_FRAG_LAST_IN: final fragment has arrived
32 * @INET_FRAG_COMPLETE: frag queue has been processed and is due for destruction
33 * @INET_FRAG_HASH_DEAD: inet_frag_kill() has not removed fq from rhashtable
36 INET_FRAG_FIRST_IN
= BIT(0),
37 INET_FRAG_LAST_IN
= BIT(1),
38 INET_FRAG_COMPLETE
= BIT(2),
39 INET_FRAG_HASH_DEAD
= BIT(3),
42 struct frag_v4_compare_key
{
51 struct frag_v6_compare_key
{
52 struct in6_addr saddr
;
53 struct in6_addr daddr
;
60 * struct inet_frag_queue - fragment queue
63 * @key: keys identifying this frag.
64 * @timer: queue expiration timer
65 * @lock: spinlock protecting this frag
66 * @refcnt: reference count of the queue
67 * @rb_fragments: received fragments rb-tree root
68 * @fragments_tail: received fragments tail
69 * @last_run_head: the head of the last "run". see ip_fragment.c
70 * @stamp: timestamp of the last received fragment
71 * @len: total length of the original datagram
72 * @meat: length of received fragments so far
73 * @flags: fragment queue flags
74 * @max_size: maximum received fragment size
75 * @fqdir: pointer to struct fqdir
76 * @rcu: rcu head for freeing deferall
78 struct inet_frag_queue
{
79 struct rhash_head node
;
81 struct frag_v4_compare_key v4
;
82 struct frag_v6_compare_key v6
;
84 struct timer_list timer
;
87 struct rb_root rb_fragments
;
88 struct sk_buff
*fragments_tail
;
89 struct sk_buff
*last_run_head
;
102 void (*constructor
)(struct inet_frag_queue
*q
,
104 void (*destructor
)(struct inet_frag_queue
*);
105 void (*frag_expire
)(struct timer_list
*t
);
106 struct kmem_cache
*frags_cachep
;
107 const char *frags_cache_name
;
108 struct rhashtable_params rhash_params
;
110 struct completion completion
;
113 int inet_frags_init(struct inet_frags
*);
114 void inet_frags_fini(struct inet_frags
*);
116 int fqdir_init(struct fqdir
**fqdirp
, struct inet_frags
*f
, struct net
*net
);
118 static inline void fqdir_pre_exit(struct fqdir
*fqdir
)
120 fqdir
->high_thresh
= 0; /* prevent creation of new frags */
123 void fqdir_exit(struct fqdir
*fqdir
);
125 void inet_frag_kill(struct inet_frag_queue
*q
);
126 void inet_frag_destroy(struct inet_frag_queue
*q
);
127 struct inet_frag_queue
*inet_frag_find(struct fqdir
*fqdir
, void *key
);
129 /* Free all skbs in the queue; return the sum of their truesizes. */
130 unsigned int inet_frag_rbtree_purge(struct rb_root
*root
);
132 static inline void inet_frag_put(struct inet_frag_queue
*q
)
134 if (refcount_dec_and_test(&q
->refcnt
))
135 inet_frag_destroy(q
);
138 /* Memory Tracking Functions. */
140 static inline long frag_mem_limit(const struct fqdir
*fqdir
)
142 return atomic_long_read(&fqdir
->mem
);
145 static inline void sub_frag_mem_limit(struct fqdir
*fqdir
, long val
)
147 atomic_long_sub(val
, &fqdir
->mem
);
150 static inline void add_frag_mem_limit(struct fqdir
*fqdir
, long val
)
152 atomic_long_add(val
, &fqdir
->mem
);
155 /* RFC 3168 support :
156 * We want to check ECN values of all fragments, do detect invalid combinations.
157 * In ipq->ecn, we store the OR value of each ip4_frag_ecn() fragment value.
159 #define IPFRAG_ECN_NOT_ECT 0x01 /* one frag had ECN_NOT_ECT */
160 #define IPFRAG_ECN_ECT_1 0x02 /* one frag had ECN_ECT_1 */
161 #define IPFRAG_ECN_ECT_0 0x04 /* one frag had ECN_ECT_0 */
162 #define IPFRAG_ECN_CE 0x08 /* one frag had ECN_CE */
164 extern const u8 ip_frag_ecn_table
[16];
166 /* Return values of inet_frag_queue_insert() */
169 #define IPFRAG_OVERLAP 2
170 int inet_frag_queue_insert(struct inet_frag_queue
*q
, struct sk_buff
*skb
,
171 int offset
, int end
);
172 void *inet_frag_reasm_prepare(struct inet_frag_queue
*q
, struct sk_buff
*skb
,
173 struct sk_buff
*parent
);
174 void inet_frag_reasm_finish(struct inet_frag_queue
*q
, struct sk_buff
*head
,
175 void *reasm_data
, bool try_coalesce
);
176 struct sk_buff
*inet_frag_pull_head(struct inet_frag_queue
*q
);