Skip to content

brettdh/libcmm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Intentional Networking

Intentional Networking (née libcmm*) is a library that helps applications make good use of multiple networks simultaneously.

It presents an interface similar to the traditional BSD socket API, with some additions to support multi-network operation. Underneath this interface, Intentional Networking maintains multiple connections as networks come and go, sending traffic on the network that best suits the traffic's characteristics. These characteristics are specified by applications as simple, qualitative labels such as "foreground" vs. "background."

In order to ensure that data is delivered in a correct order, Intentional Networking allows applications to group data into atomic units of delivery, called IROBs (Isolated Reliable Ordered Bytestream). Applications can also specify ordering constraints between IROBs, and Intentional Networking will ensure that the receiving end sees the IROBs in an order that obeys the constraints. This construction gives Intentional Networking freedom to reorder and stripe data for performance without breaking application expectations on delivery order.

For full details, see the paper and presentation published in MobiCom 2010.

How to use

Prerequisites:

For tests:

Build:

$ git clone https://github.com/brettdh/libcmm
$ cd libcmm
$ make
$ sudo make install

Android

The javalib directory contains an Android library that you can use by importing it in Eclipse and adding it as a library project to your Android project. See the Android documentation for more details.

Alternatively, to use from JNI (or to build other projects that depend on Intentional Networking), first symlink the jni directory into your NDK modules path:

$ mkdir -p $NDK_MODULE_PATH/edu.umich.mobility
$ ln -s /path/to/libcmm/jni $NDK_MODULE_PATH/edu.umich.mobility/libcmm

then add this line to the end of your Android.mk:

$(call import-module, edu.umich.mobility/libcmm)

Use:

Here I must refer you to the API documentation in libcmm.h and libcmm_irob.h and example applications, such as libcmm_test_{sender,receiver}.cpp and AndroidSimpleSender. I intend to write a more thorough guide for setup and use eventually. I also intend to make this more turnkey, but that will take considerable effort.

Did I mention this is research-quality code? The terms of the CRAPL apply (though the actual license is BSD).

Caveats

In order to actually use multiple networks at once on Linux, your kernel must support policy routing, and you must configure additional default gateways for each network interface, along with a policy rule that directs traffic bound to a particular IP to that gateway. (See above about how I really want to write a better guide for all this, and then obviate the need for that guide by making it all automatic.)

Good luck!

Footnote

* "Connection Manager Manager" [sic]. It's a long story.

About

Intentional Networking, a library for using multiple networks well.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published