MORE -- MAC-independent Opportunistic Routing and Encoding



As packaged here, MORE supports a limited set of features:

We are planning to address the missing features in the near future, depending on the demand.

Important Notes


As implemented here, MORE is a userspace program that communicates with the wireless network interface via raw sockets to route its packets from the source to the destination.

MORE has been built on Click modular router and tested on Atheros 802.11 a/b/g cards driven by the MadWifi driver on Linux 2.6. Running on other systems will require some porting.

To truly test MORE, you will need at least 3 machines (source, destination and a forwarder) equipped with an Atheros wireless interface. To sum up, the steps required are:

  1. install madwifi-ng on testbed machines
  2. build userlevel Click with MORE
  3. place click binary, and on testbed machines (default location is ~root/more)
  4. place remaining scripts (or the whole conf directory) in your environment PATH on your experiment driving machine
  5. create a nodes listing file and run experiments


MadWifi is only needed to run Click with MORE, not build it.

Follow the download instructions from MORE should work fine with both madwifi-old and madwifi-ng. However, this package has been specifically prepared for the release madwifi- Follow the installation instructions from the driver package on your testbed machines.

If you previously had madwifi installed, you might have to remove the old modules. That could require bringing the interface down and unloading the module ath_pci.


Follow the download instructions from This package was tested on Click releases 1.5.0 and 1.6.0.

To build Click with MORE, you need to place MORE source code as a subdirectory to one of the enabled subdirectories in the /elements tree. For example you can place the source files under elements/local, but do not forget to --enable-local in the configure. Alternatively, place the source files in a subdirectory of /elements/wifi.

MORE uses very few elements from click -- from userlevel, standard, ethernet, and wifi. Make sure that these element directories are enabled. MORE was tested in userlevel only. You can disable linuxmodule, app, aqm, tcpudp, ip, icmp for faster build. If you are building on a different machine than the testbed, you might consider adding LDFLAGS=--static.

Build the userlevel click binary and place it on your testbed machines.

Router configuration

A core component of the package is the script When executed on a testbed machine, it ensures that the wireless interface is in the monitor ("raw") mode and generates a a Click configuration file including both MORE and a straw-man single-path router (SPP).


To compute static routing, you need to measure all-pair delivery probabilities in the selected transmitter configuration (channel, bitrate, tx power). Included in the package is a simple tool that takes care of that.

Like other scripts in this package, uses and a common format of node list for management -- for each node in your testbed the list includes the line:

The scripts assume you can ssh root@IP without passwords (e.g., using keys). MAC is the hardware address of the wireless device and HOSTNAME is for convenience. To find the MAC you can run (on the subject testbed machine):
./ > /dev/null
With default settings, it should read:
using wifi0 / ath0 MAC 00:11:22:33:44:55

NOTE: the assumed directory for click, and is /root/more. To change it, update RUNTIME_DIR in The default name for the node list is ./nodes.

The link measurement format used for computation is:

[transmitter] [receiver] [bitrate] [delivery-prob]
Where bitrate is the IEEE (2x) bit-rate (i.e, 5.5Mb/s is bitrate 11).


To install Madwifi:

make install  

To configure and build click (assuming MORE is under elements/local):

./configure --enable-wifi --enable-local
# copy userlevel/click to the testbed machines

To setup runtime environment:

# create the 'nodes' file, e.g. 00:AA:BB:CC:DD:EE host1 00:AA:BB:CC:DD:FF host2
# put click, and in your runtime dir on the testbed

To setup all nodes on a common channel, e.g. 4, and (and to quickly check if the 'nodes' file is correct): nodes 'iwconfig ath0 channel 4'

To measure links at 1Mb/s: -r 2 -o links2
# it takes a while!
# output in links2 could look like this:
host1 host2 2 0.5
host2 host1 2 1.0

To run experiment: links2 host1 host2 spp links2 host1 host2 more
# this writes the routing configuration to (spp|more).feed
# executes it
# and dumps the counters' readings to (spp|more).stats
The resulting Python-parsable .stats file contains a dictionary storing, for each hostname in nodes, a list of 5 strings: outgoing DATA packets, outgoing ACK packets, incoming packets, packets received (at sink), average rate of packets received (at sink). For example:
'host1' : ['4200', '0', '64', '0', '0'] ,
'host2' : ['0', '64', '4188', '4160', '70.92'] ,
We see host2 received 4160 packets at average rate of 70.92 per second.

NOTE: Your mileage may vary. The throughput gain of MORE strongly depends on the diversity in the network. For example, if both MORE and SPP transmit directly to the destination (1-hop), then there is no opportunistic gain to be expected. Generally, we can expect better results, if the nodes in the network have high degrees of low quality links.

Change Log