34

On a MBP (OS X 10.6.2) I've got the wired ethernet and wireless airport configurations set up to use the same static IP to my router (e.g. as described at http://forums.macrumors.com/archive/index.php/t-708685.html). I've also got the Service Order set up so that the wired connection is above Airport (e.g. as described at Mac OS X automatically turn off Airport if ethernet cable is plugged in).

This seems to "work": an open ssh connection to a remote location stays up as I plug in and unplug the ethernet cable. However, since the Airport card stays live (and connected to the router) regardless of whether the wired connection is present, how can I tell that the wired interface is actually the "active" connection when it is available? Since the IP address is the same for both, is this a guarantee that the wireless interface cannot be used? Is there some other way to tell if this interface is in use?

PS. I'm going to post a (partial) answer as soon as I post this, as the act of writing this up and checking all my facts lead me to some insights. (The more interesting and unanswered part is in bold above.)

Ether
  • 1,187

7 Answers7

39

The definitive reference for questions such as 'Which interface will be used to reach host w.x.y.z?' for any given time or situation is to refer to the routing table.

[mini-nevie:~] nevinwilliams% route get 10.10.10.10
   route to: 10.10.10.10
destination: default
       mask: default
    gateway: 192.168.2.1
  interface: en0
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500         0 

I've both en0 and en1 enabled, and en0 is first in Service Order. Unplugging my ethernet, making no other changes, the same command gives:

mini-nevie:~] nevinwilliams% route get 10.10.10.10
   route to: 10.10.10.10
destination: default
       mask: default
    gateway: 192.168.2.1
  interface: en1
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500         0 
18

On Mac, I use this:

if=$(route -n get 0.0.0.0 2>/dev/null | awk '/interface: / {print $2}')

if [ -n "$if" ]; then echo "Default route is through interface $if" else echo "No default route found" fi

On Linux, the first line would be slightly different:

if=$(ip route show 0.0.0.0/0 | awk '/ dev / {print $NF}')
# or
if=$(awk '$2 == 00000000 {print $1}' /proc/net/route)
mivk
  • 4,015
9

Here's a dump of ifconfig -a in each situation (I'll highlight the differences afterward):

Ethernet cable is plugged in:

lo0: flags=8049 mtu 16384
        inet6 ::1 prefixlen 128
        inet6 xxxx::1%lo0 prefixlen 64 scopeid 0x1
        inet 127.0.0.1 netmask 0xff000000
gif0: flags=8010 mtu 1280
stf0: flags=0 mtu 1280
en0: flags=8863 mtu 1500
        inet6 xxxx%en0 prefixlen 64 scopeid 0x4
        inet 192.168.0.110 netmask 0xffffff00 broadcast 192.168.0.255
        ether xx:xx:xx:xx:xx:xx
        media: autoselect (100baseTX ) status: active
        supported media: none autoselect 10baseT/UTP  10baseT/UTP  10baseT/UTP  10baseT/UTP  100baseTX  100baseTX  100baseTX  100baseTX  1000baseT  1000baseT  1000baseT 
fw0: flags=8863 mtu 4078
        lladdr xx:xx:xx:xx:xx:xx
        media: autoselect  status: inactive
        supported media: autoselect 
en1: flags=8863 mtu 1500
        inet6 xxxx%en1 prefixlen 64 scopeid 0x6
        inet 192.168.0.110 netmask 0xffffff00 broadcast 192.168.0.255
        ether xx:xx:xx:xx:xx:xx
        media: autoselect status: active
        supported media: autoselect

Ethernet cable is unplugged:

lo0: flags=8049 mtu 16384
        inet6 ::1 prefixlen 128
        inet6 xxxx::1%lo0 prefixlen 64 scopeid 0x1
        inet 127.0.0.1 netmask 0xff000000
gif0: flags=8010 mtu 1280
stf0: flags=0 mtu 1280
en0: flags=8863 mtu 1500
        ether xx:xx:xx:xx:xx:xx
        media: autoselect status: inactive
        supported media: none autoselect 10baseT/UTP  10baseT/UTP  10baseT/UTP  10baseT/UTP  100baseTX  100baseTX  100baseTX  100baseTX  1000baseT  1000baseT  1000baseT 
fw0: flags=8863 mtu 4078
        lladdr xx:xx:xx:xx:xx:xx
        media: autoselect  status: inactive
        supported media: autoselect 
en1: flags=8863 mtu 1500
        inet6 xxxx%en1 prefixlen 64 scopeid 0x6
        inet 192.168.0.110 netmask 0xffffff00 broadcast 192.168.0.255
        ether xx:xx:xx:xx:xx:xx
        media: autoselect status: active
        supported media: autoselect

diff plugged unplugged shows that the wired connection does become active when it is available:

8,9d7
<   inet6 xxxx%en0 prefixlen 64 scopeid 0x4 
<   inet 192.168.0.110 netmask 0xffffff00 broadcast 192.168.0.255
11c9
<   media: autoselect (100baseTX <full-duplex,flow-control>) status: active
---
>   media: autoselect status: inactive
Ether
  • 1,187
6

A couple of things. Mac will always use the network connections in order that's listed in your "Network Connections" profile. For example, if Ethernet is on top of Wireless, Ethernet will take over.

I'm not sure on how SSH works that much, but from my experience. If one connection fails or disconnects, SSH will then use the other connection.

If you really want to see if the connections are active, you should use a bandwidth monitor utility. A great one is iStat (http://www.islayer.com/apps/istatmenus/).

Steven Lu
  • 716
3
route -n get 0.0.0.0 | grep interface
Toto
  • 19,304
1

When working between various Linux systems I've found the following script helpful - its easy to remember/copy paste, the one below is tailored to MacOS

#!/bin/bash

export DEFAULT_IF=$(route -n get default | grep interface | awk '{print $2}')

ifconfig | awk -v D=$DEFAULT_IF 'BEGIN{I="";}/^[a-zA-Z0-9]/{I=substr($1,1,length($1)-1);};/inet /{printf("%2s %s %s\n",((D == I)?"*":" "),I,$0);};'

It simply gives me a "*" alongside the interface through which default IPv4 traffic is generally being routed in an easy to see format:

$ ./iplist lo0 inet 127.0.0.1 netmask 0xff000000

  • en0 inet 10.16.1.2 netmask 0xffffff00 broadcast 172.16.1.255 en1 inet 192.168.11.4 netmask 0xffffff00 broadcast 192.168.0.255
0

I used the advice to make IP adresses the same for Ethernet and WiFi, Set the Service Order as suggested, and just used Network Utility>Info on en0 and en1.

I initiated a TimeMachine backup and under Network Utility > Info > en0 Ethernet I could see that thousands of packets were moving through the ethernet connection, while Network Utility > Info > en1 WiFi nothing was moving.

Thanks for getting me pointed in the right direction. When TimeMachine backup is complete I'll revert back to separate IP addresses and see if Mac automatically still moves everything through Ethernet.

The original question was "How can I tell which network interface my computer is using?" Network utility worked for me.

Macbook Pro 17" Mid-2010, Mountain Lion

slm
  • 10,859