====== Using SLIP ====== ===== What is SLIP? ===== SLIP is the "mostly obsolete" wikipedia:Serial Line Internet Protocol. "On personal computers, SLIP has been largely replaced by the Point-to-Point Protocol (PPP), which is better engineered, has more features and does not require its IP address configuration to be set before it is established. On microcontrollers, however, SLIP is still the preferred way of encapsulating IP packets due to its very small overhead." Contiki uses SLIP to bridge the wireless IPv6 network onto a PC via a USB connection. So with your Sparrow plugged into your PC, and the right software running on each, traffic from the wireless IP network can reach your site-wide Ethernet network and potentially beyond. On Sparrow, there is only one UART exposed. This means we have to choose between reading debug messages and connecting to our PC via SLIP. This change is exposed by adding "WITH_SLIP=1" to the makefile or command line for any particular project. Projects made "WITH_SLIP" will expect to talk to a slip tunnel on the PC side. Speaking of the PC side... In order for SLIP to work, something on the host PC has to be listening. Using Instant Contiki, the 'tunslip6' will do this. Running it in Linux creates a 'tun0' interface which gives the connected Sparrow an address of aaaa::1 on your local network. ===== Building ===== First, built the tunslip6 tool. This works without modification on Instant Contiki. $ cd tools $ make tunslip6 Now make and upload the border router itself. Be sure to include "WITH_SLIP=1" to turn on slip for this node, and "WITH_WEBSERVER=0" to exclude a web server from this node. $ cd examples/ipv6/rpl-border-router $ make TARGET=sparrow savetarget $ make WITH_SLIP=1 WITH_WEBSERVER=0 -j10 $ make upload AVRDUDE_PORT=/dev/ttyUSB0 ===== Connecting ===== Ok, now it's built. Let's bring up the slip interface on Linux. Note that the baud rate here has to match the baud rate in the uart setup on the board, which is currently 38400. That's a little slow, but I'll work on bringing it up in future revisions. Also note the "v6" switch. That turns on maximum debugging output so we can follow along. $ sudo ../../../tools/tunslip6 aaaa::1/64 -s /dev/ttyUSB0 -B 38400 -v6 ********SLIP started on ``/dev/ttyUSB0 opened tun device ``/dev/tun0 ifconfig tun0 inet `hostname` up ifconfig tun0 add aaaa::1/64 ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:127.0.1.1 P-t-P:127.0.1.1 Mask:255.255.255.255 inet6 addr: aaaa::1/64 Scope:Global UP POINTOPOINT RUNNING NOARP 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:500 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:127.0.0.1 P-t-P:127.0.0.1 Mask:255.255.255.255 inet6 addr: aaaa::1/64 Scope:Global UP POINTOPOINT RUNNING NOARP 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:500 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) IP addresses [4 max] fdfd::3 fe80::11:22ff:fe33:4403 RPL-Border router started *** Address:aaaa::1 => aaaa:0000:0000:0000 SIN: 10 Got configuration message of type P Setting prefix aaaa:: created a new RPL dag Server IPv6 addresses: aaaa::11:22ff:fe33:4403 fdfd::3 fe80::11:22ff:fe33:4403 It's helpful that tunslip6 is putting through the debug messages from the Sparrow. So we can see the boot-up process complete successfully. ===== Ping ===== We should now be able to ping the border router from the host PC. First, we can ping its auto-configured aaaa::/64 address $ ping6 aaaa::11:22ff:fe33:4403 PING aaaa::11:22ff:fe33:4403(aaaa::11:22ff:fe33:4403) 56 data bytes 64 bytes from aaaa::11:22ff:fe33:4403: icmp_seq=1 ttl=64 time=66.1 ms 64 bytes from aaaa::11:22ff:fe33:4403: icmp_seq=2 ttl=64 time=68.6 ms 64 bytes from aaaa::11:22ff:fe33:4403: icmp_seq=3 ttl=64 time=66.2 ms ===== Nodes Beyond the Border ===== We want to reach more nodes than just the one connected. So let's add a route on the host PC. This "route add" command tells Ubuntu that whenever it wants to reach a node whose IP starts with fdfd::/64, it can send that through the tun0 interface. $ sudo route -A inet6 add fdfd::/64 dev tun0 $ netstat -r6 Kernel IPv6 routing table Destination Next Hop Flag Met Ref Use If aaaa::/64 :: U 256 0 0 tun0 fdfd::/64 :: U 1 0 0 tun0 Now that we have the route set up, we can put another node on the network, and ping that. Put anything that speaks RPL on fdfd::1, for example rpl-collect/sender $ cd examples/ipv6/rpl-collect $ make TARGET=sparrow savetarget $ make udp-sender.sparrow.u AVRDUDE_PORT=/dev/ttyUSB1 -j10 Now see that we can ping it ok: $ ping6 fdfd::1 PING fdfd::1(fdfd::1) 56 data bytes 64 bytes from fdfd::1: icmp_seq=1 ttl=64 time=67.8 ms 64 bytes from fdfd::1: icmp_seq=2 ttl=64 time=66.3 ms ====== Using the Webserver ====== From a PC on our network, we want to view a web page served up by any node on our wireless IP network. This will allow us to look at sensor values or other data stored there. ===== Building ===== We'll put the rpl-border-router (with no webserver) on the node connected to the PC, and talk SLIP over USB between it and the PC. The other node will run webserver-ipv6 with 'webserver-nano'. $ cd examples/ipv6/rpl-border-router $ make TARGET=sparrow savetarget $ make upload WITH_WEBSERVER=0 WITH_SLIP=1 AVRDUDE_PORT=/dev/ttyUSB0 -j10 $ cd examples/webserver-ipv6 $ make TARGET=sparrow savetarget $ make WITH_WEBSERVER=webserver-nano -j10 $ make upload login WITH_WEBSERVER=webserver-nano AVRDUDE_PORT=/dev/ttyUSB1 ===== Running ===== This has to be done in another window, because "make login" above took over that window. Here we will bring up the tunnel, and try everything out, one thing at a time. Ping the router, ping the webserver, do the 'get'. $ sudo ../../../tools/tunslip6 aaaa::1/64 -s /dev/ttyUSB0 -B 38400 -v6 $ sudo route -A inet6 add fdfd::/64 dev tun0 $ ping6 fdfd::3 $ ping6 fdfd::1 $ curl -g "http://[aaaa::11:22ff:fe33:4401]/" Here's what success looks like! $ curl -g "http://[aaaa::11:22ff:fe33:4401]/" Contiki-nano
 Front page| Status| Network connections| System processes| File statistics| TicTacToe 
