aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2016-10-23 16:35:11 -0700
committerRobin H. Johnson <robbat2@gentoo.org>2016-10-23 16:35:11 -0700
commitc0e9d13165c53ee934b25883b03ff39ef04e2904 (patch)
tree92963e0f76816cc0bed6cdedc1dabffb05714363
parentiproute2: prepare for error-checking on ip addr/route/tunnel. (diff)
downloadnetifrc-c0e9d13165c53ee934b25883b03ff39ef04e2904.tar.gz
netifrc-c0e9d13165c53ee934b25883b03ff39ef04e2904.tar.bz2
netifrc-c0e9d13165c53ee934b25883b03ff39ef04e2904.zip
iproute2: capture the family and always set netmask explicitly.
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
-rw-r--r--net/iproute2.sh39
1 files changed, 27 insertions, 12 deletions
diff --git a/net/iproute2.sh b/net/iproute2.sh
index 6cf9aef..f15f3af 100644
--- a/net/iproute2.sh
+++ b/net/iproute2.sh
@@ -109,17 +109,31 @@ _add_address()
local x
local address netmask broadcast peer anycast label scope
local valid_lft preferred_lft home nodad
- local confflaglist
- address="$1" ; shift
+ local confflaglist family raw_address family_maxnetmask
+ raw_address="$1" ; shift
+ # Extract the netmask on address if present.
+ if [ "${address%\/*}" != "${address}" ]; then
+ address="${raw_address%\/*}"
+ netmask="${raw_address#*\/}"
+ else
+ address="$raw_address"
+ fi
+
+ # Some options are not valid for one family or the other.
+ case ${address} in
+ *:*) family=6 family_maxnetmask=128 ;;
+ *) family=4 family_maxnetmask=32 ;;
+ esac
+
while [ -n "$*" ]; do
x=$1 ; shift
case "$x" in
netmask|ne*)
- netmask="/$(_netmask2cidr "$1")"
- if [ "${address/\/}" != "${address}" ]; then
- eerror "Too many netmasks: $address netmask $1"
+ if [ -n "${netmask}" ]; then
+ eerror "Too many netmasks: $raw_address netmask $1"
return 1
fi
+ netmask="/$(_netmask2cidr "$1")"
shift ;;
broadcast|brd|br*)
broadcast="$1" ; shift ;;
@@ -155,15 +169,16 @@ _add_address()
# figure out the broadcast address if it is not specified
# This must NOT be set for IPv6 addresses
- if [ "${address#*:}" = "${address}" ]; then
- [ -z "$broadcast" ] && broadcast="+"
- elif [ -n "$broadcast" ]; then
- eerror "Broadcast keywords are not valid with IPv6 addresses"
- return 1
- fi
+ case $family in
+ 4) [ -z "$broadcast" ] && broadcast="+" ;;
+ 6) [ -n "$broadcast" ] && eerror "Broadcast keywords are not valid with IPv6 addresses" && return 1 ;;
+ esac
+
+ # Always have a netmask
+ [ -z "$netmask" ] && netmask=$family_maxnetmask
# This must appear on a single line, continuations cannot be used
- set -- "${address}${netmask}" ${peer:+peer} ${peer} ${broadcast:+broadcast} ${broadcast} ${anycast:+anycast} ${anycast} ${label:+label} ${label} ${scope:+scope} ${scope} dev "${IFACE}" ${valid_lft:+valid_lft} $valid_lft ${preferred_lft:+preferred_lft} $preferred_lft $confflaglist
+ set -- "${address}${netmask:+/}${netmask}" ${peer:+peer} ${peer} ${broadcast:+broadcast} ${broadcast} ${anycast:+anycast} ${anycast} ${label:+label} ${label} ${scope:+scope} ${scope} dev "${IFACE}" ${valid_lft:+valid_lft} $valid_lft ${preferred_lft:+preferred_lft} $preferred_lft $confflaglist
veinfo ip addr add "$@"
ip addr add "$@"
rc=$?