netfilter: remove IPvX specific parts from nf_conntrack_l4proto.h
[safe/jmp/linux-2.6] / include / net / inet_frag.h
index 74e9cb9..e081eef 100644 (file)
@@ -1,8 +1,20 @@
 #ifndef __NET_FRAG_H__
 #define __NET_FRAG_H__
 
+struct netns_frags {
+       int                     nqueues;
+       atomic_t                mem;
+       struct list_head        lru_list;
+
+       /* sysctls */
+       int                     timeout;
+       int                     high_thresh;
+       int                     low_thresh;
+};
+
 struct inet_frag_queue {
        struct hlist_node       list;
+       struct netns_frags      *net;
        struct list_head        lru_list;   /* lru list member */
        spinlock_t              lock;
        atomic_t                refcnt;
@@ -13,9 +25,48 @@ struct inet_frag_queue {
        int                     meat;
        __u8                    last_in;    /* first/last segment arrived? */
 
-#define COMPLETE               4
-#define FIRST_IN               2
-#define LAST_IN                        1
+#define INET_FRAG_COMPLETE     4
+#define INET_FRAG_FIRST_IN     2
+#define INET_FRAG_LAST_IN      1
 };
 
+#define INETFRAGS_HASHSZ               64
+
+struct inet_frags {
+       struct hlist_head       hash[INETFRAGS_HASHSZ];
+       rwlock_t                lock;
+       u32                     rnd;
+       int                     qsize;
+       int                     secret_interval;
+       struct timer_list       secret_timer;
+
+       unsigned int            (*hashfn)(struct inet_frag_queue *);
+       void                    (*constructor)(struct inet_frag_queue *q,
+                                               void *arg);
+       void                    (*destructor)(struct inet_frag_queue *);
+       void                    (*skb_free)(struct sk_buff *);
+       int                     (*match)(struct inet_frag_queue *q,
+                                               void *arg);
+       void                    (*frag_expire)(unsigned long data);
+};
+
+void inet_frags_init(struct inet_frags *);
+void inet_frags_fini(struct inet_frags *);
+
+void inet_frags_init_net(struct netns_frags *nf);
+void inet_frags_exit_net(struct netns_frags *nf, struct inet_frags *f);
+
+void inet_frag_kill(struct inet_frag_queue *q, struct inet_frags *f);
+void inet_frag_destroy(struct inet_frag_queue *q,
+                               struct inet_frags *f, int *work);
+int inet_frag_evictor(struct netns_frags *nf, struct inet_frags *f);
+struct inet_frag_queue *inet_frag_find(struct netns_frags *nf,
+               struct inet_frags *f, void *key, unsigned int hash);
+
+static inline void inet_frag_put(struct inet_frag_queue *q, struct inet_frags *f)
+{
+       if (atomic_dec_and_test(&q->refcnt))
+               inet_frag_destroy(q, f, NULL);
+}
+
 #endif