Several people have reported on troubles here in the past with trying (and failing) to connect to a BT (British Telecom) supplied 2100/2110 wireless xDSL router/gateway from Linux.

I am (today) in a hotel served by such a box, and so I took a couple of hours to figure it all out.

The BT-supplied "key" (sticky label on bottom of router) is a WEP128 Passphrase, not a full WEP hex key. Even though it looks sort of like a key. Easy one.

But the real problems came after sorting out the silly WEP key. The box would not forward any of my packets through to the outside world.

It seems that these boxes use two *different* MAC addresses for themselves (protocol violation). Linux just keeps trying to use the first ARP discovered MAC destination for the BT Voyager box -- but only the second one actually works.

Witness this:
# arping -c1 192.168.1.1 -I eth1
ARPING 192.168.1.1 from 192.168.1.53 eth1
Unicast reply from 192.168.1.1 [00:11:F5:BA:67:AA] 1.831ms
Unicast reply from 192.168.1.1 [00:11:F5:77:38:C2] 2.588ms
Sent 1 probes (1 broadcast(s))
Received 2 response(s)

The first MAC address (ends with :AA) is what Linux will use to talk to the router, but the router instead wants us to use the second one (ends in :C2). Each time Linux tries to send a packet to the first MAC, it gets an unsolicited ARP reply telling Linux to use the second MAC instead. Linux ignores this. Apparently windows does not ignore it.

To fix the problem, you can simply do the same "arping" command shown above, substituting the correct IP address and ethX interface. Then, force Linux to switch to using the second MAC when sending packets, like I do here:

arp -i eth1 -d 192.168.1.1
arp -i eth1 -s 192.168.1.1 00:11:F5:77:38:C2

Done. Everything works fine now.

To automate this, I have written an awk script to do all of the above with no need for hardcoded values anywhere. In the "eth1" section of my /etc/network/interfaces file, I added two lines to invoke the script on connect/disconnect. The script is harmless when talking to non-BT routers, so no problems just leaving it all in place.

Here are the additional lines from the eth1 section of my /etc/network/interfaces file:

post-up /usr/local/bin/handle_multiple_arps.awk $IFACE set
pre-down /usr/local/bin/handle_multiple_arps.awk $IFACE delete

The script itself is available for download (right-click and save) from here:

http://rtr.ca/handle_multiple_arps.awk

Cheers

Mark Lord