Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
Bug 89901 - Alias broking when using ifconfig_ethX, bad route add when using iface_ethx instead of ifconfig_ethx
Summary: Alias broking when using ifconfig_ethX, bad route add when using iface_ethx i...
Status: RESOLVED WONTFIX
Alias: None
Product: Gentoo Linux
Classification: Unclassified
Component: [OLD] baselayout (show other bugs)
Hardware: x86 Linux
: High normal (vote)
Assignee: Gentoo's Team for Core System packages
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-04-21 01:25 UTC by Franc SERRES
Modified: 2005-04-21 01:52 UTC (History)
1 user (show)

See Also:
Package list:
Runtime testing required: ---


Attachments
Patch with bonding support (net.eth0,9.96 KB, text/plain)
2005-04-21 01:30 UTC, Franc SERRES
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Franc SERRES 2005-04-21 01:25:11 UTC
I'm correct this, and i adding bonding function.
See french link
http://fr.gentoo-wiki.com/HOWTO_Accouplement_d%27interfaces_r%C3%A9seau


Reproducible: Always
Steps to Reproduce:
1.
2.
3.

Actual Results:  
Patch : 
#!/sbin/runscript 
# Copyright 1999-2004 Gentoo Technologies, Inc. 
# Distributed under the terms of the GNU General Public License v2 
# $Header: /home/cvsroot/gentoo-src/rc-scripts/init.d/net.eth0,v 1.41 
2004/05/10 14:16:35 agriffis Exp $ 
 
#NB: Config is in /etc/conf.d/net 
 
if [[ -n $NET_DEBUG ]]; then 
	set -x 
	devnull=/dev/stderr 
else 
	devnull=/dev/null 
fi 
 
# For pcmcia users. note that pcmcia must be added to the same 
# runlevel as the net.* script that needs it. 
depend() { 
	use hotplug pcmcia 
} 
 
checkconfig() { 
	if [[ -z "${ifconfig_IFACE}" ]]; then 
		eerror "Please make sure that /etc/conf.d/net has 
\$ifconfig_$IFACE set" 
		eerror "(or \$iface_$IFACE for old-style configuration)" 
		return 1 
	fi 
	if [[ -n "${vlans_IFACE}" && ! -x /sbin/vconfig ]]; then 
		eerror "For VLAN (802.1q) support, emerge net-misc/vconfig" 
		return 1 
	fi 
	if [[ -n "${bonding_IFACE}" && ! -x /sbin/ifenslave ]]; then 
		eerror "For Bonding support, emerge net-misc/ifenslave" 
		return 1 
	fi 
} 
 
# Fix bug 50039 (init.d/net.eth0 localization) 
# Some other commands in this script might need to be wrapped, but 
# we'll get them one-by-one.  Note that LC_ALL trumps LC_anything_else 
# according to locale(7) 
ifconfig() { 
	LC_ALL=C /sbin/ifconfig "$@" 
} 
 
