From Openmoko

Jump to: navigation, search

Once you successfully connect to your network operator (see Manually using GPRS), you can start sharing your data plan with your computer through USB or Bluetooth networking. The following describes how you can do so through USB networking. Currently, there are four different ways that have been confirmed by users.



The following FSO dbus call starts a DHCP server on the FreeRunner, allowing you to access the GPRS connection which you will have already started(!) from the tethered PC.

mdbus -s org.freesmartphone.onetworkd /org/freesmartphone/Network org.freesmartphone.Network.StartConnectionSharingWithInterface usb0

I was able to access the DHCP server from my Eee PC (running Jaunty) by copying the MAC address from the static entry in network-manager, and created a new entry with the same MAC but DHCP rather than a static IP address.


If you use files in /etc/.../network/ to manage your network connections (and not any so-called network manager tools), you might need to add a file like the following before the above step works:

# file /etc/sysconfig/network/ifcfg-eth1
# USB configuration for PDAs (openmoko)

The above worked for openSUSE (11.2).


If you only need/want web browsing, or if your phone provider is blocking other services, the easiest way to browse the web using your FreeRunner is to install tinyproxy : http://secretsauce.net:5050/tinyproxy_1.6.4-r0_armv4t.ipk

Tinyproxy needs to be configured by adding "Allow" to /etc/tinyproxy/tinyproxy.conf.

Start GPRS, start tinyproxy, use as the proxy on your computer, and you're ready to go.

Setting up your computer's network settings

I find it useful to have my computer automatically acquire its network address, mask, gateway, and DNS servers from the FreeRunner instead of manually setting these up. In order to this, I installed busybox-udhcpd from the Angstrom repositories onto my FreeRunner (see Repositories)

 opkg install busybox-udhcpd

Once it is installed, it needs to be configured. Edit the /etc/udhcpd.conf file. Mine looks like this:

# Sample udhcpd configuration file (/etc/udhcpd.conf)

# The start and end of the IP lease block

start    #default:
end      #default:

# The interface that udhcpd will use

interface       usb0            #default: eth0

# The maximum number of leases (includes addresses reserved
# by OFFER's, DECLINE's, and ARP conficts)

#max_leases     254             #default: 254

# If remaining is true (default), udhcpd will store the time
# remaining for each lease in the udhcpd leases file. This is
# for embedded systems that cannot keep time between reboots.
# If you set remaining to no, the absolute time that the lease
# expires at will be stored in the dhcpd.leases file.

#remaining      yes             #default: yes

# The time period at which udhcpd will write out a dhcpd.leases
# file. If this is 0, udhcpd will never automatically write a
# lease file. (specified in seconds)

#auto_time      7200            #default: 7200 (2 hours)

# The amount of time that an IP will be reserved (leased) for if a
# DHCP decline message is received (seconds).

#decline_time   3600            #default: 3600 (1 hour)

# The amount of time that an IP will be reserved (leased) for if an
# ARP conflict occurs. (seconds)

#conflict_time  3600            #default: 3600 (1 hour)

# How long an offered address is reserved (leased) in seconds

#offer_time     60              #default: 60 (1 minute)

# If a lease to be given is below this value, the full lease time is
# instead used (seconds).

#min_lease      60              #defult: 60

# The location of the leases file

#lease_file     /var/lib/misc/udhcpd.leases     #defualt: /var/lib/misc/udhcpd.

# The location of the pid file
#pidfile        /var/run/udhcpd.pid     #default: /var/run/udhcpd.pid

# Everytime udhcpd writes a leases file, the below script will be called.
# Useful for writing the lease file to flash every few hours.

#notify_file                            #default: (no script)

#notify_file    dumpleases      # <--- usefull for debugging

# The following are bootp specific options, settable by udhcpd.

#siaddr            #default:

#sname          zorak                   #default: (none)

#boot_file      /var/nfs_root           #default: (none)

# The remainder of options are DHCP options and can be specified with the
# keyword 'opt' or 'option'. If an option can take multiple items, such
# as the dns option, they can be listed on the same line, or multiple
# lines. The only option with a default is 'lease'.

opt     dns <your APN's DNS server>
option  subnet
opt     router
opt     wins
#option dns   # append to above DNS servers for a total of 3
option  domain  local
option  lease   864000          # 10 days of seconds

# Currently supported options, for more info, see options.c

Notice that I set the start and end of the IP lease block to If you follow the instructions at USB Networking, this is the address that it assumes the host to be and the /etc/resolv.conf file points to this address to allow name resolution from your phone.

The interface in this case is usb0. This will have to be set differently if you are using Bluetooth.

The dns is set to the FreeRunner's address, as well as my network operator's DNS server address. You don't have to use your network operator's DNS address if you can find a caching nameserver for the FreeRunner.

The router is set to the FreeRunner.

Turning your FreeRunner into a Network Address Translation (NAT) gateway

I set up my FreeRunner so that it acts as a NAT gateway so that all traffic that goes to my network operator appears to originate from the phone. I installed iptables to accomplish this:

 opkg install iptables iptables-utils kernel-module-ipt-masquerade kernel-module-iptable-nat

Once that is installed, I have the following script named firewall.sh that I use to set up the NAT once connected to the GPRS network:


# Set interface values

# enable ip forwarding in the kernel
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward

# flush rules and delete chains

#Enable masquerading to allow LAN internet access

#Forward LAN traffic from LAN $INTIF to Internet $EXTIF

#Allowing access to the SSH server"
#$IPTABLES -A INPUT --protocol tcp --dport 22 -j ACCEPT

#Allowing access to the HTTP server"
#$IPTABLES -A INPUT --protocol tcp --dport 80 -j ACCEPT

# block out all other Internet access on $EXTIF

So once connected through GPRS, I run:


And then you should be able to connect to the internet from your computer!

Of course this also works when sharing your WLAN connection. Just set EXTIF to eth0.

See also

Personal tools