linux/include/net/inet_frag.h
<<
>>
Prefs
   1#ifndef __NET_FRAG_H__
   2#define __NET_FRAG_H__
   3
   4struct 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
  15struct 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        struct sk_buff          *fragments_tail;
  24        ktime_t                 stamp;
  25        int                     len;        /* total length of orig datagram */
  26        int                     meat;
  27        __u8                    last_in;    /* first/last segment arrived? */
  28
  29#define INET_FRAG_COMPLETE      4
  30#define INET_FRAG_FIRST_IN      2
  31#define INET_FRAG_LAST_IN       1
  32
  33        u16                     max_size;
  34};
  35
  36#define INETFRAGS_HASHSZ                64
  37
  38struct inet_frags {
  39        struct hlist_head       hash[INETFRAGS_HASHSZ];
  40        rwlock_t                lock;
  41        u32                     rnd;
  42        int                     qsize;
  43        int                     secret_interval;
  44        struct timer_list       secret_timer;
  45
  46        unsigned int            (*hashfn)(struct inet_frag_queue *);
  47        void                    (*constructor)(struct inet_frag_queue *q,
  48                                                void *arg);
  49        void                    (*destructor)(struct inet_frag_queue *);
  50        void                    (*skb_free)(struct sk_buff *);
  51        bool                    (*match)(struct inet_frag_queue *q, void *arg);
  52        void                    (*frag_expire)(unsigned long data);
  53};
  54
  55void inet_frags_init(struct inet_frags *);
  56void inet_frags_fini(struct inet_frags *);
  57
  58void inet_frags_init_net(struct netns_frags *nf);
  59void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f);
  60
  61void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f);
  62void inet_frag_destroy(struct inet_frag_queue *q,
  63                                struct inet_frags *f, int *work);
  64int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f, bool force);
  65struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,
  66                struct inet_frags *f, void *key, unsigned int hash)
  67        __releases(&f->lock);
  68
  69static 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
  75#endif
  76
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.