Re: Ethernet-multiple NICs and laptop

From: Jim Roland (
Date: Thu May 11 2000 - 10:40:21 EST

After several hours at trial and error and my RHCE Study guide, I managed
to figure out what was wrong. The RH 6.1 scripts for network startup are
expecting DEVICE to be assigned inside one of the eth-* scripts (formerly
ifcfg-eth*). Since we were trying to keep away from that to avoid having
to manually config the network cards at each boot (eth0 and eth1 float
around), putting in a DEVICE= in the ifcfg-eth* scripts, I assumed was a
big no-no for what I was trying to accomplish.

I debugged the scripts, found the correct one and found that ifcfg-eth0 and
ifcfg-eth1 (a symb link to ifcfg-eth0) was being passed the $CONFIG
parameter, which had a value of "ifcfg-eth0" when eth0 was being setup (the
name of the script), and "ifcfg-eth1" when eth1 was being setup (and so
on). I assigned DEVICE= inside your ifcfg-eth* script that you provided

I managed to get my first sed (stream editor) formula written, and here is
what I did:
(added to your script)
# Since DEVICE is defined in here, we must define it based on what is
# passed for starting this script (ifup uses CONFIG which for eth0 is
# ifcfg-eth0):
DEVICE=`echo $CONFIG | sed -ne 's/.*ifcfg-/\1/p'`

This, in effect, takes the CONFIG parameter (value of "ifcfg-eth0") and
makes it "eth0" assigning that to DEVICE.

I also changed your last statement, since reboots were not reassigning the
tmp files you originally defined (/var/tmp/eth-docking, and so on) because
the test was checking for a zero length file, at shutdown, there was no
deletion of these tmp files if I undocked my Latitude (I could have put it
in a shutdown script I guess).

Therefore I changed:
    [ -n "$USERDEVICENAME" ] && echo $DEVICE > /var/tmp/$USERDEVICENAME
    echo $DEVICE > /var/tmp/$USERDEVICENAME

Which makes the /var/tmp/eth-docking or /var/tmp/eth-pcmcia get written
each time the system is booted.

Thanks for pointing me in the right direction. I'm providing these changes
to the audience in the event there is another like me trying to get docking
and undocking profiles to work in RedHat.

-=>Jim Roland
"Never settle with words what you can settle with a flamethrower."

On Sat, 8 Apr 2000, Keith Owens wrote:

> Date: Sat, 08 Apr 2000 13:06:53 +1000
> From: Keith Owens <>
> To: Jim Roland <>
> Cc:,
> Subject: Re: Ethernet-multiple NICs and laptop
> On Thu, 6 Apr 2000 08:32:36 -0600 (CST),
> Jim Roland <> wrote:
> >I have a port replicator with a 3Com 3C905C NIC built-in. When I'm docked,
> >my port replicator's NIC enables with eth0 and my PCMCIA network card
> >enables with eth1. When I'm undocked my PCMCIA card takes over eth0. How
> >do I get the PCMCIA card to ALWAYS use eth1???
> Don't bother trying. eth0/eth1 are what the kernel calls the hardware
> and is always going to be hardware dependent. The mistake is trying to
> override the kernel's hardware numbering, this mistake arises because
> the user wants to use eth0 and eth1 instead of "eth-pcmcia" and
> "eth-docking". That is, you are trying to use a kernel construct as a
> user identifier.
> The solution to the problem of multiple NICs is to use separate kernel
> and user identifiers. Anything in user space should use the user
> identifier to get the kernel identifier. "Any problem can be solved by
> another level of indirection".
> Example.
> In directory /etc/sysconfig/network-scripts (this is RedHat, other
> distributions may use different names) there are ifup and ifdown
> scripts. These are general scripts that obtain IP addresses and
> routing data from ifcfg-<device>, e.g. ifcfg-eth0. Instead of hard
> coding the pcmcia data in ifcfg-eth0 and the docking station data in
> ifcfg-eth1, make the data dynamic. Create two files in
> /etc/sysconfig/network-scripts for the pcmcia card and the docking
> station data, call them eth-pcmcia and eth-docking. In those files you
> store the IP data for the relevant card, lines like
> # eth-pcmcia
> # eth-docking
> USERDEVICENAME=eth-docking
> ONBOOT=yes
> The job of ifcfg-eth[01] is now to work out which card is being
> accessed and to map the kernel identifier (eth[01]) to a user
> identifier (eth-{docking,pcmcia}). This example ifcfg-eth0 script uses
> MAC addresses, replace the sample MAC addresses with your own. If you
> do not like using MAC to identify cards, find some other way to
> identify which physical card is being configured. Replace both the
> ifcfg-eth0 and ifcfg-eth1 files (make one a link to the other) with
> # ifcfg-eth*
> case `ifconfig $DEVICE | sed -ne 's/.*HWaddr *\([^ ]*\) */\1/p'` in
> 00:10:A4:F3:A3:79) . eth-pcmcia;; # read pcmcia data
> 00:80:AD:79:82:D8) . eth-docking;; # read docking station data
> *) echo Unknown MAC address, please update ifcfg-eth0
> esac
> [ -n "$USERDEVICENAME" ] && echo $DEVICE > /var/tmp/$USERDEVICENAME
> Now it does not matter whether the kernel calls a network card eth0 or
> eth1 or even eth99. The configure scripts assign the correct IP and
> routing data no matter what the kernel id is. If you need to access
> the kernel id, use the value in /var/tmp/eth-*, e.g.
> route add -net netmask dev `cat /var/tmp/eth-docking`
> I use this technique on multi NIC boxes where device numbers have a
> tendency to move around as slots or IRQs or the kernel scan order
> changes. Instead of trying to force the kernel into your order, accept
> whatever the kernel gives you and handle the mapping in user space.

To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to
Please read the FAQ at

This archive was generated by hypermail 2b29 : Mon May 15 2000 - 21:00:18 EST