This is an old revision of the document!
The Wisconsin Wireless Rover (WiRover) project implements a bandwidth aggregated wide-area wireless access technology for the Internet, especially suited for users on the move, often in vehicles. The goal is to exploit diversity to provide a reliable and high-quality Internet connection.
MAR: A Commuter Router Infrastructure for the Mobile Internet
Exploiting Diversity to Enhance Multimedia Streaming Over Cellular Links
Task Table
Task Name | Sub-task | Details | Owner | Date completed |
---|---|---|---|---|
Dynamically scan interfaces | - | The system should be able to adjust to iface going up or down and changing IP addresses | Josh | DONE |
- | Spawn off a thread | This code to be a thread to dynamically scan interfaces on the go | Josh | N/A |
- | Route Patching | Need to code up some functions to patch routing when needed (or turn off network manager) | - | - |
Setup proxy | - | All packets will be encapsulated and sent to the proxy | Josh | DONE |
- | Proxy NAT | The proxy will also need a NAT to translate packets for multiple WiRovers | Josh/Rob | DONE |
Test Scripts | - | Scripts to test the code base | - | - |
- | Log Test Output | Keep a log of test output so we can go back and see when/where things broke | - | DONE |
Code Cleaning | General clean up | Lots of code to clean up | Josh/Rob | DONE |
- | Parameter File | Have all the parameters read from a file | Josh/Rob | DONE |
- | Better Logging | If a crash happens we need enough info to figure out what caused the crash | Josh/Rob | DONE |
- | Break Up Long Functions | - | Josh/Rob | - |
- | Remove Hard Coded Values | - | - | - |
- | Remove Globals | - | Josh/Rob | DONE |
Demo | Basic demo | Run round robin in the lab | All | DONE |
- | Weighted round robin | In lab | Josh | DONE |
- | Video demo | In lab or in a car | All | - |
Deployment | - | What needs to be done before deployment can happen? | - | - |
- | MTU Problems | For iPhone and other devices (N800) | Rob | DONE |
- | Set up DNS for WiRover | When we have code updates we need to be able to remote into the machine and update it | - | DONE |
- | Bus Install | Need remote access and log/info about crashes | - | - |
- | Push Updates | If new code version | - | - |
- | Usage Stats | Need to be able to collect general stats like number of unique IP, average usage, length of use, etc. | - | - |
Currently being worked on by Joshua Hare, Rob Madden, and Jordan Walker
Previously worked on by Ryan Pfeiffer, Nick Leaf, and Sharad Saha.
Gmail Account for getting mar status emails:
user: wisconsin.rover@gmail.com
pass: soekris;
Set up a dyndns.com account
Install ddclient package on eeepc, set up for wirover1.dyndns.org.
Future boxes can be added by adding host wirover2, etc.
WiNGS-Laptop-3
WiNGS-Laptop-4 (eeepc 900A)
WiNGS-Laptop-5 (eeepc 900A)
WiNGS-Laptop-6 (eeepc 900A)
Ubuntu EEEPC/Easy Peasy Configuration
SVN Howto for MAR:
[rmadden@corral mar]$ svn ls file:///home/svn/mar OR svn ls svn+ssh://username@corral.wail.wisc.edu/home/svn/mar mar_eeepc/ mar_linux/ mar_soekris/
[rmadden@corral wirover]$ svn ls file:///home/svn/wirover OR svn ls svn+ssh://username@corral.wail.wisc.edu/home/svn/wirover wicontroller/ wigateway/
wireless28:~ robmadden$ svn ls svn+ssh://svn@corral.wail.wisc.edu/home/svn/wiscosvn@corral.wail.wisc.edu's password: wirover/
Checkout current version of WiRover System (checks out code for Gateway/Controller)
svn co svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco/
Checkout modules over ssh:
svn co svn+ssh://username@corral.wail.wisc.edu/home/svn/(project)/(module)
wireless28:~ robmadden$ svn co svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco wireless28:~ robmadden$ svn co svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco/wirover wireless28:~ robmadden$ svn co svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco/wirover/data wireless28:~ robmadden$ svn co svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco/wirover/demo
Checkout the bus tracker over ssh:
svn co svn+ssh://username@corral.wail.wisc.edu/home/svn/bus_tracker
How to make a branch over ssh:
svn copy svn+ssh://username@corral.wail.wisc.edu/home/svn/mar/mar_eeepc/(copy_from) svn+ssh://username@corral.wail.wisc.edu/home/svn/mar/mar_eeepc/branches/(branch_name)
How to make a tag over ssh:
svn copy svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco/wirover/ svn+ssh://svn@corral.wail.wisc.edu/home/svn/wisco/tags/wirover-0.1 -m "Tagging the 0.1 releaes of the 'wirover' project."
Because the routing cache is maintained by the kernel separately from the routing tables, manipulating the routing tables may not have an immediate effect on the kernel's choice of path for a given packet. To avoid a non-deterministic lag between the time that a new route is entered into the kernel routing tables and the time that a new lookup in those route tables is performed, use ip route flush cache. Once the route cache has been emptied, new route lookups (if not by a packet, then manually with ip route get) will result in a new lookup to the kernel routing tables.
BIOS Changes
OpenWRT Settings (backed up in svn as config/dd-wrt-config.bin):
Administration Tab
Setup Tab
Wireless Tab
NAT/QoS Tab
On ubuntu machine:
cat enabled > /sys/class/net/eth0/device/power/wakeup
Add ethernet card driver to MODULES_WHITELIST in /etc/default/acpi-support
Write 'wol_setup' script : ethtool -s (interface) wol g
Modify scripts in /etc/acpi/suspend.d
I started out with a fresh install of ubuntu 9.04 on a HP desktop machine.
To setup the madwifi driver
Setup DNSmasq for the AP:
Setup the linksys AP for now
Then setup no_proxy per connection striping.
/etc/resolv.conf nameserver 208.67.222.222 nameserver 208.67.220.220
OpenWRT Settings (backed up in svn as config/dd-wrt-config.bin):
Administration Tab
Setup Tab
Wireless Tab
NAT/QoS Tab
Setup the linksys AP for now
From Nick Leaf
MAR has two “ends,” so to speak. The inward-facing end is the NAT and wireless AP. On the MAR laptop, this function is taken care of by the internal wifi interface. MAR captures all packets on this interface. The outward-facing end is one or more EVDO cards. MAR captures all packets on either interface, though it mostly only deals with the network and transport layers.
Most of the action takes place in mar_msg.c, in the process_outbound_pkt and process_inbound_pkt functions. Outbound packets are those heading from clients on the AP to the EVDO network, and inbound packets are those heading towards the AP clients. UDP (except for DNS packets on port 53) and ICMP traffic is blocked; only TCP traffic is passed.
Every time process_outbound_pkt receives a SYN from an AP client on a connection that does not already exist, it creates entries in the hashtables for that connection. See lines 387-453 in mar_msg.c. There are two tables, one for outbound packets and one for inbound packets. The key for the outbound hashtable key is computed from the AP client's IP, the AP client's port, and the destination server's IP and port. The inbound hashtable key is computed from the server's IP and port, and the EVDO interface's IP and port.
sudo apt-get install uvc
sudo apt-get install vlc
sudo wget http://www.medibuntu.org/sources.list.d/`lsb_release -cs`.list --output-document=/etc/apt/sources.list.d/medibuntu.list && sudo apt-get -q update && sudo apt-get --yes -q --allow-unauthenticated install medibuntu-keyring && sudo apt-get -q update
sudo apt-get update
sudo apt-get purge ffmpeg x264 libx264-dev sudo apt-get update sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libsdl1.2-dev libtheora-dev libx11-dev libxvidcore4-dev zlib1g-dev git clone git://git.videolan.org/x264.git cd x264 ./configure make sudo checkinstall --fstrans=no --install=yes --pkgname=x264 --pkgversion "1:0.svn`date +%Y%m%d`-0.0ubuntu1" --default cd .. svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg cd ffmpeg ./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab make sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg --pkgversion "3:0.svn`date +%Y%m%d`-12ubuntu3" --default
Netlink sockets will send notifications from the kernel to the user space of links going up and down, changes to IP addresses, and changes to routes. It can also be used to add and remove routes.