Welcome to the Contiki nano web server!



This page has been sent 2 times
Plus here's the Wireshark summary of this conversation: No. Time Source Destination Protocol Info 1 0.000000 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [SYN] Seq=0 Win=5760 Len=0 MSS=1440 TSV=87387016 TSER=0 WS=5 2 0.242296 aaaa::11:22ff:fe33:4401 aaaa::1 TCP http > 36067 [SYN, ACK] Seq=0 Ack=1 Win=1220 Len=0 MSS=1220 3 0.242351 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [ACK] Seq=1 Ack=1 Win=5760 Len=0 4 0.242589 aaaa::1 aaaa::11:22ff:fe33:4401 HTTP GET / HTTP/1.1 5 0.630341 aaaa::11:22ff:fe33:4401 aaaa::1 TCP [TCP segment of a reassembled PDU] 6 0.630388 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [ACK] Seq=165 Ack=86 Win=5760 Len=0 7 0.898326 aaaa::11:22ff:fe33:4401 aaaa::1 TCP [TCP segment of a reassembled PDU] 8 0.898360 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [ACK] Seq=165 Ack=113 Win=5760 Len=0 9 1.258323 aaaa::11:22ff:fe33:4401 aaaa::1 TCP [TCP segment of a reassembled PDU] 10 1.258369 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [ACK] Seq=165 Ack=408 Win=6432 Len=0 11 1.550390 aaaa::11:22ff:fe33:4401 aaaa::1 TCP [TCP segment of a reassembled PDU] 12 1.550426 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [ACK] Seq=165 Ack=490 Win=6432 Len=0 13 1.842334 aaaa::11:22ff:fe33:4401 aaaa::1 TCP [TCP segment of a reassembled PDU] 14 1.842364 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [ACK] Seq=165 Ack=567 Win=6432 Len=0 15 2.098333 aaaa::11:22ff:fe33:4401 aaaa::1 TCP http > 36067 [FIN, ACK] Seq=567 Ack=165 Win=1220 Len=0 16 2.098508 aaaa::1 aaaa::11:22ff:fe33:4401 TCP 36067 > http [FIN, ACK] Seq=165 Ack=568 Win=6432 Len=0 17 2.334295 aaaa::11:22ff:fe33:4401 aaaa::1 TCP http > 36067 [ACK] Seq=568 Ack=166 Win=1220 Len=0