1 #ifndef __NET_INET_FRAG_WRAPPER_H
2 #define __NET_INET_FRAG_WRAPPER_H 1
4 #include <linux/version.h>
5 #include_next <net/inet_frag.h>
7 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
8 #define inet_frag_evictor(nf, f, force) \
10 if (force || atomic_read(&nf->mem) > nf->high_thresh) { \
11 inet_frag_evictor(nf, f); \
16 #ifdef OVS_FRAGMENT_BACKPORT
17 #ifdef HAVE_INET_FRAGS_LAST_IN
18 #define q_flags(q) (q->last_in)
19 #define qp_flags(qp) (qp->q.last_in)
21 #define q_flags(q) (q->flags)
22 #define qp_flags(qp) (qp->q.flags)
25 #ifndef HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR
27 * struct ovs_inet_frag_queue - fragment queue
29 * Wrap the system inet_frag_queue to provide a list evictor.
31 * @list_evictor: list of queues to forcefully evict (e.g. due to low memory)
33 struct ovs_inet_frag_queue {
34 struct inet_frag_queue fq;
35 struct hlist_node list_evictor;
38 static inline bool rpl_inet_frag_evicting(struct inet_frag_queue *q)
40 #ifdef HAVE_INET_FRAGS_WITH_FRAGS_WORK
41 struct ovs_inet_frag_queue *ofq = (struct ovs_inet_frag_queue *)q;
42 return !hlist_unhashed(&ofq->list_evictor);
44 return (q_flags(q) & INET_FRAG_FIRST_IN) && q->fragments != NULL;
47 #define inet_frag_evicting rpl_inet_frag_evicting
48 #else /* HAVE_INET_FRAG_QUEUE_WITH_LIST_EVICTOR */
49 #ifndef HAVE_INET_FRAG_EVICTING
50 static inline bool rpl_inet_frag_evicting(struct inet_frag_queue *q)
52 return !hlist_unhashed(&q->list_evictor);
54 #define inet_frag_evicting rpl_inet_frag_evicting
58 #ifndef HAVE_CORRECT_MRU_HANDLING
59 static unsigned int rpl_frag_percpu_counter_batch = 130000;
60 #define frag_percpu_counter_batch rpl_frag_percpu_counter_batch
62 static inline void rpl_sub_frag_mem_limit(struct netns_frags *nf, int i)
64 __percpu_counter_add(&nf->mem, -i, frag_percpu_counter_batch);
66 #define sub_frag_mem_limit rpl_sub_frag_mem_limit
68 static inline void rpl_add_frag_mem_limit(struct netns_frags *nf, int i)
70 __percpu_counter_add(&nf->mem, i, frag_percpu_counter_batch);
72 #define add_frag_mem_limit rpl_add_frag_mem_limit
74 int rpl_inet_frags_init(struct inet_frags *f);
75 #define inet_frags_init rpl_inet_frags_init
77 void rpl_inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f);
78 #define inet_frags_exit_net rpl_inet_frags_exit_net
80 void rpl_inet_frag_destroy(struct inet_frag_queue *q, struct inet_frags *f);
81 #define inet_frag_destroy(q, f, work) rpl_inet_frag_destroy(q, f)
82 #endif /* !HAVE_CORRECT_MRU_HANDLING */
83 #endif /* OVS_FRAGMENT_BACKPORT */
85 #endif /* inet_frag.h */