Plug-and-Play USB Networking

From Openmoko

(Difference between revisions)
Jump to: navigation, search
(Prerequisites)
(delete the nat rules on network down)
 
(3 intermediate revisions by one user not shown)
Line 12: Line 12:
 
You need a linux/unix computer with working NetworkManager setup.
 
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 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 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)
  
== Table ==
+
== Tested distributions ==
 
{| border="1" cellspacing=0 cellpadding=4
 
{| border="1" cellspacing=0 cellpadding=4
 
  !Distribution
 
  !Distribution
Line 22: Line 22:
 
  |Ubuntu 8.10 (Intrepid)
 
  |Ubuntu 8.10 (Intrepid)
 
  |?
 
  |?
  |NO
+
  |style="background-color:Red"|NO
 
  |-
 
  |-
 
  |Ubuntu 9.04 (Jaunty)
 
  |Ubuntu 9.04 (Jaunty)
 
  |0.7.1~rc4-0ubuntu1
 
  |0.7.1~rc4-0ubuntu1
  |YES
+
  |style="background-color:Green"|YES
 
  |-
 
  |-
 
  |Ubuntu 9.10 (Karmic)
 
  |Ubuntu 9.10 (Karmic)
 
  |?
 
  |?
  |YES
+
  |style="background-color:Green"|YES
 
  |}
 
  |}
  
Line 146: Line 146:
 
if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then
 
if [ "X${CONNECTION_UUID}" = "X${MYUUID1}" ] ; then
 
echo "Bobek's Freerunner disconnected..." >> $tmpfile
 
echo "Bobek's Freerunner disconnected..." >> $tmpfile
iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
+
iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
 
iptables -P FORWARD ACCEPT
 
iptables -P FORWARD ACCEPT
 
sysctl -w net.ipv4.ip_forward=0
 
sysctl -w net.ipv4.ip_forward=0
Line 152: Line 152:
 
if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then
 
if [ "X${CONNECTION_UUID}" = "X${MYUUID2}" ] ; then
 
echo "Bob's Freerunner disconnected..." >> $tmpfile
 
echo "Bob's Freerunner disconnected..." >> $tmpfile
iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
+
iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
 
iptables -P FORWARD ACCEPT
 
iptables -P FORWARD ACCEPT
 
sysctl -w net.ipv4.ip_forward=0
 
sysctl -w net.ipv4.ip_forward=0

Latest revision as of 04:51, 29 November 2009

Contents

[edit] Introduction

I provide here an example setup which are more complicated than your setup probably will be.

[edit] 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.

[edit] 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)

[edit] 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

[edit] 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)

[edit] 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
Personal tools

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.

Table

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 -A 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 -A 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