This source file includes following definitions.
- fqdir_pre_exit
- inet_frag_put
- frag_mem_limit
- sub_frag_mem_limit
- add_frag_mem_limit
   1 
   2 #ifndef __NET_FRAG_H__
   3 #define __NET_FRAG_H__
   4 
   5 #include <linux/rhashtable-types.h>
   6 #include <linux/completion.h>
   7 
   8 
   9 struct fqdir {
  10         
  11         long                    high_thresh;
  12         long                    low_thresh;
  13         int                     timeout;
  14         int                     max_dist;
  15         struct inet_frags       *f;
  16         struct net              *net;
  17         bool                    dead;
  18 
  19         struct rhashtable       rhashtable ____cacheline_aligned_in_smp;
  20 
  21         
  22         atomic_long_t           mem ____cacheline_aligned_in_smp;
  23         struct work_struct      destroy_work;
  24 };
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 enum {
  35         INET_FRAG_FIRST_IN      = BIT(0),
  36         INET_FRAG_LAST_IN       = BIT(1),
  37         INET_FRAG_COMPLETE      = BIT(2),
  38         INET_FRAG_HASH_DEAD     = BIT(3),
  39 };
  40 
  41 struct frag_v4_compare_key {
  42         __be32          saddr;
  43         __be32          daddr;
  44         u32             user;
  45         u32             vif;
  46         __be16          id;
  47         u16             protocol;
  48 };
  49 
  50 struct frag_v6_compare_key {
  51         struct in6_addr saddr;
  52         struct in6_addr daddr;
  53         u32             user;
  54         __be32          id;
  55         u32             iif;
  56 };
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 struct inet_frag_queue {
  78         struct rhash_head       node;
  79         union {
  80                 struct frag_v4_compare_key v4;
  81                 struct frag_v6_compare_key v6;
  82         } key;
  83         struct timer_list       timer;
  84         spinlock_t              lock;
  85         refcount_t              refcnt;
  86         struct rb_root          rb_fragments;
  87         struct sk_buff          *fragments_tail;
  88         struct sk_buff          *last_run_head;
  89         ktime_t                 stamp;
  90         int                     len;
  91         int                     meat;
  92         __u8                    flags;
  93         u16                     max_size;
  94         struct fqdir            *fqdir;
  95         struct rcu_head         rcu;
  96 };
  97 
  98 struct inet_frags {
  99         unsigned int            qsize;
 100 
 101         void                    (*constructor)(struct inet_frag_queue *q,
 102                                                const void *arg);
 103         void                    (*destructor)(struct inet_frag_queue *);
 104         void                    (*frag_expire)(struct timer_list *t);
 105         struct kmem_cache       *frags_cachep;
 106         const char              *frags_cache_name;
 107         struct rhashtable_params rhash_params;
 108         refcount_t              refcnt;
 109         struct completion       completion;
 110 };
 111 
 112 int inet_frags_init(struct inet_frags *);
 113 void inet_frags_fini(struct inet_frags *);
 114 
 115 int fqdir_init(struct fqdir **fqdirp, struct inet_frags *f, struct net *net);
 116 
 117 static inline void fqdir_pre_exit(struct fqdir *fqdir)
 118 {
 119         fqdir->high_thresh = 0; 
 120         fqdir->dead = true;
 121 }
 122 void fqdir_exit(struct fqdir *fqdir);
 123 
 124 void inet_frag_kill(struct inet_frag_queue *q);
 125 void inet_frag_destroy(struct inet_frag_queue *q);
 126 struct inet_frag_queue *inet_frag_find(struct fqdir *fqdir, void *key);
 127 
 128 
 129 unsigned int inet_frag_rbtree_purge(struct rb_root *root);
 130 
 131 static inline void inet_frag_put(struct inet_frag_queue *q)
 132 {
 133         if (refcount_dec_and_test(&q->refcnt))
 134                 inet_frag_destroy(q);
 135 }
 136 
 137 
 138 
 139 static inline long frag_mem_limit(const struct fqdir *fqdir)
 140 {
 141         return atomic_long_read(&fqdir->mem);
 142 }
 143 
 144 static inline void sub_frag_mem_limit(struct fqdir *fqdir, long val)
 145 {
 146         atomic_long_sub(val, &fqdir->mem);
 147 }
 148 
 149 static inline void add_frag_mem_limit(struct fqdir *fqdir, long val)
 150 {
 151         atomic_long_add(val, &fqdir->mem);
 152 }
 153 
 154 
 155 
 156 
 157 
 158 #define IPFRAG_ECN_NOT_ECT      0x01 
 159 #define IPFRAG_ECN_ECT_1        0x02 
 160 #define IPFRAG_ECN_ECT_0        0x04 
 161 #define IPFRAG_ECN_CE           0x08 
 162 
 163 extern const u8 ip_frag_ecn_table[16];
 164 
 165 
 166 #define IPFRAG_OK       0
 167 #define IPFRAG_DUP      1
 168 #define IPFRAG_OVERLAP  2
 169 int inet_frag_queue_insert(struct inet_frag_queue *q, struct sk_buff *skb,
 170                            int offset, int end);
 171 void *inet_frag_reasm_prepare(struct inet_frag_queue *q, struct sk_buff *skb,
 172                               struct sk_buff *parent);
 173 void inet_frag_reasm_finish(struct inet_frag_queue *q, struct sk_buff *head,
 174                             void *reasm_data, bool try_coalesce);
 175 struct sk_buff *inet_frag_pull_head(struct inet_frag_queue *q);
 176 
 177 #endif