conf/92433: /etc/nework.subr cannot handle interfaces like bge0.13 properly

Alex Semenyaka alexs at snark.rinet.ru
Fri Jan 27 10:00:29 PST 2006


>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 at 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:


More information about the freebsd-bugs mailing list