3 .
/lib
/functions
/ipv4.sh
5 PROG
="$(basename "$0")"
8 echo "Usage: $PROG address/prefix [ start limit ]" >&2
18 str2ip ipaddr
"${1%/*}" ||
exit 1
19 str2ip netmask
"${1#*/}" ||
exit 1
23 str2ip ipaddr
"${1%/*}" ||
exit 1
25 assert_uint32
"$prefix" ||
exit 1
26 if [ "$prefix" -gt 32 ]; then
27 printf "Prefix out of range (%s)\n" "$prefix" >&2
30 netmask
=$
(((0xffffffff << (32 - prefix
)) & 0xffffffff))
34 str2ip ipaddr
"$1" ||
exit 1
35 str2ip netmask
"$2" ||
exit 1
40 if [ $# -ne 0 ] && [ $# -ne 2 ]; then
44 if ! bitcount prefix
"$netmask"; then
45 printf "Invalid netmask (%s)\n" "$netmask" >&2
49 # complement of the netmask, i.e. the hostmask
50 hostmask
=$
((netmask ^
0xffffffff))
51 network
=$
((ipaddr
& netmask
))
52 broadcast
=$
((network | hostmask
))
55 ip2str NETMASK
"$netmask"
56 ip2str NETWORK
"$network"
59 echo "NETMASK=$NETMASK"
60 if [ "$prefix" -le 30 ]; then
61 ip2str BROADCAST
"$broadcast"
62 echo "BROADCAST=$BROADCAST"
64 echo "NETWORK=$NETWORK"
67 [ $# -eq 0 ] && exit 0
69 if [ "$prefix" -le 30 ]; then
70 lower
=$
((network
+ 1))
76 assert_uint32
"$start" ||
exit 1
77 start
=$
((network |
(start
& hostmask
)))
78 [ "$start" -lt "$lower" ] && start
="$lower"
79 [ "$start" -eq "$ipaddr" ] && start
=$
((start
+ 1))
81 if [ "$prefix" -le 30 ]; then
82 upper
=$
(((network | hostmask
) - 1))
88 assert_uint32
"$range" ||
exit 1
89 end
=$
((start
+ range
- 1))
90 [ "$end" -gt "$upper" ] && end
="$upper"
91 [ "$end" -eq "$ipaddr" ] && end
=$
((end
- 1))
93 if [ "$start" -gt "$end" ]; then
94 echo "network ($NETWORK/$prefix) too small" >&2
101 if [ "$start" -le "$ipaddr" ] && [ "$ipaddr" -le "$end" ]; then
102 echo "error: address $IP inside range $START..$END" >&2