From owner-freebsd-rc@FreeBSD.ORG Tue Feb 7 14:27:00 2012 Return-Path: Delivered-To: freebsd-rc@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0ADA410656D3; Tue, 7 Feb 2012 14:27:00 +0000 (UTC) (envelope-from hrs@FreeBSD.org) Received: from mail.allbsd.org (gatekeeper-int.allbsd.org [IPv6:2001:2f0:104:e002::2]) by mx1.freebsd.org (Postfix) with ESMTP id 744958FC19; Tue, 7 Feb 2012 14:26:58 +0000 (UTC) Received: from alph.allbsd.org (p1012-ipbf2105funabasi.chiba.ocn.ne.jp [114.148.160.12]) (authenticated bits=128) by mail.allbsd.org (8.14.4/8.14.4) with ESMTP id q17EQULt081347; Tue, 7 Feb 2012 23:26:40 +0900 (JST) (envelope-from hrs@FreeBSD.org) Received: from localhost (localhost [IPv6:::1]) (authenticated bits=0) by alph.allbsd.org (8.14.4/8.14.4) with ESMTP id q17EQRQn017341; Tue, 7 Feb 2012 23:26:30 +0900 (JST) (envelope-from hrs@FreeBSD.org) Date: Tue, 07 Feb 2012 23:24:17 +0900 (JST) Message-Id: <20120207.232417.487789017555472392.hrs@allbsd.org> To: erdgeist@erdgeist.org, se@FreeBSD.org From: Hiroki Sato In-Reply-To: <20120207.170255.161251905285915806.hrs@allbsd.org> <4F3100C3.4040700@freebsd.org> References: <20120207.072925.1861639312875773760.hrs@allbsd.org> <4F3088C8.9090505@erdgeist.org> <20120207.170255.161251905285915806.hrs@allbsd.org> X-PGPkey-fingerprint: BDB3 443F A5DD B3D0 A530 FFD7 4F2C D3D8 2793 CF2D X-Mailer: Mew version 6.4 on Emacs 23.3 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Multipart/Signed; protocol="application/pgp-signature"; micalg=pgp-sha1; boundary="--Security_Multipart0(Tue_Feb__7_23_24_17_2012_986)--" Content-Transfer-Encoding: 7bit X-Virus-Scanned: clamav-milter 0.97 at gatekeeper.allbsd.org X-Virus-Status: Clean X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.3 (mail.allbsd.org [133.31.130.32]); Tue, 07 Feb 2012 23:26:45 +0900 (JST) X-Spam-Status: No, score=-99.9 required=13.0 tests=BAYES_00, CONTENT_TYPE_PRESENT,FAKEDWORD_ZERO,QENCPTR1,QENCPTR2,RCVD_IN_PBL, RCVD_IN_RP_RNBL, SPF_SOFTFAIL, USER_IN_WHITELIST autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on gatekeeper.allbsd.org Cc: freebsd-rc@FreeBSD.org Subject: Re: Proposal ipv6_addrs_common X-BeenThere: freebsd-rc@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussion related to /etc/rc.d design and implementation." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Feb 2012 14:27:00 -0000 ----Security_Multipart0(Tue_Feb__7_23_24_17_2012_986)-- Content-Type: Multipart/Mixed; boundary="--Next_Part(Tue_Feb__7_23_24_17_2012_022)--" Content-Transfer-Encoding: 7bit ----Next_Part(Tue_Feb__7_23_24_17_2012_022)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Dirk Engling wrote in <4F3088C8.9090505@erdgeist.org>: 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 wrote in <4F3100C3.4040700@freebsd.org>: 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 metric 0 mtu 1500 options=80000 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 hrs@dev1 % sudo /etc/rc.d/netif stop tap0 Stopping Network: tap0. tap0: flags=8842 metric 0 mtu 1500 options=80000 ether 00:bd:bf:28:00:00 nd6 options=23 ---- Comments are welcome. I am moving onto implementing address range expansion to this framework. -- Hiroki ----Next_Part(Tue_Feb__7_23_24_17_2012_022)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="network.subr.20120207-1.diff" 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 } ----Next_Part(Tue_Feb__7_23_24_17_2012_022)---- ----Security_Multipart0(Tue_Feb__7_23_24_17_2012_986)-- Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (FreeBSD) iEYEABECAAYFAk8xNBEACgkQTyzT2CeTzy1+ZACgr4Q/qKXH8LdEx6VzU+mhwkxR TqcAoJQDShk40wFz/vX21FUBbsjqS+OZ =7xWP -----END PGP SIGNATURE----- ----Security_Multipart0(Tue_Feb__7_23_24_17_2012_986)----