diff --git a/binaries/armhf/ip2net b/binaries/armhf/ip2net index 7550f35..9d7b9e0 100755 Binary files a/binaries/armhf/ip2net and b/binaries/armhf/ip2net differ diff --git a/binaries/mips32r1-lsb/ip2net b/binaries/mips32r1-lsb/ip2net index 005eb40..bf56297 100755 Binary files a/binaries/mips32r1-lsb/ip2net and b/binaries/mips32r1-lsb/ip2net differ diff --git a/binaries/mips32r1-msb/ip2net b/binaries/mips32r1-msb/ip2net index 3652611..ba197b6 100755 Binary files a/binaries/mips32r1-msb/ip2net and b/binaries/mips32r1-msb/ip2net differ diff --git a/binaries/x86/ip2net b/binaries/x86/ip2net index fe164c6..2597651 100755 Binary files a/binaries/x86/ip2net and b/binaries/x86/ip2net differ diff --git a/binaries/x86_64/ip2net b/binaries/x86_64/ip2net index cec11bd..1198d71 100755 Binary files a/binaries/x86_64/ip2net and b/binaries/x86_64/ip2net differ diff --git a/ip2net/ip2net.c b/ip2net/ip2net.c index d44458a..63c2dae 100644 --- a/ip2net/ip2net.c +++ b/ip2net/ip2net.c @@ -1,5 +1,7 @@ -// group ip list from stdout into subnets -// ip list must be pre-uniqued +// group ipv4 list from stdout into subnets +// each line must contain either ipv4 or ipv4/bitcount +// valid ipv4/bitcount are passed through without modification +// ipv4 are groupped into subnets #include #include @@ -29,41 +31,68 @@ uint mask_from_bitcount(uint zct) return ~((1< 1,2,3,0 (ct=4) +uint unique_uint(uint *pu,uint ct) +{ + uint i,j,u; + for(i=j=0 ; j=4 && !(u1 & 0xFFFFFF00) && !(u2 & 0xFFFFFF00) && !(u3 & 0xFFFFFF00) && !(u4 & 0xFFFFFF00)) { - ip = u1<<24 | u2<<16 | u3<<8 | u4; - if (ipct>=iplist_size) + if (i==5 && zct!=32) { - iplist_size += ALLOC_STEP; - iplist_new = (uint*)(iplist ? realloc(iplist,sizeof(*iplist)*iplist_size) : malloc(sizeof(*iplist)*iplist_size)); - if (!iplist_new) - { - free(iplist); - fprintf(stderr,"out of memory\n"); - return 100; - } - iplist = iplist_new; + // we have subnet x.x.x.x/y + // output it as is if valid, ignore otherwise + if (zct<32) + printf("%u.%u.%u.%u/%u\n",u1,u2,u3,u4,zct); } - iplist[ipct++]= ip; - } - - gnu_quicksort(iplist,ipct,sizeof(*iplist),ucmp,NULL); - - while(pos=2 ; zct--) + else { + ip = u1<<24 | u2<<16 | u3<<8 | u4; + if (ipct>=iplist_size) + { + iplist_size += ALLOC_STEP; + iplist_new = (uint*)(iplist ? realloc(iplist,sizeof(*iplist)*iplist_size) : malloc(sizeof(*iplist)*iplist_size)); + if (!iplist_new) + { + free(iplist); + fprintf(stderr,"out of memory\n"); + return 100; + } + iplist = iplist_new; + } + iplist[ipct++]= ip; + } + } + } + + gnu_quicksort(iplist,ipct,sizeof(*iplist),ucmp,NULL); + ipct = unique_uint(iplist,ipct); + + while(pos=2 ; zct--) + { mask = mask_from_bitcount(zct); ip_start = iplist[pos] & mask; subnet_ct = ~mask+1; @@ -76,21 +105,21 @@ int main() pos_end = p; break; } - } - if (!subnet_ok) zct=0,ip_start=iplist[pos]; + } + if (!subnet_ok) zct=0,ip_start=iplist[pos]; - u1 = ip_start>>24; - u2 = (ip_start>>16) & 0xFF; - u3 = (ip_start>>8) & 0xFF; - u4 = ip_start & 0xFF; - if (zct) + u1 = ip_start>>24; + u2 = (ip_start>>16) & 0xFF; + u3 = (ip_start>>8) & 0xFF; + u4 = ip_start & 0xFF; + if (zct) printf("%u.%u.%u.%u/%u\n",u1,u2,u3,u4,32-zct); - else + else printf("%u.%u.%u.%u\n",u1,u2,u3,u4); - pos = pos_end; - } + pos = pos_end; + } - free(iplist); - return 0; + free(iplist); + return 0; } diff --git a/ipset/create_ipset.sh b/ipset/create_ipset.sh index 386effc..1f653e9 100755 --- a/ipset/create_ipset.sh +++ b/ipset/create_ipset.sh @@ -23,9 +23,9 @@ do if [ -x $IP2NET ]; then echo Adding to ipset $2 \($IPSTYPE , ip2net\) : $f if [ -f "$ZIPLIST_EXCLUDE" ] ; then - grep -vxFf $ZIPLIST_EXCLUDE "$f" | sort -u | $IP2NET | sed -nre "s/^.+$/add $2 &/p" | ipset -! restore + grep -vxFf $ZIPLIST_EXCLUDE "$f" | $IP2NET | sed -nre "s/^.+$/add $2 &/p" | ipset -! restore else - sort -u "$f" | $IP2NET | sed -nre "s/^.+$/add $2 &/p" | ipset -! restore + $IP2NET <"$f" | sed -nre "s/^.+$/add $2 &/p" | ipset -! restore fi else echo Adding to ipset $2 \($IPSTYPE\) : $f