SMesh on Meraki

This is step-by-step tutorial on how to run SMesh on Meraki.

1. Flashing the Meraki

Download the roofs and kernel images from OpenWrt website. The latest stable version of Kamikaze is 7.09:
ral@dell1:~$ mkdir meraki
ral@dell1:~$ cd meraki
ral@dell1:~/meraki$ wget http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/openwrt-atheros-2.6-root.jffs2-64k
ral@dell1:~/meraki$ wget http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/openwrt-atheros-2.6-vmlinux.gz
ral@dell1:~/meraki$ wget http://download.berlin.freifunk.net/sven-ola/area51/ap51-flash
ral@dell1:~/meraki$ ls -la
total 2728
drwxr-xr-x  2 ral ral    4096 Apr 11 16:18 .
drwxr-xr-x 34 ral ral    4096 Apr 11 16:19 ..
-rw-r--r--  1 ral ral   22620 Aug  3  2007 ap51-flash
-rw-r--r--  1 ral ral 1703936 Sep 30  2007 openwrt-atheros-2.6-root.jffs2-64k
-rw-r--r--  1 ral ral 1048576 Sep 30  2007 openwrt-atheros-2.6-vmlinux.gz
ral@dell1:~/meraki$
Assign the eth interface a static IP in 192.168.84.0/24 network:
ral@dell1:~/meraki$ sudo ifconfig eth1 192.168.84.9 netmask 255.255.255.0
The Meraki should be turned off now. Run the flasher:
ral@dell1:~/meraki$ chmod a+x ap51-flash
ral@dell1:~/meraki$ sudo ./ap51-flash eth1 openwrt-atheros-2.6-root.jffs2-64k openwrt-atheros-2.6-vmlinux.gz
Reading rootfs file openwrt-atheros-2.6-root.jffs2-64k with 1703936 bytes...
Reading kernel file openwrt-atheros-2.6-vmlinux.gz with 1048576 bytes...
Now power on the Meraki. It will take about 10 minutes for this to finish:
rootfs(0x006a0000) + kernel(0x00100000) + nvram(0x00000000) sums up to 0x007a0000 bytes
Peer MAC: 00:18:0a:01:25:4e
Peer IP : 192.168.84.1
Your MAC: 00:ba:be:ca:ff:ee
Your IP : 192.168.84.0
Setting IP address...
Loading rootfs...
Sending rootfs, 3328 blocks...
Initializing partitions...
Flashing rootfs...
Loading kernel...
Sending kernel, 2048 blocks...
Flashing kernel...
Setting boot_script_data...
Done. Restarting device...
ral@dell1:~/meraki$
In OpenWrt the default IP for eth is 192.168.1.1. So assign an IP in 192.168.1.0/24 network:
ral@dell1:~/meraki$ sudo ifconfig eth1 192.168.1.10 netmask 255.255.255.0
ral@dell1:~/meraki$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.949 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.17 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=1.00 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.949/1.042/1.170/0.093 ms
ral@dell1:~/meraki$
Now we can connect to it. Telnet login is enabled by default, but once you change the root password, telnet is disabled and ssh is enabled:
ral@dell1:~/meraki$ telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
 === IMPORTANT ============================
  Use 'passwd' to set your login password
  this will disable telnet and enable SSH
 ------------------------------------------


BusyBox v1.4.2 (2007-09-29 07:21:40 CEST) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
KAMIKAZE (7.09) -----------------------------------
  * 10 oz Vodka       Shake well with ice and strain
  * 10 oz Triple sec  mixture into 10 shot glasses.
  * 10 oz lime juice  Salute!
 ---------------------------------------------------
root@OpenWrt:/# passwd
Changing password for root
New password:
Bad password: too weak
Retype password:
Password for root changed by root
root@OpenWrt:/# exit
Connection closed by foreign host.
ral@dell1:~/meraki$ ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is b7:68:ff:65:95:d4:c5:89:5b:2c:c2:b2:b2:8e:53:9c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts.
root@192.168.1.1's password:


BusyBox v1.4.2 (2007-09-29 07:21:40 CEST) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 KAMIKAZE (7.09) -----------------------------------
  * 10 oz Vodka       Shake well with ice and strain
  * 10 oz Triple sec  mixture into 10 shot glasses.
  * 10 oz lime juice  Salute!
 ---------------------------------------------------
root@OpenWrt:~#
If everything went ok, you should see this:
root@OpenWrt:~# ls -la
drwxrwxrwt    8 root     root          240 Jan  1 00:01 .
drwxr-xr-x   15 root     root            0 Jan  1  1970 ..
-rwx------    1 root     root            0 Jan  1 00:00 .failsafe
-rwx------    1 root     root            4 Jan  1 00:01 .switch2jffs
-rw-r--r--    1 root     root            0 Jan  1 00:00 dhcp.leases
drwxr-xr-x    2 root     root           40 Jan  1 00:01 dropbear
drwxr-xr-x    2 root     root           40 Jan  1 00:00 lock
drwxr-xr-x    2 root     root           80 Jan  1 00:00 log
-rw-r--r--    1 root     root           21 Jan  1 00:00 resolv.conf
drwxr-xr-x    2 root     root           80 Jan  1 00:01 run
drwxr-xr-x    3 root     root           60 Jan  1 00:00 spool
drwxr-xr-x    2 root     root           60 Jan  1 00:00 state
root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/mtdblock1            6.6M      1.8M      4.8M  27% /
none                     14.6M     20.0k     14.6M   0% /tmp
tmpfs                   512.0k         0    512.0k   0% /dev

2. Basic settings

We need Internet connection to update some packages. Change the default IP to one in your network or to DHCP by editing the /etc/config/network file. Mine looks like this:
root@OpenWrt:~# cat /etc/config/network
# Copyright (C) 2006 OpenWrt.org

