]> err.no Git - linux-2.6/blobdiff - include/linux/netfilter.h
[KERNEL] Do not truncate to 'int' in ALIGN() macro.
[linux-2.6] / include / linux / netfilter.h
index 5aa9316079234f77b897d34ae7d5e3febb7dfd36..10168e26a8466eb889c3c9c5530a645d85679c25 100644 (file)
@@ -40,7 +40,6 @@
 #endif
 
 #ifdef __KERNEL__
-#include <linux/config.h>
 #ifdef CONFIG_NETFILTER
 
 extern void netfilter_init(void);
@@ -283,16 +282,42 @@ extern void nf_invalidate_cache(int pf);
    Returns true or false. */
 extern int skb_make_writable(struct sk_buff **pskb, unsigned int writable_len);
 
-struct nf_queue_rerouter {
-       void (*save)(const struct sk_buff *skb, struct nf_info *info);
-       int (*reroute)(struct sk_buff **skb, const struct nf_info *info);
-       int rer_size;
+struct nf_afinfo {
+       unsigned short  family;
+       unsigned int    (*checksum)(struct sk_buff *skb, unsigned int hook,
+                                   unsigned int dataoff, u_int8_t protocol);
+       void            (*saveroute)(const struct sk_buff *skb,
+                                    struct nf_info *info);
+       int             (*reroute)(struct sk_buff **skb,
+                                  const struct nf_info *info);
+       int             route_key_size;
 };
 
-#define nf_info_reroute(x) ((void *)x + sizeof(struct nf_info))
+extern struct nf_afinfo *nf_afinfo[];
+static inline struct nf_afinfo *nf_get_afinfo(unsigned short family)
+{
+       return rcu_dereference(nf_afinfo[family]);
+}
+
+static inline unsigned int
+nf_checksum(struct sk_buff *skb, unsigned int hook, unsigned int dataoff,
+           u_int8_t protocol, unsigned short family)
+{
+       struct nf_afinfo *afinfo;
+       unsigned int csum = 0;
+
+       rcu_read_lock();
+       afinfo = nf_get_afinfo(family);
+       if (afinfo)
+               csum = afinfo->checksum(skb, hook, dataoff, protocol);
+       rcu_read_unlock();
+       return csum;
+}
 
-extern int nf_register_queue_rerouter(int pf, struct nf_queue_rerouter *rer);
-extern int nf_unregister_queue_rerouter(int pf);
+extern int nf_register_afinfo(struct nf_afinfo *afinfo);
+extern void nf_unregister_afinfo(struct nf_afinfo *afinfo);
+
+#define nf_info_reroute(x) ((void *)x + sizeof(struct nf_info))
 
 #include <net/flow.h>
 extern void (*ip_nat_decode_session)(struct sk_buff *, struct flowi *);