# setup_vars: setup variables based on $1 and content of /etc/conf.d/net 
# The following variables are set, which should be declared local by 
# the calling routine. 
#	status_IFACE			(up or '') 
#	vlans_IFACE			(space-separated list) 
#	ifconfig_IFACE			(array of ifconfig lines, replaces 
iface_IFACE) 
#	dhcpcd_IFACE			(command-line args for dhcpcd) 
#	routes_IFACE			(array of route lines) 
#	inet6_IFACE			(array of inet6 lines) 
#	ifconfig_fallback_IFACE		(fallback ifconfig if dhcp fails) 
#	bonding_IFACE			(array of ethernets networks cards 
bonding) 
setup_vars() { 
	local i iface="${1//\./_}" 
 
	status_IFACE="$(ifconfig ${1} 2>${devnull} | gawk '$1 == "UP" {print 
"up"}')" 
	eval vlans_IFACE=\"\$\{iface_${iface}_vlans\}\" 
	eval ifconfig_IFACE=( \"\$\{ifconfig_$iface\[@\]\}\" ) 
	eval dhcpcd_IFACE=\"\$\{dhcpcd_$iface\}\" 
	eval routes_IFACE=( \"\$\{routes_$iface\[@\]\}\" ) 
	eval inet6_IFACE=( \"\$\{inet6_$iface\[@\]\}\" ) 
	eval 
ifconfig_fallback_IFACE=( \"\$\{ifconfig_fallback_$iface\[@\]\}\" ) 
	eval bonding_IFACE=( \"\$\{bonding_$iface\[@\]\}\" ) 
 
	# BACKWARD COMPATIBILITY: populate the ifconfig_IFACE array 
	# if iface_IFACE is set (fex. iface_eth0 instead of ifconfig_eth0) 
	eval local iface_IFACE=\"\$\{iface_$iface\}\" 
	if [[ -n ${iface_IFACE} && -z ${ifconfig_IFACE} ]]; then 
		# Start with the primary interface 
		ifconfig_IFACE=( "${iface_IFACE}" ) 
	fi 
	 
	if [[ -n ${ifconfig_IFACE} ]]; then 
		# Make sure these get evaluated as arrays 
		local -a aliases broadcasts netmasks 
		 
		 
		# ..then add aliases 
		eval aliases=( \$\{alias_$iface\} ) 
		eval broadcasts=( \$\{broadcast_$iface\} ) 
		eval netmasks=( \$\{netmask_$iface\} ) 
		for ((i = 0; i < ${#aliases[@]}; i = i + 1)); do 
			ifconfig_IFACE[i+1]="${aliases[i]} ${broadcasts[i]:
+broadcast ${broadcasts[i]}} ${netmasks[i]:+netmask ${netmasks[i]}}" 
		done 
	fi 
	 
 
	# BACKWARD COMPATIBILITY: check for space-separated inet6 addresses 
	if [[ ${#inet6_IFACE[@]} == 1 && ${inet6_IFACE} == *' '* ]]; then 
		inet6_IFACE=( ${inet6_IFACE} ) 
	fi 
} 
 
iface_start() { 
	local IFACE=${1} i x retval 
	checkconfig || return 1 
 
	if [[ ${ifconfig_IFACE} != dhcp ]]; then 
		# Show the address, but catch if this interface will be inet6 
only 
		i=${ifconfig_IFACE%% *} 
		if [[ ${i} == *.*.*.* ]]; then 
			ebegin "Bringing ${IFACE} up (${i})" 
		else 
			ebegin "Bringing ${IFACE} up" 
		fi 
		# ifconfig does not always return failure .. 
		ifconfig ${IFACE} ${ifconfig_IFACE} >${devnull} && \ 
		ifconfig ${IFACE} up &>${devnull} 
		eend $? || return $? 
		if [[ -n "${bonding_IFACE}" ]]; then 
			ifenslave ${IFACE} ${bonding_IFACE} &>${devnull} 
			eend $? || return $? 
		fi 
	else 
		# Check that eth0 was not brought up by the kernel ... 
		if [[ ${status_IFACE} == up ]]; then 
			einfo "Keeping kernel configuration for ${IFACE}" 
		else 
			ebegin "Bringing ${IFACE} up via DHCP" 
			/sbin/dhcpcd ${dhcpcd_IFACE} ${IFACE} 
			retval=$? 
			eend $retval 
			if [[ $retval == 0 ]]; then 
				# DHCP succeeded, show address retrieved 
				i=$(ifconfig ${IFACE} | grep -m1 -o 'inet addr:
[^ ]*' |  
					cut -d: -f2) 
				[[ -n ${i} ]] && einfo "  ${IFACE} received 
address ${i}" 
			elif [[ -n "${ifconfig_fallback_IFACE}" ]]; then 
				# DHCP failed, try fallback. 
				# Show the address, but catch if this interface 
will be inet6 only 
				i=${ifconfig_fallback_IFACE%% *} 
				if [[ ${i} == *.*.*.* ]]; then 
					ebegin "Using fallback configuration 
(${i}) for ${IFACE}" 
				else 
					ebegin "Using fallback configuration 
for ${IFACE}" 
				fi 
				ifconfig ${IFACE} ${ifconfig_fallback_IFACE} 
>${devnull} && \ 
				ifconfig ${IFACE} up &>${devnull} 
				eend $? || return $? 
			else 
				return $retval 
			fi 
		fi 
	fi 
 
	if [[ ${#ifconfig_IFACE[@]} -gt 1 ]]; then 
		einfo "  Adding aliases" 
		for ((i = 1; i < ${#ifconfig_IFACE[@]}; i = i + 1)); do 
			ebegin "    ${IFACE}:${i} (${ifconfig_IFACE[i]%% *})" 
			ifconfig ${IFACE}:${i} ${ifconfig_IFACE[i]} 
			eend $? 
		done 
	fi 
 
	if [[ -n ${inet6_IFACE} ]]; then 
		einfo "  Adding inet6 addresses" 
		for ((i = 0; i < ${#inet6_IFACE[@]}; i = i + 1)); do 
			ebegin "    ${IFACE} inet6 add ${inet6_IFACE[i]}" 
			ifconfig ${IFACE} inet6 add ${inet6_IFACE[i]} 
>${devnull} 
			eend $? 
		done 
	fi 
 
	# Set static routes 
	if [[ -n ${routes_IFACE} ]]; then 
		einfo "  Adding routes" 
		for ((i = 0; i < ${#routes_IFACE[@]}; i = i + 1)); do 
			ebegin "    ${routes_IFACE[i]}" 
			/sbin/route add ${routes_IFACE[i]} 
			eend $? 
		done 
	fi 
 
	# Set default route if applicable to this interface 
	if [[ ${gateway} == ${IFACE}/* ]]; then 
		local ogw=$(/bin/netstat -rn | awk '$1 == "0.0.0.0" {print 
$2}') 
		local gw=${gateway#*/} 
		if [[ ${ogw} != ${gw} ]]; then 
			ebegin "  Setting default gateway ($gw)" 
 
			# First delete any existing route if it was setup by 
kernel... 
			/sbin/route del default dev ${IFACE} &>${devnull} 
 
			# Second delete old gateway if it was set... 
			/sbin/route del default gw ${ogw} &>${devnull} 
 
			# Third add our new default gateway 
			/sbin/route add default gw ${gw} >${devnull} 
			eend $? || { 
				true # need to have some command in here 
				# Note: This originally called stop, which is 
obviously 
				# wrong since it's calling with a local version 
of IFACE. 
				# The below code works correctly to abort 
configuration of 
				# the interface, but is commented because we're 
assuming 
				# that default route failure should not cause 
the interface 
				# to be unconfigured. 
				#local error=$? 
				#ewarn "Aborting configuration of ${IFACE}" 
				#iface_stop ${IFACE} 
				#return ${error} 
			} 
		fi 
	fi 
 
	# Enabling rp_filter causes wacky packets to be auto-dropped by 
	# the kernel.  Note that we only do this if it is not set via 
	# /etc/sysctl.conf ... 
	if [[ -e /proc/sys/net/ipv4/conf/${IFACE}/rp_filter && \ 
			-z "$(grep -s '^[^#]*rp_filter' /etc/sysctl.conf)" ]]; 
then 
		echo -n 1 > /proc/sys/net/ipv4/conf/${IFACE}/rp_filter 
	fi 
} 
 
# iface_stop: bring down an interface.  Don't trust information in 
# /etc/conf.d/net since the configuration might have changed since 
# iface_start ran.  Instead query for current configuration and bring 
# down the interface. 
iface_stop() { 
	local IFACE=${1} i x aliases inet6 count 
 
	# Try to do a simple down (no aliases, no inet6, no dhcp) 
	aliases="$(ifconfig | grep -o "^$IFACE:[0-9]*" | tac)" 
	inet6="$(ifconfig ${IFACE} | awk '$1 == "inet6" {print $2}')" 
	if [[ -z ${aliases} && -z ${inet6} && ! 
-e /var/run/dhcpcd-${IFACE}.pid ]]; then 
		ebegin "Bringing ${IFACE} down" 
		ifconfig ${IFACE} down &>/dev/null 
		eend 0 
		return 0 
	fi 
 
	einfo "Bringing ${IFACE} down" 
 
	# Stop aliases before primary interface. 
	# Note this must be done in reverse order, since ifconfig eth0:1  
	# will remove eth0:2, etc.  It might be sufficient to simply remove  
	# the base interface but we're being safe here. 
	for i in ${aliases} ${IFACE}; do 
 
		# Delete all the inet6 addresses for this interface 
		inet6="$(ifconfig ${i} | awk '$1 == "inet6" {print $3}')" 
		if [[ -n ${inet6} ]]; then 
			einfo "  Removing inet6 addresses" 
			for x in ${inet6}; do  
				ebegin "    ${IFACE} inet6 del ${x}" 
				ifconfig ${i} inet6 del ${x} 
				eend $? 
			done 
		fi 
 
		# Stop DHCP (should be N/A for aliases) 
		# Don't trust current configuration... investigate ourselves 
		if /sbin/dhcpcd -z ${i} &>${devnull}; then 
			ebegin "  Releasing DHCP lease for ${IFACE}" 
			for ((count = 0; count < 9; count = count + 1)); do 
				/sbin/dhcpcd -z ${i} &>${devnull} || break 
				sleep 1 
			done 
			[[ ${count} -lt 9 ]] 
			eend $? "Timed out" 
		fi 
		ebegin "  Stopping ${i}" 
		ifconfig ${i} down &>${devnull} 
		eend 0 
	done 
 
	return 0 
} 
 
start() { 
	# These variables are set by setup_vars 
	local status_IFACE vlans_IFACE dhcpcd_IFACE  
	local -a ifconfig_IFACE routes_IFACE inet6_IFACE 
 
	# Call user-defined preup function if it exists 
	if [[ $(type -t preup) == function ]]; then 
		einfo "Running preup function" 
		preup ${IFACE} || { 
			eerror "preup ${IFACE} failed" 
			return 1 
		} 
	fi 
 
	# Start the primary interface and aliases 
	setup_vars ${IFACE} 
	iface_start ${IFACE} || return 1 
 
	# Start vlans 
	local vlan 
	for vlan in ${vlans_IFACE}; do 
		/sbin/vconfig add ${IFACE} ${vlan} >${devnull} 
		setup_vars ${IFACE}.${vlan} 
		iface_start ${IFACE}.${vlan} 
	done 
 
	# Call user-defined postup function if it exists 
	if [[ $(type -t postup) == function ]]; then 
		einfo "Running postup function" 
		postup ${IFACE} 
	fi 
} 
 
stop() { 
	# Call user-defined predown function if it exists 
	if [[ $(type -t predown) == function ]]; then 
		einfo "Running predown function" 
		predown ${IFACE} 
	fi 
 
	# Don't depend on setup_vars since configuration might have changed. 
	# Investigate current configuration instead. 
	local vlan 
	for vlan in $(ifconfig | grep -o "^${IFACE}\.[^ ]*"); do 
		iface_stop ${vlan} 
		/sbin/vconfig rem ${vlan} >${devnull} 
	done 
 
	iface_stop ${IFACE} || return 1  # always succeeds, btw 
 
	# Call user-defined postdown function if it exists 
	if [[ $(type -t postdown) == function ]]; then 
		einfo "Running postdown function" 
		postdown ${IFACE} 
	fi 
} 
 
# vim:ts=4 
 


emerge info 
Portage 2.0.51.19 (default-linux/x86/2005.0, gcc-3.3.5-20050130, 
glibc-2.3.4.20041102-r1, 2.6.11-gentoo-r4 i686) 
================================================================= 
System uname: 2.6.11-gentoo-r4 i686 Intel(R) Pentium(R) 4 CPU 2.40GHz 
Gentoo Base System version 1.4.16 
Python:              dev-lang/python-2.3.4-r1 [2.3.4 (#1, Feb 28 2005, 
11:57:04)] 
distcc 2.16 i686-pc-linux-gnu (protocols 1 and 2) (default port 3632) 
[disabled] 
ccache version 2.3 [enabled] 
dev-lang/python:     2.3.4-r1 
sys-devel/autoconf:  2.13, 2.59-r6 
sys-devel/automake:  1.8.5-r3, 1.5, 1.7.9-r1, 1.6.3, 1.4_p6, 1.9.4 
sys-devel/binutils:  2.15.92.0.2-r7 
sys-devel/libtool:   1.5.14 
virtual/os-headers:  2.6.8.1-r2 
ACCEPT_KEYWORDS="x86" 
AUTOCLEAN="yes" 
CFLAGS="-march=pentium4 -O2 -pipe" 
CHOST="i686-pc-linux-gnu" 
CONFIG_PROTECT="/etc /usr/kde/2/share/config /usr/kde/3/share/config /usr/lib/fax /usr/share/config /usr/share/texmf/dvipdfm/config/ /usr/share/texmf/dvips/config/ /usr/share/texmf/tex/generic/config/ /usr/share/texmf/tex/platex/config/ /usr/share/texmf/xdvi/ /var/qmail/control /var/spool/fax/etc" 
CONFIG_PROTECT_MASK="/etc/gconf /etc/terminfo /etc/env.d" 
CXXFLAGS="-march=pentium4 -O2 -pipe" 
DISTDIR="/usr/portage/distfiles" 
FEATURES="autoaddcvs autoconfig ccache distlocks sandbox sfperms" 
GENTOO_MIRRORS="http://distfiles.gentoo.org 
http://distro.ibiblio.org/pub/Linux/distributions/gentoo" 
LANG="fr_FR@euro" 
LC_ALL="fr_FR@euro" 
LINGUAS="fr" 
MAKEOPTS="-j2" 
PKGDIR="/usr/portage/packages" 
PORTAGE_TMPDIR="/var/tmp" 
PORTDIR="/usr/portage" 
SYNC="rsync://rsync.europe.gentoo.org/gentoo-portage" 
USE="x86 aalib acl apache2 audiofile avi berkdb bitmap-fonts bzlib caps cpdflib 
crypt cscope cups curl dba dbase dbx doc emboss encode ethereal exif fam 
fastcgi fftw flac flash foomaticdb fortran freetds ftp gcj gd gif gignac gpm 
gstreamer guile ifc imagemagick imap imlib innodb ipv6 jabber java jikes jpeg 
junit kerberos krb4 ladcca lcms ldap libg++ libwww mad maildir mailwrapper mbox 
mcal mcve memlimit mhash mikmod milter mime ming mmap mmx mng motif mp3 mpeg 
mpi msession mssql mysql mysqli ncurses netcdf nhc98 nls nocardbus nptl odbc 
offensive oggvorbis openal opengl oscar oss pam pcntl pcre pdflib perl pfpro 
php plotutils png postgres prelude python quicktime readline recode samba sasl 
scanner session shared simplexml slp snmp soap sockets socks5 speex spell spl 
sqlite sse ssl svg svga sysvpic szip tcpd tetex theora tidy tiff tokenizer 
truetype truetype-fonts type1-fonts unicode usb userlocales vhosts videos wmf 
xface xml xml2 xmlrpc xmms xpm xsl xv yaz zlib linguas_fr" 
Unset:  ASFLAGS, CBUILD, CTARGET, LDFLAGS, PORTDIR_OVERLAY
Comment 1 Franc SERRES 2005-04-21 01:30:28 UTC
Created attachment 56816 [details]
Patch with bonding support

Correct bug alias ip and add bonding support
Comment 2 Franc SERRES 2005-04-21 01:32:16 UTC
I try to help you, sory if i'm make mistake :(
Comment 3 Roy Marples (RETIRED) gentoo-dev 2005-04-21 01:52:49 UTC
baselayout-1.11.11 (currently ~ARCH) has bonding support.