[RFC] ifconfig: match by link-level address

Peter Pentchev roam at ringlet.net
Fri May 21 07:04:53 GMT 2004


On Thu, May 20, 2004 at 10:18:38AM -0700, Brooks Davis wrote:
> On Thu, May 20, 2004 at 07:29:19PM +0300, Peter Pentchev wrote:
> > Hi,
> > 
> > I found out recently that the Linux (or at least recent RedHat) startup
> > scripts could be configured to not bring up an Ethernet interface unless
> > it has a specified MAC address.  This, combined with the wonderful
> > interface renaming functionality recently committed to -CURRENT, led me
> > to the idea of interface renaming on boot-up, by hardware addresses -
> > something like 'I don't care how you detected this network card, or how
> > many others like it are there, but the card with MAC address
> > 00:03:0d:08:dc:a7 will be known as sis0int from now on'.
> > 
> > The main missing piece was the ability to find an interface by MAC
> > address; hence the attached patch, also available at
> > http://www.ringlet.net/~roam/bsd-patches/src5/sbin-ifconfig-hwmatch.patch
> > http://people.FreeBSD.org/~roam/bsd-patches/src5/sbin-ifconfig-hwmatch.patch
> > 
> > It teaches ifconfig(8) to treat interface "names" beginning with 'hw-'
> > as link-level addresses; ifconfig tries to find an interface with this
> > address and behaves as if its name was specified on the command line:
> > 
> > [roam at straylight ~/fbsd/r/src/sbin/ifconfig]> ./ifconfig hw-00:03:0d:08:dc:a7
> > sis0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> >         options=8<VLAN_MTU>
> >         inet 10.0.8.129 netmask 0xffff0000 broadcast 10.0.255.255
> >         inet 192.168.1.13 netmask 0xffffff00 broadcast 192.168.1.255
> >         ether 00:03:0d:08:dc:a7
> >         media: Ethernet autoselect (100baseTX <full-duplex>)
> >         status: active
> > [roam at straylight ~/fbsd/r/src/sbin/ifconfig]>
> > 
> > This could be the first step towards teaching rc.conf about something like
> > network_interfaces_rename="hw-00:03:0d:08:dc:a7 sis0int"
> > 
> > I had initially written my own function for parsing the user-supplied
> > address into a sequence of bytes instead of using ether_aton(); it would
> > have the advantage of being able to specify 'hw-' to match lo0's empty
> > link-level "address".  However, the odds of somebody actually wishing to
> > rename lo0 don't seem to be so high :)
> 
> I don't really like the idea of adding magic values to the interface
> namespace that only work with ifconfig.  If you want ifconfig to match
> the lladdr, I'd suggest adding a flag that means match interface by
> address instead of by name.  That would be a fairly simple change to
> your patch and seems like a potentialy useful feature.

Agreed, I don't like the magic hw- too much either, but.. see below for
more comments on this and interface renaming on startup.

> FWIW, I've talked to Warner about automaticly renaming interfaces based
> on things like their MAC address or their PCI slot and we think devd
> will eventually be the place to do this.  We're probably going to have
> to rethink interface configuration for this to work though.

Well, it turned out that adding basic interface renaming support to our
startup scripts wasn't all that hard - the attached patch, also at
http://www.ringlet.net/~roam/bsd-patches/src5/etc-iface-rename.patch
http://people.FreeBSD.org/~roam/bsd-patches/src5/etc-iface-rename.patch
seems to work for both 'sis0 ethlocal xl0 ethext' and
'hw-00:03:0d:08:dc:a7 ethlocal', since it just passes the interface name
to ifconfig(8).

If the link-level address matching should be done with a separate
ifconfig(8) option, the interface renaming may need to be split into two
stages controlled by two configuration variables - one specifying the
'source' interface by name, the other one by address, with the latter
code using the new ifconfig option.

Of course, this still leaves a problem with specifying the address for
an interface that has not yet been 'found' - after all, we can't
ifmaybeload() a driver on just the link-level address of the card.  This
is a case when devd might be a better solution indeed.  However, I don't
think that people who use interface renaming will depend on the system
automatically discovering the *types* of network cards: if you know the
MAC address of the card, you'll probably know just what brand and model
it is, too :)

G'luck,
Peter

