Ethernet over USB

From Qi-Hardware
Revision as of 23:31, 17 August 2012 by PaulBoddie (Talk | contribs)
Jump to: navigation, search

Contents

The recently uboot/kernel images have Ethernet-over-USB support enabled by default, which you can use to give the NanoNote a connection to the internet.

Setup on the Host

To let your NanoNote use your laptop's/PC's (host) internet connection, you have to enable NAT and routing on your host and set a default route on your NanoNote via your host.

The NanoNote's IP address is set to 192.168.254.101 by default.

Note that if you use Ubuntu, you should consider removing the default connection-manager, and replacing it with wicd. The connection manager has issues with adding and removing networking hardware, while wicd ignores usb0.

Network Configuration

On your Linux/Unix host run...

$ ifconfig usb0 192.168.254.100

...to give your host an IP address which is in the same subnet as your NanoNote.

To review that, you can use ifconfig:

$ ifconfig usb0

You should get the following:

usb0      Link encap:Ethernet  HWaddr 16:90:89:ea:82:6f  
          inet addr:192.168.254.100  Bcast:192.168.3.255  Mask:255.255.255.0
          inet6 addr: fe80::1490:89ff:feea:826f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

To verify the proper connection, you can try to ping your NanoNote from your host and vice versa (note: NanoNote has the 101 in the end).

$ ping 192.168.254.101 # pinging your NanoNote from your host

Now we have successfully established a network connection between host and NanoNote.

To let your NanoNote use your host's internet connection, we have to enable routing and NAT on the host's side.

NAT Configuration

NOTE: Replace eth0 below with the interface your host is connected to on the Internet.


# modprobe iptable_nat
# echo "1" > /proc/sys/net/ipv4/ip_forward
# eth0 in this example is the interface on your host connected to the internet, adjust if needed
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Editing the Host's Network Configuration

Add the following to your /etc/network/interfaces file in order to be able to use ifup usb0 and ifdown usb0 and to implement the above network and NAT configuration in a more permanent fashion:

allow-hotplug usb0
iface usb0 inet static
       address 192.168.254.100
       netmask 255.255.255.0
       network 192.168.254.0
       broadcast 192.168.254.255
       up iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.254.0/24
       up sysctl -w net.ipv4.ip_forward=1
       up route add -host 192.168.254.101 usb0
       down iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.254.0/24

If you are using Debian/Ubuntu with NetworkManager installed you may need to edit /etc/NetworkManager/NetworkManager.conf, making sure the managed=false setting is applied to the interface.

On some systems, there is no /etc/NetworkManager/NetworkManager.conf file, but you may be able to prevent interference with the interface by NetworkManager by using the following declaration:

iface usb0 inet manual

This by itself can be used to reserve the interface for manual configuration.

Setup on the NanoNote

Network Configuration

This is no longer required after OpenWrt Release 2010-12-14


Log into your NanoNote, either with...

$ telnet 192.168.254.101

...or, if you already set a root password on your NanoNote, with...

$  ssh root@192.168.254.101

Then issue the following commands:

$ route add default gw 192.168.254.100 # set a route on your NanoNote through your host
$ echo "nameserver 8.8.8.8" >> /etc/resolv.conf

In this example we use Google's nameserver (8.8.8.8) but you can use any you like.

We're done now! :)

You may want to verify your setup by connecting an outer server by your NanoNote with pinging e.g. google.com:

$ ping google.com

You should see something like this:

PING google.com (209.85.129.105) 56(84) bytes of data.
64 bytes from fk-in-f105.1e100.net (209.85.129.105): icmp_seq=1 ttl=57 time=44.2 ms
64 bytes from fk-in-f105.1e100.net (209.85.129.105): icmp_seq=2 ttl=57 time=44.1 ms

And "voilà"! your Ben is now connected to the evil Internet. :)

Transfer Files

Using scp:

$ scp PC_FILE root@192.168.254.101:~/
$ scp root@192.168.254.101:/PATH/TO/NANONOTE_FILE ./

Using sftp:

$ sftp root@192.168.254.101
sftp> get FILE_NAME

