Skip to content
C Groff Other
Latest commit bda8e6d @jech Dump interfaces too.
Failed to load latest commit information.
.gitattributes Add .gitattributes.
.gitignore Generate babeld's version automatically, display in control interface.
CHANGES Update CHANGES for 1.7.0.
LICENCE Update copyright date in LICENCE.
Makefile Generate babeld's version automatically, display in control interface.
README Update website address.
babeld.c Add support for returning actions from parse_config_from_string.
babeld.h Add option "router-id", remove command-line flag "-R".
babeld.man Generate babeld's version automatically, display in control interface.
configuration.c Implement config command flush interface.
configuration.h Implement flush_interface.
disambiguation.c Optimization, by allowing traversing (installed) specific routes only.
disambiguation.h Add disambiguation algorithm.
generate-version.sh Avoid spaces in babeld version.
interface.c Implement flush_interface.
interface.h Implement flush_interface.
kernel.c Fix style.
kernel.h Move the table selection into rule.c.
kernel_netlink.c Fix uninitialized values.
kernel_socket.c Move the table selection into rule.c.
local.c Dump interfaces too.
local.h Implement dump, monitor, unmonitor.
message.c Fix typo -- ids are 8 octets, not 16.
message.h Remove obsolete comment.
neighbour.c Format TLV for unicast requests.
neighbour.h Add a cost to neighbours, computed from the RTT
net.c Protect against sendmsg returning EAGAIN indefinitely.
net.h Implement tcp_server_socket.
resend.c Fix bug: wrong comparison.
resend.h Implement source-specific requests.
route.c Do not send multihop requests when a route's metric increases.
route.h Optimization, by allowing traversing (installed) specific routes only.
rule.c Fix typo.
rule.h Move the table selection into rule.c.
source.c Make expire_sources run in linear time.
source.h Rework source.c to be in log(n).
util.c Simplify prefix_cmp.
util.h Tweak endianness of D_NTOHS.
xroute.c Fixed incorrect ifindex overwrite.
xroute.h Refactor netlink: address import.

README

Babel
=====

Babel is a loop-avoiding distance-vector routing protocol roughly
based on HSDV and AODV, but with provisions for link cost estimation
and redistribution of routes from other routing protocols.


Installation
============

    $ make
    $ su -c 'make install'

If compiling for OpenWRT, you will probably want to say something like

    $ make CC=mipsel-linux-gcc PLATFORM_DEFINES='-march=mips32'

On Mac OS X, you'll need to do

    $ make LDLIBS=''


Setting up a network for use with Babel
=======================================

1. Set up every node's interface
--------------------------------

On every node, set up the wireless interface:

    # iwconfig eth1 mode ad-hoc channel 11 essid "my-mesh-network"
    # ip link set up dev eth1

2. Set up every node's IP addresses
-----------------------------------

You will need to make sure that all of your nodes have a unique IPv6
address, and/or a unique IPv4 address.

On every node, run something like:

    # ip addr add 192.168.13.33/32 dev eth1
    # ip -6 addr add $(generate-ipv6-address -r)/128 dev eth1

You will find the generate-ipv6-address utility, which can generate random
IPv6 addresses according to RFC 4193, on

      http://www.pps.univ-paris-diderot.fr/~jch/software/files/


A note about tunnels and VPNs
-----------------------------

Some VPN implementations (notably OpenVPN and Linux GRE) do not
automatically add an IPv6 link-local address to the tunnel interface.
If you attempt to run Babel over such an interface, it will complain
that it ``couldn't allocate requested address''.

The solution is to manually add the link-local address to the
interface.  This can be done by running e.g.

    # ip -6 addr add $(ahcp-generate-address fe80::) dev gre0


3. Start the routing daemon
---------------------------

Run Babel on every node, specifying the set of interfaces that it
should consider:

    # babeld eth1

If your node has multiple interfaces which you want to participate in
the Babel network, just list them all:

    # babeld eth0 eth1 sit1


4. Setting up an Internet gateway
---------------------------------

If you have one or more Internet gateways on your mesh network, you
will want to set them up so that they redistribute the default route.
Babel will only redistribute routes with an explicit protocol
attached, so you must say something like:

    # ip route add 0.0.0.0/0 via 1.2.3.4 dev eth0 proto static

In order to redistribute all routes, you will say:

    # babeld -C 'redistribute metric 128' eth1

You may also be more selective in the routes you redistribute, for
instance by specifying the interface over which the route goes out:

    # babeld -C 'redistribute if eth0 metric 128' eth1

or by constraining the prefix length:

    # babeld -C 'redistribute ip ::/0 le 64 metric 128' \
             -C 'redistribute ip 0.0.0.0/0 le 28 metric 128' \
             eth1

You may also want to constrain which local routes (routes to local
interface addresses) you advertise:

    # babeld -C 'redistribute local if eth1' -C 'redistribute local deny' \
             -C 'redistribute metric 128' \
             eth1

If you find all of this too complicated and error-prone (as I do), you
may want to consider autoconfiguring your routing domain using AHCP:

    http://www.pps.univ-paris-diderot.fr/~jch/software/ahcp/

-- Juliusz Chroboczek
Something went wrong with that request. Please try again.