Date: Fri, 27 Jan 2006 20:54:34 +0300 (MSK) From: Alex Semenyaka <alexs@snark.rinet.ru> To: FreeBSD-gnats-submit@FreeBSD.org Cc: glebius@cell.sick.ru Subject: conf/92433: /etc/nework.subr cannot handle interfaces like bge0.13 properly Message-ID: <200601271754.k0RHsYbI063995@snark.rinet.ru> Resent-Message-ID: <200601271800.k0RI0F6l031490@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 92433 >Category: conf >Synopsis: /etc/nework.subr cannot handle interfaces like bge0.13 properly >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Jan 27 18:00:15 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Alex Semenyaka >Release: FreeBSD 6.0-STABLE amd64 >Organization: ZAO "SonicDuo" >Environment: FreeBSD packets-sr2.sonicduo.com 6.0-RELEASE FreeBSD 6.0-RELEASE #0: Thu Nov 3 09:36:13 UTC 2005 root@x64.samsco.home:/usr/obj/usr/src/sys/GENERIC i386 >Description: The interface name like "bge0.13" listed as the cloned interfaces in the /etc/rc.conf cannot be handled by /etc/network.subr properly. Thus interfaces with those names cannot be configured. >How-To-Repeat: 1. Add the interface with the dot in the name to the list of cloned interfaces. 2. Add configuration for it. 3. Run /etc/rc.d/netif start >Fix: 1) Add procedure to trasform interface names with dots with the names without dot. In this way they will be used in the configuration strings of /etc/rc.conf. Example: from "bge0.13" will obtain "bge0_13". The corresponding config-string in /etc/rc.conf will be ifconfig_bge0_13="inet 10.0.13.1 netmask 255.255.255.0" 2) classify procedures from network.subr into the three groups. First group needs real name of the interface only, so we can feed it as is without changes. Second one needs only modifyed name to work with the configuration. Third group needs both. 3) In the procedures belonging to the third group we will transform the real interface name to the name without dot to use inside and pass as the argument to the procedures from the second group. Here is the patch for FreeBSD 6.0-RELEASE. If this change is acceptable I'll prepare the patch for CURRENT. --- network.subr.old Fri Jan 27 20:08:21 2006 +++ network.subr Fri Jan 27 20:28:55 2006 @@ -30,6 +30,21 @@ # Requires that rc.conf be loaded first. # +# cfg_ifname if +# Evaluate the name for the dotted VLAN interface which should +# be used inrc.conf (for example, makes "bge0_1" from "bge0.1") +# and print it out to the stdout. +cfg_ifname() +{ + _devpart=${1%.*} + _vlanpart=${1#*.} + if [ -n "${_vlanpart}" ]; then + echo "${_devpart}_${_vlanpart}" + else + echo $1 + fi +} + # ifconfig_up if # Evaluate ifconfig(8) arguments for interface $if and # run ifconfig(8) with those arguments. It returns 0 if @@ -41,14 +56,16 @@ { _cfg=1 - ifconfig_args=`ifconfig_getargs $1` + _cfgif="`cfg_ifname "$1"`" + + ifconfig_args=`ifconfig_getargs "${_cfgif}"` if [ -n "${ifconfig_args}" ]; then ifconfig $1 up eval "ifconfig $1 ${ifconfig_args}" _cfg=0 fi - if wpaif $1; then + if wpaif "${_cfgif}"; then if [ $_cfg -ne 0 ] ; then ifconfig $1 up fi @@ -56,7 +73,7 @@ _cfg=0 # XXX: not sure this should count fi - if dhcpif $1; then + if dhcpif "${_cfgif}"; then if [ $_cfg -ne 0 ] ; then ifconfig $1 up fi @@ -78,6 +95,8 @@ _ifs="^" _cfg=1 + _cfgif="`cfg_ifname "$1"`" + inetList="`ifconfig $1 | grep 'inet ' | tr "\n" "$_ifs"`" oldifs="$IFS" @@ -95,12 +114,12 @@ done IFS="$oldifs" - if wpaif $1; then + if wpaif "${_cfgif}"; then /etc/rc.d/wpa_supplicant stop $1 _cfg=0 fi - if dhcpif $1; then + if dhcpif "${_cfgif}"; then /etc/rc.d/dhclient stop $1 _cfg=0 fi @@ -108,7 +127,7 @@ return $_cfg } -# _ifconfig_getargs if +# _ifconfig_getargs cfgif # Echos the arguments for the supplied interface to stdout. # returns 1 if empty. In general, ifconfig_getargs should be used # outside this file. @@ -124,7 +143,7 @@ echo "$_args" } -# ifconfig_getargs if +# ifconfig_getargs cfgif # Takes the result from _ifconfig_getargs and removes pseudo # args such as DHCP and WPA. ifconfig_getargs() @@ -152,7 +171,7 @@ echo $_args } -# autoif +# autoif cfgif # Returns 0 if the interface should be automaticly configured at # boot time and 1 otherwise. autoif() @@ -168,7 +187,7 @@ return 0 } -# dhcpif if +# dhcpif cfgif # Returns 0 if the interface is a DHCP interface and 1 otherwise. dhcpif() { @@ -183,7 +202,7 @@ return 1 } -# wpaif if +# wpaif cfgif # Returns 0 if the interface is a WPA interface and 1 otherwise. wpaif() { @@ -207,8 +226,11 @@ { _ret=1 alias=0 + + _cfgif="`cfg_ifname "$1"`" + while : ; do - eval ifconfig_args=\$ifconfig_$1_alias${alias} + eval ifconfig_args=\$ifconfig_${_cfgif}_alias${alias} if [ -n "${ifconfig_args}" ]; then ifconfig $1 ${ifconfig_args} alias alias=$((${alias} + 1)) @@ -229,8 +251,11 @@ { _ret=1 alias=0 + + _cfgif="`cfg_ifname "$1"`" + while : ; do - eval ifconfig_args=\$ifconfig_$1_alias${alias} + eval ifconfig_args=\$ifconfig_${_cfgif}_alias${alias} if [ -n "${ifconfig_args}" ]; then ifconfig $1 ${ifconfig_args} -alias alias=$((${alias} + 1)) @@ -380,7 +405,8 @@ _ifn_list="`ifconfig -l`" [ -z "$_ifn_list" ] && return 0 for _if in ${_ifn_list} ; do - eval _ifname=\$ifconfig_${_if}_name + _cfgif="`cfg_ifname "$1"`" + eval _ifname=\$ifconfig_${_cfgif}_name if [ ! -z "$_ifname" ]; then ifconfig $_if name $_ifname fi @@ -438,11 +464,12 @@ _aprefix= _bprefix= for _if in ${_tmplist} ; do - if dhcpif $_if; then - _dhcplist="${_dhcplist}${_aprefix}${_if}" + _cfgif="`cfg_ifname "$1"`" + if dhcpif $_cfgif; then + _dhcplist="${_dhcplist}${_aprefix}${_cfgif}" [ -z "$_aprefix" ] && _aprefix=' ' - elif [ -n "`_ifconfig_getargs $if`" ]; then - _nodhcplist="${_nodhcplist}${_bprefix}${_if}" + elif [ -n "`_ifconfig_getargs $cfgif`" ]; then + _nodhcplist="${_nodhcplist}${_bprefix}${_cfgif}" [ -z "$_bprefix" ] && _bprefix=' ' fi done @@ -560,8 +587,9 @@ for i in $interfaces; do alias=0 + _cfgif="`cfg_ifname "$i"`" while : ; do - eval ipv6_ifconfig=\$ipv6_ifconfig_${i}_alias${alias} + eval ipv6_ifconfig=\$ipv6_ifconfig_${_cfgif}_alias${alias} if [ -z "${ipv6_ifconfig}" ]; then break; fi >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200601271754.k0RHsYbI063995>