using sshfs, like mount a disk to your pc.

$ sshfs root@192.168.254.101:/ /mountpoint
$ fusermount -u /mountpoint

To make this work with the dropbear SSH server:

$ opkg install gesftpserver
$ ln -s /usr/bin/gesftpserver /usr/libexec/sftp-server
$ opkg install openssh-sftp-server

I had file corruption using gesftpserver - r228-1. Maybe it was unrelated, maybe not.

Automatic Script Files

UDEV

  1. Save the following as /etc/udev/rules.d/72-BenNanoNote-net.rules:
    SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0525", ATTR{idProduct}=="a4a1", RUN+="/usr/local/bin/ben-net.sh"
  2. Save the following as /usr/local/bin/ben-net.sh, and don't forget to issue chmod +x /usr/local/bin/ben-net.sh!
    GATEWAY_IF=ppp0
    if ( /usr/bin/lsusb -t -d "0525:a4a1" ); then
            echo .
            echo "Ben NanoNote found, setting up USB network ... "
            if !( /sbin/lsmod | grep 'ip_tables' ) && ( /sbin/modprobe -l ip_tables ); then
            	/sbin/modprobe ip_tables
            	echo "ip_tables is now loaded"
            else
                	echo "ip_tables already loaded"
            fi
            if ( grep '0' /proc/sys/net/ipv4/ip_forward ); then
            	echo "1" > /proc/sys/net/ipv4/ip_forward
            	echo "IP forwarding is now enabled"
            else
                	echo "IP forwarding already enabled"
            fi
            if !( /sbin/iptables -L -t nat -v | grep $GATEWAY_IF ); then
            	/usr/sbin/iptables -t nat -A POSTROUTING -o $GATEWAY_IF -j MASQUERADE
            	echo "Routing is now enabled"
            else
                	echo "Routing already setup on "$GATEWAY_IF
            fi
            /sbin/ifconfig usb0 192.168.254.100 netmask 255.255.255.0
    fi
    
  3. Reboot, or log in as root and run udevadm control --reload-rules
  4. Connect your Nanonote, observe the magic!

Note this will not work when the Nanonote is connected to the PC at boot time, only if you plug it in while udev is running!

Static Mac Address

This can by done by add the following text to the kernel command line:

 g_ether.dev_addr=5a:77:1e:af:8e:9e
 g_ether.host_addr=72:8d:1f:c4:e8:ca 

(See also issues_7.)

If your rootfs has mtd.nn you can using these commands:

mtd.nn fw_setenv_default
fw_setenv bootargs   g_ether.host_addr=72:8d:1f:c4:e8:ca mem=32M console=tty0 console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait

If your rootfs doesn't have mtd.nn, please run these commands before you change the default bootargs:

fw_setenv bootargs mem=32M console=tty0 console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait
fw_setenv bootcmd nand read 0x80600000 0x400000 0x200000\;bootm
fw_setenv bootargsfromsd mem=32M console=tty0 console=ttyS0,57600n8 rootfstype=ext2 root=/dev/mmcblk0p1 rw rootwait
fw_setenv bootcmdfromsd mmc init\; ext2load mmc 0 0x80600000 /boot/uImage\; bootm
......
then :
fw_setenv bootargs g_ether.host_addr=72:8d:1f:c4:e8:ca mem=32M console=tty0 console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait 

Always check mtd.nn for the latest default bootloader ENVs.

authorized_keys

Keys for the root user go into /etc/dropbear/authorized_keys, not into /root/.ssh.

sftp

$ opkg update
$ opkg install openssh-sftp-server  (works with dropbear)

Issues

Rebooting BEN or SIE and makes ssh connections freeze and I need to make a new connection, why?

The issue is on the host, as some popular distros will try to automatically set up a new usb0 interface even after you configured it. By adding...

iface usb0 inet manual

...to /etc/network/interfaces, then NetworkManager daemon won't try to assign an IP with dhcp or avahi.

Personal tools
Namespaces
Variants
Actions
Navigation
interactive
Toolbox
Print/export