-- 
Peter Pentchev	roam at ringlet.net    roam at sbnd.net    roam at FreeBSD.org
PGP key:	http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint	FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
This sentence contradicts itself - or rather - well, no, actually it doesn't!
-------------- next part --------------
Index: src/etc/defaults/rc.conf
===================================================================
RCS file: /home/ncvs/src/etc/defaults/rc.conf,v
retrieving revision 1.205
diff -u -r1.205 rc.conf
--- src/etc/defaults/rc.conf	10 Apr 2004 22:13:27 -0000	1.205
+++ src/etc/defaults/rc.conf	20 May 2004 17:43:07 -0000
@@ -120,6 +120,7 @@
 				# NOTE: this violates the TCP specification
 icmp_drop_redirect="NO" 	# Set to YES to ignore ICMP REDIRECT packets
 icmp_log_redirect="NO"		# Set to YES to log ICMP REDIRECT packets
+network_interfaces_rename="NO"	# Network interface name pairs (or "NO")
 network_interfaces="auto"	# List of network interfaces (or "auto").
 cloned_interfaces=""		# List of cloned network interfaces to create.
 #cloned_interfaces="gif0 gif1 gif2 gif3" # Pre-cloning GENERIC config.
Index: src/etc/network.subr
===================================================================
RCS file: /home/ncvs/src/etc/network.subr,v
retrieving revision 1.153
diff -u -r1.153 network.subr
--- src/etc/network.subr	11 Aug 2003 20:32:00 -0000	1.153
+++ src/etc/network.subr	21 May 2004 06:40:15 -0000
@@ -623,3 +623,35 @@
 		esac
 	done
 }
+
+# Rename interfaces if the network_interfaces_rename variable is set
+# to 'old new' pair(s), e.g. 'sis0 ethlocal xl0 ethext'.
+rename_ifaces()
+{
+	echo -n 'Renaming interfaces: '
+	case "${network_interfaces_rename}" in
+		[Nn][Oo] | '')
+			echo 'none'
+			;;
+
+		*)
+			if [ "$1" = 'stop' ]; then
+				set ${network_interfaces_rename}
+				_v=''
+				while [ -n "$1" ]; do
+					_v="$1 ${_v}"
+					shift
+				done
+				set ${_v}
+			else
+				set ${network_interfaces_rename}
+			fi
+			while [ -n "$2" ]; do
+				echo -n "$1 -> $2 "
+				ifconfig "$1" name "$2"	
+				shift 2
+			done
+			echo 'done'
+			;;
+	esac
+}
Index: src/etc/rc.d/netif
===================================================================
RCS file: /home/ncvs/src/etc/rc.d/netif,v
retrieving revision 1.7
diff -u -r1.7 netif
--- src/etc/rc.d/netif	28 Apr 2004 13:20:15 -0000	1.7
+++ src/etc/rc.d/netif	21 May 2004 06:42:25 -0000
@@ -47,6 +47,9 @@
 		# We're operating as a general network start routine.
 		#
 
+		# Rename interfaces if requested
+		rename_ifaces start
+
 		# Create cloned interfaces
 		clone_up
 
@@ -70,6 +73,9 @@
 	# Deconfigure the interface(s)
 	network_common ifn_stop
 	echo '.'
+	
+	# Rename interfaces back if needed
+	rename_ifaces stop
 }
 
 # network_common routine verbose
Index: src/share/man/man5/rc.conf.5
===================================================================
RCS file: /home/ncvs/src/share/man/man5/rc.conf.5,v
retrieving revision 1.216
diff -u -r1.216 rc.conf.5
--- src/share/man/man5/rc.conf.5	28 Apr 2004 23:16:06 -0000	1.216
+++ src/share/man/man5/rc.conf.5	20 May 2004 17:54:22 -0000
@@ -860,6 +860,31 @@
 Refer to
 .Xr ip 4
 for more information.
+.It Va network_interfaces_rename
+.Pq Vt str
+Set to a list of pairs of network interface names to rename on boot.
+For example, if you want the
+.Li sis0
+interface to be actually seen as
+.Li ethlocal
+and the
+.Li xl0
+interface to be seen as
+.Li ethext ,
+this could be set to
+.Dq Li "sis0 ethlocal xl0 ethext" .
+.Pp
+Additionally,
+.Xr ifconfig 8
+may allow specifying interfaces by link-level address by prefixing the
+address with
+.Dq hw- ,
+e.g.
+.Dq Li hw-00:03:0d:08:dc:a7 .
+In this case, you can set the
+.Va network_interfaces_rename
+variable to
+.Dq Li "hw-00:03:0d:08:dc:a7 ethlocal" .
 .It Va network_interfaces
 .Pq Vt str
 Set to the list of network interfaces to configure on this host.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-net/attachments/20040521/0954b34a/attachment.bin


More information about the freebsd-net mailing list