config interface loopback
        option ifname   lo
        option proto    static
        option ipaddr   127.0.0.1
        option netmask  255.0.0.0

config interface lan
        option ifname   eth0
        option proto    dhcp

#config interface lan
#       option ifname   eth0
#       option type     bridge
#       option proto    static
#       option ipaddr   192.168.1.1
#       option netmask  255.255.255.0
Plug the Internet cable. Reboot the Meraki and ssh into it. Now we can update the packages list:
root@OpenWrt:~# ipkg update
Downloading http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/packages/Packages
Updated list of available packages in /usr/lib/ipkg/lists/release
Downloading http://downloads.openwrt.org/kamikaze/packages/mips/Packages
Updated list of available packages in /usr/lib/ipkg/lists/packages
Done.
Install ip and iptables-mod-ipopt packages.. They are required for running SMesh:
root@OpenWrt:~# ipkg install ip iptables-mod-ipopt
Installing ip (2.6.20-070313-1) to root...
Downloading http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/packages/./ip_2.6.20-070313-1_mips.ipk
Installing iptables-mod-ipopt (1.3.7-1) to root...
Downloading http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/packages/./iptables-mod-ipopt_1.3.7-1_mips.ipk
Installing kmod-ipt-ipopt (2.6.21.5-atheros-1) to root...
Downloading http://downloads.openwrt.org/kamikaze/7.09/atheros-2.6/packages/./kmod-ipt-ipopt_2.6.21.5-atheros-1_mips.ipk
Configuring ip
Configuring iptables-mod-ipopt
Configuring kmod-ipt-ipopt
Done.
root@OpenWrt:~#

3. Running SMesh

First we're going to configure the wireless interface. Here is a simple script for setting the interface in adhoc mode (as required by SMesh):
root@OpenWrt:/smesh# cat /smesh/smesh-up
wlanconfig ath0 create wlandev wifi0 wlanmode adhoc
iwconfig ath0 essid smesh_net300
iwconfig ath0 channel 11
iwconfig ath0
ifconfig ath0 10.0.11.123 netmask 255.0.0.0
ifconfig ath0
Run smesh-up. It prints the output of 'ifconfig ath0' and 'iwconfig ath0':
root@OpenWrt:/smesh# ./smesh-up
ath0
ath0      IEEE 802.11b  ESSID:"smesh_net300"  Nickname:""
          Mode:Ad-Hoc  Frequency:2.462 GHz  Cell: Not-Associated
          Bit Rate:0 kb/s   Tx-Power:0 dBm   Sensitivity=1/1
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/70  Signal level=-256 dBm  Noise level=-256 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

ath0      Link encap:Ethernet  HWaddr 06:18:0A:01:25:4E
          inet addr:10.0.11.123  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:82 (82.0 B)  TX bytes:0 (0.0 B)
Scp the smesh binaries and config files to /smesh:
root@OpenWrt:/smesh# ls -la
drwxr-xr-x    2 root     root            0 Jan  1 00:05 .
drwxr-xr-x   16 root     root            0 Jan  1  1970 ..
-rwxr-xr-x    1 root     root        11410 Jan  1 00:04 runSmesh
-rwxr-xr-x    1 root     root          183 Jan  1 00:03 smesh-up
-rwxr-xr-x    1 root     root         4747 Jan  1 00:04 smesh.conf
-rwxr-xr-x    1 root     root       364780 Jan  1 00:04 smesh_proxy
-rwxr-xr-x    1 root     root       332112 Jan  1 00:04 spines
Edit /smesh/smesh.conf. MESHIF should be ath0 (or whatever interface you set in smesh-up script). For the Internet gateway Meraki the WANIF should be eth0.
Edit /smesh/runSmesh and change . /jffs/smesh.conf to . /smesh/smesh.conf.
Finally, run /smesh/runSmesh script. If everything goes ok, spines and smesh_proxy processes should be running:
root@OpenWrt:/smesh# ./runSmesh
root@OpenWrt:/smesh# ps
  PID  Uid     VmSize Stat Command
    1 root        396 S   init
    2 root            SWN [ksoftirqd/0]
    3 root            SW< [events/0]
    4 root            SW< [khelper]
    5 root            SW< [kthread]
   17 root            SW< [kblockd/0]
   28 root            SW  [pdflush]
   29 root            SW  [pdflush]
   30 root            SW< [kswapd0]
   31 root            SW< [aio/0]
   41 root            SW  [mtdblockd]
  150 root            SWN [jffs2_gcd_mtd1]
  157 root        404 S   logger -s -p 6 -t
  159 root        244 S   init
  166 root        336 S   syslogd -C16
  169 root        288 S   klogd
  177 root        268 S   /sbin/hotplug2 --override --persistent --max-children 1 --no-coldplug
  330 root        220 S   udhcpc -t 0 -i eth0 -b -p /var/run/eth0.pid -R
  404 root        332 S   crond -c /etc/crontabs
  408 root        328 S   /usr/sbin/dropbear -p 22
  415 root        172 S   httpd -p 80 -h /www -r OpenWrt
  429 root        560 R   /usr/sbin/dropbear -p 22
  430 root        572 S   -ash
  568 root        308 S   /usr/sbin/dropbear -p 722
  592 root        688 S   /smesh/spines -l 10.0.11.123 -p 8120 -k 0 -k 1 -W -M 6
  645 root        648 S   /smesh/smesh_proxy -p 8120 -k 1 -mesh_if ath0 -m arp -bht 3 -uht 3 -max 20 -ts 0.2 -df 0.2 -dhcp 120
 -igw_if eth0 -dns 128.220.221.1 -dns 127.0.0.1
  650 root        408 R   ps