4f48e0a79271fb12c98b91ffc3c37462e93684d1
3 .
/lib
/functions
/ipv4.sh
5 PROG
="$(basename "$0")"
7 # wrapper to convert an integer to an address, unless we're using
8 # decimal output format.
9 # hook for library function
12 assert_uint32
"$n" ||
exit 1
14 if [ "$decimal" -ne 0 ]; then
16 elif [ "$hexadecimal" -ne 0 ]; then
17 export -- "$var=$(printf "%x
" "$n")"
24 echo "Usage: $PROG [ -d | -x ] address/prefix [ start limit ]" >&2
30 if [ "$1" = "-d" ]; then
33 elif [ "$1" = "-x" ]; then
44 # data is n.n.n.n/m.m.m.m format, like on a Cisco router
45 str2ip ipaddr
"${1%/*}" ||
exit 1
46 str2ip netmask
"${1#*/}" ||
exit 1
50 # more modern prefix notation of n.n.n.n/p
51 str2ip ipaddr
"${1%/*}" ||
exit 1
53 assert_uint32
"$prefix" ||
exit 1
54 if [ "$prefix" -gt 32 ]; then
55 printf "Prefix out of range (%s)\n" "$prefix" >&2
58 prefix2netmask netmask
"$prefix" ||
exit 1
62 # address and netmask as two separate arguments
63 str2ip ipaddr
"$1" ||
exit 1
64 str2ip netmask
"$2" ||
exit 1
69 # we either have no arguments left, or we have a range start and length
70 if [ $# -ne 0 ] && [ $# -ne 2 ]; then
74 if ! bitcount prefix
"$netmask"; then
75 printf "Invalid netmask (%s)\n" "$netmask" >&2
79 # complement of the netmask, i.e. the hostmask
80 hostmask
=$
((netmask ^
0xffffffff))
81 network
=$
((ipaddr
& netmask
))
82 broadcast
=$
((network | hostmask
))
83 count
=$
((hostmask
+ 1))
86 _ip2str NETMASK
"$netmask"
87 _ip2str NETWORK
"$network"
90 echo "NETMASK=$NETMASK"
91 # don't include this-network or broadcast addresses
92 if [ "$prefix" -le 30 ]; then
93 _ip2str BROADCAST
"$broadcast"
94 echo "BROADCAST=$BROADCAST"
96 echo "NETWORK=$NETWORK"
100 # if there's no range, we're done
101 [ $# -eq 0 ] && exit 0
103 if [ "$prefix" -le 30 ]; then
104 lower
=$
((network
+ 1))
110 assert_uint32
"$start" ||
exit 1
111 start
=$
((network |
(start
& hostmask
)))
112 [ "$start" -lt "$lower" ] && start
="$lower"
113 [ "$start" -eq "$ipaddr" ] && start
=$
((start
+ 1))
115 if [ "$prefix" -le 30 ]; then
116 upper
=$
(((network | hostmask
) - 1))
122 assert_uint32
"$range" ||
exit 1
123 end
=$
((start
+ range
- 1))
124 [ "$end" -gt "$upper" ] && end
="$upper"
125 [ "$end" -eq "$ipaddr" ] && end
=$
((end
- 1))
127 if [ "$start" -gt "$end" ]; then
128 echo "network ($NETWORK/$prefix) too small" >&2
132 _ip2str START
"$start"
135 if [ "$start" -le "$ipaddr" ] && [ "$ipaddr" -le "$end" ]; then
136 echo "error: address $IP inside range $START..$END" >&2