Plug-and-Play USB Networking
From Openmoko
Contents |
Introduction
I provide here an example setup which are more complicated than your setup probably will be.
Use case
I have 1 laptop and 2 freerunners. Whenever I plug my freerunner, I want my laptop recognize which freerunner was plugged in and act accordingly. Also automagically set up the networking for me.
Prerequisites
You need a linux/unix computer with working NetworkManager setup. I have successfully use this method more than a month now, with Ubuntu 9.04 (jaunty), I will test it also on Ubuntu 8.10 (intrepid), and report back here.(I tested, and it does not work, however 9.10 works great)
Tested distributions
| Distribution | NetworkManager version | Known to work |
|---|---|---|
| Ubuntu 8.10 (Intrepid) | ? | NO |
| Ubuntu 9.04 (Jaunty) | 0.7.1~rc4-0ubuntu1 | YES |
| Ubuntu 9.10 (Karmic) | ? | YES |
The NetworkManager on jaunty is:
ii network-manager 0.7.1~rc4-0ubuntu1 ii network-manager-gnome 0.7.1~rc4.1-0ubuntu1
File/directory structure
/etc/NetworkManager/system-connections/freerunner_bob (owner: root, rights: 600) /etc/NetworkManager/system-connections/freerunner_bobek (owner: root, rights: 600) /etc/NetworkManager/dispatcher.d/10myiptables (owner: root, rights: 755)
File contents
/etc/NetworkManager/system-connections/freerunner_bob:
[connection] id=Bob's moko uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb4 type=802-3-ethernet autoconnect=true timestamp=0 [ipv4] method=manual never-default=true address1=192.168.0.200;24 [802-3-ethernet] mac-address=00:1f:11:01:5d:13
/etc/NetworkManager/system-connections/freerunner_bobek:
[connection] id=Bobek's moko uuid=27afa607-ee36-43f0-b8c3-9d245cdc4bb3 type=802-3-ethernet autoconnect=true timestamp=0 [ipv4] method=manual never-default=true address1=192.168.0.200;24 [802-3-ethernet] mac-address=00:1f:11:01:6e:12
/etc/NetworkManager/dispatcher.d/10myiptables:
#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs ifupdown scripts when NetworkManager fiddles with interfaces.
# Bobek's freerunner
export MYUUID1="27afa607-ee36-43f0-b8c3-9d245cdc4bb3"
# Bob's freerunner
export MYUUID2="27afa607-ee36-43f0-b8c3-9d245cdc4bb4"
# The computer's username
export USERNAME="lolza"
if [ -z "$1" ]; then
echo "$0: called with no interface" 1>&2
exit 1;
fi
# Fake ifupdown environment
export IFACE="$1"
export LOGICAL="$1"
export ADDRFAM="NetworkManager"
export METHOD="NetworkManager"
export VERBOSITY="0"
# Run the right scripts
case "$2" in
up)
export MODE="start"
export PHASE="up"
if [ -f /sys/class/net/$IFACE/address ] ; then
tmpfile=`mktemp -t`
echo $CONNECTION_UUID > $tmpfile
if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then
echo "Bobek's Freerunner connected..." >> $tmpfile
date >> $tmpfile
iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
iptables -P FORWARD ACCEPT
sysctl -w net.ipv4.ip_forward=1
sudo -u ${USERNAME} ssh-keygen -R 192.168.0.202
else
if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then
echo "Bob's Freerunner connected..." >> $tmpfile
date >> $tmpfile
iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
iptables -P FORWARD ACCEPT
sysctl -w net.ipv4.ip_forward=1
sudo -u ${USERNAME} ssh-keygen -R 192.168.0.202
fi
fi
fi
;;
down)
export MODE="stop"
export PHASE="down"
tmpfile=`mktemp -t`
echo "down called..." >> $tmpfile
tmpfile=`mktemp -t`
echo $CONNECTION_UUID > $tmpfile
if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then
echo "Bobek's Freerunner disconnected..." >> $tmpfile
iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
iptables -P FORWARD ACCEPT
sysctl -w net.ipv4.ip_forward=0
else
if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then
echo "Bob's Freerunner disconnected..." >> $tmpfile
iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
iptables -P FORWARD ACCEPT
sysctl -w net.ipv4.ip_forward=0
fi
fi
;;
*)
echo "$0: called with unknown action \`$2'" 1>&2
exit 1
;;
esac
