Changeset 9269


Ignore:
Timestamp:
2007-10-12T16:58:35+02:00 (10 years ago)
Author:
juhosg
Message:

[kernel] netfilter/ipset cleanups

  • rename patches to follow our naming conventions
  • update ipset patches with revision 7096 of pom
  • add CONFIG_IP_NF_SET_IPTREEMAP to default kernel configs
  • add ip_set_iptreemap to include/netfilter.mk
  • update kmod-ipt-ipset module description
Location:
trunk
Files:
5 edited
3 moved

Legend:

Unmodified
Added
Removed
  • trunk/include/netfilter.mk

    r9178 r9269  
    136136$(eval $(call nf_add,IPT_IPSET,CONFIG_IP_NF_SET_IPPORTHASH, $(P_V4)ip_set_ipporthash)) 
    137137$(eval $(call nf_add,IPT_IPSET,CONFIG_IP_NF_SET_IPTREE, $(P_V4)ip_set_iptree)) 
     138$(eval $(call nf_add,IPT_IPSET,CONFIG_IP_NF_SET_IPTREEMAP, $(P_V4)ip_set_iptreemap)) 
    138139$(eval $(call nf_add,IPT_IPSET,CONFIG_IP_NF_SET_MACIPMAP, $(P_V4)ip_set_macipmap)) 
    139140$(eval $(call nf_add,IPT_IPSET,CONFIG_IP_NF_SET_NETHASH, $(P_V4)ip_set_nethash)) 
  • trunk/package/kernel/modules/netfilter.mk

    r9178 r9269  
    228228define KernelPackage/ipt-ipset/description 
    229229 Netfilter kernel modules for ipset 
     230 Includes:  
     231 - ip_set  
     232 - ip_set_iphash  
     233 - ip_set_ipmap  
     234 - ip_set_ipporthash  
     235 - ip_set_iptree  
     236 - ip_set_iptreemap 
     237 - ip_set_macipmap  
     238 - ip_set_nethash  
     239 - ip_set_portmap  
     240 - ipt_set  
     241 - ipt_SET 
    230242endef 
    231243 
  • trunk/target/linux/generic-2.6/config-2.6.22

    r9218 r9269  
    578578CONFIG_IP_NF_SET_IPPORTHASH=m 
    579579CONFIG_IP_NF_SET_IPTREE=m 
     580CONFIG_IP_NF_SET_IPTREEMAP=m 
    580581CONFIG_IP_NF_SET_MACIPMAP=m 
    581582CONFIG_IP_NF_SET_MAX=256 
  • trunk/target/linux/generic-2.6/config-2.6.23

    r9256 r9269  
    585585CONFIG_IP_NF_SET_IPPORTHASH=m 
    586586CONFIG_IP_NF_SET_IPTREE=m 
     587CONFIG_IP_NF_SET_IPTREEMAP=m 
    587588CONFIG_IP_NF_SET_MACIPMAP=m 
    588589CONFIG_IP_NF_SET_MAX=256 
  • trunk/target/linux/generic-2.6/config-default

    r9055 r9269  
    562562CONFIG_IP_NF_SET_IPPORTHASH=m 
    563563CONFIG_IP_NF_SET_IPTREE=m 
     564CONFIG_IP_NF_SET_IPTREEMAP=m 
    564565CONFIG_IP_NF_SET_MACIPMAP=m 
    565566CONFIG_IP_NF_SET_MAX=256 
  • trunk/target/linux/generic-2.6/patches-2.6.22/130-netfilter_ipset.patch

    r9263 r9269  
    1 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set.h 
    2 =================================================================== 
    3 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set.h      2007-06-19 23:19:01.000000000 +0100 
     1diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set.h 
     2--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set.h      1970-01-01 01:00:00.000000000 +0100 
     3+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set.h  2007-10-12 14:31:55.000000000 +0200 
    54@@ -0,0 +1,498 @@ 
    65+#ifndef _IP_SET_H 
     
    502501+ 
    503502+#endif /*_IP_SET_H*/ 
    504 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_iphash.h 
    505 =================================================================== 
    506 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    507 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_iphash.h       2007-06-19 23:19:01.000000000 +0100 
     503diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_iphash.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iphash.h 
     504--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_iphash.h       1970-01-01 01:00:00.000000000 +0100 
     505+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iphash.h   2007-10-12 14:31:55.000000000 +0200 
    508506@@ -0,0 +1,30 @@ 
    509507+#ifndef __IP_SET_IPHASH_H 
     
    537535+ 
    538536+#endif /* __IP_SET_IPHASH_H */ 
    539 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_ipmap.h 
    540 =================================================================== 
    541 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    542 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_ipmap.h        2007-06-19 23:19:01.000000000 +0100 
     537diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_ipmap.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipmap.h 
     538--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_ipmap.h        1970-01-01 01:00:00.000000000 +0100 
     539+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipmap.h    2007-10-12 14:31:55.000000000 +0200 
    543540@@ -0,0 +1,56 @@ 
    544541+#ifndef __IP_SET_IPMAP_H 
     
    598595+        
    599596+#endif /* __IP_SET_IPMAP_H */ 
    600 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_ipporthash.h 
    601 =================================================================== 
    602 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    603 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_ipporthash.h   2007-06-19 23:19:01.000000000 +0100 
     597diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_ipporthash.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipporthash.h 
     598--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_ipporthash.h   1970-01-01 01:00:00.000000000 +0100 
     599+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipporthash.h       2007-10-12 14:31:55.000000000 +0200 
    604600@@ -0,0 +1,34 @@ 
    605601+#ifndef __IP_SET_IPPORTHASH_H 
     
    637633+ 
    638634+#endif /* __IP_SET_IPPORTHASH_H */ 
    639 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_iptree.h 
    640 =================================================================== 
    641 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    642 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_iptree.h       2007-06-19 23:19:01.000000000 +0100 
     635diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_iptree.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptree.h 
     636--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_iptree.h       1970-01-01 01:00:00.000000000 +0100 
     637+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptree.h   2007-10-12 14:31:55.000000000 +0200 
    643638@@ -0,0 +1,40 @@ 
    644639+#ifndef __IP_SET_IPTREE_H 
     
    682677+ 
    683678+#endif /* __IP_SET_IPTREE_H */ 
    684 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_macipmap.h 
    685 =================================================================== 
    686 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    687 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_macipmap.h     2007-06-19 23:19:01.000000000 +0100 
     679diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_iptreemap.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptreemap.h 
     680--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_iptreemap.h    1970-01-01 01:00:00.000000000 +0100 
     681+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptreemap.h        2007-10-12 14:31:55.000000000 +0200 
     682@@ -0,0 +1,40 @@ 
     683+#ifndef __IP_SET_IPTREEMAP_H 
     684+#define __IP_SET_IPTREEMAP_H 
     685+ 
     686+#include <linux/netfilter_ipv4/ip_set.h> 
     687+ 
     688+#define SETTYPE_NAME "iptreemap" 
     689+ 
     690+#ifdef __KERNEL__ 
     691+struct ip_set_iptreemap_d { 
     692+       unsigned char bitmap[32]; /* x.x.x.y */ 
     693+}; 
     694+ 
     695+struct ip_set_iptreemap_c { 
     696+       struct ip_set_iptreemap_d *tree[256]; /* x.x.y.x */ 
     697+}; 
     698+ 
     699+struct ip_set_iptreemap_b { 
     700+       struct ip_set_iptreemap_c *tree[256]; /* x.y.x.x */ 
     701+       unsigned char dirty[32]; 
     702+}; 
     703+#endif 
     704+ 
     705+struct ip_set_iptreemap { 
     706+       unsigned int gc_interval; 
     707+#ifdef __KERNEL__ 
     708+       struct timer_list gc; 
     709+       struct ip_set_iptreemap_b *tree[256]; /* y.x.x.x */ 
     710+#endif 
     711+}; 
     712+ 
     713+struct ip_set_req_iptreemap_create { 
     714+       unsigned int gc_interval; 
     715+}; 
     716+ 
     717+struct ip_set_req_iptreemap { 
     718+       ip_set_ip_t start; 
     719+       ip_set_ip_t end; 
     720+}; 
     721+ 
     722+#endif /* __IP_SET_IPTREEMAP_H */ 
     723diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_jhash.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_jhash.h 
     724--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_jhash.h        1970-01-01 01:00:00.000000000 +0100 
     725+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_jhash.h    2007-10-12 14:31:55.000000000 +0200 
     726@@ -0,0 +1,148 @@ 
     727+#ifndef _LINUX_IPSET_JHASH_H 
     728+#define _LINUX_IPSET_JHASH_H 
     729+ 
     730+/* This is a copy of linux/jhash.h but the types u32/u8 are changed 
     731+ * to __u32/__u8 so that the header file can be included into 
     732+ * userspace code as well. Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) 
     733+ */ 
     734+ 
     735+/* jhash.h: Jenkins hash support. 
     736+ * 
     737+ * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net) 
     738+ * 
     739+ * http://burtleburtle.net/bob/hash/ 
     740+ * 
     741+ * These are the credits from Bob's sources: 
     742+ * 
     743+ * lookup2.c, by Bob Jenkins, December 1996, Public Domain. 
     744+ * hash(), hash2(), hash3, and mix() are externally useful functions. 
     745+ * Routines to test the hash are included if SELF_TEST is defined. 
     746+ * You can use this free for any purpose.  It has no warranty. 
     747+ * 
     748+ * Copyright (C) 2003 David S. Miller (davem@redhat.com) 
     749+ * 
     750+ * I've modified Bob's hash to be useful in the Linux kernel, and 
     751+ * any bugs present are surely my fault.  -DaveM 
     752+ */ 
     753+ 
     754+/* NOTE: Arguments are modified. */ 
     755+#define __jhash_mix(a, b, c) \ 
     756+{ \ 
     757+  a -= b; a -= c; a ^= (c>>13); \ 
     758+  b -= c; b -= a; b ^= (a<<8); \ 
     759+  c -= a; c -= b; c ^= (b>>13); \ 
     760+  a -= b; a -= c; a ^= (c>>12);  \ 
     761+  b -= c; b -= a; b ^= (a<<16); \ 
     762+  c -= a; c -= b; c ^= (b>>5); \ 
     763+  a -= b; a -= c; a ^= (c>>3);  \ 
     764+  b -= c; b -= a; b ^= (a<<10); \ 
     765+  c -= a; c -= b; c ^= (b>>15); \ 
     766+} 
     767+ 
     768+/* The golden ration: an arbitrary value */ 
     769+#define JHASH_GOLDEN_RATIO     0x9e3779b9 
     770+ 
     771+/* The most generic version, hashes an arbitrary sequence 
     772+ * of bytes.  No alignment or length assumptions are made about 
     773+ * the input key. 
     774+ */ 
     775+static inline __u32 jhash(void *key, __u32 length, __u32 initval) 
     776+{ 
     777+       __u32 a, b, c, len; 
     778+       __u8 *k = key; 
     779+ 
     780+       len = length; 
     781+       a = b = JHASH_GOLDEN_RATIO; 
     782+       c = initval; 
     783+ 
     784+       while (len >= 12) { 
     785+               a += (k[0] +((__u32)k[1]<<8) +((__u32)k[2]<<16) +((__u32)k[3]<<24)); 
     786+               b += (k[4] +((__u32)k[5]<<8) +((__u32)k[6]<<16) +((__u32)k[7]<<24)); 
     787+               c += (k[8] +((__u32)k[9]<<8) +((__u32)k[10]<<16)+((__u32)k[11]<<24)); 
     788+ 
     789+               __jhash_mix(a,b,c); 
     790+ 
     791+               k += 12; 
     792+               len -= 12; 
     793+       } 
     794+ 
     795+       c += length; 
     796+       switch (len) { 
     797+       case 11: c += ((__u32)k[10]<<24); 
     798+       case 10: c += ((__u32)k[9]<<16); 
     799+       case 9 : c += ((__u32)k[8]<<8); 
     800+       case 8 : b += ((__u32)k[7]<<24); 
     801+       case 7 : b += ((__u32)k[6]<<16); 
     802+       case 6 : b += ((__u32)k[5]<<8); 
     803+       case 5 : b += k[4]; 
     804+       case 4 : a += ((__u32)k[3]<<24); 
     805+       case 3 : a += ((__u32)k[2]<<16); 
     806+       case 2 : a += ((__u32)k[1]<<8); 
     807+       case 1 : a += k[0]; 
     808+       }; 
     809+ 
     810+       __jhash_mix(a,b,c); 
     811+ 
     812+       return c; 
     813+} 
     814+ 
     815+/* A special optimized version that handles 1 or more of __u32s. 
     816+ * The length parameter here is the number of __u32s in the key. 
     817+ */ 
     818+static inline __u32 jhash2(__u32 *k, __u32 length, __u32 initval) 
     819+{ 
     820+       __u32 a, b, c, len; 
     821+ 
     822+       a = b = JHASH_GOLDEN_RATIO; 
     823+       c = initval; 
     824+       len = length; 
     825+ 
     826+       while (len >= 3) { 
     827+               a += k[0]; 
     828+               b += k[1]; 
     829+               c += k[2]; 
     830+               __jhash_mix(a, b, c); 
     831+               k += 3; len -= 3; 
     832+       } 
     833+ 
     834+       c += length * 4; 
     835+ 
     836+       switch (len) { 
     837+       case 2 : b += k[1]; 
     838+       case 1 : a += k[0]; 
     839+       }; 
     840+ 
     841+       __jhash_mix(a,b,c); 
     842+ 
     843+       return c; 
     844+} 
     845+ 
     846+ 
     847+/* A special ultra-optimized versions that knows they are hashing exactly 
     848+ * 3, 2 or 1 word(s). 
     849+ * 
     850+ * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally 
     851+ *       done at the end is not done here. 
     852+ */ 
     853+static inline __u32 jhash_3words(__u32 a, __u32 b, __u32 c, __u32 initval) 
     854+{ 
     855+       a += JHASH_GOLDEN_RATIO; 
     856+       b += JHASH_GOLDEN_RATIO; 
     857+       c += initval; 
     858+ 
     859+       __jhash_mix(a, b, c); 
     860+ 
     861+       return c; 
     862+} 
     863+ 
     864+static inline __u32 jhash_2words(__u32 a, __u32 b, __u32 initval) 
     865+{ 
     866+       return jhash_3words(a, b, 0, initval); 
     867+} 
     868+ 
     869+static inline __u32 jhash_1word(__u32 a, __u32 initval) 
     870+{ 
     871+       return jhash_3words(a, 0, 0, initval); 
     872+} 
     873+ 
     874+#endif /* _LINUX_IPSET_JHASH_H */ 
     875diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_macipmap.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_macipmap.h 
     876--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_macipmap.h     1970-01-01 01:00:00.000000000 +0100 
     877+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_macipmap.h 2007-10-12 14:31:55.000000000 +0200 
    688878@@ -0,0 +1,38 @@ 
    689879+#ifndef __IP_SET_MACIPMAP_H 
     
    725915+ 
    726916+#endif /* __IP_SET_MACIPMAP_H */ 
    727 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_malloc.h 
    728 =================================================================== 
    729 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    730 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_malloc.h       2007-06-19 23:19:01.000000000 +0100 
     917diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_malloc.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_malloc.h 
     918--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_malloc.h       1970-01-01 01:00:00.000000000 +0100 
     919+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_malloc.h   2007-10-12 14:31:55.000000000 +0200 
    731920@@ -0,0 +1,116 @@ 
    732921+#ifndef _IP_SET_MALLOC_H 
     
    8461035+ 
    8471036+#endif /*_IP_SET_MALLOC_H*/ 
    848 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_nethash.h 
    849 =================================================================== 
    850 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    851 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_nethash.h      2007-06-19 23:19:01.000000000 +0100 
     1037diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_nethash.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_nethash.h 
     1038--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_nethash.h      1970-01-01 01:00:00.000000000 +0100 
     1039+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_nethash.h  2007-10-12 14:31:55.000000000 +0200 
    8521040@@ -0,0 +1,55 @@ 
    8531041+#ifndef __IP_SET_NETHASH_H 
     
    9061094+ 
    9071095+#endif /* __IP_SET_NETHASH_H */ 
    908 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_portmap.h 
    909 =================================================================== 
    910 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    911 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ip_set_portmap.h      2007-06-19 23:19:01.000000000 +0100 
     1096diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_portmap.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_portmap.h 
     1097--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ip_set_portmap.h      1970-01-01 01:00:00.000000000 +0100 
     1098+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ip_set_portmap.h  2007-10-12 14:31:55.000000000 +0200 
    9121099@@ -0,0 +1,25 @@ 
    9131100+#ifndef __IP_SET_PORTMAP_H 
     
    9361123+ 
    9371124+#endif /* __IP_SET_PORTMAP_H */ 
    938 Index: linux-2.6.22-rc5/include/linux/netfilter_ipv4/ipt_set.h 
    939 =================================================================== 
    940 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    941 +++ linux-2.6.22-rc5/include/linux/netfilter_ipv4/ipt_set.h     2007-06-19 23:19:01.000000000 +0100 
     1125diff -Nru ./linux-2.6.22.4/include/linux/netfilter_ipv4/ipt_set.h linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ipt_set.h 
     1126--- ./linux-2.6.22.4/include/linux/netfilter_ipv4/ipt_set.h     1970-01-01 01:00:00.000000000 +0100 
     1127+++ linux-2.6.22.4.pom2patch.set/include/linux/netfilter_ipv4/ipt_set.h 2007-10-12 14:31:55.000000000 +0200 
    9421128@@ -0,0 +1,21 @@ 
    9431129+#ifndef _IPT_SET_H 
     
    9621148+ 
    9631149+#endif /*_IPT_SET_H*/ 
    964 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set.c 
    965 =================================================================== 
    966 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    967 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set.c        2007-06-19 23:19:01.000000000 +0100 
    968 @@ -0,0 +1,2001 @@ 
     1150diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set.c 
     1151--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set.c        1970-01-01 01:00:00.000000000 +0100 
     1152+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set.c    2007-10-12 14:31:55.000000000 +0200 
     1153@@ -0,0 +1,2003 @@ 
    9691154+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    9701155+ *                         Patrick Schaaf <bof@bof.de> 
     
    28973082+       .get_optmax     = SO_IP_SET + 1, 
    28983083+       .get            = &ip_set_sockfn_get, 
    2899 +       .use            = 0 
     3084+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     3085+       .owner          = THIS_MODULE, 
     3086+#endif 
    29003087+}; 
    29013088+ 
     
    29093096+MODULE_DESCRIPTION("module implementing core IP set support"); 
    29103097+ 
    2911 +static int __init init(void) 
     3098+static int __init ip_set_init(void) 
    29123099+{ 
    29133100+       int res; 
     
    29463133+} 
    29473134+ 
    2948 +static void __exit fini(void) 
     3135+static void __exit ip_set_fini(void) 
    29493136+{ 
    29503137+       /* There can't be any existing set or binding */ 
     
    29663153+EXPORT_SYMBOL(ip_set_testip_kernel); 
    29673154+ 
    2968 +module_init(init); 
    2969 +module_exit(fini); 
    2970 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_iphash.c 
    2971 =================================================================== 
    2972 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    2973 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_iphash.c 2007-06-19 23:19:01.000000000 +0100 
    2974 @@ -0,0 +1,413 @@ 
     3155+module_init(ip_set_init); 
     3156+module_exit(ip_set_fini); 
     3157diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_iphash.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_iphash.c 
     3158--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_iphash.c 1970-01-01 01:00:00.000000000 +0100 
     3159+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_iphash.c     2007-10-12 14:31:55.000000000 +0200 
     3160@@ -0,0 +1,429 @@ 
    29753161+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    29763162+ * 
     
    29853171+#include <linux/ip.h> 
    29863172+#include <linux/skbuff.h> 
     3173+#include <linux/version.h> 
     3174+#include <linux/jhash.h> 
    29873175+#include <linux/netfilter_ipv4/ip_tables.h> 
    29883176+#include <linux/netfilter_ipv4/ip_set.h> 
     
    29933181+#include <linux/vmalloc.h> 
    29943182+#include <linux/random.h> 
    2995 +#include <linux/jhash.h> 
    29963183+ 
    29973184+#include <net/ip.h> 
     
    30633250+       return __testip(set, 
    30643251+                       ntohl(flags[index] & IPSET_SRC  
     3252+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    30653253+                               ? ip_hdr(skb)->saddr  
    30663254+                               : ip_hdr(skb)->daddr), 
     3255+#else 
     3256+                               ? skb->nh.iph->saddr  
     3257+                               : skb->nh.iph->daddr), 
     3258+#endif 
    30673259+                       hash_ip); 
    30683260+} 
     
    30753267+       ip_set_ip_t *elem; 
    30763268+        
    3077 +       if (!ip || map->elements > limit) 
     3269+       if (!ip || map->elements >= limit) 
    30783270+               return -ERANGE; 
    30793271+ 
     
    31203312+       return __addip((struct ip_set_iphash *) set->data, 
    31213313+                      ntohl(flags[index] & IPSET_SRC  
    3122 +                               ? ip_hdr(skb)->saddr  
     3314+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3315+                               ? ip_hdr(skb)->saddr  
    31233316+                               : ip_hdr(skb)->daddr), 
     3317+#else 
     3318+                               ? skb->nh.iph->saddr  
     3319+                               : skb->nh.iph->daddr), 
     3320+#endif 
    31243321+                      hash_ip); 
    31253322+} 
     
    32433440+       return __delip(set, 
    32443441+                      ntohl(flags[index] & IPSET_SRC  
     3442+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    32453443+                               ? ip_hdr(skb)->saddr  
    32463444+                               : ip_hdr(skb)->daddr), 
     3445+#else 
     3446+                               ? skb->nh.iph->saddr  
     3447+                               : skb->nh.iph->daddr), 
     3448+#endif 
    32473449+                      hash_ip); 
    32483450+} 
     
    33733575+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    33743576+ 
    3375 +static int __init init(void) 
     3577+static int __init ip_set_iphash_init(void) 
    33763578+{ 
    33773579+       return ip_set_register_set_type(&ip_set_iphash); 
    33783580+} 
    33793581+ 
    3380 +static void __exit fini(void) 
     3582+static void __exit ip_set_iphash_fini(void) 
    33813583+{ 
    33823584+       /* FIXME: possible race with ip_set_create() */ 
     
    33843586+} 
    33853587+ 
    3386 +module_init(init); 
    3387 +module_exit(fini); 
    3388 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_ipmap.c 
    3389 =================================================================== 
    3390 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    3391 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_ipmap.c  2007-06-19 23:19:01.000000000 +0100 
    3392 @@ -0,0 +1,327 @@ 
     3588+module_init(ip_set_iphash_init); 
     3589+module_exit(ip_set_iphash_fini); 
     3590diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_ipmap.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_ipmap.c 
     3591--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_ipmap.c  1970-01-01 01:00:00.000000000 +0100 
     3592+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_ipmap.c      2007-10-12 14:31:55.000000000 +0200 
     3593@@ -0,0 +1,336 @@ 
    33933594+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    33943595+ *                         Patrick Schaaf <bof@bof.de> 
     
    34053606+#include <linux/ip.h> 
    34063607+#include <linux/skbuff.h> 
     3608+#include <linux/version.h> 
    34073609+#include <linux/netfilter_ipv4/ip_tables.h> 
    34083610+#include <linux/netfilter_ipv4/ip_set.h> 
     
    34113613+#include <asm/bitops.h> 
    34123614+#include <linux/spinlock.h> 
    3413 +#include <linux/skbuff.h> 
     3615+ 
    34143616+#include <linux/netfilter_ipv4/ip_set_ipmap.h> 
    34153617+ 
     
    34573659+             unsigned char index) 
    34583660+{ 
    3459 +       int res; 
    3460 +        
    3461 +       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    3462 +          flags[index] & IPSET_SRC ? "SRC" : "DST", 
    3463 +          NIPQUAD(ip_hdr(skb)->saddr), 
    3464 +          NIPQUAD(ip_hdr(skb)->daddr)); 
    3465 + 
    3466 +       res =  __testip(set, 
    3467 +                       ntohl(flags[index] & IPSET_SRC  
     3661+       int res =  __testip(set, 
     3662+                       ntohl(flags[index] & IPSET_SRC 
     3663+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    34683664+                               ? ip_hdr(skb)->saddr  
    34693665+                               : ip_hdr(skb)->daddr), 
     3666+#else 
     3667+                               ? skb->nh.iph->saddr  
     3668+                               : skb->nh.iph->daddr), 
     3669+#endif 
    34703670+                       hash_ip); 
    34713671+       return (res < 0 ? 0 : res); 
     
    35143714+       return __addip(set, 
    35153715+                      ntohl(flags[index] & IPSET_SRC  
    3516 +                               ? ip_hdr(skb)->saddr  
     3716+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3717+                               ? ip_hdr(skb)->saddr  
    35173718+                               : ip_hdr(skb)->daddr), 
     3719+#else 
     3720+                               ? skb->nh.iph->saddr  
     3721+                               : skb->nh.iph->daddr), 
     3722+#endif 
    35183723+                      hash_ip); 
    35193724+} 
     
    35603765+       return __delip(set, 
    35613766+                      ntohl(flags[index] & IPSET_SRC  
     3767+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    35623768+                               ? ip_hdr(skb)->saddr  
    35633769+                               : ip_hdr(skb)->daddr), 
     3770+#else 
     3771+                               ? skb->nh.iph->saddr  
     3772+                               : skb->nh.iph->daddr), 
     3773+#endif 
    35643774+                      hash_ip); 
    35653775+} 
     
    37053915+MODULE_DESCRIPTION("ipmap type of IP sets"); 
    37063916+ 
    3707 +static int __init init(void) 
     3917+static int __init ip_set_ipmap_init(void) 
    37083918+{ 
    37093919+       return ip_set_register_set_type(&ip_set_ipmap); 
    37103920+} 
    37113921+ 
    3712 +static void __exit fini(void) 
     3922+static void __exit ip_set_ipmap_fini(void) 
    37133923+{ 
    37143924+       /* FIXME: possible race with ip_set_create() */ 
     
    37163926+} 
    37173927+ 
    3718 +module_init(init); 
    3719 +module_exit(fini); 
    3720 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_ipporthash.c 
    3721 =================================================================== 
    3722 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    3723 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_ipporthash.c     2007-06-20 20:00:06.000000000 +0100 
    3724 @@ -0,0 +1,535 @@ 
     3928+module_init(ip_set_ipmap_init); 
     3929+module_exit(ip_set_ipmap_fini); 
     3930diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_ipporthash.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_ipporthash.c 
     3931--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_ipporthash.c     1970-01-01 01:00:00.000000000 +0100 
     3932+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_ipporthash.c 2007-10-12 14:31:55.000000000 +0200 
     3933@@ -0,0 +1,581 @@ 
    37253934+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    37263935+ * 
     
    37373946+#include <linux/udp.h> 
    37383947+#include <linux/skbuff.h> 
     3948+#include <linux/version.h> 
     3949+#include <linux/jhash.h> 
    37393950+#include <linux/netfilter_ipv4/ip_tables.h> 
    37403951+#include <linux/netfilter_ipv4/ip_set.h> 
     
    37453956+#include <linux/vmalloc.h> 
    37463957+#include <linux/random.h> 
    3747 +#include <linux/jhash.h> 
    37483958+ 
    37493959+#include <net/ip.h> 
     
    37583968+get_port(const struct sk_buff *skb, u_int32_t flags) 
    37593969+{ 
     3970+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    37603971+       struct iphdr *iph = ip_hdr(skb); 
     3972+#else 
     3973+       struct iphdr *iph = skb->nh.iph; 
     3974+#endif 
    37613975+       u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET; 
    37623976+ 
     
    37693983+                       return INVALID_PORT; 
    37703984+ 
    3771 +               if (skb_copy_bits(skb, ip_hdrlen(skb), &tcph, sizeof(tcph)) < 0) 
     3985+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3986+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0) 
     3987+#else 
     3988+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) 
     3989+#endif 
    37723990+                       /* No choice either */ 
    37733991+                       return INVALID_PORT; 
     
    37824000+                       return INVALID_PORT; 
    37834001+ 
    3784 +               if (skb_copy_bits(skb, ip_hdrlen(skb), &udph, sizeof(udph)) < 0) 
     4002+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4003+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0) 
     4004+#else 
     4005+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) 
     4006+#endif 
    37854007+                       /* No choice either */ 
    37864008+                       return INVALID_PORT; 
     
    38644086+{ 
    38654087+       ip_set_ip_t port; 
     4088+       int res; 
    38664089+ 
    38674090+       if (flags[index+1] == 0) 
    3868 +               return -EINVAL; 
     4091+               return 0; 
    38694092+                
    38704093+       port = get_port(skb, flags[index+1]); 
     
    38724095+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    38734096+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4097+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    38744098+          NIPQUAD(ip_hdr(skb)->saddr), 
    38754099+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4100+#else 
     4101+          NIPQUAD(skb->nh.iph->saddr), 
     4102+          NIPQUAD(skb->nh.iph->daddr)); 
     4103+#endif 
    38764104+       DP("flag %s port %u", 
    38774105+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    38804108+               return 0;        
    38814109+ 
    3882 +       return __testip(set, 
     4110+       res = __testip(set, 
    38834111+                       ntohl(flags[index] & IPSET_SRC  
     4112+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    38844113+                                       ? ip_hdr(skb)->saddr  
    38854114+                                       : ip_hdr(skb)->daddr), 
     4115+#else 
     4116+                                       ? skb->nh.iph->saddr  
     4117+                                       : skb->nh.iph->daddr), 
     4118+#endif 
    38864119+                       port, 
    38874120+                       hash_ip); 
     4121+       return (res < 0 ? 0 : res); 
     4122+        
    38884123+} 
    38894124+ 
     
    39574192+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    39584193+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4194+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    39594195+          NIPQUAD(ip_hdr(skb)->saddr), 
    39604196+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4197+#else 
     4198+          NIPQUAD(skb->nh.iph->saddr), 
     4199+          NIPQUAD(skb->nh.iph->daddr)); 
     4200+#endif 
    39614201+       DP("flag %s port %u",  
    39624202+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    39674207+       return __addip((struct ip_set_ipporthash *) set->data, 
    39684208+                      ntohl(flags[index] & IPSET_SRC  
    3969 +                               ? ip_hdr(skb)->saddr  
     4209+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4210+                               ? ip_hdr(skb)->saddr  
    39704211+                               : ip_hdr(skb)->daddr), 
     4212+#else 
     4213+                               ? skb->nh.iph->saddr  
     4214+                               : skb->nh.iph->daddr), 
     4215+#endif 
    39714216+                      port, 
    39724217+                      hash_ip); 
     
    41024347+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    41034348+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4349+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    41044350+          NIPQUAD(ip_hdr(skb)->saddr), 
    41054351+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4352+#else 
     4353+          NIPQUAD(skb->nh.iph->saddr), 
     4354+          NIPQUAD(skb->nh.iph->daddr)); 
     4355+#endif 
    41064356+       DP("flag %s port %u", 
    41074357+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    41124362+       return __delip(set, 
    41134363+                      ntohl(flags[index] & IPSET_SRC  
    4114 +                               ? ip_hdr(skb)->saddr  
     4364+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4365+                               ? ip_hdr(skb)->saddr  
    41154366+                               : ip_hdr(skb)->daddr), 
     4367+#else 
     4368+                               ? skb->nh.iph->saddr  
     4369+                               : skb->nh.iph->daddr), 
     4370+#endif 
    41164371+                      port, 
    41174372+                      hash_ip); 
     
    42454500+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    42464501+ 
    4247 +static int __init init(void) 
     4502+static int __init ip_set_ipporthash_init(void) 
    42484503+{ 
    42494504+       return ip_set_register_set_type(&ip_set_ipporthash); 
    42504505+} 
    42514506+ 
    4252 +static void __exit fini(void) 
     4507+static void __exit ip_set_ipporthash_fini(void) 
    42534508+{ 
    42544509+       /* FIXME: possible race with ip_set_create() */ 
     
    42564511+} 
    42574512+ 
    4258 +module_init(init); 
    4259 +module_exit(fini); 
    4260 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_iptree.c 
    4261 =================================================================== 
    4262 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4263 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_iptree.c 2007-06-19 23:19:01.000000000 +0100 
    4264 @@ -0,0 +1,571 @@ 
     4513+module_init(ip_set_ipporthash_init); 
     4514+module_exit(ip_set_ipporthash_fini); 
     4515diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_iptree.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_iptree.c 
     4516--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_iptree.c 1970-01-01 01:00:00.000000000 +0100 
     4517+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_iptree.c     2007-10-12 14:31:55.000000000 +0200 
     4518@@ -0,0 +1,612 @@ 
    42654519+/* Copyright (C) 2005 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    42664520+ * 
     
    43084562+#endif 
    43094563+ 
     4564+#if defined(__LITTLE_ENDIAN) 
    43104565+#define ABCD(a,b,c,d,addrp) do {               \ 
    43114566+       a = ((unsigned char *)addrp)[3];        \ 
     
    43144569+       d = ((unsigned char *)addrp)[0];        \ 
    43154570+} while (0) 
     4571+#elif defined(__BIG_ENDIAN) 
     4572+#define ABCD(a,b,c,d,addrp) do {               \ 
     4573+       a = ((unsigned char *)addrp)[0];        \ 
     4574+       b = ((unsigned char *)addrp)[1];        \ 
     4575+       c = ((unsigned char *)addrp)[2];        \ 
     4576+       d = ((unsigned char *)addrp)[3];        \ 
     4577+} while (0) 
     4578+#else 
     4579+#error "Please fix asm/byteorder.h" 
     4580+#endif /* __LITTLE_ENDIAN */ 
    43164581+ 
    43174582+#define TESTIP_WALK(map, elem, branch) do {    \ 
     
    43414606+       TESTIP_WALK(ctree, c, dtree); 
    43424607+       DP("%lu %lu", dtree->expires[d], jiffies); 
    4343 +       return !!(map->timeout ? (time_after(dtree->expires[d], jiffies)) 
    4344 +                              : dtree->expires[d]); 
     4608+       return dtree->expires[d] 
     4609+              && (!map->timeout 
     4610+                  || time_after(dtree->expires[d], jiffies)); 
    43454611+} 
    43464612+ 
     
    43724638+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    43734639+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4640+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    43744641+          NIPQUAD(ip_hdr(skb)->saddr), 
    43754642+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4643+#else 
     4644+          NIPQUAD(skb->nh.iph->saddr), 
     4645+          NIPQUAD(skb->nh.iph->daddr)); 
     4646+#endif 
    43764647+ 
    43774648+       res =  __testip(set, 
    43784649+                       ntohl(flags[index] & IPSET_SRC  
     4650+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    43794651+                               ? ip_hdr(skb)->saddr  
    43804652+                               : ip_hdr(skb)->daddr), 
     4653+#else 
     4654+                               ? skb->nh.iph->saddr  
     4655+                               : skb->nh.iph->daddr), 
     4656+#endif 
    43814657+                       hash_ip); 
    43824658+       return (res < 0 ? 0 : res); 
    43834659+} 
    43844660+ 
    4385 +#define ADDIP_WALK(map, elem, branch, type, cachep, flags) do {        \ 
     4661+#define ADDIP_WALK(map, elem, branch, type, cachep) do {       \ 
    43864662+       if ((map)->tree[elem]) {                                \ 
    43874663+               DP("found %u", elem);                           \ 
     
    43894665+       } else {                                                \ 
    43904666+               branch = (type *)                               \ 
    4391 +                       kmem_cache_alloc(cachep, flags);        \ 
     4667+                       kmem_cache_alloc(cachep, GFP_ATOMIC);   \ 
    43924668+               if (branch == NULL)                             \ 
    43934669+                       return -ENOMEM;                         \ 
     
    44004676+static inline int 
    44014677+__addip(struct ip_set *set, ip_set_ip_t ip, unsigned int timeout, 
    4402 +       ip_set_ip_t *hash_ip, 
    4403 +       unsigned int __nocast flags) 
     4678+       ip_set_ip_t *hash_ip) 
    44044679+{ 
    44054680+       struct ip_set_iptree *map = (struct ip_set_iptree *) set->data; 
     
    44104685+       int ret = 0; 
    44114686+        
    4412 +       if (!ip || map->elements > limit) 
     4687+       if (!ip || map->elements >= limit) 
    44134688+               /* We could call the garbage collector 
    44144689+                * but it's probably overkill */ 
     
    44184693+       ABCD(a, b, c, d, hash_ip); 
    44194694+       DP("%u %u %u %u timeout %u", a, b, c, d, timeout); 
    4420 +       ADDIP_WALK(map, a, btree, struct ip_set_iptreeb, branch_cachep, flags); 
    4421 +       ADDIP_WALK(btree, b, ctree, struct ip_set_iptreec, branch_cachep, flags); 
    4422 +       ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreed, leaf_cachep, flags); 
     4695+       ADDIP_WALK(map, a, btree, struct ip_set_iptreeb, branch_cachep); 
     4696+       ADDIP_WALK(btree, b, ctree, struct ip_set_iptreec, branch_cachep); 
     4697+       ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreed, leaf_cachep); 
    44234698+       if (dtree->expires[d] 
    44244699+           && (!map->timeout || time_after(dtree->expires[d], jiffies))) 
    44254700+               ret = -EEXIST; 
    44264701+       dtree->expires[d] = map->timeout ? (timeout * HZ + jiffies) : 1; 
    4427 +       /* Lottery */ 
     4702+       /* Lottery: I won! */ 
    44284703+       if (dtree->expires[d] == 0) 
    44294704+               dtree->expires[d] = 1; 
     
    44514726+       return __addip(set, req->ip, 
    44524727+                      req->timeout ? req->timeout : map->timeout, 
    4453 +                      hash_ip, 
    4454 +                      GFP_ATOMIC); 
     4728+                      hash_ip); 
    44554729+} 
    44564730+ 
     
    44664740+       return __addip(set, 
    44674741+                      ntohl(flags[index] & IPSET_SRC  
    4468 +                               ? ip_hdr(skb)->saddr  
     4742+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4743+                               ? ip_hdr(skb)->saddr  
    44694744+                               : ip_hdr(skb)->daddr), 
     4745+#else 
     4746+                               ? skb->nh.iph->saddr  
     4747+                               : skb->nh.iph->daddr), 
     4748+#endif 
    44704749+                      map->timeout, 
    4471 +                      hash_ip, 
    4472 +                      GFP_ATOMIC); 
     4750+                      hash_ip); 
    44734751+} 
    44744752+ 
     
    45314809+       return __delip(set, 
    45324810+                      ntohl(flags[index] & IPSET_SRC  
    4533 +                               ? ip_hdr(skb)->saddr  
     4811+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4812+                               ? ip_hdr(skb)->saddr  
    45344813+                               : ip_hdr(skb)->daddr), 
     4814+#else 
     4815+                               ? skb->nh.iph->saddr  
     4816+                               : skb->nh.iph->daddr), 
     4817+#endif 
    45354818+                      hash_ip); 
    45364819+} 
     
    47935076+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    47945077+ 
    4795 +static int __init init(void) 
     5078+static int __init ip_set_iptree_init(void) 
    47965079+{ 
    47975080+       int ret; 
    47985081+        
     5082+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5083+       branch_cachep = kmem_cache_create("ip_set_iptreeb", 
     5084+                               sizeof(struct ip_set_iptreeb), 
     5085+                               0, 0, NULL); 
     5086+#else 
    47995087+       branch_cachep = kmem_cache_create("ip_set_iptreeb", 
    48005088+                               sizeof(struct ip_set_iptreeb), 
    48015089+                               0, 0, NULL, NULL); 
     5090+#endif 
    48025091+       if (!branch_cachep) { 
    48035092+               printk(KERN_ERR "Unable to create ip_set_iptreeb slab cache\n"); 
     
    48055094+               goto out; 
    48065095+       } 
     5096+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5097+       leaf_cachep = kmem_cache_create("ip_set_iptreed", 
     5098+                               sizeof(struct ip_set_iptreed), 
     5099+                               0, 0, NULL); 
     5100+#else 
    48075101+       leaf_cachep = kmem_cache_create("ip_set_iptreed", 
    48085102+                               sizeof(struct ip_set_iptreed), 
    48095103+                               0, 0, NULL, NULL); 
     5104+#endif 
    48105105+       if (!leaf_cachep) { 
    48115106+               printk(KERN_ERR "Unable to create ip_set_iptreed slab cache\n"); 
     
    48245119+} 
    48255120+ 
    4826 +static void __exit fini(void) 
     5121+static void __exit ip_set_iptree_fini(void) 
    48275122+{ 
    48285123+       /* FIXME: possible race with ip_set_create() */ 
     
    48325127+} 
    48335128+ 
    4834 +module_init(init); 
    4835 +module_exit(fini); 
    4836 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_macipmap.c 
    4837 =================================================================== 
    4838 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4839 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_macipmap.c       2007-06-19 23:19:01.000000000 +0100 
    4840 @@ -0,0 +1,353 @@ 
     5129+module_init(ip_set_iptree_init); 
     5130+module_exit(ip_set_iptree_fini); 
     5131diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_iptreemap.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_iptreemap.c 
     5132--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_iptreemap.c      1970-01-01 01:00:00.000000000 +0100 
     5133+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_iptreemap.c  2007-10-12 14:31:55.000000000 +0200 
     5134@@ -0,0 +1,829 @@ 
     5135+/* Copyright (C) 2007 Sven Wegener <sven.wegener@stealer.net> 
     5136+ * 
     5137+ * This program is free software; you can redistribute it and/or modify it 
     5138+ * under the terms of the GNU General Public License version 2 as published by 
     5139+ * the Free Software Foundation. 
     5140+ */ 
     5141+ 
     5142+/* This modules implements the iptreemap ipset type. It uses bitmaps to 
     5143+ * represent every single IPv4 address as a single bit. The bitmaps are managed 
     5144+ * in a tree structure, where the first three octets of an addresses are used 
     5145+ * as an index to find the bitmap and the last octet is used as the bit number. 
     5146+ */ 
     5147+ 
     5148+#include <linux/version.h> 
     5149+#include <linux/module.h> 
     5150+#include <linux/ip.h> 
     5151+#include <linux/skbuff.h> 
     5152+#include <linux/slab.h> 
     5153+#include <linux/delay.h> 
     5154+#include <linux/netfilter_ipv4/ip_tables.h> 
     5155+#include <linux/netfilter_ipv4/ip_set.h> 
     5156+#include <linux/errno.h> 
     5157+#include <asm/uaccess.h> 
     5158+#include <asm/bitops.h> 
     5159+#include <linux/spinlock.h> 
     5160+ 
     5161+#include <linux/netfilter_ipv4/ip_set_iptreemap.h> 
     5162+ 
     5163+#define IPTREEMAP_DEFAULT_GC_TIME (5 * 60) 
     5164+#define IPTREEMAP_DESTROY_SLEEP (100) 
     5165+ 
     5166+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21) 
     5167+static struct kmem_cache *cachep_b; 
     5168+static struct kmem_cache *cachep_c; 
     5169+static struct kmem_cache *cachep_d; 
     5170+#else 
     5171+static kmem_cache_t *cachep_b; 
     5172+static kmem_cache_t *cachep_c; 
     5173+static kmem_cache_t *cachep_d; 
     5174+#endif 
     5175+ 
     5176+static struct ip_set_iptreemap_d *fullbitmap_d; 
     5177+static struct ip_set_iptreemap_c *fullbitmap_c; 
     5178+static struct ip_set_iptreemap_b *fullbitmap_b; 
     5179+ 
     5180+#if defined(__LITTLE_ENDIAN) 
     5181+#define ABCD(a, b, c, d, addr) \ 
     5182+       do { \ 
     5183+               a = ((unsigned char *)addr)[3]; \ 
     5184+               b = ((unsigned char *)addr)[2]; \ 
     5185+               c = ((unsigned char *)addr)[1]; \ 
     5186+               d = ((unsigned char *)addr)[0]; \ 
     5187+       } while (0) 
     5188+#elif defined(__BIG_ENDIAN) 
     5189+#define ABCD(a,b,c,d,addrp) do {               \ 
     5190+       a = ((unsigned char *)addrp)[0];        \ 
     5191+       b = ((unsigned char *)addrp)[1];        \ 
     5192+       c = ((unsigned char *)addrp)[2];        \ 
     5193+       d = ((unsigned char *)addrp)[3];        \ 
     5194+} while (0) 
     5195+#else 
     5196+#error "Please fix asm/byteorder.h" 
     5197+#endif /* __LITTLE_ENDIAN */ 
     5198+ 
     5199+#define TESTIP_WALK(map, elem, branch, full) \ 
     5200+       do { \ 
     5201+               branch = (map)->tree[elem]; \ 
     5202+               if (!branch) \ 
     5203+                       return 0; \ 
     5204+               else if (branch == full) \ 
     5205+                       return 1; \ 
     5206+       } while (0) 
     5207+ 
     5208+#define ADDIP_WALK(map, elem, branch, type, cachep, full) \ 
     5209+       do { \ 
     5210+               branch = (map)->tree[elem]; \ 
     5211+               if (!branch) { \ 
     5212+                       branch = (type *) kmem_cache_alloc(cachep, GFP_ATOMIC); \ 
     5213+                       if (!branch) \ 
     5214+                               return -ENOMEM; \ 
     5215+                       memset(branch, 0, sizeof(*branch)); \ 
     5216+                       (map)->tree[elem] = branch; \ 
     5217+               } else if (branch == full) { \ 
     5218+                       return -EEXIST; \ 
     5219+               } \ 
     5220+       } while (0) 
     5221+ 
     5222+#define ADDIP_RANGE_LOOP(map, a, a1, a2, hint, branch, full, cachep, free) \ 
     5223+       for (a = a1; a <= a2; a++) { \ 
     5224+               branch = (map)->tree[a]; \ 
     5225+               if (branch != full) { \ 
     5226+                       if ((a > a1 && a < a2) || (hint)) { \ 
     5227+                               if (branch) \ 
     5228+                                       free(branch); \ 
     5229+                               (map)->tree[a] = full; \ 
     5230+                               continue; \ 
     5231+                       } else if (!branch) { \ 
     5232+                               branch = kmem_cache_alloc(cachep, GFP_ATOMIC); \ 
     5233+                               if (!branch) \ 
     5234+                                       return -ENOMEM; \ 
     5235+                               memset(branch, 0, sizeof(*branch)); \ 
     5236+                               (map)->tree[a] = branch; \ 
     5237+                       } 
     5238+ 
     5239+#define ADDIP_RANGE_LOOP_END() \ 
     5240+               } \ 
     5241+       } 
     5242+ 
     5243+#define DELIP_WALK(map, elem, branch, cachep, full, flags) \ 
     5244+       do { \ 
     5245+               branch = (map)->tree[elem]; \ 
     5246+               if (!branch) { \ 
     5247+                       return -EEXIST; \ 
     5248+               } else if (branch == full) { \ 
     5249+                       branch = kmem_cache_alloc(cachep, flags); \ 
     5250+                       if (!branch) \ 
     5251+                               return -ENOMEM; \ 
     5252+                       memcpy(branch, full, sizeof(*full)); \ 
     5253+                       (map)->tree[elem] = branch; \ 
     5254+               } \ 
     5255+       } while (0) 
     5256+ 
     5257+#define DELIP_RANGE_LOOP(map, a, a1, a2, hint, branch, full, cachep, free, flags) \ 
     5258+       for (a = a1; a <= a2; a++) { \ 
     5259+               branch = (map)->tree[a]; \ 
     5260+               if (branch) { \ 
     5261+                       if ((a > a1 && a < a2) || (hint)) { \ 
     5262+                               if (branch != full) \ 
     5263+                                       free(branch); \ 
     5264+                               (map)->tree[a] = NULL; \ 
     5265+                               continue; \ 
     5266+                       } else if (branch == full) { \ 
     5267+                               branch = kmem_cache_alloc(cachep, flags); \ 
     5268+                               if (!branch) \ 
     5269+                                       return -ENOMEM; \ 
     5270+                               memcpy(branch, full, sizeof(*branch)); \ 
     5271+                               (map)->tree[a] = branch; \ 
     5272+                       } 
     5273+ 
     5274+#define DELIP_RANGE_LOOP_END() \ 
     5275+               } \ 
     5276+       } 
     5277+ 
     5278+#define LOOP_WALK_BEGIN(map, i, branch) \ 
     5279+       for (i = 0; i < 256; i++) { \ 
     5280+               branch = (map)->tree[i]; \ 
     5281+               if (likely(!branch)) \ 
     5282+                       continue; 
     5283+ 
     5284+#define LOOP_WALK_END() \ 
     5285+       } 
     5286+ 
     5287+#define LOOP_WALK_BEGIN_GC(map, i, branch, full, cachep, count) \ 
     5288+       count = -256; \ 
     5289+       for (i = 0; i < 256; i++) { \ 
     5290+               branch = (map)->tree[i]; \ 
     5291+               if (likely(!branch)) \ 
     5292+                       continue; \ 
     5293+               count++; \ 
     5294+               if (branch == full) { \ 
     5295+                       count++; \ 
     5296+                       continue; \ 
     5297+               } 
     5298+ 
     5299+#define LOOP_WALK_END_GC(map, i, branch, full, cachep, count) \ 
     5300+               if (-256 == count) { \ 
     5301+                       kmem_cache_free(cachep, branch); \ 
     5302+                       (map)->tree[i] = NULL; \ 
     5303+               } else if (256 == count) { \ 
     5304+                       kmem_cache_free(cachep, branch); \ 
     5305+                       (map)->tree[i] = full; \ 
     5306+               } \ 
     5307+       } 
     5308+ 
     5309+#define LOOP_WALK_BEGIN_COUNT(map, i, branch, inrange, count) \ 
     5310+       for (i = 0; i < 256; i++) { \ 
     5311+               if (!(map)->tree[i]) { \ 
     5312+                       if (inrange) { \ 
     5313+                               count++; \ 
     5314+                               inrange = 0; \ 
     5315+                       } \ 
     5316+                       continue; \ 
     5317+               } \ 
     5318+               branch = (map)->tree[i]; 
     5319+ 
     5320+#define LOOP_WALK_END_COUNT() \ 
     5321+       } 
     5322+ 
     5323+#define MIN(a, b) (a < b ? a : b) 
     5324+#define MAX(a, b) (a > b ? a : b) 
     5325+ 
     5326+#define GETVALUE1(a, a1, b1, r) \ 
     5327+       (a == a1 ? b1 : r) 
     5328+ 
     5329+#define GETVALUE2(a, b, a1, b1, c1, r) \ 
     5330+       (a == a1 && b == b1 ? c1 : r) 
     5331+ 
     5332+#define GETVALUE3(a, b, c, a1, b1, c1, d1, r) \ 
     5333+       (a == a1 && b == b1 && c == c1 ? d1 : r) 
     5334+ 
     5335+#define CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2) \ 
     5336+       ( \ 
     5337+               GETVALUE1(a, a1, b1, 0) == 0 \ 
     5338+               && GETVALUE1(a, a2, b2, 255) == 255 \ 
     5339+               && c1 == 0 \ 
     5340+               && c2 == 255 \ 
     5341+               && d1 == 0 \ 
     5342+               && d2 == 255 \ 
     5343+       ) 
     5344+ 
     5345+#define CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2) \ 
     5346+       ( \ 
     5347+               GETVALUE2(a, b, a1, b1, c1, 0) == 0 \ 
     5348+               && GETVALUE2(a, b, a2, b2, c2, 255) == 255 \ 
     5349+               && d1 == 0 \ 
     5350+               && d2 == 255 \ 
     5351+       ) 
     5352+ 
     5353+#define CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2) \ 
     5354+       ( \ 
     5355+               GETVALUE3(a, b, c, a1, b1, c1, d1, 0) == 0 \ 
     5356+               && GETVALUE3(a, b, c, a2, b2, c2, d2, 255) == 255 \ 
     5357+       ) 
     5358+ 
     5359+ 
     5360+static inline void 
     5361+free_d(struct ip_set_iptreemap_d *map) 
     5362+{ 
     5363+       kmem_cache_free(cachep_d, map); 
     5364+} 
     5365+ 
     5366+static inline void 
     5367+free_c(struct ip_set_iptreemap_c *map) 
     5368+{ 
     5369+       struct ip_set_iptreemap_d *dtree; 
     5370+       unsigned int i; 
     5371+ 
     5372+       LOOP_WALK_BEGIN(map, i, dtree) { 
     5373+               if (dtree != fullbitmap_d) 
     5374+                       free_d(dtree); 
     5375+       } LOOP_WALK_END(); 
     5376+ 
     5377+       kmem_cache_free(cachep_c, map); 
     5378+} 
     5379+ 
     5380+static inline void 
     5381+free_b(struct ip_set_iptreemap_b *map) 
     5382+{ 
     5383+       struct ip_set_iptreemap_c *ctree; 
     5384+       unsigned int i; 
     5385+ 
     5386+       LOOP_WALK_BEGIN(map, i, ctree) { 
     5387+               if (ctree != fullbitmap_c) 
     5388+                       free_c(ctree); 
     5389+       } LOOP_WALK_END(); 
     5390+ 
     5391+       kmem_cache_free(cachep_b, map); 
     5392+} 
     5393+ 
     5394+static inline int 
     5395+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip) 
     5396+{ 
     5397+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5398+       struct ip_set_iptreemap_b *btree; 
     5399+       struct ip_set_iptreemap_c *ctree; 
     5400+       struct ip_set_iptreemap_d *dtree; 
     5401+       unsigned char a, b, c, d; 
     5402+ 
     5403+       *hash_ip = ip; 
     5404+ 
     5405+       ABCD(a, b, c, d, hash_ip); 
     5406+ 
     5407+       TESTIP_WALK(map, a, btree, fullbitmap_b); 
     5408+       TESTIP_WALK(btree, b, ctree, fullbitmap_c); 
     5409+       TESTIP_WALK(ctree, c, dtree, fullbitmap_d); 
     5410+ 
     5411+       return !!test_bit(d, (void *) dtree->bitmap); 
     5412+} 
     5413+ 
     5414+static int 
     5415+testip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip) 
     5416+{ 
     5417+       struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data; 
     5418+ 
     5419+       if (size != sizeof(struct ip_set_req_iptreemap)) { 
     5420+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size); 
     5421+               return -EINVAL; 
     5422+       } 
     5423+ 
     5424+       return __testip(set, req->start, hash_ip); 
     5425+} 
     5426+ 
     5427+static int 
     5428+testip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index) 
     5429+{ 
     5430+       int res; 
     5431+ 
     5432+       res = __testip(set,  
     5433+                      ntohl(flags[index] & IPSET_SRC  
     5434+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     5435+                               ? ip_hdr(skb)->saddr  
     5436+                               : ip_hdr(skb)->daddr), 
     5437+#else 
     5438+                               ? skb->nh.iph->saddr  
     5439+                               : skb->nh.iph->daddr), 
     5440+#endif 
     5441+                      hash_ip); 
     5442+ 
     5443+       return (res < 0 ? 0 : res); 
     5444+} 
     5445+ 
     5446+static inline int 
     5447+__addip_single(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip) 
     5448+{ 
     5449+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5450+       struct ip_set_iptreemap_b *btree; 
     5451+       struct ip_set_iptreemap_c *ctree; 
     5452+       struct ip_set_iptreemap_d *dtree; 
     5453+       unsigned char a, b, c, d; 
     5454+ 
     5455+       *hash_ip = ip; 
     5456+ 
     5457+       ABCD(a, b, c, d, hash_ip); 
     5458+ 
     5459+       ADDIP_WALK(map, a, btree, struct ip_set_iptreemap_b, cachep_b, fullbitmap_b); 
     5460+       ADDIP_WALK(btree, b, ctree, struct ip_set_iptreemap_c, cachep_c, fullbitmap_c); 
     5461+       ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreemap_d, cachep_d, fullbitmap_d); 
     5462+ 
     5463+       if (test_and_set_bit(d, (void *) dtree->bitmap)) 
     5464+               return -EEXIST; 
     5465+ 
     5466+       set_bit(b, (void *) btree->dirty); 
     5467+ 
     5468+       return 0; 
     5469+} 
     5470+ 
     5471+static inline int 
     5472+__addip_range(struct ip_set *set, ip_set_ip_t start, ip_set_ip_t end, ip_set_ip_t *hash_ip) 
     5473+{ 
     5474+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5475+       struct ip_set_iptreemap_b *btree; 
     5476+       struct ip_set_iptreemap_c *ctree; 
     5477+       struct ip_set_iptreemap_d *dtree; 
     5478+       unsigned int a, b, c, d; 
     5479+       unsigned char a1, b1, c1, d1; 
     5480+       unsigned char a2, b2, c2, d2; 
     5481+ 
     5482+       if (start == end) 
     5483+               return __addip_single(set, start, hash_ip); 
     5484+ 
     5485+       *hash_ip = start; 
     5486+ 
     5487+       ABCD(a1, b1, c1, d1, &start); 
     5488+       ABCD(a2, b2, c2, d2, &end); 
     5489+ 
     5490+       /* This is sooo ugly... */ 
     5491+       ADDIP_RANGE_LOOP(map, a, a1, a2, CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2), btree, fullbitmap_b, cachep_b, free_b) { 
     5492+               ADDIP_RANGE_LOOP(btree, b, GETVALUE1(a, a1, b1, 0), GETVALUE1(a, a2, b2, 255), CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2), ctree, fullbitmap_c, cachep_c, free_c) { 
     5493+                       ADDIP_RANGE_LOOP(ctree, c, GETVALUE2(a, b, a1, b1, c1, 0), GETVALUE2(a, b, a2, b2, c2, 255), CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2), dtree, fullbitmap_d, cachep_d, free_d) { 
     5494+                               for (d = GETVALUE3(a, b, c, a1, b1, c1, d1, 0); d <= GETVALUE3(a, b, c, a2, b2, c2, d2, 255); d++) 
     5495+                                       set_bit(d, (void *) dtree->bitmap); 
     5496+                               set_bit(b, (void *) btree->dirty); 
     5497+                       } ADDIP_RANGE_LOOP_END(); 
     5498+               } ADDIP_RANGE_LOOP_END(); 
     5499+       } ADDIP_RANGE_LOOP_END(); 
     5500+ 
     5501+       return 0; 
     5502+} 
     5503+ 
     5504+static int 
     5505+addip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip) 
     5506+{ 
     5507+       struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data; 
     5508+ 
     5509+       if (size != sizeof(struct ip_set_req_iptreemap)) { 
     5510+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size); 
     5511+               return -EINVAL; 
     5512+       } 
     5513+ 
     5514+       return __addip_range(set, MIN(req->start, req->end), MAX(req->start, req->end), hash_ip); 
     5515+} 
     5516+ 
     5517+static int 
     5518+addip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index) 
     5519+{ 
     5520+ 
     5521+       return __addip_single(set, 
     5522+                       ntohl(flags[index] & IPSET_SRC  
     5523+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     5524+                               ? ip_hdr(skb)->saddr  
     5525+                               : ip_hdr(skb)->daddr), 
     5526+#else 
     5527+                               ? skb->nh.iph->saddr  
     5528+                               : skb->nh.iph->daddr), 
     5529+#endif 
     5530+                       hash_ip); 
     5531+} 
     5532+ 
     5533+static inline int 
     5534+__delip_single(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip, unsigned int __nocast flags) 
     5535+{ 
     5536+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5537+       struct ip_set_iptreemap_b *btree; 
     5538+       struct ip_set_iptreemap_c *ctree; 
     5539+       struct ip_set_iptreemap_d *dtree; 
     5540+       unsigned char a,b,c,d; 
     5541+ 
     5542+       *hash_ip = ip; 
     5543+ 
     5544+       ABCD(a, b, c, d, hash_ip); 
     5545+ 
     5546+       DELIP_WALK(map, a, btree, cachep_b, fullbitmap_b, flags); 
     5547+       DELIP_WALK(btree, b, ctree, cachep_c, fullbitmap_c, flags); 
     5548+       DELIP_WALK(ctree, c, dtree, cachep_d, fullbitmap_d, flags); 
     5549+ 
     5550+       if (!test_and_clear_bit(d, (void *) dtree->bitmap)) 
     5551+               return -EEXIST; 
     5552+ 
     5553+       set_bit(b, (void *) btree->dirty); 
     5554+ 
     5555+       return 0; 
     5556+} 
     5557+ 
     5558+static inline int 
     5559+__delip_range(struct ip_set *set, ip_set_ip_t start, ip_set_ip_t end, ip_set_ip_t *hash_ip, unsigned int __nocast flags) 
     5560+{ 
     5561+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5562+       struct ip_set_iptreemap_b *btree; 
     5563+       struct ip_set_iptreemap_c *ctree; 
     5564+       struct ip_set_iptreemap_d *dtree; 
     5565+       unsigned int a, b, c, d; 
     5566+       unsigned char a1, b1, c1, d1; 
     5567+       unsigned char a2, b2, c2, d2; 
     5568+ 
     5569+       if (start == end) 
     5570+               return __delip_single(set, start, hash_ip, flags); 
     5571+ 
     5572+       *hash_ip = start; 
     5573+ 
     5574+       ABCD(a1, b1, c1, d1, &start); 
     5575+       ABCD(a2, b2, c2, d2, &end); 
     5576+ 
     5577+       /* This is sooo ugly... */ 
     5578+       DELIP_RANGE_LOOP(map, a, a1, a2, CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2), btree, fullbitmap_b, cachep_b, free_b, flags) { 
     5579+               DELIP_RANGE_LOOP(btree, b, GETVALUE1(a, a1, b1, 0), GETVALUE1(a, a2, b2, 255), CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2), ctree, fullbitmap_c, cachep_c, free_c, flags) { 
     5580+                       DELIP_RANGE_LOOP(ctree, c, GETVALUE2(a, b, a1, b1, c1, 0), GETVALUE2(a, b, a2, b2, c2, 255), CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2), dtree, fullbitmap_d, cachep_d, free_d, flags) { 
     5581+                               for (d = GETVALUE3(a, b, c, a1, b1, c1, d1, 0); d <= GETVALUE3(a, b, c, a2, b2, c2, d2, 255); d++) 
     5582+                                       clear_bit(d, (void *) dtree->bitmap); 
     5583+                               set_bit(b, (void *) btree->dirty); 
     5584+                       } DELIP_RANGE_LOOP_END(); 
     5585+               } DELIP_RANGE_LOOP_END(); 
     5586+       } DELIP_RANGE_LOOP_END(); 
     5587+ 
     5588+       return 0; 
     5589+} 
     5590+ 
     5591+static int 
     5592+delip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip) 
     5593+{ 
     5594+       struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data; 
     5595+ 
     5596+       if (size != sizeof(struct ip_set_req_iptreemap)) { 
     5597+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size); 
     5598+               return -EINVAL; 
     5599+       } 
     5600+ 
     5601+       return __delip_range(set, MIN(req->start, req->end), MAX(req->start, req->end), hash_ip, GFP_KERNEL); 
     5602+} 
     5603+ 
     5604+static int 
     5605+delip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index) 
     5606+{ 
     5607+       return __delip_single(set,  
     5608+                       ntohl(flags[index] & IPSET_SRC  
     5609+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     5610+                               ? ip_hdr(skb)->saddr  
     5611+                               : ip_hdr(skb)->daddr), 
     5612+#else 
     5613+                               ? skb->nh.iph->saddr  
     5614+                               : skb->nh.iph->daddr), 
     5615+#endif 
     5616+                       hash_ip, 
     5617+                       GFP_ATOMIC); 
     5618+} 
     5619+ 
     5620+/* Check the status of the bitmap 
     5621+ * -1 == all bits cleared 
     5622+ *  1 == all bits set 
     5623+ *  0 == anything else 
     5624+ */ 
     5625+static inline int 
     5626+bitmap_status(struct ip_set_iptreemap_d *dtree) 
     5627+{ 
     5628+       unsigned char first = dtree->bitmap[0]; 
     5629+       int a; 
     5630+ 
     5631+       for (a = 1; a < 32; a++) 
     5632+               if (dtree->bitmap[a] != first) 
     5633+                       return 0; 
     5634+ 
     5635+       return (first == 0 ? -1 : (first == 255 ? 1 : 0)); 
     5636+} 
     5637+ 
     5638+static void 
     5639+gc(unsigned long addr) 
     5640+{ 
     5641+       struct ip_set *set = (struct ip_set *) addr; 
     5642+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5643+       struct ip_set_iptreemap_b *btree; 
     5644+       struct ip_set_iptreemap_c *ctree; 
     5645+       struct ip_set_iptreemap_d *dtree; 
     5646+       unsigned int a, b, c; 
     5647+       int i, j, k; 
     5648+ 
     5649+       write_lock_bh(&set->lock); 
     5650+ 
     5651+       LOOP_WALK_BEGIN_GC(map, a, btree, fullbitmap_b, cachep_b, i) { 
     5652+               LOOP_WALK_BEGIN_GC(btree, b, ctree, fullbitmap_c, cachep_c, j) { 
     5653+                       if (!test_and_clear_bit(b, (void *) btree->dirty)) 
     5654+                               continue; 
     5655+                       LOOP_WALK_BEGIN_GC(ctree, c, dtree, fullbitmap_d, cachep_d, k) { 
     5656+                               switch (bitmap_status(dtree)) { 
     5657+                                       case -1: 
     5658+                                               kmem_cache_free(cachep_d, dtree); 
     5659+                                               ctree->tree[c] = NULL; 
     5660+                                               k--; 
     5661+                                       break; 
     5662+                                       case 1: 
     5663+                                               kmem_cache_free(cachep_d, dtree); 
     5664+                                               ctree->tree[c] = fullbitmap_d; 
     5665+                                               k++; 
     5666+                                       break; 
     5667+                               } 
     5668+                       } LOOP_WALK_END(); 
     5669+               } LOOP_WALK_END_GC(btree, b, ctree, fullbitmap_c, cachep_c, k); 
     5670+       } LOOP_WALK_END_GC(map, a, btree, fullbitmap_b, cachep_b, j); 
     5671+ 
     5672+       write_unlock_bh(&set->lock); 
     5673+ 
     5674+       map->gc.expires = jiffies + map->gc_interval * HZ; 
     5675+       add_timer(&map->gc); 
     5676+} 
     5677+ 
     5678+static inline void 
     5679+init_gc_timer(struct ip_set *set) 
     5680+{ 
     5681+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5682+ 
     5683+       init_timer(&map->gc); 
     5684+       map->gc.data = (unsigned long) set; 
     5685+       map->gc.function = gc; 
     5686+       map->gc.expires = jiffies + map->gc_interval * HZ; 
     5687+       add_timer(&map->gc); 
     5688+} 
     5689+ 
     5690+static int create(struct ip_set *set, const void *data, size_t size) 
     5691+{ 
     5692+       struct ip_set_req_iptreemap_create *req = (struct ip_set_req_iptreemap_create *) data; 
     5693+       struct ip_set_iptreemap *map; 
     5694+ 
     5695+       if (size != sizeof(struct ip_set_req_iptreemap_create)) { 
     5696+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap_create), size); 
     5697+               return -EINVAL; 
     5698+       } 
     5699+ 
     5700+       map = kzalloc(sizeof(*map), GFP_KERNEL); 
     5701+       if (!map) 
     5702+               return -ENOMEM; 
     5703+ 
     5704+       map->gc_interval = req->gc_interval ? req->gc_interval : IPTREEMAP_DEFAULT_GC_TIME; 
     5705+       set->data = map; 
     5706+ 
     5707+       init_gc_timer(set); 
     5708+ 
     5709+       return 0; 
     5710+} 
     5711+ 
     5712+static inline void __flush(struct ip_set_iptreemap *map) 
     5713+{ 
     5714+       struct ip_set_iptreemap_b *btree; 
     5715+       unsigned int a; 
     5716+ 
     5717+       LOOP_WALK_BEGIN(map, a, btree); 
     5718+               if (btree != fullbitmap_b) 
     5719+                       free_b(btree); 
     5720+       LOOP_WALK_END(); 
     5721+} 
     5722+ 
     5723+static void destroy(struct ip_set *set) 
     5724+{ 
     5725+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5726+ 
     5727+       while (!del_timer(&map->gc)) 
     5728+               msleep(IPTREEMAP_DESTROY_SLEEP); 
     5729+ 
     5730+       __flush(map); 
     5731+       kfree(map); 
     5732+ 
     5733+       set->data = NULL; 
     5734+} 
     5735+ 
     5736+static void flush(struct ip_set *set) 
     5737+{ 
     5738+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5739+ 
     5740+       while (!del_timer(&map->gc)) 
     5741+               msleep(IPTREEMAP_DESTROY_SLEEP); 
     5742+ 
     5743+       __flush(map); 
     5744+ 
     5745+       memset(map, 0, sizeof(*map)); 
     5746+ 
     5747+       init_gc_timer(set); 
     5748+} 
     5749+ 
     5750+static void list_header(const struct ip_set *set, void *data) 
     5751+{ 
     5752+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5753+       struct ip_set_req_iptreemap_create *header = (struct ip_set_req_iptreemap_create *) data; 
     5754+ 
     5755+       header->gc_interval = map->gc_interval; 
     5756+} 
     5757+ 
     5758+static int list_members_size(const struct ip_set *set) 
     5759+{ 
     5760+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5761+       struct ip_set_iptreemap_b *btree; 
     5762+       struct ip_set_iptreemap_c *ctree; 
     5763+       struct ip_set_iptreemap_d *dtree; 
     5764+       unsigned int a, b, c, d, inrange = 0, count = 0; 
     5765+ 
     5766+       LOOP_WALK_BEGIN_COUNT(map, a, btree, inrange, count) { 
     5767+               LOOP_WALK_BEGIN_COUNT(btree, b, ctree, inrange, count) { 
     5768+                       LOOP_WALK_BEGIN_COUNT(ctree, c, dtree, inrange, count) { 
     5769+                               for (d = 0; d < 256; d++) { 
     5770+                                       if (test_bit(d, (void *) dtree->bitmap)) { 
     5771+                                               inrange = 1; 
     5772+                                       } else if (inrange) { 
     5773+                                               count++; 
     5774+                                               inrange = 0; 
     5775+                                       } 
     5776+                               } 
     5777+                       } LOOP_WALK_END_COUNT(); 
     5778+               } LOOP_WALK_END_COUNT(); 
     5779+       } LOOP_WALK_END_COUNT(); 
     5780+ 
     5781+       if (inrange) 
     5782+               count++; 
     5783+ 
     5784+       return (count * sizeof(struct ip_set_req_iptreemap)); 
     5785+} 
     5786+ 
     5787+static inline size_t add_member(void *data, size_t offset, ip_set_ip_t start, ip_set_ip_t end) 
     5788+{ 
     5789+       struct ip_set_req_iptreemap *entry = (struct ip_set_req_iptreemap *) (data + offset); 
     5790+ 
     5791+       entry->start = start; 
     5792+       entry->end = end; 
     5793+ 
     5794+       return sizeof(*entry); 
     5795+} 
     5796+ 
     5797+static void list_members(const struct ip_set *set, void *data) 
     5798+{ 
     5799+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5800+       struct ip_set_iptreemap_b *btree; 
     5801+       struct ip_set_iptreemap_c *ctree; 
     5802+       struct ip_set_iptreemap_d *dtree; 
     5803+       unsigned int a, b, c, d, inrange = 0; 
     5804+       size_t offset = 0; 
     5805+       ip_set_ip_t start = 0, end = 0, ip; 
     5806+ 
     5807+       LOOP_WALK_BEGIN(map, a, btree) { 
     5808+               LOOP_WALK_BEGIN(btree, b, ctree) { 
     5809+                       LOOP_WALK_BEGIN(ctree, c, dtree) { 
     5810+                               for (d = 0; d < 256; d++) { 
     5811+                                       if (test_bit(d, (void *) dtree->bitmap)) { 
     5812+                                               ip = ((a << 24) | (b << 16) | (c << 8) | d); 
     5813+                                               if (!inrange) { 
     5814+                                                       inrange = 1; 
     5815+                                                       start = ip; 
     5816+                                               } else if (end < ip - 1) { 
     5817+                                                       offset += add_member(data, offset, start, end); 
     5818+                                                       start = ip; 
     5819+                                               } 
     5820+                                               end = ip; 
     5821+                                       } else if (inrange) { 
     5822+                                               offset += add_member(data, offset, start, end); 
     5823+                                               inrange = 0; 
     5824+                                       } 
     5825+                               } 
     5826+                       } LOOP_WALK_END(); 
     5827+               } LOOP_WALK_END(); 
     5828+       } LOOP_WALK_END(); 
     5829+ 
     5830+       if (inrange) 
     5831+               add_member(data, offset, start, end); 
     5832+} 
     5833+ 
     5834+static struct ip_set_type ip_set_iptreemap = { 
     5835+       .typename               = SETTYPE_NAME, 
     5836+       .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE, 
     5837+       .protocol_version       = IP_SET_PROTOCOL_VERSION, 
     5838+       .create                 = create, 
     5839+       .destroy                = destroy, 
     5840+       .flush                  = flush, 
     5841+       .reqsize                = sizeof(struct ip_set_req_iptreemap), 
     5842+       .addip                  = addip, 
     5843+       .addip_kernel           = addip_kernel, 
     5844+       .delip                  = delip, 
     5845+       .delip_kernel           = delip_kernel, 
     5846+       .testip                 = testip, 
     5847+       .testip_kernel          = testip_kernel, 
     5848+       .header_size            = sizeof(struct ip_set_req_iptreemap_create), 
     5849+       .list_header            = list_header, 
     5850+       .list_members_size      = list_members_size, 
     5851+       .list_members           = list_members, 
     5852+       .me                     = THIS_MODULE, 
     5853+}; 
     5854+ 
     5855+MODULE_LICENSE("GPL"); 
     5856+MODULE_AUTHOR("Sven Wegener <sven.wegener@stealer.net>"); 
     5857+MODULE_DESCRIPTION("iptreemap type of IP sets"); 
     5858+ 
     5859+static int __init ip_set_iptreemap_init(void) 
     5860+{ 
     5861+       int ret = -ENOMEM; 
     5862+       int a; 
     5863+ 
     5864+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5865+       cachep_b = kmem_cache_create("ip_set_iptreemap_b",  
     5866+                                    sizeof(struct ip_set_iptreemap_b),  
     5867+                                    0, 0, NULL); 
     5868+#else 
     5869+       cachep_b = kmem_cache_create("ip_set_iptreemap_b",  
     5870+                                    sizeof(struct ip_set_iptreemap_b),  
     5871+                                    0, 0, NULL, NULL); 
     5872+#endif 
     5873+       if (!cachep_b) { 
     5874+               ip_set_printk("Unable to create ip_set_iptreemap_b slab cache"); 
     5875+               goto out; 
     5876+       } 
     5877+ 
     5878+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5879+       cachep_c = kmem_cache_create("ip_set_iptreemap_c",  
     5880+                                    sizeof(struct ip_set_iptreemap_c), 
     5881+                                    0, 0, NULL); 
     5882+#else 
     5883+       cachep_c = kmem_cache_create("ip_set_iptreemap_c",  
     5884+                                    sizeof(struct ip_set_iptreemap_c), 
     5885+                                    0, 0, NULL, NULL); 
     5886+#endif 
     5887+       if (!cachep_c) { 
     5888+               ip_set_printk("Unable to create ip_set_iptreemap_c slab cache"); 
     5889+               goto outb; 
     5890+       } 
     5891+ 
     5892+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5893+       cachep_d = kmem_cache_create("ip_set_iptreemap_d", 
     5894+                                    sizeof(struct ip_set_iptreemap_d), 
     5895+                                    0, 0, NULL); 
     5896+#else 
     5897+       cachep_d = kmem_cache_create("ip_set_iptreemap_d", 
     5898+                                    sizeof(struct ip_set_iptreemap_d), 
     5899+                                    0, 0, NULL, NULL); 
     5900+#endif 
     5901+       if (!cachep_d) { 
     5902+               ip_set_printk("Unable to create ip_set_iptreemap_d slab cache"); 
     5903+               goto outc; 
     5904+       } 
     5905+ 
     5906+       fullbitmap_d = kmem_cache_alloc(cachep_d, GFP_KERNEL); 
     5907+       if (!fullbitmap_d) 
     5908+               goto outd; 
     5909+ 
     5910+       fullbitmap_c = kmem_cache_alloc(cachep_c, GFP_KERNEL); 
     5911+       if (!fullbitmap_c) 
     5912+               goto outbitmapd; 
     5913+ 
     5914+       fullbitmap_b = kmem_cache_alloc(cachep_b, GFP_KERNEL); 
     5915+       if (!fullbitmap_b) 
     5916+               goto outbitmapc; 
     5917+ 
     5918+       ret = ip_set_register_set_type(&ip_set_iptreemap); 
     5919+       if (0 > ret) 
     5920+               goto outbitmapb; 
     5921+ 
     5922+       /* Now init our global bitmaps */ 
     5923+       memset(fullbitmap_d->bitmap, 0xff, sizeof(fullbitmap_d->bitmap)); 
     5924+ 
     5925+       for (a = 0; a < 256; a++) 
     5926+               fullbitmap_c->tree[a] = fullbitmap_d; 
     5927+ 
     5928+       for (a = 0; a < 256; a++) 
     5929+               fullbitmap_b->tree[a] = fullbitmap_c; 
     5930+       memset(fullbitmap_b->dirty, 0, sizeof(fullbitmap_b->dirty)); 
     5931+ 
     5932+       return 0; 
     5933+ 
     5934+outbitmapb: 
     5935+       kmem_cache_free(cachep_b, fullbitmap_b); 
     5936+outbitmapc: 
     5937+       kmem_cache_free(cachep_c, fullbitmap_c); 
     5938+outbitmapd: 
     5939+       kmem_cache_free(cachep_d, fullbitmap_d); 
     5940+outd: 
     5941+       kmem_cache_destroy(cachep_d); 
     5942+outc: 
     5943+       kmem_cache_destroy(cachep_c); 
     5944+outb: 
     5945+       kmem_cache_destroy(cachep_b); 
     5946+out: 
     5947+ 
     5948+       return ret; 
     5949+} 
     5950+ 
     5951+static void __exit ip_set_iptreemap_fini(void) 
     5952+{ 
     5953+       ip_set_unregister_set_type(&ip_set_iptreemap); 
     5954+       kmem_cache_free(cachep_d, fullbitmap_d); 
     5955+       kmem_cache_free(cachep_c, fullbitmap_c); 
     5956+       kmem_cache_free(cachep_b, fullbitmap_b); 
     5957+       kmem_cache_destroy(cachep_d); 
     5958+       kmem_cache_destroy(cachep_c); 
     5959+       kmem_cache_destroy(cachep_b); 
     5960+} 
     5961+ 
     5962+module_init(ip_set_iptreemap_init); 
     5963+module_exit(ip_set_iptreemap_fini); 
     5964diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_macipmap.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_macipmap.c 
     5965--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_macipmap.c       1970-01-01 01:00:00.000000000 +0100 
     5966+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_macipmap.c   2007-10-12 14:31:55.000000000 +0200 
     5967@@ -0,0 +1,375 @@ 
    48415968+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    48425969+ *                         Patrick Schaaf <bof@bof.de> 
     
    48545981+#include <linux/ip.h> 
    48555982+#include <linux/skbuff.h> 
     5983+#include <linux/version.h> 
    48565984+#include <linux/netfilter_ipv4/ip_tables.h> 
    48575985+#include <linux/netfilter_ipv4/ip_set.h> 
     
    49106038+        
    49116039+       ip = ntohl(flags[index] & IPSET_SRC 
    4912 +                       ? ip_hdr(skb)->saddr 
     6040+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6041+                       ? ip_hdr(skb)->saddr  
    49136042+                       : ip_hdr(skb)->daddr); 
    4914 +       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    4915 +          flags[index] & IPSET_SRC ? "SRC" : "DST", 
    4916 +          NIPQUAD(ip_hdr(skb)->saddr), 
    4917 +          NIPQUAD(ip_hdr(skb)->daddr)); 
     6043+#else 
     6044+                       ? skb->nh.iph->saddr 
     6045+                       : skb->nh.iph->daddr); 
     6046+#endif 
    49186047+ 
    49196048+       if (ip < map->first_ip || ip > map->last_ip) 
     
    49276056+               /* Is mac pointer valid? 
    49286057+                * If so, compare... */ 
     6058+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    49296059+               return (skb_mac_header(skb) >= skb->head 
    49306060+                       && (skb_mac_header(skb) + ETH_HLEN) <= skb->data 
     6061+#else 
     6062+               return (skb->mac.raw >= skb->head 
     6063+                       && (skb->mac.raw + ETH_HLEN) <= skb->data 
     6064+#endif 
    49316065+                       && (memcmp(eth_hdr(skb)->h_source, 
    49326066+                                  &table[ip - map->first_ip].ethernet, 
     
    49856119+        
    49866120+       ip = ntohl(flags[index] & IPSET_SRC 
    4987 +                       ? ip_hdr(skb)->saddr 
     6121+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6122+                       ? ip_hdr(skb)->saddr  
    49886123+                       : ip_hdr(skb)->daddr); 
    4989 + 
     6124+#else 
     6125+                       ? skb->nh.iph->saddr 
     6126+                       : skb->nh.iph->daddr); 
     6127+#endif 
     6128+ 
     6129+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    49906130+       if (!(skb_mac_header(skb) >= skb->head 
    49916131+             && (skb_mac_header(skb) + ETH_HLEN) <= skb->data)) 
     6132+#else 
     6133+       if (!(skb->mac.raw >= skb->head 
     6134+             && (skb->mac.raw + ETH_HLEN) <= skb->data)) 
     6135+#endif 
    49926136+               return -EINVAL; 
    49936137+ 
     
    50396183+       return __delip(set, 
    50406184+                      ntohl(flags[index] & IPSET_SRC  
    5041 +                               ? ip_hdr(skb)->saddr  
     6185+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6186+                               ? ip_hdr(skb)->saddr  
    50426187+                               : ip_hdr(skb)->daddr), 
     6188+#else 
     6189+                               ? skb->nh.iph->saddr  
     6190+                               : skb->nh.iph->daddr), 
     6191+#endif 
    50436192+                      hash_ip); 
    50446193+} 
     
    51786327+MODULE_DESCRIPTION("macipmap type of IP sets"); 
    51796328+ 
    5180 +static int __init init(void) 
     6329+static int __init ip_set_macipmap_init(void) 
    51816330+{ 
    51826331+       init_max_malloc_size(); 
     
    51846333+} 
    51856334+ 
    5186 +static void __exit fini(void) 
     6335+static void __exit ip_set_macipmap_fini(void) 
    51876336+{ 
    51886337+       /* FIXME: possible race with ip_set_create() */ 
     
    51906339+} 
    51916340+ 
    5192 +module_init(init); 
    5193 +module_exit(fini); 
    5194 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_nethash.c 
    5195 =================================================================== 
    5196 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    5197 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_nethash.c        2007-06-19 23:19:01.000000000 +0100 
    5198 @@ -0,0 +1,481 @@ 
     6341+module_init(ip_set_macipmap_init); 
     6342+module_exit(ip_set_macipmap_fini); 
     6343diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_nethash.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_nethash.c 
     6344--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_nethash.c        1970-01-01 01:00:00.000000000 +0100 
     6345+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_nethash.c    2007-10-12 14:31:55.000000000 +0200 
     6346@@ -0,0 +1,497 @@ 
    51996347+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    52006348+ * 
     
    52096357+#include <linux/ip.h> 
    52106358+#include <linux/skbuff.h> 
     6359+#include <linux/version.h> 
     6360+#include <linux/jhash.h> 
    52116361+#include <linux/netfilter_ipv4/ip_tables.h> 
    52126362+#include <linux/netfilter_ipv4/ip_set.h> 
     
    52176367+#include <linux/vmalloc.h> 
    52186368+#include <linux/random.h> 
    5219 +#include <linux/jhash.h> 
    52206369+ 
    52216370+#include <net/ip.h> 
     
    53106459+       return __testip(set, 
    53116460+                       ntohl(flags[index] & IPSET_SRC  
     6461+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    53126462+                               ? ip_hdr(skb)->saddr  
    53136463+                               : ip_hdr(skb)->daddr), 
     6464+#else 
     6465+                               ? skb->nh.iph->saddr  
     6466+                               : skb->nh.iph->daddr), 
     6467+#endif 
    53146468+                       hash_ip); 
    53156469+} 
     
    53416495+       ip_set_ip_t *hash_ip) 
    53426496+{ 
    5343 +       if (!ip || map->elements > limit) 
     6497+       if (!ip || map->elements >= limit) 
    53446498+               return -ERANGE; 
    53456499+        
     
    54036557+       int ret = -ERANGE; 
    54046558+       ip_set_ip_t ip = ntohl(flags[index] & IPSET_SRC  
    5405 +                                       ? ip_hdr(skb)->saddr 
     6559+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6560+                                       ? ip_hdr(skb)->saddr  
    54066561+                                       : ip_hdr(skb)->daddr); 
     6562+#else 
     6563+                                       ? skb->nh.iph->saddr 
     6564+                                       : skb->nh.iph->daddr); 
     6565+#endif 
    54076566+        
    54086567+       if (map->cidr[0]) 
     
    55326691+       int ret = -ERANGE; 
    55336692+       ip_set_ip_t ip = ntohl(flags[index] & IPSET_SRC  
    5534 +                                       ? ip_hdr(skb)->saddr 
     6693+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6694+                                       ? ip_hdr(skb)->saddr  
    55356695+                                       : ip_hdr(skb)->daddr); 
     6696+#else 
     6697+                                       ? skb->nh.iph->saddr 
     6698+                                       : skb->nh.iph->daddr); 
     6699+#endif 
    55366700+        
    55376701+       if (map->cidr[0]) 
     
    56656829+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    56666830+ 
    5667 +static int __init init(void) 
     6831+static int __init ip_set_nethash_init(void) 
    56686832+{ 
    56696833+       return ip_set_register_set_type(&ip_set_nethash); 
    56706834+} 
    56716835+ 
    5672 +static void __exit fini(void) 
     6836+static void __exit ip_set_nethash_fini(void) 
    56736837+{ 
    56746838+       /* FIXME: possible race with ip_set_create() */ 
     
    56766840+} 
    56776841+ 
    5678 +module_init(init); 
    5679 +module_exit(fini); 
    5680 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_portmap.c 
    5681 =================================================================== 
    5682 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    5683 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ip_set_portmap.c        2007-06-19 23:19:01.000000000 +0100 
    5684 @@ -0,0 +1,334 @@ 
     6842+module_init(ip_set_nethash_init); 
     6843+module_exit(ip_set_nethash_fini); 
     6844diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_portmap.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_portmap.c 
     6845--- ./linux-2.6.22.4/net/ipv4/netfilter/ip_set_portmap.c        1970-01-01 01:00:00.000000000 +0100 
     6846+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ip_set_portmap.c    2007-10-12 14:31:55.000000000 +0200 
     6847@@ -0,0 +1,346 @@ 
    56856848+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    56866849+ * 
     
    56976860+#include <linux/udp.h> 
    56986861+#include <linux/skbuff.h> 
     6862+#include <linux/version.h> 
    56996863+#include <linux/netfilter_ipv4/ip_tables.h> 
    57006864+#include <linux/netfilter_ipv4/ip_set.h> 
     
    57126876+get_port(const struct sk_buff *skb, u_int32_t flags) 
    57136877+{ 
     6878+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    57146879+       struct iphdr *iph = ip_hdr(skb); 
     6880+#else 
     6881+       struct iphdr *iph = skb->nh.iph; 
     6882+#endif 
    57156883+       u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET; 
    5716 + 
    57176884+       switch (iph->protocol) { 
    57186885+       case IPPROTO_TCP: { 
     
    57236890+                       return INVALID_PORT; 
    57246891+ 
     6892+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    57256893+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0) 
     6894+#else 
     6895+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) 
     6896+#endif 
    57266897+                       /* No choice either */ 
    57276898+                       return INVALID_PORT; 
     
    57366907+                       return INVALID_PORT; 
    57376908+ 
     6909+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    57386910+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0) 
     6911+#else 
     6912+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) 
     6913+#endif 
    57396914+                       /* No choice either */ 
    57406915+                       return INVALID_PORT; 
     
    60047179+MODULE_DESCRIPTION("portmap type of IP sets"); 
    60057180+ 
    6006 +static int __init init(void) 
     7181+static int __init ip_set_portmap_init(void) 
    60077182+{ 
    60087183+       return ip_set_register_set_type(&ip_set_portmap); 
    60097184+} 
    60107185+ 
    6011 +static void __exit fini(void) 
     7186+static void __exit ip_set_portmap_fini(void) 
    60127187+{ 
    60137188+       /* FIXME: possible race with ip_set_create() */ 
     
    60157190+} 
    60167191+ 
    6017 +module_init(init); 
    6018 +module_exit(fini); 
    6019 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ipt_set.c 
    6020 =================================================================== 
    6021 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    6022 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ipt_set.c       2007-06-19 23:19:01.000000000 +0100 
    6023 @@ -0,0 +1,150 @@ 
     7192+module_init(ip_set_portmap_init); 
     7193+module_exit(ip_set_portmap_fini); 
     7194diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ipt_set.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ipt_set.c 
     7195--- ./linux-2.6.22.4/net/ipv4/netfilter/ipt_set.c       1970-01-01 01:00:00.000000000 +0100 
     7196+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ipt_set.c   2007-10-12 14:31:55.000000000 +0200 
     7197@@ -0,0 +1,160 @@ 
    60247198+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    60257199+ *                         Patrick Schaaf <bof@bof.de> 
     
    60537227+} 
    60547228+ 
     7229+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7230+static bool 
     7231+#else 
    60557232+static int 
     7233+#endif 
    60567234+match(const struct sk_buff *skb, 
    60577235+      const struct net_device *in, 
     
    60617239+#endif 
    60627240+      const void *matchinfo, 
    6063 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
     7241+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7242+      int offset, unsigned int protoff, bool *hotdrop) 
     7243+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
    60647244+      int offset, unsigned int protoff, int *hotdrop) 
    60657245+#else 
     
    60747254+} 
    60757255+ 
     7256+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7257+bool 
     7258+#else 
    60767259+static int 
     7260+#endif 
    60777261+checkentry(const char *tablename, 
    60787262+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
     
    61727356+module_init(ipt_ipset_init); 
    61737357+module_exit(ipt_ipset_fini); 
    6174 Index: linux-2.6.22-rc5/net/ipv4/netfilter/ipt_SET.c 
    6175 =================================================================== 
    6176 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    6177 +++ linux-2.6.22-rc5/net/ipv4/netfilter/ipt_SET.c       2007-06-19 23:19:01.000000000 +0100 
    6178 @@ -0,0 +1,169 @@ 
     7358diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/ipt_SET.c linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ipt_SET.c 
     7359--- ./linux-2.6.22.4/net/ipv4/netfilter/ipt_SET.c       1970-01-01 01:00:00.000000000 +0100 
     7360+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/ipt_SET.c   2007-10-12 14:31:55.000000000 +0200 
     7361@@ -0,0 +1,172 @@ 
    61797362+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    61807363+ *                         Patrick Schaaf <bof@bof.de> 
     
    61987381+#include <linux/inetdevice.h> 
    61997382+#include <linux/version.h> 
    6200 +#include <linux/skbuff.h> 
    62017383+#include <net/protocol.h> 
    62027384+#include <net/checksum.h> 
     
    62347416+} 
    62357417+ 
     7418+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7419+static bool 
     7420+#else 
    62367421+static int 
     7422+#endif 
    62377423+checkentry(const char *tablename, 
    62387424+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
     
    63467532+module_init(ipt_SET_init); 
    63477533+module_exit(ipt_SET_fini); 
    6348 Index: linux-2.6.22-rc5/net/ipv4/netfilter/Kconfig 
    6349 =================================================================== 
    6350 --- linux-2.6.22-rc5.orig/net/ipv4/netfilter/Kconfig    2007-06-19 23:19:01.000000000 +0100 
    6351 +++ linux-2.6.22-rc5/net/ipv4/netfilter/Kconfig 2007-06-20 19:20:37.000000000 +0100 
    6352 @@ -426,5 +426,114 @@ 
     7534diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/Kconfig linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/Kconfig 
     7535--- ./linux-2.6.22.4/net/ipv4/netfilter/Kconfig 2007-08-21 06:33:06.000000000 +0200 
     7536+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/Kconfig     2007-10-12 14:31:55.000000000 +0200 
     7537@@ -402,5 +402,122 @@ 
    63537538          Allows altering the ARP packet payload: source and destination 
    63547539          hardware and network addresses. 
     
    64437628+         To compile it as a module, choose M here.  If unsure, say N. 
    64447629+ 
     7630+config IP_NF_SET_IPTREEMAP 
     7631+       tristate "iptreemap set support" 
     7632+       depends on IP_NF_SET 
     7633+       help 
     7634+         This option adds the iptreemap set type support. 
     7635+ 
     7636+         To compile it as a module, choose M here.  If unsure, say N. 
     7637+ 
    64457638+config IP_NF_MATCH_SET 
    64467639+       tristate "set match support" 
     
    64657658 endmenu 
    64667659  
    6467 Index: linux-2.6.22-rc5/net/ipv4/netfilter/Makefile 
    6468 =================================================================== 
    6469 --- linux-2.6.22-rc5.orig/net/ipv4/netfilter/Makefile   2007-06-19 23:19:01.000000000 +0100 
    6470 +++ linux-2.6.22-rc5/net/ipv4/netfilter/Makefile        2007-06-20 19:20:37.000000000 +0100 
     7660diff -Nru ./linux-2.6.22.4/net/ipv4/netfilter/Makefile linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/Makefile 
     7661--- ./linux-2.6.22.4/net/ipv4/netfilter/Makefile        2007-08-21 06:33:06.000000000 +0200 
     7662+++ linux-2.6.22.4.pom2patch.set/net/ipv4/netfilter/Makefile    2007-10-12 14:31:55.000000000 +0200 
    64717663@@ -48,6 +48,7 @@ 
    64727664 obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o 
     
    64757667+obj-$(CONFIG_IP_NF_MATCH_SET) += ipt_set.o 
    64767668 obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ipt_addrtype.o 
    6477  obj-$(CONFIG_IP_NF_MATCH_IPP2P) += ipt_ipp2p.o 
    6478  obj-$(CONFIG_IP_NF_MATCH_LAYER7) += ipt_layer7.o 
    6479 @@ -64,6 +65,17 @@ 
     7669  
     7670 # targets 
     7671@@ -62,6 +63,18 @@ 
    64807672 obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o 
    64817673 obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o 
     
    64927684+obj-$(CONFIG_IP_NF_SET_IPPORTHASH) += ip_set_ipporthash.o 
    64937685+obj-$(CONFIG_IP_NF_SET_IPTREE) += ip_set_iptree.o 
     7686+obj-$(CONFIG_IP_NF_SET_IPTREEMAP) += ip_set_iptreemap.o 
    64947687  
    64957688 # generic ARP tables 
  • trunk/target/linux/generic-2.6/patches-2.6.23/130-netfilter_ipset.patch

    r9263 r9269  
    1 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set.h 
    2 =================================================================== 
    3 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set.h      2007-09-21 16:24:01.000000000 +0800 
     1diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set.h 
     2--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set.h  1970-01-01 01:00:00.000000000 +0100 
     3+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set.h    2007-10-12 11:52:37.000000000 +0200 
    54@@ -0,0 +1,498 @@ 
    65+#ifndef _IP_SET_H 
     
    502501+ 
    503502+#endif /*_IP_SET_H*/ 
    504 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_iphash.h 
    505 =================================================================== 
    506 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    507 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_iphash.h       2007-09-21 16:24:01.000000000 +0800 
     503diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_iphash.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iphash.h 
     504--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_iphash.h   1970-01-01 01:00:00.000000000 +0100 
     505+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iphash.h     2007-10-12 11:52:37.000000000 +0200 
    508506@@ -0,0 +1,30 @@ 
    509507+#ifndef __IP_SET_IPHASH_H 
     
    537535+ 
    538536+#endif /* __IP_SET_IPHASH_H */ 
    539 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_ipmap.h 
    540 =================================================================== 
    541 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    542 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_ipmap.h        2007-09-21 16:24:01.000000000 +0800 
     537diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_ipmap.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipmap.h 
     538--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_ipmap.h    1970-01-01 01:00:00.000000000 +0100 
     539+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipmap.h      2007-10-12 11:52:37.000000000 +0200 
    543540@@ -0,0 +1,56 @@ 
    544541+#ifndef __IP_SET_IPMAP_H 
     
    598595+        
    599596+#endif /* __IP_SET_IPMAP_H */ 
    600 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_ipporthash.h 
    601 =================================================================== 
    602 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    603 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_ipporthash.h   2007-09-21 16:24:01.000000000 +0800 
     597diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_ipporthash.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipporthash.h 
     598--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_ipporthash.h       1970-01-01 01:00:00.000000000 +0100 
     599+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipporthash.h 2007-10-12 11:52:37.000000000 +0200 
    604600@@ -0,0 +1,34 @@ 
    605601+#ifndef __IP_SET_IPPORTHASH_H 
     
    637633+ 
    638634+#endif /* __IP_SET_IPPORTHASH_H */ 
    639 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_iptree.h 
    640 =================================================================== 
    641 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    642 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_iptree.h       2007-09-21 16:24:01.000000000 +0800 
     635diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_iptree.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptree.h 
     636--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_iptree.h   1970-01-01 01:00:00.000000000 +0100 
     637+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptree.h     2007-10-12 11:52:37.000000000 +0200 
    643638@@ -0,0 +1,40 @@ 
    644639+#ifndef __IP_SET_IPTREE_H 
     
    682677+ 
    683678+#endif /* __IP_SET_IPTREE_H */ 
    684 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_macipmap.h 
    685 =================================================================== 
    686 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    687 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_macipmap.h     2007-09-21 16:24:01.000000000 +0800 
     679diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_iptreemap.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptreemap.h 
     680--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_iptreemap.h        1970-01-01 01:00:00.000000000 +0100 
     681+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptreemap.h  2007-10-12 11:52:37.000000000 +0200 
     682@@ -0,0 +1,40 @@ 
     683+#ifndef __IP_SET_IPTREEMAP_H 
     684+#define __IP_SET_IPTREEMAP_H 
     685+ 
     686+#include <linux/netfilter_ipv4/ip_set.h> 
     687+ 
     688+#define SETTYPE_NAME "iptreemap" 
     689+ 
     690+#ifdef __KERNEL__ 
     691+struct ip_set_iptreemap_d { 
     692+       unsigned char bitmap[32]; /* x.x.x.y */ 
     693+}; 
     694+ 
     695+struct ip_set_iptreemap_c { 
     696+       struct ip_set_iptreemap_d *tree[256]; /* x.x.y.x */ 
     697+}; 
     698+ 
     699+struct ip_set_iptreemap_b { 
     700+       struct ip_set_iptreemap_c *tree[256]; /* x.y.x.x */ 
     701+       unsigned char dirty[32]; 
     702+}; 
     703+#endif 
     704+ 
     705+struct ip_set_iptreemap { 
     706+       unsigned int gc_interval; 
     707+#ifdef __KERNEL__ 
     708+       struct timer_list gc; 
     709+       struct ip_set_iptreemap_b *tree[256]; /* y.x.x.x */ 
     710+#endif 
     711+}; 
     712+ 
     713+struct ip_set_req_iptreemap_create { 
     714+       unsigned int gc_interval; 
     715+}; 
     716+ 
     717+struct ip_set_req_iptreemap { 
     718+       ip_set_ip_t start; 
     719+       ip_set_ip_t end; 
     720+}; 
     721+ 
     722+#endif /* __IP_SET_IPTREEMAP_H */ 
     723diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_jhash.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_jhash.h 
     724--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_jhash.h    1970-01-01 01:00:00.000000000 +0100 
     725+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_jhash.h      2007-10-12 11:52:37.000000000 +0200 
     726@@ -0,0 +1,148 @@ 
     727+#ifndef _LINUX_IPSET_JHASH_H 
     728+#define _LINUX_IPSET_JHASH_H 
     729+ 
     730+/* This is a copy of linux/jhash.h but the types u32/u8 are changed 
     731+ * to __u32/__u8 so that the header file can be included into 
     732+ * userspace code as well. Jozsef Kadlecsik (kadlec@blackhole.kfki.hu) 
     733+ */ 
     734+ 
     735+/* jhash.h: Jenkins hash support. 
     736+ * 
     737+ * Copyright (C) 1996 Bob Jenkins (bob_jenkins@burtleburtle.net) 
     738+ * 
     739+ * http://burtleburtle.net/bob/hash/ 
     740+ * 
     741+ * These are the credits from Bob's sources: 
     742+ * 
     743+ * lookup2.c, by Bob Jenkins, December 1996, Public Domain. 
     744+ * hash(), hash2(), hash3, and mix() are externally useful functions. 
     745+ * Routines to test the hash are included if SELF_TEST is defined. 
     746+ * You can use this free for any purpose.  It has no warranty. 
     747+ * 
     748+ * Copyright (C) 2003 David S. Miller (davem@redhat.com) 
     749+ * 
     750+ * I've modified Bob's hash to be useful in the Linux kernel, and 
     751+ * any bugs present are surely my fault.  -DaveM 
     752+ */ 
     753+ 
     754+/* NOTE: Arguments are modified. */ 
     755+#define __jhash_mix(a, b, c) \ 
     756+{ \ 
     757+  a -= b; a -= c; a ^= (c>>13); \ 
     758+  b -= c; b -= a; b ^= (a<<8); \ 
     759+  c -= a; c -= b; c ^= (b>>13); \ 
     760+  a -= b; a -= c; a ^= (c>>12);  \ 
     761+  b -= c; b -= a; b ^= (a<<16); \ 
     762+  c -= a; c -= b; c ^= (b>>5); \ 
     763+  a -= b; a -= c; a ^= (c>>3);  \ 
     764+  b -= c; b -= a; b ^= (a<<10); \ 
     765+  c -= a; c -= b; c ^= (b>>15); \ 
     766+} 
     767+ 
     768+/* The golden ration: an arbitrary value */ 
     769+#define JHASH_GOLDEN_RATIO     0x9e3779b9 
     770+ 
     771+/* The most generic version, hashes an arbitrary sequence 
     772+ * of bytes.  No alignment or length assumptions are made about 
     773+ * the input key. 
     774+ */ 
     775+static inline __u32 jhash(void *key, __u32 length, __u32 initval) 
     776+{ 
     777+       __u32 a, b, c, len; 
     778+       __u8 *k = key; 
     779+ 
     780+       len = length; 
     781+       a = b = JHASH_GOLDEN_RATIO; 
     782+       c = initval; 
     783+ 
     784+       while (len >= 12) { 
     785+               a += (k[0] +((__u32)k[1]<<8) +((__u32)k[2]<<16) +((__u32)k[3]<<24)); 
     786+               b += (k[4] +((__u32)k[5]<<8) +((__u32)k[6]<<16) +((__u32)k[7]<<24)); 
     787+               c += (k[8] +((__u32)k[9]<<8) +((__u32)k[10]<<16)+((__u32)k[11]<<24)); 
     788+ 
     789+               __jhash_mix(a,b,c); 
     790+ 
     791+               k += 12; 
     792+               len -= 12; 
     793+       } 
     794+ 
     795+       c += length; 
     796+       switch (len) { 
     797+       case 11: c += ((__u32)k[10]<<24); 
     798+       case 10: c += ((__u32)k[9]<<16); 
     799+       case 9 : c += ((__u32)k[8]<<8); 
     800+       case 8 : b += ((__u32)k[7]<<24); 
     801+       case 7 : b += ((__u32)k[6]<<16); 
     802+       case 6 : b += ((__u32)k[5]<<8); 
     803+       case 5 : b += k[4]; 
     804+       case 4 : a += ((__u32)k[3]<<24); 
     805+       case 3 : a += ((__u32)k[2]<<16); 
     806+       case 2 : a += ((__u32)k[1]<<8); 
     807+       case 1 : a += k[0]; 
     808+       }; 
     809+ 
     810+       __jhash_mix(a,b,c); 
     811+ 
     812+       return c; 
     813+} 
     814+ 
     815+/* A special optimized version that handles 1 or more of __u32s. 
     816+ * The length parameter here is the number of __u32s in the key. 
     817+ */ 
     818+static inline __u32 jhash2(__u32 *k, __u32 length, __u32 initval) 
     819+{ 
     820+       __u32 a, b, c, len; 
     821+ 
     822+       a = b = JHASH_GOLDEN_RATIO; 
     823+       c = initval; 
     824+       len = length; 
     825+ 
     826+       while (len >= 3) { 
     827+               a += k[0]; 
     828+               b += k[1]; 
     829+               c += k[2]; 
     830+               __jhash_mix(a, b, c); 
     831+               k += 3; len -= 3; 
     832+       } 
     833+ 
     834+       c += length * 4; 
     835+ 
     836+       switch (len) { 
     837+       case 2 : b += k[1]; 
     838+       case 1 : a += k[0]; 
     839+       }; 
     840+ 
     841+       __jhash_mix(a,b,c); 
     842+ 
     843+       return c; 
     844+} 
     845+ 
     846+ 
     847+/* A special ultra-optimized versions that knows they are hashing exactly 
     848+ * 3, 2 or 1 word(s). 
     849+ * 
     850+ * NOTE: In partilar the "c += length; __jhash_mix(a,b,c);" normally 
     851+ *       done at the end is not done here. 
     852+ */ 
     853+static inline __u32 jhash_3words(__u32 a, __u32 b, __u32 c, __u32 initval) 
     854+{ 
     855+       a += JHASH_GOLDEN_RATIO; 
     856+       b += JHASH_GOLDEN_RATIO; 
     857+       c += initval; 
     858+ 
     859+       __jhash_mix(a, b, c); 
     860+ 
     861+       return c; 
     862+} 
     863+ 
     864+static inline __u32 jhash_2words(__u32 a, __u32 b, __u32 initval) 
     865+{ 
     866+       return jhash_3words(a, b, 0, initval); 
     867+} 
     868+ 
     869+static inline __u32 jhash_1word(__u32 a, __u32 initval) 
     870+{ 
     871+       return jhash_3words(a, 0, 0, initval); 
     872+} 
     873+ 
     874+#endif /* _LINUX_IPSET_JHASH_H */ 
     875diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_macipmap.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_macipmap.h 
     876--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_macipmap.h 1970-01-01 01:00:00.000000000 +0100 
     877+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_macipmap.h   2007-10-12 11:52:37.000000000 +0200 
    688878@@ -0,0 +1,38 @@ 
    689879+#ifndef __IP_SET_MACIPMAP_H 
     
    725915+ 
    726916+#endif /* __IP_SET_MACIPMAP_H */ 
    727 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_malloc.h 
    728 =================================================================== 
    729 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    730 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_malloc.h       2007-09-21 16:24:01.000000000 +0800 
     917diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_malloc.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_malloc.h 
     918--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_malloc.h   1970-01-01 01:00:00.000000000 +0100 
     919+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_malloc.h     2007-10-12 11:52:37.000000000 +0200 
    731920@@ -0,0 +1,116 @@ 
    732921+#ifndef _IP_SET_MALLOC_H 
     
    8461035+ 
    8471036+#endif /*_IP_SET_MALLOC_H*/ 
    848 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_nethash.h 
    849 =================================================================== 
    850 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    851 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_nethash.h      2007-09-21 16:24:01.000000000 +0800 
     1037diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_nethash.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_nethash.h 
     1038--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_nethash.h  1970-01-01 01:00:00.000000000 +0100 
     1039+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_nethash.h    2007-10-12 11:52:37.000000000 +0200 
    8521040@@ -0,0 +1,55 @@ 
    8531041+#ifndef __IP_SET_NETHASH_H 
     
    9061094+ 
    9071095+#endif /* __IP_SET_NETHASH_H */ 
    908 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_portmap.h 
    909 =================================================================== 
    910 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    911 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ip_set_portmap.h      2007-09-21 16:24:01.000000000 +0800 
     1096diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ip_set_portmap.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_portmap.h 
     1097--- linux-2.6.23/include/linux/netfilter_ipv4/ip_set_portmap.h  1970-01-01 01:00:00.000000000 +0100 
     1098+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ip_set_portmap.h    2007-10-12 11:52:37.000000000 +0200 
    9121099@@ -0,0 +1,25 @@ 
    9131100+#ifndef __IP_SET_PORTMAP_H 
     
    9361123+ 
    9371124+#endif /* __IP_SET_PORTMAP_H */ 
    938 Index: linux-2.6.23-rc6/include/linux/netfilter_ipv4/ipt_set.h 
    939 =================================================================== 
    940 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    941 +++ linux-2.6.23-rc6/include/linux/netfilter_ipv4/ipt_set.h     2007-09-21 16:24:01.000000000 +0800 
     1125diff -Nru linux-2.6.23/include/linux/netfilter_ipv4/ipt_set.h linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ipt_set.h 
     1126--- linux-2.6.23/include/linux/netfilter_ipv4/ipt_set.h 1970-01-01 01:00:00.000000000 +0100 
     1127+++ linux-2.6.23.pom2patch.set/include/linux/netfilter_ipv4/ipt_set.h   2007-10-12 11:52:37.000000000 +0200 
    9421128@@ -0,0 +1,21 @@ 
    9431129+#ifndef _IPT_SET_H 
     
    9621148+ 
    9631149+#endif /*_IPT_SET_H*/ 
    964 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set.c 
    965 =================================================================== 
    966 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    967 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set.c        2007-09-21 16:24:01.000000000 +0800 
    968 @@ -0,0 +1,2001 @@ 
     1150diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set.c 
     1151--- linux-2.6.23/net/ipv4/netfilter/ip_set.c    1970-01-01 01:00:00.000000000 +0100 
     1152+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set.c      2007-10-12 11:52:37.000000000 +0200 
     1153@@ -0,0 +1,2003 @@ 
    9691154+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    9701155+ *                         Patrick Schaaf <bof@bof.de> 
     
    28973082+       .get_optmax     = SO_IP_SET + 1, 
    28983083+       .get            = &ip_set_sockfn_get, 
    2899 +       .use            = 0 
     3084+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     3085+       .owner          = THIS_MODULE, 
     3086+#endif 
    29003087+}; 
    29013088+ 
     
    29093096+MODULE_DESCRIPTION("module implementing core IP set support"); 
    29103097+ 
    2911 +static int __init init(void) 
     3098+static int __init ip_set_init(void) 
    29123099+{ 
    29133100+       int res; 
     
    29463133+} 
    29473134+ 
    2948 +static void __exit fini(void) 
     3135+static void __exit ip_set_fini(void) 
    29493136+{ 
    29503137+       /* There can't be any existing set or binding */ 
     
    29663153+EXPORT_SYMBOL(ip_set_testip_kernel); 
    29673154+ 
    2968 +module_init(init); 
    2969 +module_exit(fini); 
    2970 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_iphash.c 
    2971 =================================================================== 
    2972 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    2973 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_iphash.c 2007-09-21 16:24:01.000000000 +0800 
    2974 @@ -0,0 +1,413 @@ 
     3155+module_init(ip_set_init); 
     3156+module_exit(ip_set_fini); 
     3157diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_iphash.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_iphash.c 
     3158--- linux-2.6.23/net/ipv4/netfilter/ip_set_iphash.c     1970-01-01 01:00:00.000000000 +0100 
     3159+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_iphash.c       2007-10-12 11:52:37.000000000 +0200 
     3160@@ -0,0 +1,429 @@ 
    29753161+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    29763162+ * 
     
    29853171+#include <linux/ip.h> 
    29863172+#include <linux/skbuff.h> 
     3173+#include <linux/version.h> 
     3174+#include <linux/jhash.h> 
    29873175+#include <linux/netfilter_ipv4/ip_tables.h> 
    29883176+#include <linux/netfilter_ipv4/ip_set.h> 
     
    29933181+#include <linux/vmalloc.h> 
    29943182+#include <linux/random.h> 
    2995 +#include <linux/jhash.h> 
    29963183+ 
    29973184+#include <net/ip.h> 
     
    30633250+       return __testip(set, 
    30643251+                       ntohl(flags[index] & IPSET_SRC  
     3252+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    30653253+                               ? ip_hdr(skb)->saddr  
    30663254+                               : ip_hdr(skb)->daddr), 
     3255+#else 
     3256+                               ? skb->nh.iph->saddr  
     3257+                               : skb->nh.iph->daddr), 
     3258+#endif 
    30673259+                       hash_ip); 
    30683260+} 
     
    30753267+       ip_set_ip_t *elem; 
    30763268+        
    3077 +       if (!ip || map->elements > limit) 
     3269+       if (!ip || map->elements >= limit) 
    30783270+               return -ERANGE; 
    30793271+ 
     
    31203312+       return __addip((struct ip_set_iphash *) set->data, 
    31213313+                      ntohl(flags[index] & IPSET_SRC  
    3122 +                               ? ip_hdr(skb)->saddr  
     3314+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3315+                               ? ip_hdr(skb)->saddr  
    31233316+                               : ip_hdr(skb)->daddr), 
     3317+#else 
     3318+                               ? skb->nh.iph->saddr  
     3319+                               : skb->nh.iph->daddr), 
     3320+#endif 
    31243321+                      hash_ip); 
    31253322+} 
     
    32433440+       return __delip(set, 
    32443441+                      ntohl(flags[index] & IPSET_SRC  
     3442+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    32453443+                               ? ip_hdr(skb)->saddr  
    32463444+                               : ip_hdr(skb)->daddr), 
     3445+#else 
     3446+                               ? skb->nh.iph->saddr  
     3447+                               : skb->nh.iph->daddr), 
     3448+#endif 
    32473449+                      hash_ip); 
    32483450+} 
     
    33733575+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    33743576+ 
    3375 +static int __init init(void) 
     3577+static int __init ip_set_iphash_init(void) 
    33763578+{ 
    33773579+       return ip_set_register_set_type(&ip_set_iphash); 
    33783580+} 
    33793581+ 
    3380 +static void __exit fini(void) 
     3582+static void __exit ip_set_iphash_fini(void) 
    33813583+{ 
    33823584+       /* FIXME: possible race with ip_set_create() */ 
     
    33843586+} 
    33853587+ 
    3386 +module_init(init); 
    3387 +module_exit(fini); 
    3388 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_ipmap.c 
    3389 =================================================================== 
    3390 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    3391 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_ipmap.c  2007-09-21 16:24:01.000000000 +0800 
    3392 @@ -0,0 +1,327 @@ 
     3588+module_init(ip_set_iphash_init); 
     3589+module_exit(ip_set_iphash_fini); 
     3590diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_ipmap.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_ipmap.c 
     3591--- linux-2.6.23/net/ipv4/netfilter/ip_set_ipmap.c      1970-01-01 01:00:00.000000000 +0100 
     3592+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_ipmap.c        2007-10-12 11:52:37.000000000 +0200 
     3593@@ -0,0 +1,336 @@ 
    33933594+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    33943595+ *                         Patrick Schaaf <bof@bof.de> 
     
    34053606+#include <linux/ip.h> 
    34063607+#include <linux/skbuff.h> 
     3608+#include <linux/version.h> 
    34073609+#include <linux/netfilter_ipv4/ip_tables.h> 
    34083610+#include <linux/netfilter_ipv4/ip_set.h> 
     
    34113613+#include <asm/bitops.h> 
    34123614+#include <linux/spinlock.h> 
    3413 +#include <linux/skbuff.h> 
     3615+ 
    34143616+#include <linux/netfilter_ipv4/ip_set_ipmap.h> 
    34153617+ 
     
    34573659+             unsigned char index) 
    34583660+{ 
    3459 +       int res; 
    3460 +        
    3461 +       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    3462 +          flags[index] & IPSET_SRC ? "SRC" : "DST", 
    3463 +          NIPQUAD(ip_hdr(skb)->saddr), 
    3464 +          NIPQUAD(ip_hdr(skb)->daddr)); 
    3465 + 
    3466 +       res =  __testip(set, 
    3467 +                       ntohl(flags[index] & IPSET_SRC  
     3661+       int res =  __testip(set, 
     3662+                       ntohl(flags[index] & IPSET_SRC 
     3663+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    34683664+                               ? ip_hdr(skb)->saddr  
    34693665+                               : ip_hdr(skb)->daddr), 
     3666+#else 
     3667+                               ? skb->nh.iph->saddr  
     3668+                               : skb->nh.iph->daddr), 
     3669+#endif 
    34703670+                       hash_ip); 
    34713671+       return (res < 0 ? 0 : res); 
     
    35143714+       return __addip(set, 
    35153715+                      ntohl(flags[index] & IPSET_SRC  
    3516 +                               ? ip_hdr(skb)->saddr  
     3716+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3717+                               ? ip_hdr(skb)->saddr  
    35173718+                               : ip_hdr(skb)->daddr), 
     3719+#else 
     3720+                               ? skb->nh.iph->saddr  
     3721+                               : skb->nh.iph->daddr), 
     3722+#endif 
    35183723+                      hash_ip); 
    35193724+} 
     
    35603765+       return __delip(set, 
    35613766+                      ntohl(flags[index] & IPSET_SRC  
     3767+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    35623768+                               ? ip_hdr(skb)->saddr  
    35633769+                               : ip_hdr(skb)->daddr), 
     3770+#else 
     3771+                               ? skb->nh.iph->saddr  
     3772+                               : skb->nh.iph->daddr), 
     3773+#endif 
    35643774+                      hash_ip); 
    35653775+} 
     
    37053915+MODULE_DESCRIPTION("ipmap type of IP sets"); 
    37063916+ 
    3707 +static int __init init(void) 
     3917+static int __init ip_set_ipmap_init(void) 
    37083918+{ 
    37093919+       return ip_set_register_set_type(&ip_set_ipmap); 
    37103920+} 
    37113921+ 
    3712 +static void __exit fini(void) 
     3922+static void __exit ip_set_ipmap_fini(void) 
    37133923+{ 
    37143924+       /* FIXME: possible race with ip_set_create() */ 
     
    37163926+} 
    37173927+ 
    3718 +module_init(init); 
    3719 +module_exit(fini); 
    3720 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_ipporthash.c 
    3721 =================================================================== 
    3722 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    3723 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_ipporthash.c     2007-09-21 16:24:01.000000000 +0800 
    3724 @@ -0,0 +1,535 @@ 
     3928+module_init(ip_set_ipmap_init); 
     3929+module_exit(ip_set_ipmap_fini); 
     3930diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_ipporthash.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_ipporthash.c 
     3931--- linux-2.6.23/net/ipv4/netfilter/ip_set_ipporthash.c 1970-01-01 01:00:00.000000000 +0100 
     3932+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_ipporthash.c   2007-10-12 11:52:37.000000000 +0200 
     3933@@ -0,0 +1,581 @@ 
    37253934+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    37263935+ * 
     
    37373946+#include <linux/udp.h> 
    37383947+#include <linux/skbuff.h> 
     3948+#include <linux/version.h> 
     3949+#include <linux/jhash.h> 
    37393950+#include <linux/netfilter_ipv4/ip_tables.h> 
    37403951+#include <linux/netfilter_ipv4/ip_set.h> 
     
    37453956+#include <linux/vmalloc.h> 
    37463957+#include <linux/random.h> 
    3747 +#include <linux/jhash.h> 
    37483958+ 
    37493959+#include <net/ip.h> 
     
    37583968+get_port(const struct sk_buff *skb, u_int32_t flags) 
    37593969+{ 
     3970+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    37603971+       struct iphdr *iph = ip_hdr(skb); 
     3972+#else 
     3973+       struct iphdr *iph = skb->nh.iph; 
     3974+#endif 
    37613975+       u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET; 
    37623976+ 
     
    37693983+                       return INVALID_PORT; 
    37703984+ 
    3771 +               if (skb_copy_bits(skb, ip_hdrlen(skb), &tcph, sizeof(tcph)) < 0) 
     3985+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3986+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0) 
     3987+#else 
     3988+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) 
     3989+#endif 
    37723990+                       /* No choice either */ 
    37733991+                       return INVALID_PORT; 
     
    37824000+                       return INVALID_PORT; 
    37834001+ 
    3784 +               if (skb_copy_bits(skb, ip_hdrlen(skb), &udph, sizeof(udph)) < 0) 
     4002+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4003+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0) 
     4004+#else 
     4005+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) 
     4006+#endif 
    37854007+                       /* No choice either */ 
    37864008+                       return INVALID_PORT; 
     
    38644086+{ 
    38654087+       ip_set_ip_t port; 
     4088+       int res; 
    38664089+ 
    38674090+       if (flags[index+1] == 0) 
    3868 +               return -EINVAL; 
     4091+               return 0; 
    38694092+                
    38704093+       port = get_port(skb, flags[index+1]); 
     
    38724095+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    38734096+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4097+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    38744098+          NIPQUAD(ip_hdr(skb)->saddr), 
    38754099+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4100+#else 
     4101+          NIPQUAD(skb->nh.iph->saddr), 
     4102+          NIPQUAD(skb->nh.iph->daddr)); 
     4103+#endif 
    38764104+       DP("flag %s port %u", 
    38774105+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    38804108+               return 0;        
    38814109+ 
    3882 +       return __testip(set, 
     4110+       res = __testip(set, 
    38834111+                       ntohl(flags[index] & IPSET_SRC  
     4112+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    38844113+                                       ? ip_hdr(skb)->saddr  
    38854114+                                       : ip_hdr(skb)->daddr), 
     4115+#else 
     4116+                                       ? skb->nh.iph->saddr  
     4117+                                       : skb->nh.iph->daddr), 
     4118+#endif 
    38864119+                       port, 
    38874120+                       hash_ip); 
     4121+       return (res < 0 ? 0 : res); 
     4122+        
    38884123+} 
    38894124+ 
     
    39574192+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    39584193+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4194+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    39594195+          NIPQUAD(ip_hdr(skb)->saddr), 
    39604196+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4197+#else 
     4198+          NIPQUAD(skb->nh.iph->saddr), 
     4199+          NIPQUAD(skb->nh.iph->daddr)); 
     4200+#endif 
    39614201+       DP("flag %s port %u",  
    39624202+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    39674207+       return __addip((struct ip_set_ipporthash *) set->data, 
    39684208+                      ntohl(flags[index] & IPSET_SRC  
    3969 +                               ? ip_hdr(skb)->saddr  
     4209+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4210+                               ? ip_hdr(skb)->saddr  
    39704211+                               : ip_hdr(skb)->daddr), 
     4212+#else 
     4213+                               ? skb->nh.iph->saddr  
     4214+                               : skb->nh.iph->daddr), 
     4215+#endif 
    39714216+                      port, 
    39724217+                      hash_ip); 
     
    41024347+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    41034348+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4349+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    41044350+          NIPQUAD(ip_hdr(skb)->saddr), 
    41054351+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4352+#else 
     4353+          NIPQUAD(skb->nh.iph->saddr), 
     4354+          NIPQUAD(skb->nh.iph->daddr)); 
     4355+#endif 
    41064356+       DP("flag %s port %u", 
    41074357+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    41124362+       return __delip(set, 
    41134363+                      ntohl(flags[index] & IPSET_SRC  
    4114 +                               ? ip_hdr(skb)->saddr  
     4364+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4365+                               ? ip_hdr(skb)->saddr  
    41154366+                               : ip_hdr(skb)->daddr), 
     4367+#else 
     4368+                               ? skb->nh.iph->saddr  
     4369+                               : skb->nh.iph->daddr), 
     4370+#endif 
    41164371+                      port, 
    41174372+                      hash_ip); 
     
    42454500+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    42464501+ 
    4247 +static int __init init(void) 
     4502+static int __init ip_set_ipporthash_init(void) 
    42484503+{ 
    42494504+       return ip_set_register_set_type(&ip_set_ipporthash); 
    42504505+} 
    42514506+ 
    4252 +static void __exit fini(void) 
     4507+static void __exit ip_set_ipporthash_fini(void) 
    42534508+{ 
    42544509+       /* FIXME: possible race with ip_set_create() */ 
     
    42564511+} 
    42574512+ 
    4258 +module_init(init); 
    4259 +module_exit(fini); 
    4260 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_iptree.c 
    4261 =================================================================== 
    4262 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4263 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_iptree.c 2007-09-21 16:24:01.000000000 +0800 
    4264 @@ -0,0 +1,571 @@ 
     4513+module_init(ip_set_ipporthash_init); 
     4514+module_exit(ip_set_ipporthash_fini); 
     4515diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_iptree.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_iptree.c 
     4516--- linux-2.6.23/net/ipv4/netfilter/ip_set_iptree.c     1970-01-01 01:00:00.000000000 +0100 
     4517+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_iptree.c       2007-10-12 11:52:37.000000000 +0200 
     4518@@ -0,0 +1,612 @@ 
    42654519+/* Copyright (C) 2005 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    42664520+ * 
     
    43084562+#endif 
    43094563+ 
     4564+#if defined(__LITTLE_ENDIAN) 
    43104565+#define ABCD(a,b,c,d,addrp) do {               \ 
    43114566+       a = ((unsigned char *)addrp)[3];        \ 
     
    43144569+       d = ((unsigned char *)addrp)[0];        \ 
    43154570+} while (0) 
     4571+#elif defined(__BIG_ENDIAN) 
     4572+#define ABCD(a,b,c,d,addrp) do {               \ 
     4573+       a = ((unsigned char *)addrp)[0];        \ 
     4574+       b = ((unsigned char *)addrp)[1];        \ 
     4575+       c = ((unsigned char *)addrp)[2];        \ 
     4576+       d = ((unsigned char *)addrp)[3];        \ 
     4577+} while (0) 
     4578+#else 
     4579+#error "Please fix asm/byteorder.h" 
     4580+#endif /* __LITTLE_ENDIAN */ 
    43164581+ 
    43174582+#define TESTIP_WALK(map, elem, branch) do {    \ 
     
    43414606+       TESTIP_WALK(ctree, c, dtree); 
    43424607+       DP("%lu %lu", dtree->expires[d], jiffies); 
    4343 +       return !!(map->timeout ? (time_after(dtree->expires[d], jiffies)) 
    4344 +                              : dtree->expires[d]); 
     4608+       return dtree->expires[d] 
     4609+              && (!map->timeout 
     4610+                  || time_after(dtree->expires[d], jiffies)); 
    43454611+} 
    43464612+ 
     
    43724638+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    43734639+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4640+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    43744641+          NIPQUAD(ip_hdr(skb)->saddr), 
    43754642+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4643+#else 
     4644+          NIPQUAD(skb->nh.iph->saddr), 
     4645+          NIPQUAD(skb->nh.iph->daddr)); 
     4646+#endif 
    43764647+ 
    43774648+       res =  __testip(set, 
    43784649+                       ntohl(flags[index] & IPSET_SRC  
     4650+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    43794651+                               ? ip_hdr(skb)->saddr  
    43804652+                               : ip_hdr(skb)->daddr), 
     4653+#else 
     4654+                               ? skb->nh.iph->saddr  
     4655+                               : skb->nh.iph->daddr), 
     4656+#endif 
    43814657+                       hash_ip); 
    43824658+       return (res < 0 ? 0 : res); 
    43834659+} 
    43844660+ 
    4385 +#define ADDIP_WALK(map, elem, branch, type, cachep, flags) do {        \ 
     4661+#define ADDIP_WALK(map, elem, branch, type, cachep) do {       \ 
    43864662+       if ((map)->tree[elem]) {                                \ 
    43874663+               DP("found %u", elem);                           \ 
     
    43894665+       } else {                                                \ 
    43904666+               branch = (type *)                               \ 
    4391 +                       kmem_cache_alloc(cachep, flags);        \ 
     4667+                       kmem_cache_alloc(cachep, GFP_ATOMIC);   \ 
    43924668+               if (branch == NULL)                             \ 
    43934669+                       return -ENOMEM;                         \ 
     
    44004676+static inline int 
    44014677+__addip(struct ip_set *set, ip_set_ip_t ip, unsigned int timeout, 
    4402 +       ip_set_ip_t *hash_ip, 
    4403 +       unsigned int __nocast flags) 
     4678+       ip_set_ip_t *hash_ip) 
    44044679+{ 
    44054680+       struct ip_set_iptree *map = (struct ip_set_iptree *) set->data; 
     
    44104685+       int ret = 0; 
    44114686+        
    4412 +       if (!ip || map->elements > limit) 
     4687+       if (!ip || map->elements >= limit) 
    44134688+               /* We could call the garbage collector 
    44144689+                * but it's probably overkill */ 
     
    44184693+       ABCD(a, b, c, d, hash_ip); 
    44194694+       DP("%u %u %u %u timeout %u", a, b, c, d, timeout); 
    4420 +       ADDIP_WALK(map, a, btree, struct ip_set_iptreeb, branch_cachep, flags); 
    4421 +       ADDIP_WALK(btree, b, ctree, struct ip_set_iptreec, branch_cachep, flags); 
    4422 +       ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreed, leaf_cachep, flags); 
     4695+       ADDIP_WALK(map, a, btree, struct ip_set_iptreeb, branch_cachep); 
     4696+       ADDIP_WALK(btree, b, ctree, struct ip_set_iptreec, branch_cachep); 
     4697+       ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreed, leaf_cachep); 
    44234698+       if (dtree->expires[d] 
    44244699+           && (!map->timeout || time_after(dtree->expires[d], jiffies))) 
    44254700+               ret = -EEXIST; 
    44264701+       dtree->expires[d] = map->timeout ? (timeout * HZ + jiffies) : 1; 
    4427 +       /* Lottery */ 
     4702+       /* Lottery: I won! */ 
    44284703+       if (dtree->expires[d] == 0) 
    44294704+               dtree->expires[d] = 1; 
     
    44514726+       return __addip(set, req->ip, 
    44524727+                      req->timeout ? req->timeout : map->timeout, 
    4453 +                      hash_ip, 
    4454 +                      GFP_ATOMIC); 
     4728+                      hash_ip); 
    44554729+} 
    44564730+ 
     
    44664740+       return __addip(set, 
    44674741+                      ntohl(flags[index] & IPSET_SRC  
    4468 +                               ? ip_hdr(skb)->saddr  
     4742+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4743+                               ? ip_hdr(skb)->saddr  
    44694744+                               : ip_hdr(skb)->daddr), 
     4745+#else 
     4746+                               ? skb->nh.iph->saddr  
     4747+                               : skb->nh.iph->daddr), 
     4748+#endif 
    44704749+                      map->timeout, 
    4471 +                      hash_ip, 
    4472 +                      GFP_ATOMIC); 
     4750+                      hash_ip); 
    44734751+} 
    44744752+ 
     
    45314809+       return __delip(set, 
    45324810+                      ntohl(flags[index] & IPSET_SRC  
    4533 +                               ? ip_hdr(skb)->saddr  
     4811+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4812+                               ? ip_hdr(skb)->saddr  
    45344813+                               : ip_hdr(skb)->daddr), 
     4814+#else 
     4815+                               ? skb->nh.iph->saddr  
     4816+                               : skb->nh.iph->daddr), 
     4817+#endif 
    45354818+                      hash_ip); 
    45364819+} 
     
    47935076+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    47945077+ 
    4795 +static int __init init(void) 
     5078+static int __init ip_set_iptree_init(void) 
    47965079+{ 
    47975080+       int ret; 
    47985081+        
     5082+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5083+       branch_cachep = kmem_cache_create("ip_set_iptreeb", 
     5084+                               sizeof(struct ip_set_iptreeb), 
     5085+                               0, 0, NULL); 
     5086+#else 
    47995087+       branch_cachep = kmem_cache_create("ip_set_iptreeb", 
    48005088+                               sizeof(struct ip_set_iptreeb), 
    48015089+                               0, 0, NULL, NULL); 
     5090+#endif 
    48025091+       if (!branch_cachep) { 
    48035092+               printk(KERN_ERR "Unable to create ip_set_iptreeb slab cache\n"); 
     
    48055094+               goto out; 
    48065095+       } 
     5096+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5097+       leaf_cachep = kmem_cache_create("ip_set_iptreed", 
     5098+                               sizeof(struct ip_set_iptreed), 
     5099+                               0, 0, NULL); 
     5100+#else 
    48075101+       leaf_cachep = kmem_cache_create("ip_set_iptreed", 
    48085102+                               sizeof(struct ip_set_iptreed), 
    48095103+                               0, 0, NULL, NULL); 
     5104+#endif 
    48105105+       if (!leaf_cachep) { 
    48115106+               printk(KERN_ERR "Unable to create ip_set_iptreed slab cache\n"); 
     
    48245119+} 
    48255120+ 
    4826 +static void __exit fini(void) 
     5121+static void __exit ip_set_iptree_fini(void) 
    48275122+{ 
    48285123+       /* FIXME: possible race with ip_set_create() */ 
     
    48325127+} 
    48335128+ 
    4834 +module_init(init); 
    4835 +module_exit(fini); 
    4836 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_macipmap.c 
    4837 =================================================================== 
    4838 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4839 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_macipmap.c       2007-09-21 16:24:01.000000000 +0800 
    4840 @@ -0,0 +1,353 @@ 
     5129+module_init(ip_set_iptree_init); 
     5130+module_exit(ip_set_iptree_fini); 
     5131diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_iptreemap.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_iptreemap.c 
     5132--- linux-2.6.23/net/ipv4/netfilter/ip_set_iptreemap.c  1970-01-01 01:00:00.000000000 +0100 
     5133+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_iptreemap.c    2007-10-12 11:52:37.000000000 +0200 
     5134@@ -0,0 +1,829 @@ 
     5135+/* Copyright (C) 2007 Sven Wegener <sven.wegener@stealer.net> 
     5136+ * 
     5137+ * This program is free software; you can redistribute it and/or modify it 
     5138+ * under the terms of the GNU General Public License version 2 as published by 
     5139+ * the Free Software Foundation. 
     5140+ */ 
     5141+ 
     5142+/* This modules implements the iptreemap ipset type. It uses bitmaps to 
     5143+ * represent every single IPv4 address as a single bit. The bitmaps are managed 
     5144+ * in a tree structure, where the first three octets of an addresses are used 
     5145+ * as an index to find the bitmap and the last octet is used as the bit number. 
     5146+ */ 
     5147+ 
     5148+#include <linux/version.h> 
     5149+#include <linux/module.h> 
     5150+#include <linux/ip.h> 
     5151+#include <linux/skbuff.h> 
     5152+#include <linux/slab.h> 
     5153+#include <linux/delay.h> 
     5154+#include <linux/netfilter_ipv4/ip_tables.h> 
     5155+#include <linux/netfilter_ipv4/ip_set.h> 
     5156+#include <linux/errno.h> 
     5157+#include <asm/uaccess.h> 
     5158+#include <asm/bitops.h> 
     5159+#include <linux/spinlock.h> 
     5160+ 
     5161+#include <linux/netfilter_ipv4/ip_set_iptreemap.h> 
     5162+ 
     5163+#define IPTREEMAP_DEFAULT_GC_TIME (5 * 60) 
     5164+#define IPTREEMAP_DESTROY_SLEEP (100) 
     5165+ 
     5166+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21) 
     5167+static struct kmem_cache *cachep_b; 
     5168+static struct kmem_cache *cachep_c; 
     5169+static struct kmem_cache *cachep_d; 
     5170+#else 
     5171+static kmem_cache_t *cachep_b; 
     5172+static kmem_cache_t *cachep_c; 
     5173+static kmem_cache_t *cachep_d; 
     5174+#endif 
     5175+ 
     5176+static struct ip_set_iptreemap_d *fullbitmap_d; 
     5177+static struct ip_set_iptreemap_c *fullbitmap_c; 
     5178+static struct ip_set_iptreemap_b *fullbitmap_b; 
     5179+ 
     5180+#if defined(__LITTLE_ENDIAN) 
     5181+#define ABCD(a, b, c, d, addr) \ 
     5182+       do { \ 
     5183+               a = ((unsigned char *)addr)[3]; \ 
     5184+               b = ((unsigned char *)addr)[2]; \ 
     5185+               c = ((unsigned char *)addr)[1]; \ 
     5186+               d = ((unsigned char *)addr)[0]; \ 
     5187+       } while (0) 
     5188+#elif defined(__BIG_ENDIAN) 
     5189+#define ABCD(a,b,c,d,addrp) do {               \ 
     5190+       a = ((unsigned char *)addrp)[0];        \ 
     5191+       b = ((unsigned char *)addrp)[1];        \ 
     5192+       c = ((unsigned char *)addrp)[2];        \ 
     5193+       d = ((unsigned char *)addrp)[3];        \ 
     5194+} while (0) 
     5195+#else 
     5196+#error "Please fix asm/byteorder.h" 
     5197+#endif /* __LITTLE_ENDIAN */ 
     5198+ 
     5199+#define TESTIP_WALK(map, elem, branch, full) \ 
     5200+       do { \ 
     5201+               branch = (map)->tree[elem]; \ 
     5202+               if (!branch) \ 
     5203+                       return 0; \ 
     5204+               else if (branch == full) \ 
     5205+                       return 1; \ 
     5206+       } while (0) 
     5207+ 
     5208+#define ADDIP_WALK(map, elem, branch, type, cachep, full) \ 
     5209+       do { \ 
     5210+               branch = (map)->tree[elem]; \ 
     5211+               if (!branch) { \ 
     5212+                       branch = (type *) kmem_cache_alloc(cachep, GFP_ATOMIC); \ 
     5213+                       if (!branch) \ 
     5214+                               return -ENOMEM; \ 
     5215+                       memset(branch, 0, sizeof(*branch)); \ 
     5216+                       (map)->tree[elem] = branch; \ 
     5217+               } else if (branch == full) { \ 
     5218+                       return -EEXIST; \ 
     5219+               } \ 
     5220+       } while (0) 
     5221+ 
     5222+#define ADDIP_RANGE_LOOP(map, a, a1, a2, hint, branch, full, cachep, free) \ 
     5223+       for (a = a1; a <= a2; a++) { \ 
     5224+               branch = (map)->tree[a]; \ 
     5225+               if (branch != full) { \ 
     5226+                       if ((a > a1 && a < a2) || (hint)) { \ 
     5227+                               if (branch) \ 
     5228+                                       free(branch); \ 
     5229+                               (map)->tree[a] = full; \ 
     5230+                               continue; \ 
     5231+                       } else if (!branch) { \ 
     5232+                               branch = kmem_cache_alloc(cachep, GFP_ATOMIC); \ 
     5233+                               if (!branch) \ 
     5234+                                       return -ENOMEM; \ 
     5235+                               memset(branch, 0, sizeof(*branch)); \ 
     5236+                               (map)->tree[a] = branch; \ 
     5237+                       } 
     5238+ 
     5239+#define ADDIP_RANGE_LOOP_END() \ 
     5240+               } \ 
     5241+       } 
     5242+ 
     5243+#define DELIP_WALK(map, elem, branch, cachep, full, flags) \ 
     5244+       do { \ 
     5245+               branch = (map)->tree[elem]; \ 
     5246+               if (!branch) { \ 
     5247+                       return -EEXIST; \ 
     5248+               } else if (branch == full) { \ 
     5249+                       branch = kmem_cache_alloc(cachep, flags); \ 
     5250+                       if (!branch) \ 
     5251+                               return -ENOMEM; \ 
     5252+                       memcpy(branch, full, sizeof(*full)); \ 
     5253+                       (map)->tree[elem] = branch; \ 
     5254+               } \ 
     5255+       } while (0) 
     5256+ 
     5257+#define DELIP_RANGE_LOOP(map, a, a1, a2, hint, branch, full, cachep, free, flags) \ 
     5258+       for (a = a1; a <= a2; a++) { \ 
     5259+               branch = (map)->tree[a]; \ 
     5260+               if (branch) { \ 
     5261+                       if ((a > a1 && a < a2) || (hint)) { \ 
     5262+                               if (branch != full) \ 
     5263+                                       free(branch); \ 
     5264+                               (map)->tree[a] = NULL; \ 
     5265+                               continue; \ 
     5266+                       } else if (branch == full) { \ 
     5267+                               branch = kmem_cache_alloc(cachep, flags); \ 
     5268+                               if (!branch) \ 
     5269+                                       return -ENOMEM; \ 
     5270+                               memcpy(branch, full, sizeof(*branch)); \ 
     5271+                               (map)->tree[a] = branch; \ 
     5272+                       } 
     5273+ 
     5274+#define DELIP_RANGE_LOOP_END() \ 
     5275+               } \ 
     5276+       } 
     5277+ 
     5278+#define LOOP_WALK_BEGIN(map, i, branch) \ 
     5279+       for (i = 0; i < 256; i++) { \ 
     5280+               branch = (map)->tree[i]; \ 
     5281+               if (likely(!branch)) \ 
     5282+                       continue; 
     5283+ 
     5284+#define LOOP_WALK_END() \ 
     5285+       } 
     5286+ 
     5287+#define LOOP_WALK_BEGIN_GC(map, i, branch, full, cachep, count) \ 
     5288+       count = -256; \ 
     5289+       for (i = 0; i < 256; i++) { \ 
     5290+               branch = (map)->tree[i]; \ 
     5291+               if (likely(!branch)) \ 
     5292+                       continue; \ 
     5293+               count++; \ 
     5294+               if (branch == full) { \ 
     5295+                       count++; \ 
     5296+                       continue; \ 
     5297+               } 
     5298+ 
     5299+#define LOOP_WALK_END_GC(map, i, branch, full, cachep, count) \ 
     5300+               if (-256 == count) { \ 
     5301+                       kmem_cache_free(cachep, branch); \ 
     5302+                       (map)->tree[i] = NULL; \ 
     5303+               } else if (256 == count) { \ 
     5304+                       kmem_cache_free(cachep, branch); \ 
     5305+                       (map)->tree[i] = full; \ 
     5306+               } \ 
     5307+       } 
     5308+ 
     5309+#define LOOP_WALK_BEGIN_COUNT(map, i, branch, inrange, count) \ 
     5310+       for (i = 0; i < 256; i++) { \ 
     5311+               if (!(map)->tree[i]) { \ 
     5312+                       if (inrange) { \ 
     5313+                               count++; \ 
     5314+                               inrange = 0; \ 
     5315+                       } \ 
     5316+                       continue; \ 
     5317+               } \ 
     5318+               branch = (map)->tree[i]; 
     5319+ 
     5320+#define LOOP_WALK_END_COUNT() \ 
     5321+       } 
     5322+ 
     5323+#define MIN(a, b) (a < b ? a : b) 
     5324+#define MAX(a, b) (a > b ? a : b) 
     5325+ 
     5326+#define GETVALUE1(a, a1, b1, r) \ 
     5327+       (a == a1 ? b1 : r) 
     5328+ 
     5329+#define GETVALUE2(a, b, a1, b1, c1, r) \ 
     5330+       (a == a1 && b == b1 ? c1 : r) 
     5331+ 
     5332+#define GETVALUE3(a, b, c, a1, b1, c1, d1, r) \ 
     5333+       (a == a1 && b == b1 && c == c1 ? d1 : r) 
     5334+ 
     5335+#define CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2) \ 
     5336+       ( \ 
     5337+               GETVALUE1(a, a1, b1, 0) == 0 \ 
     5338+               && GETVALUE1(a, a2, b2, 255) == 255 \ 
     5339+               && c1 == 0 \ 
     5340+               && c2 == 255 \ 
     5341+               && d1 == 0 \ 
     5342+               && d2 == 255 \ 
     5343+       ) 
     5344+ 
     5345+#define CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2) \ 
     5346+       ( \ 
     5347+               GETVALUE2(a, b, a1, b1, c1, 0) == 0 \ 
     5348+               && GETVALUE2(a, b, a2, b2, c2, 255) == 255 \ 
     5349+               && d1 == 0 \ 
     5350+               && d2 == 255 \ 
     5351+       ) 
     5352+ 
     5353+#define CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2) \ 
     5354+       ( \ 
     5355+               GETVALUE3(a, b, c, a1, b1, c1, d1, 0) == 0 \ 
     5356+               && GETVALUE3(a, b, c, a2, b2, c2, d2, 255) == 255 \ 
     5357+       ) 
     5358+ 
     5359+ 
     5360+static inline void 
     5361+free_d(struct ip_set_iptreemap_d *map) 
     5362+{ 
     5363+       kmem_cache_free(cachep_d, map); 
     5364+} 
     5365+ 
     5366+static inline void 
     5367+free_c(struct ip_set_iptreemap_c *map) 
     5368+{ 
     5369+       struct ip_set_iptreemap_d *dtree; 
     5370+       unsigned int i; 
     5371+ 
     5372+       LOOP_WALK_BEGIN(map, i, dtree) { 
     5373+               if (dtree != fullbitmap_d) 
     5374+                       free_d(dtree); 
     5375+       } LOOP_WALK_END(); 
     5376+ 
     5377+       kmem_cache_free(cachep_c, map); 
     5378+} 
     5379+ 
     5380+static inline void 
     5381+free_b(struct ip_set_iptreemap_b *map) 
     5382+{ 
     5383+       struct ip_set_iptreemap_c *ctree; 
     5384+       unsigned int i; 
     5385+ 
     5386+       LOOP_WALK_BEGIN(map, i, ctree) { 
     5387+               if (ctree != fullbitmap_c) 
     5388+                       free_c(ctree); 
     5389+       } LOOP_WALK_END(); 
     5390+ 
     5391+       kmem_cache_free(cachep_b, map); 
     5392+} 
     5393+ 
     5394+static inline int 
     5395+__testip(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip) 
     5396+{ 
     5397+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5398+       struct ip_set_iptreemap_b *btree; 
     5399+       struct ip_set_iptreemap_c *ctree; 
     5400+       struct ip_set_iptreemap_d *dtree; 
     5401+       unsigned char a, b, c, d; 
     5402+ 
     5403+       *hash_ip = ip; 
     5404+ 
     5405+       ABCD(a, b, c, d, hash_ip); 
     5406+ 
     5407+       TESTIP_WALK(map, a, btree, fullbitmap_b); 
     5408+       TESTIP_WALK(btree, b, ctree, fullbitmap_c); 
     5409+       TESTIP_WALK(ctree, c, dtree, fullbitmap_d); 
     5410+ 
     5411+       return !!test_bit(d, (void *) dtree->bitmap); 
     5412+} 
     5413+ 
     5414+static int 
     5415+testip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip) 
     5416+{ 
     5417+       struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data; 
     5418+ 
     5419+       if (size != sizeof(struct ip_set_req_iptreemap)) { 
     5420+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size); 
     5421+               return -EINVAL; 
     5422+       } 
     5423+ 
     5424+       return __testip(set, req->start, hash_ip); 
     5425+} 
     5426+ 
     5427+static int 
     5428+testip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index) 
     5429+{ 
     5430+       int res; 
     5431+ 
     5432+       res = __testip(set,  
     5433+                      ntohl(flags[index] & IPSET_SRC  
     5434+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     5435+                               ? ip_hdr(skb)->saddr  
     5436+                               : ip_hdr(skb)->daddr), 
     5437+#else 
     5438+                               ? skb->nh.iph->saddr  
     5439+                               : skb->nh.iph->daddr), 
     5440+#endif 
     5441+                      hash_ip); 
     5442+ 
     5443+       return (res < 0 ? 0 : res); 
     5444+} 
     5445+ 
     5446+static inline int 
     5447+__addip_single(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip) 
     5448+{ 
     5449+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5450+       struct ip_set_iptreemap_b *btree; 
     5451+       struct ip_set_iptreemap_c *ctree; 
     5452+       struct ip_set_iptreemap_d *dtree; 
     5453+       unsigned char a, b, c, d; 
     5454+ 
     5455+       *hash_ip = ip; 
     5456+ 
     5457+       ABCD(a, b, c, d, hash_ip); 
     5458+ 
     5459+       ADDIP_WALK(map, a, btree, struct ip_set_iptreemap_b, cachep_b, fullbitmap_b); 
     5460+       ADDIP_WALK(btree, b, ctree, struct ip_set_iptreemap_c, cachep_c, fullbitmap_c); 
     5461+       ADDIP_WALK(ctree, c, dtree, struct ip_set_iptreemap_d, cachep_d, fullbitmap_d); 
     5462+ 
     5463+       if (test_and_set_bit(d, (void *) dtree->bitmap)) 
     5464+               return -EEXIST; 
     5465+ 
     5466+       set_bit(b, (void *) btree->dirty); 
     5467+ 
     5468+       return 0; 
     5469+} 
     5470+ 
     5471+static inline int 
     5472+__addip_range(struct ip_set *set, ip_set_ip_t start, ip_set_ip_t end, ip_set_ip_t *hash_ip) 
     5473+{ 
     5474+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5475+       struct ip_set_iptreemap_b *btree; 
     5476+       struct ip_set_iptreemap_c *ctree; 
     5477+       struct ip_set_iptreemap_d *dtree; 
     5478+       unsigned int a, b, c, d; 
     5479+       unsigned char a1, b1, c1, d1; 
     5480+       unsigned char a2, b2, c2, d2; 
     5481+ 
     5482+       if (start == end) 
     5483+               return __addip_single(set, start, hash_ip); 
     5484+ 
     5485+       *hash_ip = start; 
     5486+ 
     5487+       ABCD(a1, b1, c1, d1, &start); 
     5488+       ABCD(a2, b2, c2, d2, &end); 
     5489+ 
     5490+       /* This is sooo ugly... */ 
     5491+       ADDIP_RANGE_LOOP(map, a, a1, a2, CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2), btree, fullbitmap_b, cachep_b, free_b) { 
     5492+               ADDIP_RANGE_LOOP(btree, b, GETVALUE1(a, a1, b1, 0), GETVALUE1(a, a2, b2, 255), CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2), ctree, fullbitmap_c, cachep_c, free_c) { 
     5493+                       ADDIP_RANGE_LOOP(ctree, c, GETVALUE2(a, b, a1, b1, c1, 0), GETVALUE2(a, b, a2, b2, c2, 255), CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2), dtree, fullbitmap_d, cachep_d, free_d) { 
     5494+                               for (d = GETVALUE3(a, b, c, a1, b1, c1, d1, 0); d <= GETVALUE3(a, b, c, a2, b2, c2, d2, 255); d++) 
     5495+                                       set_bit(d, (void *) dtree->bitmap); 
     5496+                               set_bit(b, (void *) btree->dirty); 
     5497+                       } ADDIP_RANGE_LOOP_END(); 
     5498+               } ADDIP_RANGE_LOOP_END(); 
     5499+       } ADDIP_RANGE_LOOP_END(); 
     5500+ 
     5501+       return 0; 
     5502+} 
     5503+ 
     5504+static int 
     5505+addip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip) 
     5506+{ 
     5507+       struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data; 
     5508+ 
     5509+       if (size != sizeof(struct ip_set_req_iptreemap)) { 
     5510+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size); 
     5511+               return -EINVAL; 
     5512+       } 
     5513+ 
     5514+       return __addip_range(set, MIN(req->start, req->end), MAX(req->start, req->end), hash_ip); 
     5515+} 
     5516+ 
     5517+static int 
     5518+addip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index) 
     5519+{ 
     5520+ 
     5521+       return __addip_single(set, 
     5522+                       ntohl(flags[index] & IPSET_SRC  
     5523+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     5524+                               ? ip_hdr(skb)->saddr  
     5525+                               : ip_hdr(skb)->daddr), 
     5526+#else 
     5527+                               ? skb->nh.iph->saddr  
     5528+                               : skb->nh.iph->daddr), 
     5529+#endif 
     5530+                       hash_ip); 
     5531+} 
     5532+ 
     5533+static inline int 
     5534+__delip_single(struct ip_set *set, ip_set_ip_t ip, ip_set_ip_t *hash_ip, unsigned int __nocast flags) 
     5535+{ 
     5536+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5537+       struct ip_set_iptreemap_b *btree; 
     5538+       struct ip_set_iptreemap_c *ctree; 
     5539+       struct ip_set_iptreemap_d *dtree; 
     5540+       unsigned char a,b,c,d; 
     5541+ 
     5542+       *hash_ip = ip; 
     5543+ 
     5544+       ABCD(a, b, c, d, hash_ip); 
     5545+ 
     5546+       DELIP_WALK(map, a, btree, cachep_b, fullbitmap_b, flags); 
     5547+       DELIP_WALK(btree, b, ctree, cachep_c, fullbitmap_c, flags); 
     5548+       DELIP_WALK(ctree, c, dtree, cachep_d, fullbitmap_d, flags); 
     5549+ 
     5550+       if (!test_and_clear_bit(d, (void *) dtree->bitmap)) 
     5551+               return -EEXIST; 
     5552+ 
     5553+       set_bit(b, (void *) btree->dirty); 
     5554+ 
     5555+       return 0; 
     5556+} 
     5557+ 
     5558+static inline int 
     5559+__delip_range(struct ip_set *set, ip_set_ip_t start, ip_set_ip_t end, ip_set_ip_t *hash_ip, unsigned int __nocast flags) 
     5560+{ 
     5561+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5562+       struct ip_set_iptreemap_b *btree; 
     5563+       struct ip_set_iptreemap_c *ctree; 
     5564+       struct ip_set_iptreemap_d *dtree; 
     5565+       unsigned int a, b, c, d; 
     5566+       unsigned char a1, b1, c1, d1; 
     5567+       unsigned char a2, b2, c2, d2; 
     5568+ 
     5569+       if (start == end) 
     5570+               return __delip_single(set, start, hash_ip, flags); 
     5571+ 
     5572+       *hash_ip = start; 
     5573+ 
     5574+       ABCD(a1, b1, c1, d1, &start); 
     5575+       ABCD(a2, b2, c2, d2, &end); 
     5576+ 
     5577+       /* This is sooo ugly... */ 
     5578+       DELIP_RANGE_LOOP(map, a, a1, a2, CHECK1(a, a1, a2, b1, b2, c1, c2, d1, d2), btree, fullbitmap_b, cachep_b, free_b, flags) { 
     5579+               DELIP_RANGE_LOOP(btree, b, GETVALUE1(a, a1, b1, 0), GETVALUE1(a, a2, b2, 255), CHECK2(a, b, a1, a2, b1, b2, c1, c2, d1, d2), ctree, fullbitmap_c, cachep_c, free_c, flags) { 
     5580+                       DELIP_RANGE_LOOP(ctree, c, GETVALUE2(a, b, a1, b1, c1, 0), GETVALUE2(a, b, a2, b2, c2, 255), CHECK3(a, b, c, a1, a2, b1, b2, c1, c2, d1, d2), dtree, fullbitmap_d, cachep_d, free_d, flags) { 
     5581+                               for (d = GETVALUE3(a, b, c, a1, b1, c1, d1, 0); d <= GETVALUE3(a, b, c, a2, b2, c2, d2, 255); d++) 
     5582+                                       clear_bit(d, (void *) dtree->bitmap); 
     5583+                               set_bit(b, (void *) btree->dirty); 
     5584+                       } DELIP_RANGE_LOOP_END(); 
     5585+               } DELIP_RANGE_LOOP_END(); 
     5586+       } DELIP_RANGE_LOOP_END(); 
     5587+ 
     5588+       return 0; 
     5589+} 
     5590+ 
     5591+static int 
     5592+delip(struct ip_set *set, const void *data, size_t size, ip_set_ip_t *hash_ip) 
     5593+{ 
     5594+       struct ip_set_req_iptreemap *req = (struct ip_set_req_iptreemap *) data; 
     5595+ 
     5596+       if (size != sizeof(struct ip_set_req_iptreemap)) { 
     5597+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap), size); 
     5598+               return -EINVAL; 
     5599+       } 
     5600+ 
     5601+       return __delip_range(set, MIN(req->start, req->end), MAX(req->start, req->end), hash_ip, GFP_KERNEL); 
     5602+} 
     5603+ 
     5604+static int 
     5605+delip_kernel(struct ip_set *set, const struct sk_buff *skb, ip_set_ip_t *hash_ip, const u_int32_t *flags, unsigned char index) 
     5606+{ 
     5607+       return __delip_single(set,  
     5608+                       ntohl(flags[index] & IPSET_SRC  
     5609+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     5610+                               ? ip_hdr(skb)->saddr  
     5611+                               : ip_hdr(skb)->daddr), 
     5612+#else 
     5613+                               ? skb->nh.iph->saddr  
     5614+                               : skb->nh.iph->daddr), 
     5615+#endif 
     5616+                       hash_ip, 
     5617+                       GFP_ATOMIC); 
     5618+} 
     5619+ 
     5620+/* Check the status of the bitmap 
     5621+ * -1 == all bits cleared 
     5622+ *  1 == all bits set 
     5623+ *  0 == anything else 
     5624+ */ 
     5625+static inline int 
     5626+bitmap_status(struct ip_set_iptreemap_d *dtree) 
     5627+{ 
     5628+       unsigned char first = dtree->bitmap[0]; 
     5629+       int a; 
     5630+ 
     5631+       for (a = 1; a < 32; a++) 
     5632+               if (dtree->bitmap[a] != first) 
     5633+                       return 0; 
     5634+ 
     5635+       return (first == 0 ? -1 : (first == 255 ? 1 : 0)); 
     5636+} 
     5637+ 
     5638+static void 
     5639+gc(unsigned long addr) 
     5640+{ 
     5641+       struct ip_set *set = (struct ip_set *) addr; 
     5642+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5643+       struct ip_set_iptreemap_b *btree; 
     5644+       struct ip_set_iptreemap_c *ctree; 
     5645+       struct ip_set_iptreemap_d *dtree; 
     5646+       unsigned int a, b, c; 
     5647+       int i, j, k; 
     5648+ 
     5649+       write_lock_bh(&set->lock); 
     5650+ 
     5651+       LOOP_WALK_BEGIN_GC(map, a, btree, fullbitmap_b, cachep_b, i) { 
     5652+               LOOP_WALK_BEGIN_GC(btree, b, ctree, fullbitmap_c, cachep_c, j) { 
     5653+                       if (!test_and_clear_bit(b, (void *) btree->dirty)) 
     5654+                               continue; 
     5655+                       LOOP_WALK_BEGIN_GC(ctree, c, dtree, fullbitmap_d, cachep_d, k) { 
     5656+                               switch (bitmap_status(dtree)) { 
     5657+                                       case -1: 
     5658+                                               kmem_cache_free(cachep_d, dtree); 
     5659+                                               ctree->tree[c] = NULL; 
     5660+                                               k--; 
     5661+                                       break; 
     5662+                                       case 1: 
     5663+                                               kmem_cache_free(cachep_d, dtree); 
     5664+                                               ctree->tree[c] = fullbitmap_d; 
     5665+                                               k++; 
     5666+                                       break; 
     5667+                               } 
     5668+                       } LOOP_WALK_END(); 
     5669+               } LOOP_WALK_END_GC(btree, b, ctree, fullbitmap_c, cachep_c, k); 
     5670+       } LOOP_WALK_END_GC(map, a, btree, fullbitmap_b, cachep_b, j); 
     5671+ 
     5672+       write_unlock_bh(&set->lock); 
     5673+ 
     5674+       map->gc.expires = jiffies + map->gc_interval * HZ; 
     5675+       add_timer(&map->gc); 
     5676+} 
     5677+ 
     5678+static inline void 
     5679+init_gc_timer(struct ip_set *set) 
     5680+{ 
     5681+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5682+ 
     5683+       init_timer(&map->gc); 
     5684+       map->gc.data = (unsigned long) set; 
     5685+       map->gc.function = gc; 
     5686+       map->gc.expires = jiffies + map->gc_interval * HZ; 
     5687+       add_timer(&map->gc); 
     5688+} 
     5689+ 
     5690+static int create(struct ip_set *set, const void *data, size_t size) 
     5691+{ 
     5692+       struct ip_set_req_iptreemap_create *req = (struct ip_set_req_iptreemap_create *) data; 
     5693+       struct ip_set_iptreemap *map; 
     5694+ 
     5695+       if (size != sizeof(struct ip_set_req_iptreemap_create)) { 
     5696+               ip_set_printk("data length wrong (want %zu, have %zu)", sizeof(struct ip_set_req_iptreemap_create), size); 
     5697+               return -EINVAL; 
     5698+       } 
     5699+ 
     5700+       map = kzalloc(sizeof(*map), GFP_KERNEL); 
     5701+       if (!map) 
     5702+               return -ENOMEM; 
     5703+ 
     5704+       map->gc_interval = req->gc_interval ? req->gc_interval : IPTREEMAP_DEFAULT_GC_TIME; 
     5705+       set->data = map; 
     5706+ 
     5707+       init_gc_timer(set); 
     5708+ 
     5709+       return 0; 
     5710+} 
     5711+ 
     5712+static inline void __flush(struct ip_set_iptreemap *map) 
     5713+{ 
     5714+       struct ip_set_iptreemap_b *btree; 
     5715+       unsigned int a; 
     5716+ 
     5717+       LOOP_WALK_BEGIN(map, a, btree); 
     5718+               if (btree != fullbitmap_b) 
     5719+                       free_b(btree); 
     5720+       LOOP_WALK_END(); 
     5721+} 
     5722+ 
     5723+static void destroy(struct ip_set *set) 
     5724+{ 
     5725+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5726+ 
     5727+       while (!del_timer(&map->gc)) 
     5728+               msleep(IPTREEMAP_DESTROY_SLEEP); 
     5729+ 
     5730+       __flush(map); 
     5731+       kfree(map); 
     5732+ 
     5733+       set->data = NULL; 
     5734+} 
     5735+ 
     5736+static void flush(struct ip_set *set) 
     5737+{ 
     5738+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5739+ 
     5740+       while (!del_timer(&map->gc)) 
     5741+               msleep(IPTREEMAP_DESTROY_SLEEP); 
     5742+ 
     5743+       __flush(map); 
     5744+ 
     5745+       memset(map, 0, sizeof(*map)); 
     5746+ 
     5747+       init_gc_timer(set); 
     5748+} 
     5749+ 
     5750+static void list_header(const struct ip_set *set, void *data) 
     5751+{ 
     5752+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5753+       struct ip_set_req_iptreemap_create *header = (struct ip_set_req_iptreemap_create *) data; 
     5754+ 
     5755+       header->gc_interval = map->gc_interval; 
     5756+} 
     5757+ 
     5758+static int list_members_size(const struct ip_set *set) 
     5759+{ 
     5760+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5761+       struct ip_set_iptreemap_b *btree; 
     5762+       struct ip_set_iptreemap_c *ctree; 
     5763+       struct ip_set_iptreemap_d *dtree; 
     5764+       unsigned int a, b, c, d, inrange = 0, count = 0; 
     5765+ 
     5766+       LOOP_WALK_BEGIN_COUNT(map, a, btree, inrange, count) { 
     5767+               LOOP_WALK_BEGIN_COUNT(btree, b, ctree, inrange, count) { 
     5768+                       LOOP_WALK_BEGIN_COUNT(ctree, c, dtree, inrange, count) { 
     5769+                               for (d = 0; d < 256; d++) { 
     5770+                                       if (test_bit(d, (void *) dtree->bitmap)) { 
     5771+                                               inrange = 1; 
     5772+                                       } else if (inrange) { 
     5773+                                               count++; 
     5774+                                               inrange = 0; 
     5775+                                       } 
     5776+                               } 
     5777+                       } LOOP_WALK_END_COUNT(); 
     5778+               } LOOP_WALK_END_COUNT(); 
     5779+       } LOOP_WALK_END_COUNT(); 
     5780+ 
     5781+       if (inrange) 
     5782+               count++; 
     5783+ 
     5784+       return (count * sizeof(struct ip_set_req_iptreemap)); 
     5785+} 
     5786+ 
     5787+static inline size_t add_member(void *data, size_t offset, ip_set_ip_t start, ip_set_ip_t end) 
     5788+{ 
     5789+       struct ip_set_req_iptreemap *entry = (struct ip_set_req_iptreemap *) (data + offset); 
     5790+ 
     5791+       entry->start = start; 
     5792+       entry->end = end; 
     5793+ 
     5794+       return sizeof(*entry); 
     5795+} 
     5796+ 
     5797+static void list_members(const struct ip_set *set, void *data) 
     5798+{ 
     5799+       struct ip_set_iptreemap *map = (struct ip_set_iptreemap *) set->data; 
     5800+       struct ip_set_iptreemap_b *btree; 
     5801+       struct ip_set_iptreemap_c *ctree; 
     5802+       struct ip_set_iptreemap_d *dtree; 
     5803+       unsigned int a, b, c, d, inrange = 0; 
     5804+       size_t offset = 0; 
     5805+       ip_set_ip_t start = 0, end = 0, ip; 
     5806+ 
     5807+       LOOP_WALK_BEGIN(map, a, btree) { 
     5808+               LOOP_WALK_BEGIN(btree, b, ctree) { 
     5809+                       LOOP_WALK_BEGIN(ctree, c, dtree) { 
     5810+                               for (d = 0; d < 256; d++) { 
     5811+                                       if (test_bit(d, (void *) dtree->bitmap)) { 
     5812+                                               ip = ((a << 24) | (b << 16) | (c << 8) | d); 
     5813+                                               if (!inrange) { 
     5814+                                                       inrange = 1; 
     5815+                                                       start = ip; 
     5816+                                               } else if (end < ip - 1) { 
     5817+                                                       offset += add_member(data, offset, start, end); 
     5818+                                                       start = ip; 
     5819+                                               } 
     5820+                                               end = ip; 
     5821+                                       } else if (inrange) { 
     5822+                                               offset += add_member(data, offset, start, end); 
     5823+                                               inrange = 0; 
     5824+                                       } 
     5825+                               } 
     5826+                       } LOOP_WALK_END(); 
     5827+               } LOOP_WALK_END(); 
     5828+       } LOOP_WALK_END(); 
     5829+ 
     5830+       if (inrange) 
     5831+               add_member(data, offset, start, end); 
     5832+} 
     5833+ 
     5834+static struct ip_set_type ip_set_iptreemap = { 
     5835+       .typename               = SETTYPE_NAME, 
     5836+       .features               = IPSET_TYPE_IP | IPSET_DATA_SINGLE, 
     5837+       .protocol_version       = IP_SET_PROTOCOL_VERSION, 
     5838+       .create                 = create, 
     5839+       .destroy                = destroy, 
     5840+       .flush                  = flush, 
     5841+       .reqsize                = sizeof(struct ip_set_req_iptreemap), 
     5842+       .addip                  = addip, 
     5843+       .addip_kernel           = addip_kernel, 
     5844+       .delip                  = delip, 
     5845+       .delip_kernel           = delip_kernel, 
     5846+       .testip                 = testip, 
     5847+       .testip_kernel          = testip_kernel, 
     5848+       .header_size            = sizeof(struct ip_set_req_iptreemap_create), 
     5849+       .list_header            = list_header, 
     5850+       .list_members_size      = list_members_size, 
     5851+       .list_members           = list_members, 
     5852+       .me                     = THIS_MODULE, 
     5853+}; 
     5854+ 
     5855+MODULE_LICENSE("GPL"); 
     5856+MODULE_AUTHOR("Sven Wegener <sven.wegener@stealer.net>"); 
     5857+MODULE_DESCRIPTION("iptreemap type of IP sets"); 
     5858+ 
     5859+static int __init ip_set_iptreemap_init(void) 
     5860+{ 
     5861+       int ret = -ENOMEM; 
     5862+       int a; 
     5863+ 
     5864+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5865+       cachep_b = kmem_cache_create("ip_set_iptreemap_b",  
     5866+                                    sizeof(struct ip_set_iptreemap_b),  
     5867+                                    0, 0, NULL); 
     5868+#else 
     5869+       cachep_b = kmem_cache_create("ip_set_iptreemap_b",  
     5870+                                    sizeof(struct ip_set_iptreemap_b),  
     5871+                                    0, 0, NULL, NULL); 
     5872+#endif 
     5873+       if (!cachep_b) { 
     5874+               ip_set_printk("Unable to create ip_set_iptreemap_b slab cache"); 
     5875+               goto out; 
     5876+       } 
     5877+ 
     5878+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5879+       cachep_c = kmem_cache_create("ip_set_iptreemap_c",  
     5880+                                    sizeof(struct ip_set_iptreemap_c), 
     5881+                                    0, 0, NULL); 
     5882+#else 
     5883+       cachep_c = kmem_cache_create("ip_set_iptreemap_c",  
     5884+                                    sizeof(struct ip_set_iptreemap_c), 
     5885+                                    0, 0, NULL, NULL); 
     5886+#endif 
     5887+       if (!cachep_c) { 
     5888+               ip_set_printk("Unable to create ip_set_iptreemap_c slab cache"); 
     5889+               goto outb; 
     5890+       } 
     5891+ 
     5892+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     5893+       cachep_d = kmem_cache_create("ip_set_iptreemap_d", 
     5894+                                    sizeof(struct ip_set_iptreemap_d), 
     5895+                                    0, 0, NULL); 
     5896+#else 
     5897+       cachep_d = kmem_cache_create("ip_set_iptreemap_d", 
     5898+                                    sizeof(struct ip_set_iptreemap_d), 
     5899+                                    0, 0, NULL, NULL); 
     5900+#endif 
     5901+       if (!cachep_d) { 
     5902+               ip_set_printk("Unable to create ip_set_iptreemap_d slab cache"); 
     5903+               goto outc; 
     5904+       } 
     5905+ 
     5906+       fullbitmap_d = kmem_cache_alloc(cachep_d, GFP_KERNEL); 
     5907+       if (!fullbitmap_d) 
     5908+               goto outd; 
     5909+ 
     5910+       fullbitmap_c = kmem_cache_alloc(cachep_c, GFP_KERNEL); 
     5911+       if (!fullbitmap_c) 
     5912+               goto outbitmapd; 
     5913+ 
     5914+       fullbitmap_b = kmem_cache_alloc(cachep_b, GFP_KERNEL); 
     5915+       if (!fullbitmap_b) 
     5916+               goto outbitmapc; 
     5917+ 
     5918+       ret = ip_set_register_set_type(&ip_set_iptreemap); 
     5919+       if (0 > ret) 
     5920+               goto outbitmapb; 
     5921+ 
     5922+       /* Now init our global bitmaps */ 
     5923+       memset(fullbitmap_d->bitmap, 0xff, sizeof(fullbitmap_d->bitmap)); 
     5924+ 
     5925+       for (a = 0; a < 256; a++) 
     5926+               fullbitmap_c->tree[a] = fullbitmap_d; 
     5927+ 
     5928+       for (a = 0; a < 256; a++) 
     5929+               fullbitmap_b->tree[a] = fullbitmap_c; 
     5930+       memset(fullbitmap_b->dirty, 0, sizeof(fullbitmap_b->dirty)); 
     5931+ 
     5932+       return 0; 
     5933+ 
     5934+outbitmapb: 
     5935+       kmem_cache_free(cachep_b, fullbitmap_b); 
     5936+outbitmapc: 
     5937+       kmem_cache_free(cachep_c, fullbitmap_c); 
     5938+outbitmapd: 
     5939+       kmem_cache_free(cachep_d, fullbitmap_d); 
     5940+outd: 
     5941+       kmem_cache_destroy(cachep_d); 
     5942+outc: 
     5943+       kmem_cache_destroy(cachep_c); 
     5944+outb: 
     5945+       kmem_cache_destroy(cachep_b); 
     5946+out: 
     5947+ 
     5948+       return ret; 
     5949+} 
     5950+ 
     5951+static void __exit ip_set_iptreemap_fini(void) 
     5952+{ 
     5953+       ip_set_unregister_set_type(&ip_set_iptreemap); 
     5954+       kmem_cache_free(cachep_d, fullbitmap_d); 
     5955+       kmem_cache_free(cachep_c, fullbitmap_c); 
     5956+       kmem_cache_free(cachep_b, fullbitmap_b); 
     5957+       kmem_cache_destroy(cachep_d); 
     5958+       kmem_cache_destroy(cachep_c); 
     5959+       kmem_cache_destroy(cachep_b); 
     5960+} 
     5961+ 
     5962+module_init(ip_set_iptreemap_init); 
     5963+module_exit(ip_set_iptreemap_fini); 
     5964diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_macipmap.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_macipmap.c 
     5965--- linux-2.6.23/net/ipv4/netfilter/ip_set_macipmap.c   1970-01-01 01:00:00.000000000 +0100 
     5966+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_macipmap.c     2007-10-12 11:52:37.000000000 +0200 
     5967@@ -0,0 +1,375 @@ 
    48415968+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    48425969+ *                         Patrick Schaaf <bof@bof.de> 
     
    48545981+#include <linux/ip.h> 
    48555982+#include <linux/skbuff.h> 
     5983+#include <linux/version.h> 
    48565984+#include <linux/netfilter_ipv4/ip_tables.h> 
    48575985+#include <linux/netfilter_ipv4/ip_set.h> 
     
    49106038+        
    49116039+       ip = ntohl(flags[index] & IPSET_SRC 
    4912 +                       ? ip_hdr(skb)->saddr 
     6040+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6041+                       ? ip_hdr(skb)->saddr  
    49136042+                       : ip_hdr(skb)->daddr); 
    4914 +       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    4915 +          flags[index] & IPSET_SRC ? "SRC" : "DST", 
    4916 +          NIPQUAD(ip_hdr(skb)->saddr), 
    4917 +          NIPQUAD(ip_hdr(skb)->daddr)); 
     6043+#else 
     6044+                       ? skb->nh.iph->saddr 
     6045+                       : skb->nh.iph->daddr); 
     6046+#endif 
    49186047+ 
    49196048+       if (ip < map->first_ip || ip > map->last_ip) 
     
    49276056+               /* Is mac pointer valid? 
    49286057+                * If so, compare... */ 
     6058+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    49296059+               return (skb_mac_header(skb) >= skb->head 
    49306060+                       && (skb_mac_header(skb) + ETH_HLEN) <= skb->data 
     6061+#else 
     6062+               return (skb->mac.raw >= skb->head 
     6063+                       && (skb->mac.raw + ETH_HLEN) <= skb->data 
     6064+#endif 
    49316065+                       && (memcmp(eth_hdr(skb)->h_source, 
    49326066+                                  &table[ip - map->first_ip].ethernet, 
     
    49856119+        
    49866120+       ip = ntohl(flags[index] & IPSET_SRC 
    4987 +                       ? ip_hdr(skb)->saddr 
     6121+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6122+                       ? ip_hdr(skb)->saddr  
    49886123+                       : ip_hdr(skb)->daddr); 
    4989 + 
     6124+#else 
     6125+                       ? skb->nh.iph->saddr 
     6126+                       : skb->nh.iph->daddr); 
     6127+#endif 
     6128+ 
     6129+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    49906130+       if (!(skb_mac_header(skb) >= skb->head 
    49916131+             && (skb_mac_header(skb) + ETH_HLEN) <= skb->data)) 
     6132+#else 
     6133+       if (!(skb->mac.raw >= skb->head 
     6134+             && (skb->mac.raw + ETH_HLEN) <= skb->data)) 
     6135+#endif 
    49926136+               return -EINVAL; 
    49936137+ 
     
    50396183+       return __delip(set, 
    50406184+                      ntohl(flags[index] & IPSET_SRC  
    5041 +                               ? ip_hdr(skb)->saddr  
     6185+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6186+                               ? ip_hdr(skb)->saddr  
    50426187+                               : ip_hdr(skb)->daddr), 
     6188+#else 
     6189+                               ? skb->nh.iph->saddr  
     6190+                               : skb->nh.iph->daddr), 
     6191+#endif 
    50436192+                      hash_ip); 
    50446193+} 
     
    51786327+MODULE_DESCRIPTION("macipmap type of IP sets"); 
    51796328+ 
    5180 +static int __init init(void) 
     6329+static int __init ip_set_macipmap_init(void) 
    51816330+{ 
    51826331+       init_max_malloc_size(); 
     
    51846333+} 
    51856334+ 
    5186 +static void __exit fini(void) 
     6335+static void __exit ip_set_macipmap_fini(void) 
    51876336+{ 
    51886337+       /* FIXME: possible race with ip_set_create() */ 
     
    51906339+} 
    51916340+ 
    5192 +module_init(init); 
    5193 +module_exit(fini); 
    5194 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_nethash.c 
    5195 =================================================================== 
    5196 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    5197 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_nethash.c        2007-09-21 16:24:01.000000000 +0800 
    5198 @@ -0,0 +1,481 @@ 
     6341+module_init(ip_set_macipmap_init); 
     6342+module_exit(ip_set_macipmap_fini); 
     6343diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_nethash.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_nethash.c 
     6344--- linux-2.6.23/net/ipv4/netfilter/ip_set_nethash.c    1970-01-01 01:00:00.000000000 +0100 
     6345+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_nethash.c      2007-10-12 11:52:37.000000000 +0200 
     6346@@ -0,0 +1,497 @@ 
    51996347+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    52006348+ * 
     
    52096357+#include <linux/ip.h> 
    52106358+#include <linux/skbuff.h> 
     6359+#include <linux/version.h> 
     6360+#include <linux/jhash.h> 
    52116361+#include <linux/netfilter_ipv4/ip_tables.h> 
    52126362+#include <linux/netfilter_ipv4/ip_set.h> 
     
    52176367+#include <linux/vmalloc.h> 
    52186368+#include <linux/random.h> 
    5219 +#include <linux/jhash.h> 
    52206369+ 
    52216370+#include <net/ip.h> 
     
    53106459+       return __testip(set, 
    53116460+                       ntohl(flags[index] & IPSET_SRC  
     6461+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    53126462+                               ? ip_hdr(skb)->saddr  
    53136463+                               : ip_hdr(skb)->daddr), 
     6464+#else 
     6465+                               ? skb->nh.iph->saddr  
     6466+                               : skb->nh.iph->daddr), 
     6467+#endif 
    53146468+                       hash_ip); 
    53156469+} 
     
    53416495+       ip_set_ip_t *hash_ip) 
    53426496+{ 
    5343 +       if (!ip || map->elements > limit) 
     6497+       if (!ip || map->elements >= limit) 
    53446498+               return -ERANGE; 
    53456499+        
     
    54036557+       int ret = -ERANGE; 
    54046558+       ip_set_ip_t ip = ntohl(flags[index] & IPSET_SRC  
    5405 +                                       ? ip_hdr(skb)->saddr 
     6559+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6560+                                       ? ip_hdr(skb)->saddr  
    54066561+                                       : ip_hdr(skb)->daddr); 
     6562+#else 
     6563+                                       ? skb->nh.iph->saddr 
     6564+                                       : skb->nh.iph->daddr); 
     6565+#endif 
    54076566+        
    54086567+       if (map->cidr[0]) 
     
    55326691+       int ret = -ERANGE; 
    55336692+       ip_set_ip_t ip = ntohl(flags[index] & IPSET_SRC  
    5534 +                                       ? ip_hdr(skb)->saddr 
     6693+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     6694+                                       ? ip_hdr(skb)->saddr  
    55356695+                                       : ip_hdr(skb)->daddr); 
     6696+#else 
     6697+                                       ? skb->nh.iph->saddr 
     6698+                                       : skb->nh.iph->daddr); 
     6699+#endif 
    55366700+        
    55376701+       if (map->cidr[0]) 
     
    56656829+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    56666830+ 
    5667 +static int __init init(void) 
     6831+static int __init ip_set_nethash_init(void) 
    56686832+{ 
    56696833+       return ip_set_register_set_type(&ip_set_nethash); 
    56706834+} 
    56716835+ 
    5672 +static void __exit fini(void) 
     6836+static void __exit ip_set_nethash_fini(void) 
    56736837+{ 
    56746838+       /* FIXME: possible race with ip_set_create() */ 
     
    56766840+} 
    56776841+ 
    5678 +module_init(init); 
    5679 +module_exit(fini); 
    5680 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_portmap.c 
    5681 =================================================================== 
    5682 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    5683 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ip_set_portmap.c        2007-09-21 16:24:01.000000000 +0800 
    5684 @@ -0,0 +1,334 @@ 
     6842+module_init(ip_set_nethash_init); 
     6843+module_exit(ip_set_nethash_fini); 
     6844diff -Nru linux-2.6.23/net/ipv4/netfilter/ip_set_portmap.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_portmap.c 
     6845--- linux-2.6.23/net/ipv4/netfilter/ip_set_portmap.c    1970-01-01 01:00:00.000000000 +0100 
     6846+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ip_set_portmap.c      2007-10-12 11:52:37.000000000 +0200 
     6847@@ -0,0 +1,346 @@ 
    56856848+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    56866849+ * 
     
    56976860+#include <linux/udp.h> 
    56986861+#include <linux/skbuff.h> 
     6862+#include <linux/version.h> 
    56996863+#include <linux/netfilter_ipv4/ip_tables.h> 
    57006864+#include <linux/netfilter_ipv4/ip_set.h> 
     
    57126876+get_port(const struct sk_buff *skb, u_int32_t flags) 
    57136877+{ 
     6878+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    57146879+       struct iphdr *iph = ip_hdr(skb); 
     6880+#else 
     6881+       struct iphdr *iph = skb->nh.iph; 
     6882+#endif 
    57156883+       u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET; 
    5716 + 
    57176884+       switch (iph->protocol) { 
    57186885+       case IPPROTO_TCP: { 
     
    57236890+                       return INVALID_PORT; 
    57246891+ 
     6892+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    57256893+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0) 
     6894+#else 
     6895+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) 
     6896+#endif 
    57266897+                       /* No choice either */ 
    57276898+                       return INVALID_PORT; 
     
    57366907+                       return INVALID_PORT; 
    57376908+ 
     6909+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
    57386910+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0) 
     6911+#else 
     6912+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) 
     6913+#endif 
    57396914+                       /* No choice either */ 
    57406915+                       return INVALID_PORT; 
     
    60047179+MODULE_DESCRIPTION("portmap type of IP sets"); 
    60057180+ 
    6006 +static int __init init(void) 
     7181+static int __init ip_set_portmap_init(void) 
    60077182+{ 
    60087183+       return ip_set_register_set_type(&ip_set_portmap); 
    60097184+} 
    60107185+ 
    6011 +static void __exit fini(void) 
     7186+static void __exit ip_set_portmap_fini(void) 
    60127187+{ 
    60137188+       /* FIXME: possible race with ip_set_create() */ 
     
    60157190+} 
    60167191+ 
    6017 +module_init(init); 
    6018 +module_exit(fini); 
    6019 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ipt_set.c 
    6020 =================================================================== 
    6021 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    6022 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ipt_set.c       2007-09-21 16:24:01.000000000 +0800 
    6023 @@ -0,0 +1,150 @@ 
     7192+module_init(ip_set_portmap_init); 
     7193+module_exit(ip_set_portmap_fini); 
     7194diff -Nru linux-2.6.23/net/ipv4/netfilter/ipt_set.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ipt_set.c 
     7195--- linux-2.6.23/net/ipv4/netfilter/ipt_set.c   1970-01-01 01:00:00.000000000 +0100 
     7196+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ipt_set.c     2007-10-12 11:52:38.000000000 +0200 
     7197@@ -0,0 +1,160 @@ 
    60247198+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    60257199+ *                         Patrick Schaaf <bof@bof.de> 
     
    60537227+} 
    60547228+ 
     7229+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7230+static bool 
     7231+#else 
    60557232+static int 
     7233+#endif 
    60567234+match(const struct sk_buff *skb, 
    60577235+      const struct net_device *in, 
     
    60617239+#endif 
    60627240+      const void *matchinfo, 
    6063 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
     7241+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7242+      int offset, unsigned int protoff, bool *hotdrop) 
     7243+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
    60647244+      int offset, unsigned int protoff, int *hotdrop) 
    60657245+#else 
     
    60747254+} 
    60757255+ 
     7256+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7257+bool 
     7258+#else 
    60767259+static int 
     7260+#endif 
    60777261+checkentry(const char *tablename, 
    60787262+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
     
    61727356+module_init(ipt_ipset_init); 
    61737357+module_exit(ipt_ipset_fini); 
    6174 Index: linux-2.6.23-rc6/net/ipv4/netfilter/ipt_SET.c 
    6175 =================================================================== 
    6176 --- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    6177 +++ linux-2.6.23-rc6/net/ipv4/netfilter/ipt_SET.c       2007-09-21 16:24:01.000000000 +0800 
    6178 @@ -0,0 +1,169 @@ 
     7358diff -Nru linux-2.6.23/net/ipv4/netfilter/ipt_SET.c linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ipt_SET.c 
     7359--- linux-2.6.23/net/ipv4/netfilter/ipt_SET.c   1970-01-01 01:00:00.000000000 +0100 
     7360+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/ipt_SET.c     2007-10-12 11:52:37.000000000 +0200 
     7361@@ -0,0 +1,172 @@ 
    61797362+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    61807363+ *                         Patrick Schaaf <bof@bof.de> 
     
    61987381+#include <linux/inetdevice.h> 
    61997382+#include <linux/version.h> 
    6200 +#include <linux/skbuff.h> 
    62017383+#include <net/protocol.h> 
    62027384+#include <net/checksum.h> 
     
    62347416+} 
    62357417+ 
     7418+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     7419+static bool 
     7420+#else 
    62367421+static int 
     7422+#endif 
    62377423+checkentry(const char *tablename, 
    62387424+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16) 
     
    63467532+module_init(ipt_SET_init); 
    63477533+module_exit(ipt_SET_fini); 
    6348 Index: linux-2.6.23-rc6/net/ipv4/netfilter/Kconfig 
    6349 =================================================================== 
    6350 --- linux-2.6.23-rc6.orig/net/ipv4/netfilter/Kconfig    2007-09-21 16:24:00.000000000 +0800 
    6351 +++ linux-2.6.23-rc6/net/ipv4/netfilter/Kconfig 2007-09-21 16:24:01.000000000 +0800 
    6352 @@ -426,5 +426,114 @@ 
     7534diff -Nru linux-2.6.23/net/ipv4/netfilter/Kconfig linux-2.6.23.pom2patch.set/net/ipv4/netfilter/Kconfig 
     7535--- linux-2.6.23/net/ipv4/netfilter/Kconfig     2007-10-09 22:31:38.000000000 +0200 
     7536+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/Kconfig       2007-10-12 11:52:38.000000000 +0200 
     7537@@ -402,5 +402,122 @@ 
    63537538          Allows altering the ARP packet payload: source and destination 
    63547539          hardware and network addresses. 
     
    64437628+         To compile it as a module, choose M here.  If unsure, say N. 
    64447629+ 
     7630+config IP_NF_SET_IPTREEMAP 
     7631+       tristate "iptreemap set support" 
     7632+       depends on IP_NF_SET 
     7633+       help 
     7634+         This option adds the iptreemap set type support. 
     7635+ 
     7636+         To compile it as a module, choose M here.  If unsure, say N. 
     7637+ 
    64457638+config IP_NF_MATCH_SET 
    64467639+       tristate "set match support" 
     
    64657658 endmenu 
    64667659  
    6467 Index: linux-2.6.23-rc6/net/ipv4/netfilter/Makefile 
    6468 =================================================================== 
    6469 --- linux-2.6.23-rc6.orig/net/ipv4/netfilter/Makefile   2007-09-21 16:24:00.000000000 +0800 
    6470 +++ linux-2.6.23-rc6/net/ipv4/netfilter/Makefile        2007-09-21 16:24:01.000000000 +0800 
     7660diff -Nru linux-2.6.23/net/ipv4/netfilter/Makefile linux-2.6.23.pom2patch.set/net/ipv4/netfilter/Makefile 
     7661--- linux-2.6.23/net/ipv4/netfilter/Makefile    2007-10-09 22:31:38.000000000 +0200 
     7662+++ linux-2.6.23.pom2patch.set/net/ipv4/netfilter/Makefile      2007-10-12 11:52:38.000000000 +0200 
    64717663@@ -48,6 +48,7 @@ 
    64727664 obj-$(CONFIG_IP_NF_MATCH_ECN) += ipt_ecn.o 
     
    64757667+obj-$(CONFIG_IP_NF_MATCH_SET) += ipt_set.o 
    64767668 obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ipt_addrtype.o 
    6477  obj-$(CONFIG_IP_NF_MATCH_IPP2P) += ipt_ipp2p.o 
    6478  obj-$(CONFIG_IP_NF_MATCH_LAYER7) += ipt_layer7.o 
    6479 @@ -64,6 +65,17 @@ 
     7669  
     7670 # targets 
     7671@@ -62,6 +63,18 @@ 
    64807672 obj-$(CONFIG_IP_NF_TARGET_ULOG) += ipt_ULOG.o 
    64817673 obj-$(CONFIG_IP_NF_TARGET_CLUSTERIP) += ipt_CLUSTERIP.o 
     
    64927684+obj-$(CONFIG_IP_NF_SET_IPPORTHASH) += ip_set_ipporthash.o 
    64937685+obj-$(CONFIG_IP_NF_SET_IPTREE) += ip_set_iptree.o 
     7686+obj-$(CONFIG_IP_NF_SET_IPTREEMAP) += ip_set_iptreemap.o 
    64947687  
    64957688 # generic ARP tables 
  • trunk/target/linux/generic-2.6/patches/130-netfilter_ipset.patch

    r9263 r9269  
    1 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set.h 
    2 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set.h        1969-12-31 18:00:00.000000000 -0600 
    3 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set.h    2007-06-08 16:29:31.825808000 -0500 
     1diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set.h 
     2--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set.h      1970-01-01 01:00:00.000000000 +0100 
     3+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set.h  2007-10-12 14:28:29.000000000 +0200 
    44@@ -0,0 +1,498 @@ 
    55+#ifndef _IP_SET_H 
     
    501501+ 
    502502+#endif /*_IP_SET_H*/ 
    503 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_iphash.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_iphash.h 
    504 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_iphash.h 1969-12-31 18:00:00.000000000 -0600 
    505 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_iphash.h     2007-06-08 16:29:31.829808250 -0500 
     503diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_iphash.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iphash.h 
     504--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_iphash.h       1970-01-01 01:00:00.000000000 +0100 
     505+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iphash.h   2007-10-12 14:28:29.000000000 +0200 
    506506@@ -0,0 +1,30 @@ 
    507507+#ifndef __IP_SET_IPHASH_H 
     
    535535+ 
    536536+#endif /* __IP_SET_IPHASH_H */ 
    537 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_ipmap.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_ipmap.h 
    538 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_ipmap.h  1969-12-31 18:00:00.000000000 -0600 
    539 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_ipmap.h      2007-06-08 16:29:31.829808250 -0500 
     537diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_ipmap.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipmap.h 
     538--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_ipmap.h        1970-01-01 01:00:00.000000000 +0100 
     539+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipmap.h    2007-10-12 14:28:29.000000000 +0200 
    540540@@ -0,0 +1,56 @@ 
    541541+#ifndef __IP_SET_IPMAP_H 
     
    595595+        
    596596+#endif /* __IP_SET_IPMAP_H */ 
    597 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_ipporthash.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_ipporthash.h 
    598 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_ipporthash.h     1969-12-31 18:00:00.000000000 -0600 
    599 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_ipporthash.h 2007-06-08 16:29:31.829808250 -0500 
     597diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_ipporthash.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipporthash.h 
     598--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_ipporthash.h   1970-01-01 01:00:00.000000000 +0100 
     599+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_ipporthash.h       2007-10-12 14:28:29.000000000 +0200 
    600600@@ -0,0 +1,34 @@ 
    601601+#ifndef __IP_SET_IPPORTHASH_H 
     
    633633+ 
    634634+#endif /* __IP_SET_IPPORTHASH_H */ 
    635 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_iptree.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_iptree.h 
    636 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_iptree.h 1969-12-31 18:00:00.000000000 -0600 
    637 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_iptree.h     2007-06-08 16:29:31.829808250 -0500 
     635diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_iptree.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptree.h 
     636--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_iptree.h       1970-01-01 01:00:00.000000000 +0100 
     637+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptree.h   2007-10-12 14:28:29.000000000 +0200 
    638638@@ -0,0 +1,40 @@ 
    639639+#ifndef __IP_SET_IPTREE_H 
     
    677677+ 
    678678+#endif /* __IP_SET_IPTREE_H */ 
    679 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_jhash.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_jhash.h 
    680 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_jhash.h  1969-12-31 18:00:00.000000000 -0600 
    681 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_jhash.h      2007-06-08 16:29:31.829808250 -0500 
     679diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_iptreemap.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptreemap.h 
     680--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_iptreemap.h    1970-01-01 01:00:00.000000000 +0100 
     681+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_iptreemap.h        2007-10-12 14:28:29.000000000 +0200 
     682@@ -0,0 +1,40 @@ 
     683+#ifndef __IP_SET_IPTREEMAP_H 
     684+#define __IP_SET_IPTREEMAP_H 
     685+ 
     686+#include <linux/netfilter_ipv4/ip_set.h> 
     687+ 
     688+#define SETTYPE_NAME "iptreemap" 
     689+ 
     690+#ifdef __KERNEL__ 
     691+struct ip_set_iptreemap_d { 
     692+       unsigned char bitmap[32]; /* x.x.x.y */ 
     693+}; 
     694+ 
     695+struct ip_set_iptreemap_c { 
     696+       struct ip_set_iptreemap_d *tree[256]; /* x.x.y.x */ 
     697+}; 
     698+ 
     699+struct ip_set_iptreemap_b { 
     700+       struct ip_set_iptreemap_c *tree[256]; /* x.y.x.x */ 
     701+       unsigned char dirty[32]; 
     702+}; 
     703+#endif 
     704+ 
     705+struct ip_set_iptreemap { 
     706+       unsigned int gc_interval; 
     707+#ifdef __KERNEL__ 
     708+       struct timer_list gc; 
     709+       struct ip_set_iptreemap_b *tree[256]; /* y.x.x.x */ 
     710+#endif 
     711+}; 
     712+ 
     713+struct ip_set_req_iptreemap_create { 
     714+       unsigned int gc_interval; 
     715+}; 
     716+ 
     717+struct ip_set_req_iptreemap { 
     718+       ip_set_ip_t start; 
     719+       ip_set_ip_t end; 
     720+}; 
     721+ 
     722+#endif /* __IP_SET_IPTREEMAP_H */ 
     723diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_jhash.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_jhash.h 
     724--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_jhash.h        1970-01-01 01:00:00.000000000 +0100 
     725+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_jhash.h    2007-10-12 14:28:29.000000000 +0200 
    682726@@ -0,0 +1,148 @@ 
    683727+#ifndef _LINUX_IPSET_JHASH_H 
     
    829873+ 
    830874+#endif /* _LINUX_IPSET_JHASH_H */ 
    831 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_macipmap.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_macipmap.h 
    832 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_macipmap.h       1969-12-31 18:00:00.000000000 -0600 
    833 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_macipmap.h   2007-06-08 16:29:31.829808250 -0500 
     875diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_macipmap.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_macipmap.h 
     876--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_macipmap.h     1970-01-01 01:00:00.000000000 +0100 
     877+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_macipmap.h 2007-10-12 14:28:29.000000000 +0200 
    834878@@ -0,0 +1,38 @@ 
    835879+#ifndef __IP_SET_MACIPMAP_H 
     
    871915+ 
    872916+#endif /* __IP_SET_MACIPMAP_H */ 
    873 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_malloc.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_malloc.h 
    874 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_malloc.h 1969-12-31 18:00:00.000000000 -0600 
    875 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_malloc.h     2007-06-08 16:29:31.829808250 -0500 
     917diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_malloc.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_malloc.h 
     918--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_malloc.h       1970-01-01 01:00:00.000000000 +0100 
     919+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_malloc.h   2007-10-12 14:28:29.000000000 +0200 
    876920@@ -0,0 +1,116 @@ 
    877921+#ifndef _IP_SET_MALLOC_H 
     
    9911035+ 
    9921036+#endif /*_IP_SET_MALLOC_H*/ 
    993 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_nethash.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_nethash.h 
    994 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_nethash.h        1969-12-31 18:00:00.000000000 -0600 
    995 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_nethash.h    2007-06-08 16:29:31.829808250 -0500 
     1037diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_nethash.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_nethash.h 
     1038--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_nethash.h      1970-01-01 01:00:00.000000000 +0100 
     1039+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_nethash.h  2007-10-12 14:28:29.000000000 +0200 
    9961040@@ -0,0 +1,55 @@ 
    9971041+#ifndef __IP_SET_NETHASH_H 
     
    10501094+ 
    10511095+#endif /* __IP_SET_NETHASH_H */ 
    1052 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_portmap.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_portmap.h 
    1053 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ip_set_portmap.h        1969-12-31 18:00:00.000000000 -0600 
    1054 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ip_set_portmap.h    2007-06-08 16:29:31.829808250 -0500 
     1096diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_portmap.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_portmap.h 
     1097--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ip_set_portmap.h      1970-01-01 01:00:00.000000000 +0100 
     1098+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ip_set_portmap.h  2007-10-12 14:28:29.000000000 +0200 
    10551099@@ -0,0 +1,25 @@ 
    10561100+#ifndef __IP_SET_PORTMAP_H 
     
    10791123+ 
    10801124+#endif /* __IP_SET_PORTMAP_H */ 
    1081 diff -ruN linux-2.6.21.1/include/linux/netfilter_ipv4/ipt_set.h linux-2.6.21.1.new/include/linux/netfilter_ipv4/ipt_set.h 
    1082 --- linux-2.6.21.1/include/linux/netfilter_ipv4/ipt_set.h       1969-12-31 18:00:00.000000000 -0600 
    1083 +++ linux-2.6.21.1.new/include/linux/netfilter_ipv4/ipt_set.h   2007-06-08 16:29:31.829808250 -0500 
     1125diff -Nru ./linux-2.6.21.5/include/linux/netfilter_ipv4/ipt_set.h linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ipt_set.h 
     1126--- ./linux-2.6.21.5/include/linux/netfilter_ipv4/ipt_set.h     1970-01-01 01:00:00.000000000 +0100 
     1127+++ linux-2.6.21.5.pom2patch.set/include/linux/netfilter_ipv4/ipt_set.h 2007-10-12 14:28:29.000000000 +0200 
    10841128@@ -0,0 +1,21 @@ 
    10851129+#ifndef _IPT_SET_H 
     
    11041148+ 
    11051149+#endif /*_IPT_SET_H*/ 
    1106 diff -ruN linux-2.6.21.1/net/ipv4/netfilter/ip_set.c linux-2.6.21.1.new/net/ipv4/netfilter/ip_set.c 
    1107 --- linux-2.6.21.1/net/ipv4/netfilter/ip_set.c  1969-12-31 18:00:00.000000000 -0600 
    1108 +++ linux-2.6.21.1.new/net/ipv4/netfilter/ip_set.c      2007-06-08 16:29:31.829808250 -0500 
    1109 @@ -0,0 +1,2001 @@ 
     1150diff -Nru ./linux-2.6.21.5/net/ipv4/netfilter/ip_set.c linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set.c 
     1151--- ./linux-2.6.21.5/net/ipv4/netfilter/ip_set.c        1970-01-01 01:00:00.000000000 +0100 
     1152+++ linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set.c    2007-10-12 14:28:29.000000000 +0200 
     1153@@ -0,0 +1,2003 @@ 
    11101154+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    11111155+ *                         Patrick Schaaf <bof@bof.de> 
     
    30383082+       .get_optmax     = SO_IP_SET + 1, 
    30393083+       .get            = &ip_set_sockfn_get, 
    3040 +       .use            = 0 
     3084+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,23) 
     3085+       .owner          = THIS_MODULE, 
     3086+#endif 
    30413087+}; 
    30423088+ 
     
    30503096+MODULE_DESCRIPTION("module implementing core IP set support"); 
    30513097+ 
    3052 +static int __init init(void) 
     3098+static int __init ip_set_init(void) 
    30533099+{ 
    30543100+       int res; 
     
    30873133+} 
    30883134+ 
    3089 +static void __exit fini(void) 
     3135+static void __exit ip_set_fini(void) 
    30903136+{ 
    30913137+       /* There can't be any existing set or binding */ 
     
    31073153+EXPORT_SYMBOL(ip_set_testip_kernel); 
    31083154+ 
    3109 +module_init(init); 
    3110 +module_exit(fini); 
    3111 diff -ruN linux-2.6.21.1/net/ipv4/netfilter/ip_set_iphash.c linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_iphash.c 
    3112 --- linux-2.6.21.1/net/ipv4/netfilter/ip_set_iphash.c   1969-12-31 18:00:00.000000000 -0600 
    3113 +++ linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_iphash.c       2007-06-08 16:29:31.829808250 -0500 
    3114 @@ -0,0 +1,413 @@ 
     3155+module_init(ip_set_init); 
     3156+module_exit(ip_set_fini); 
     3157diff -Nru ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_iphash.c linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_iphash.c 
     3158--- ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_iphash.c 1970-01-01 01:00:00.000000000 +0100 
     3159+++ linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_iphash.c     2007-10-12 14:28:29.000000000 +0200 
     3160@@ -0,0 +1,429 @@ 
    31153161+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    31163162+ * 
     
    31253171+#include <linux/ip.h> 
    31263172+#include <linux/skbuff.h> 
     3173+#include <linux/version.h> 
     3174+#include <linux/jhash.h> 
    31273175+#include <linux/netfilter_ipv4/ip_tables.h> 
    31283176+#include <linux/netfilter_ipv4/ip_set.h> 
     
    31383186+#include <linux/netfilter_ipv4/ip_set_malloc.h> 
    31393187+#include <linux/netfilter_ipv4/ip_set_iphash.h> 
    3140 +#include <linux/netfilter_ipv4/ip_set_jhash.h> 
    31413188+ 
    31423189+static int limit = MAX_RANGE; 
     
    32033250+       return __testip(set, 
    32043251+                       ntohl(flags[index] & IPSET_SRC  
     3252+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3253+                               ? ip_hdr(skb)->saddr  
     3254+                               : ip_hdr(skb)->daddr), 
     3255+#else 
    32053256+                               ? skb->nh.iph->saddr  
    32063257+                               : skb->nh.iph->daddr), 
     3258+#endif 
    32073259+                       hash_ip); 
    32083260+} 
     
    32153267+       ip_set_ip_t *elem; 
    32163268+        
    3217 +       if (!ip || map->elements > limit) 
     3269+       if (!ip || map->elements >= limit) 
    32183270+               return -ERANGE; 
    32193271+ 
     
    32603312+       return __addip((struct ip_set_iphash *) set->data, 
    32613313+                      ntohl(flags[index] & IPSET_SRC  
     3314+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3315+                               ? ip_hdr(skb)->saddr  
     3316+                               : ip_hdr(skb)->daddr), 
     3317+#else 
    32623318+                               ? skb->nh.iph->saddr  
    32633319+                               : skb->nh.iph->daddr), 
     3320+#endif 
    32643321+                      hash_ip); 
    32653322+} 
     
    33833440+       return __delip(set, 
    33843441+                      ntohl(flags[index] & IPSET_SRC  
     3442+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3443+                               ? ip_hdr(skb)->saddr  
     3444+                               : ip_hdr(skb)->daddr), 
     3445+#else 
    33853446+                               ? skb->nh.iph->saddr  
    33863447+                               : skb->nh.iph->daddr), 
     3448+#endif 
    33873449+                      hash_ip); 
    33883450+} 
     
    35133575+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    35143576+ 
    3515 +static int __init init(void) 
     3577+static int __init ip_set_iphash_init(void) 
    35163578+{ 
    35173579+       return ip_set_register_set_type(&ip_set_iphash); 
    35183580+} 
    35193581+ 
    3520 +static void __exit fini(void) 
     3582+static void __exit ip_set_iphash_fini(void) 
    35213583+{ 
    35223584+       /* FIXME: possible race with ip_set_create() */ 
     
    35243586+} 
    35253587+ 
    3526 +module_init(init); 
    3527 +module_exit(fini); 
    3528 diff -ruN linux-2.6.21.1/net/ipv4/netfilter/ip_set_ipmap.c linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_ipmap.c 
    3529 --- linux-2.6.21.1/net/ipv4/netfilter/ip_set_ipmap.c    1969-12-31 18:00:00.000000000 -0600 
    3530 +++ linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_ipmap.c        2007-06-08 16:29:31.833808500 -0500 
    3531 @@ -0,0 +1,327 @@ 
     3588+module_init(ip_set_iphash_init); 
     3589+module_exit(ip_set_iphash_fini); 
     3590diff -Nru ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_ipmap.c linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_ipmap.c 
     3591--- ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_ipmap.c  1970-01-01 01:00:00.000000000 +0100 
     3592+++ linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_ipmap.c      2007-10-12 14:28:29.000000000 +0200 
     3593@@ -0,0 +1,336 @@ 
    35323594+/* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu> 
    35333595+ *                         Patrick Schaaf <bof@bof.de> 
     
    35443606+#include <linux/ip.h> 
    35453607+#include <linux/skbuff.h> 
     3608+#include <linux/version.h> 
    35463609+#include <linux/netfilter_ipv4/ip_tables.h> 
    35473610+#include <linux/netfilter_ipv4/ip_set.h> 
     
    35963659+             unsigned char index) 
    35973660+{ 
    3598 +       int res; 
    3599 +        
    3600 +       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    3601 +          flags[index] & IPSET_SRC ? "SRC" : "DST", 
    3602 +          NIPQUAD(skb->nh.iph->saddr), 
    3603 +          NIPQUAD(skb->nh.iph->daddr)); 
    3604 + 
    3605 +       res =  __testip(set, 
    3606 +                       ntohl(flags[index] & IPSET_SRC  
     3661+       int res =  __testip(set, 
     3662+                       ntohl(flags[index] & IPSET_SRC 
     3663+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3664+                               ? ip_hdr(skb)->saddr  
     3665+                               : ip_hdr(skb)->daddr), 
     3666+#else 
    36073667+                               ? skb->nh.iph->saddr  
    36083668+                               : skb->nh.iph->daddr), 
     3669+#endif 
    36093670+                       hash_ip); 
    36103671+       return (res < 0 ? 0 : res); 
     
    36533714+       return __addip(set, 
    36543715+                      ntohl(flags[index] & IPSET_SRC  
     3716+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3717+                               ? ip_hdr(skb)->saddr  
     3718+                               : ip_hdr(skb)->daddr), 
     3719+#else 
    36553720+                               ? skb->nh.iph->saddr  
    36563721+                               : skb->nh.iph->daddr), 
     3722+#endif 
    36573723+                      hash_ip); 
    36583724+} 
     
    36993765+       return __delip(set, 
    37003766+                      ntohl(flags[index] & IPSET_SRC  
     3767+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3768+                               ? ip_hdr(skb)->saddr  
     3769+                               : ip_hdr(skb)->daddr), 
     3770+#else 
    37013771+                               ? skb->nh.iph->saddr  
    37023772+                               : skb->nh.iph->daddr), 
     3773+#endif 
    37033774+                      hash_ip); 
    37043775+} 
     
    38443915+MODULE_DESCRIPTION("ipmap type of IP sets"); 
    38453916+ 
    3846 +static int __init init(void) 
     3917+static int __init ip_set_ipmap_init(void) 
    38473918+{ 
    38483919+       return ip_set_register_set_type(&ip_set_ipmap); 
    38493920+} 
    38503921+ 
    3851 +static void __exit fini(void) 
     3922+static void __exit ip_set_ipmap_fini(void) 
    38523923+{ 
    38533924+       /* FIXME: possible race with ip_set_create() */ 
     
    38553926+} 
    38563927+ 
    3857 +module_init(init); 
    3858 +module_exit(fini); 
    3859 diff -ruN linux-2.6.21.1/net/ipv4/netfilter/ip_set_ipporthash.c linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_ipporthash.c 
    3860 --- linux-2.6.21.1/net/ipv4/netfilter/ip_set_ipporthash.c       1969-12-31 18:00:00.000000000 -0600 
    3861 +++ linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_ipporthash.c   2007-06-08 16:29:31.833808500 -0500 
    3862 @@ -0,0 +1,535 @@ 
     3928+module_init(ip_set_ipmap_init); 
     3929+module_exit(ip_set_ipmap_fini); 
     3930diff -Nru ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_ipporthash.c linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_ipporthash.c 
     3931--- ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_ipporthash.c     1970-01-01 01:00:00.000000000 +0100 
     3932+++ linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_ipporthash.c 2007-10-12 14:28:29.000000000 +0200 
     3933@@ -0,0 +1,581 @@ 
    38633934+/* Copyright (C) 2003-2004 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    38643935+ * 
     
    38753946+#include <linux/udp.h> 
    38763947+#include <linux/skbuff.h> 
     3948+#include <linux/version.h> 
     3949+#include <linux/jhash.h> 
    38773950+#include <linux/netfilter_ipv4/ip_tables.h> 
    38783951+#include <linux/netfilter_ipv4/ip_set.h> 
     
    38883961+#include <linux/netfilter_ipv4/ip_set_malloc.h> 
    38893962+#include <linux/netfilter_ipv4/ip_set_ipporthash.h> 
    3890 +#include <linux/netfilter_ipv4/ip_set_jhash.h> 
    38913963+ 
    38923964+static int limit = MAX_RANGE; 
     
    38963968+get_port(const struct sk_buff *skb, u_int32_t flags) 
    38973969+{ 
     3970+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3971+       struct iphdr *iph = ip_hdr(skb); 
     3972+#else 
    38983973+       struct iphdr *iph = skb->nh.iph; 
     3974+#endif 
    38993975+       u_int16_t offset = ntohs(iph->frag_off) & IP_OFFSET; 
    39003976+ 
     
    39073983+                       return INVALID_PORT; 
    39083984+ 
     3985+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     3986+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &tcph, sizeof(tcph)) < 0) 
     3987+#else 
    39093988+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) 
     3989+#endif 
    39103990+                       /* No choice either */ 
    39113991+                       return INVALID_PORT; 
     
    39204000+                       return INVALID_PORT; 
    39214001+ 
     4002+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4003+               if (skb_copy_bits(skb, ip_hdr(skb)->ihl*4, &udph, sizeof(udph)) < 0) 
     4004+#else 
    39224005+               if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) 
     4006+#endif 
    39234007+                       /* No choice either */ 
    39244008+                       return INVALID_PORT; 
     
    40024086+{ 
    40034087+       ip_set_ip_t port; 
     4088+       int res; 
    40044089+ 
    40054090+       if (flags[index+1] == 0) 
    4006 +               return -EINVAL; 
     4091+               return 0; 
    40074092+                
    40084093+       port = get_port(skb, flags[index+1]); 
     
    40104095+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    40114096+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4097+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4098+          NIPQUAD(ip_hdr(skb)->saddr), 
     4099+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4100+#else 
    40124101+          NIPQUAD(skb->nh.iph->saddr), 
    40134102+          NIPQUAD(skb->nh.iph->daddr)); 
     4103+#endif 
    40144104+       DP("flag %s port %u", 
    40154105+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    40184108+               return 0;        
    40194109+ 
    4020 +       return __testip(set, 
     4110+       res = __testip(set, 
    40214111+                       ntohl(flags[index] & IPSET_SRC  
     4112+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4113+                                       ? ip_hdr(skb)->saddr  
     4114+                                       : ip_hdr(skb)->daddr), 
     4115+#else 
    40224116+                                       ? skb->nh.iph->saddr  
    40234117+                                       : skb->nh.iph->daddr), 
     4118+#endif 
    40244119+                       port, 
    40254120+                       hash_ip); 
     4121+       return (res < 0 ? 0 : res); 
     4122+        
    40264123+} 
    40274124+ 
     
    40954192+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    40964193+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4194+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4195+          NIPQUAD(ip_hdr(skb)->saddr), 
     4196+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4197+#else 
    40974198+          NIPQUAD(skb->nh.iph->saddr), 
    40984199+          NIPQUAD(skb->nh.iph->daddr)); 
     4200+#endif 
    40994201+       DP("flag %s port %u",  
    41004202+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    41054207+       return __addip((struct ip_set_ipporthash *) set->data, 
    41064208+                      ntohl(flags[index] & IPSET_SRC  
     4209+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4210+                               ? ip_hdr(skb)->saddr  
     4211+                               : ip_hdr(skb)->daddr), 
     4212+#else 
    41074213+                               ? skb->nh.iph->saddr  
    41084214+                               : skb->nh.iph->daddr), 
     4215+#endif 
    41094216+                      port, 
    41104217+                      hash_ip); 
     
    42404347+       DP("flag: %s src: %u.%u.%u.%u dst: %u.%u.%u.%u", 
    42414348+          flags[index] & IPSET_SRC ? "SRC" : "DST", 
     4349+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4350+          NIPQUAD(ip_hdr(skb)->saddr), 
     4351+          NIPQUAD(ip_hdr(skb)->daddr)); 
     4352+#else 
    42424353+          NIPQUAD(skb->nh.iph->saddr), 
    42434354+          NIPQUAD(skb->nh.iph->daddr)); 
     4355+#endif 
    42444356+       DP("flag %s port %u", 
    42454357+          flags[index+1] & IPSET_SRC ? "SRC" : "DST",  
     
    42504362+       return __delip(set, 
    42514363+                      ntohl(flags[index] & IPSET_SRC  
     4364+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) 
     4365+                               ? ip_hdr(skb)->saddr  
     4366+                               : ip_hdr(skb)->daddr), 
     4367+#else 
    42524368+                               ? skb->nh.iph->saddr  
    42534369+                               : skb->nh.iph->daddr), 
     4370+#endif 
    42544371+                      port, 
    42554372+                      hash_ip); 
     
    43834500+MODULE_PARM_DESC(limit, "maximal number of elements stored in the sets"); 
    43844501+ 
    4385 +static int __init init(void) 
     4502+static int __init ip_set_ipporthash_init(void) 
    43864503+{ 
    43874504+       return ip_set_register_set_type(&ip_set_ipporthash); 
    43884505+} 
    43894506+ 
    4390 +static void __exit fini(void) 
     4507+static void __exit ip_set_ipporthash_fini(void) 
    43914508+{ 
    43924509+       /* FIXME: possible race with ip_set_create() */ 
     
    43944511+} 
    43954512+ 
    4396 +module_init(init); 
    4397 +module_exit(fini); 
    4398 diff -ruN linux-2.6.21.1/net/ipv4/netfilter/ip_set_iptree.c linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_iptree.c 
    4399 --- linux-2.6.21.1/net/ipv4/netfilter/ip_set_iptree.c   1969-12-31 18:00:00.000000000 -0600 
    4400 +++ linux-2.6.21.1.new/net/ipv4/netfilter/ip_set_iptree.c       2007-06-08 16:29:31.833808500 -0500 
    4401 @@ -0,0 +1,571 @@ 
     4513+module_init(ip_set_ipporthash_init); 
     4514+module_exit(ip_set_ipporthash_fini); 
     4515diff -Nru ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_iptree.c linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_iptree.c 
     4516--- ./linux-2.6.21.5/net/ipv4/netfilter/ip_set_iptree.c 1970-01-01 01:00:00.000000000 +0100 
     4517+++ linux-2.6.21.5.pom2patch.set/net/ipv4/netfilter/ip_set_iptree.c     2007-10-12 14:28:29.000000000 +0200 
     4518@@ -0,0 +1,612 @@ 
    44024519+/* Copyright (C) 2005 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> 
    44034520+ *