Dirk Engling <[email protected]> wrote in <[email protected]>:
er> You can just accept them as positional paramters in a function, and er> then shift them out one by one, matching inet and inet6, switching er> state and returning an expanded string to be executed by the caller. Stefan Esser <[email protected]> wrote in <[email protected]>: se> Dirk Engling suggested to use white space as separator and to interpret se> "inet" and "inet6" as (optional) AF indicators. I like this idea a lot! se> se> You could omit inet/inet6 for all numeric addresses (any parameter with se> a colon is an IPv6 address) and just use inet/inet6 if an address is se> specified by name (e.g. a host name that can be resolved during system se> start and for which IPv4 and IPv6 addresses exist, e.g. in /etc/hosts). The attached patch is my first shot for this direction. This includes a new variable, $ifconfig_IF_aliases, but not includes the address range expansion yet. This is because I would like to get it reviewed first and go forward step-by-step. The goals are: - Keep backward compatibility. $ifconfig_IF_aliasN and $ipv6_ifconfig_IF_aliasN should work as before. - When an AF keyword is missing in ifconfig_IF_aliasN, try to recover by prepending "inet" automatically. Display a warning message only when adding an alias. - Remove duplicate code in network.subr as mush as possible. - Two bugfixes: return status of ifalias_up() and alias removal order in ipv4_down(). Configuration for testing is the following: ---- cloned_interfaces="tap0" ifconfig_tap0="up" ifconfig_tap0_alias0="10.9.1.1/24" ifconfig_tap0_alias1="10.9.2.1/24" ifconfig_tap0_alias3="10.9.3.1/24" ipv6_prefix_tap0="2001:db8:6666:2 2001:db8:7777:0" ipv6_ifconfig_tap0_alias0="2001:db8:7707:1::1 prefixlen 64" ipv6_ifconfig_tap0_alias1="2001:db8:7717:1:: prefixlen 64 eui64" ipv6_ifconfig_tap0_alias3="2001:db8:7737:1:: prefixlen 64 eui64" ifconfig_tap0_aliases="inet6 2001:db8:8888:2::1/64 inet6 2001:db8:9999:3::1/64 inet 10.8.1.1/24" ---- The results were: ---- hrs@dev1 % sudo /etc/rc.d/netif start tap0 /etc/rc.d/netif: WARNING: $ifconfig_tap0_alias0 needs "inet" keyword for an IPv4 address. /etc/rc.d/netif: WARNING: $ifconfig_tap0_alias1 needs "inet" keyword for an IPv4 address. /etc/rc.d/netif: WARNING: $ipv6_ifconfig_tap0_alias0 is obsolete. Use ifconfig_tap0_aliasN instead. /etc/rc.d/netif: WARNING: $ipv6_ifconfig_tap0_alias1 is obsolete. Use ifconfig_tap0_aliasN instead. Starting Network: tap0. tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=80000<LINKSTATE> ether 00:bd:bf:28:00:00 inet6 fe80::2bd:bfff:fe28:0%tap0 prefixlen 64 scopeid 0xb inet 10.8.1.1 netmask 0xffffff00 broadcast 10.8.1.255 inet 10.9.1.1 netmask 0xffffff00 broadcast 10.9.1.255 inet 10.9.2.1 netmask 0xffffff00 broadcast 10.9.2.255 inet6 2001:db8:8888:2::1 prefixlen 64 inet6 2001:db8:9999:3::1 prefixlen 64 inet6 2001:db8:7707:1::1 prefixlen 64 inet6 2001:db8:7717:1:2bd:bfff:fe28:0 prefixlen 64 inet6 2001:db8:6666:2:2bd:bfff:fe28:0 prefixlen 64 inet6 2001:db8:7777:0:2bd:bfff:fe28:0 prefixlen 64 nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL> hrs@dev1 % sudo /etc/rc.d/netif stop tap0 Stopping Network: tap0. tap0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=80000<LINKSTATE> ether 00:bd:bf:28:00:00 nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL> ---- Comments are welcome. I am moving onto implementing address range expansion to this framework. -- Hiroki
Index: etc/network.subr
===================================================================
--- etc/network.subr (revision 231128)
+++ etc/network.subr (working copy)
@@ -553,7 +553,7 @@
ifconfig ${_if} inet 127.0.0.1/8 alias
fi
fi
- ifalias_up ${_if} inet && _ret=0
+ ifalias ${_if} inet alias && _ret=0
ipv4_addrs_common ${_if} alias && _ret=0
return $_ret
@@ -571,7 +571,7 @@
return 0
fi
- ifalias_up ${_if} inet6 && _ret=0
+ ifalias ${_if} inet6 alias && _ret=0
ipv6_prefix_hostid_addr_common ${_if} alias && _ret=0
ipv6_accept_rtadv_up ${_if} && _ret=0
@@ -587,6 +587,9 @@
_ifs="^"
_ret=1
+ ifalias ${_if} inet -alias && _ret=0
+ ipv4_addrs_common ${_if} -alias && _ret=0
+
inetList="`ifconfig ${_if} | grep 'inet ' | tr "\n" "$_ifs"`"
oldifs="$IFS"
@@ -604,9 +607,6 @@
done
IFS="$oldifs"
- ifalias_down ${_if} inet && _ret=0
- ipv4_addrs_common ${_if} -alias && _ret=0
-
return $_ret
}
@@ -625,7 +625,7 @@
ipv6_accept_rtadv_down ${_if} && _ret=0
ipv6_prefix_hostid_addr_common ${_if} -alias && _ret=0
- ifalias_down ${_if} inet6 && _ret=0
+ ifalias ${_if} inet6 -alias && _ret=0
inetList="`ifconfig ${_if} | grep 'inet6 ' | tr "\n" "$_ifs"`"
@@ -690,191 +690,101 @@
return $_ret
}
-# ifalias_up if af
-# Configure aliases for network interface $if.
+# ifalias if af action
+# Configure or remove aliases for network interface $if.
# It returns 0 if at least one alias was configured or
-# 1 if there were none.
+# removed, or 1 if there were none.
#
-ifalias_up()
+ifalias()
{
local _ret
_ret=1
+ afexists $2 || return $_ret
+
case "$2" in
- inet)
- _ret=`ifalias_ipv4_up "$1"`
+ inet|inet6)
+ ifalias_af_common $1 $2 $3 && _ret=0
;;
- inet6)
- _ret=`ifalias_ipv6_up "$1"`
- ;;
esac
return $_ret
}
-# ifalias_ipv4_up if
-# Helper function for ifalias_up(). Handles IPv4.
+# ifalias_af_common if af action
+# Helper function for ifalias().
#
-ifalias_ipv4_up()
+ifalias_af_common()
{
- local _ret alias ifconfig_args
+ local _ret alias ifconfig_args _aliasn _L _tmpargs _if _af _action
_ret=1
+ _aliasn=
+ _if=$1
+ _af=$2
+ _action=$3
- # ifconfig_IF_aliasN which starts with "inet"
+ # ifconfig_IF_aliasN which starts with ${_af}
alias=0
while : ; do
- ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
- case "${ifconfig_args}" in
- inet\ *)
- ifconfig $1 ${ifconfig_args} alias && _ret=0
+ ifconfig_args=`get_if_var ${_if} ifconfig_IF_alias${alias}`
+ case ${_af}:${_action}:"${ifconfig_args}" in
+ ${_af}:*:${_af}\ *)
+ _aliasn="${_aliasn} ${ifconfig_args}"
;;
- inet6\ *)
- ;;
- "")
+ ${_af}:*:"")
break
;;
- *)
- warn "\$ifconfig_$1_alias${alias} needs " \
+ inet:alias:*)
+ _aliasn="${_aliasn} inet ${ifconfig_args}"
+ warn "\$ifconfig_${_if}_alias${alias} needs " \
"\"inet\" keyword for an IPv4 address."
- ifconfig $1 ${ifconfig_args} alias && _ret=0
- ;;
esac
alias=$((${alias} + 1))
done
- return $_ret
-}
-
-# ifalias_ipv6_up if
-# Helper function for ifalias_up(). Handles IPv6.
-#
-ifalias_ipv6_up()
-{
- local _ret alias ifconfig_args
- _ret=1
-
- # ifconfig_IF_aliasN which starts with "inet6"
- alias=0
- while : ; do
- ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
- case "${ifconfig_args}" in
- inet6\ *)
- ifconfig $1 ${ifconfig_args} alias && _ret=0
- ;;
- "")
- break
- ;;
- esac
- alias=$((${alias} + 1))
- done
-
# backward compatibility: ipv6_ifconfig_IF_aliasN.
- alias=0
- while : ; do
- ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
- case "${ifconfig_args}" in
- "")
- break
+ case ${_af} in
+ inet6)
+ alias=0
+ while : ; do
+ ifconfig_args=`get_if_var ${_if} ipv6_ifconfig_IF_alias${alias}`
+ case ${_action}:"${ifconfig_args}" in
+ *:"")
+ break
;;
- *)
- ifconfig $1 inet6 ${ifconfig_args} alias && _ret=0
- warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete." \
- " Use ifconfig_$1_aliasN instead."
+ alias:*)
+ _aliasn="${_aliasn} inet6 ${ifconfig_args}"
+ warn "\$ipv6_ifconfig_${_if}_alias${alias} " \
+ "is obsolete. Use ifconfig_$1_aliasN " \
+ "instead."
;;
- esac
- alias=$((${alias} + 1))
- done
-
- return $_ret
-}
-
-# ifalias_down if af
-# Remove aliases for network interface $if.
-# It returns 0 if at least one alias was removed or
-# 1 if there were none.
-#
-ifalias_down()
-{
- local _ret
- _ret=1
-
- case "$2" in
- inet)
- _ret=`ifalias_ipv4_down "$1"`
- ;;
- inet6)
- _ret=`ifalias_ipv6_down "$1"`
- ;;
+ esac
+ alias=$((${alias} + 1))
+ done
esac
- return $_ret
-}
-
-# ifalias_ipv4_down if
-# Helper function for ifalias_down(). Handles IPv4.
-#
-ifalias_ipv4_down()
-{
- local _ret alias ifconfig_args
- _ret=1
-
- # ifconfig_IF_aliasN which starts with "inet"
- alias=0
- while : ; do
- ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
- case "${ifconfig_args}" in
- inet\ *)
- ifconfig $1 ${ifconfig_args} -alias && _ret=0
+ # Handle both ifconfig_IF_aliases and ifconfig_IF_aliasN
+ _tmpargs=
+ for _L in `get_if_var ${_if} ifconfig_IF_aliases` ${_aliasn}; do
+ case ${_L} in
+ inet|inet6|ipx)
+ case ${_tmpargs} in
+ ${_af}\ *)
+ eval ifconfig $1 ${_tmpargs} ${_action} && _ret=0
;;
- "")
- break
- ;;
- esac
- alias=$((${alias} + 1))
- done
-
- return $_ret
-}
-
-# ifalias_ipv6_down if
-# Helper function for ifalias_down(). Handles IPv6.
-#
-ifalias_ipv6_down()
-{
- local _ret alias ifconfig_args
- _ret=1
-
- # ifconfig_IF_aliasN which starts with "inet6"
- alias=0
- while : ; do
- ifconfig_args=`get_if_var $1 ifconfig_IF_alias${alias}`
- case "${ifconfig_args}" in
- inet6\ *)
- ifconfig $1 ${ifconfig_args} -alias && _ret=0
- ;;
- "")
- break
- ;;
- esac
- alias=$((${alias} + 1))
- done
-
- # backward compatibility: ipv6_ifconfig_IF_aliasN.
- alias=0
- while : ; do
- ifconfig_args=`get_if_var $1 ipv6_ifconfig_IF_alias${alias}`
- case "${ifconfig_args}" in
- "")
- break
- ;;
+ esac
+ _tmpargs=${_L}
+ ;;
*)
- ifconfig $1 inet6 ${ifconfig_args} -alias && _ret=0
- warn "\$ipv6_ifconfig_$1_alias${alias} is obsolete." \
- " Use ifconfig_$1_aliasN instead."
- ;;
+ _tmpargs="${_tmpargs} ${_L}"
esac
- alias=$((${alias} + 1))
done
+ # ifconfig_IF_aliases: last component
+ case ${_tmpargs} in
+ ${_af}\ *)
+ eval ifconfig $1 ${_tmpargs} ${_action} && _ret=0
+ ;;
+ esac
return $_ret
}
pgpLEfMTSNNhv.pgp
Description: PGP signature
