1#!/bin/sh 2 3awk -f - $* <<EOF 4function bitcount(c) { 5 c=and(rshift(c, 1),0x55555555)+and(c,0x55555555) 6 c=and(rshift(c, 2),0x33333333)+and(c,0x33333333) 7 c=and(rshift(c, 4),0x0f0f0f0f)+and(c,0x0f0f0f0f) 8 c=and(rshift(c, 8),0x00ff00ff)+and(c,0x00ff00ff) 9 c=and(rshift(c,16),0x0000ffff)+and(c,0x0000ffff) 10 return c 11} 12 13function ip2int(ip) { 14 for (ret=0,n=split(ip,a,"\."),x=1;x<=n;x++) ret=or(lshift(ret,8),a[x]) 15 return ret 16} 17 18function int2ip(ip,ret,x) { 19 ret=and(ip,255) 20 ip=rshift(ip,8) 21 for(;x<3;ret=and(ip,255)"."ret,ip=rshift(ip,8),x++); 22 return ret 23} 24 25function compl32(v) { 26 ret=xor(v, 0xffffffff) 27 return ret 28} 29 30BEGIN { 31 slpos=index(ARGV[1],"/") 32 if (slpos == 0) { 33 ipaddr=ip2int(ARGV[1]) 34 dotpos=index(ARGV[2],".") 35 if (dotpos == 0) 36 netmask=compl32(2**(32-int(ARGV[2]))-1) 37 else 38 netmask=ip2int(ARGV[2]) 39 } else { 40 ipaddr=ip2int(substr(ARGV[1],0,slpos-1)) 41 netmask=compl32(2**(32-int(substr(ARGV[1],slpos+1)))-1) 42 ARGV[4]=ARGV[3] 43 ARGV[3]=ARGV[2] 44 } 45 46 network=and(ipaddr,netmask) 47 broadcast=or(network,compl32(netmask)) 48 49 start=or(network,and(ip2int(ARGV[3]),compl32(netmask))) 50 limit=network+1 51 if (start<limit) start=limit 52 53 end=start+ARGV[4] 54 limit=or(network,compl32(netmask))-1 55 if (end>limit) end=limit 56 57 print "IP="int2ip(ipaddr) 58 print "NETMASK="int2ip(netmask) 59 print "BROADCAST="int2ip(broadcast) 60 print "NETWORK="int2ip(network) 61 print "PREFIX="32-bitcount(compl32(netmask)) 62 63 # range calculations: 64 # ipcalc <ip> <netmask> <start> <num> 65 66 if (ARGC > 3) { 67 print "START="int2ip(start) 68 print "END="int2ip(end) 69 } 70} 71EOF 72