The Babel routing protocol. Babel is a routing protocol designed for wireless and wired networks. Babel is a distance-vector routing protocol. Babel converges quickly compared to other distance-vector routing protocols. Babel does NOT support BFD, at least not using FRRouting. Babel uses multiple metrics, to calculate the path to a route. Babel could be used in wired networks but always having in mind that it was designed primarily for wireless networks. In this netlab it is shown how to setup a basic babel wired topology. It is using a FRR 8.2.2 running on a alpine linux appliance. See Building 64bit alpine linux GNS3 FRRouting appliance. This netlab is running using the Graphical Network Simulator - GNS3.

Topology

This netlab is using a triangle design. It is using IPv6 only.

Triangle network topology and addressing:

            lo                                          lo
    2001:db8:1111::/128                         2001:db8:2222::/128
        +-------+                                   +-------+
        |       | eth0                         eth0 |       |
        |  FRR1 |-----------------------------------|  FRR2 |
        |       |                                   |       |
        +-------+                                   +-------+
       eth2 |                                           | eth1
            |                                           |
            |                                           |
            |                                           |
            |                                           |
            |                                           |
            |                 +-------+                 |
            |                 |       |                 |
            +-----------------|  FRR3 |-----------------+
                         eth2 |       | eth1
                              +-------+
                                  lo
                          2001:db8:3333::/128

This netlab uses wired connections to cover the basic information about the Babel routing protocol, and its current implementation status in FRRouting.

Router configuration

The router configurations for FRR1, FRR2 and FRR3 according to the depicted upper network sketch:

  • Configure loopback address
  • Enable babel routing process
  • Enable babel routing on physical interfaces
  • Advertise the loopback address

One note regarding the used redistribuite ipv6 connected configuration command in this netlab.

📘 Note

In the context of the current netlab where only 1 particular IPv6 prefix is put into the routing, 2001:db8:1111::/128 lo interface IPv6 address. It is the only working method at this time. If any other physical interfaces with global IPv6 addressing would exist on this particular router, apart from that one lo interface address, then this IPv6 address would be put into the babel routing. The router will advertise all connected ipv6 prefixes into routing.

Before using redistribute ipv6 connected command in a routing context, verify connected routes first. Each connected route on the router will be advertised by this router. It is a catchall method , or joker route kind of adding local router, as a personal note, not a good approach of adding routes into routing. Everything connected will be added to the routing area. To verify which and how many networks will be put into the babel routing, use the sh ipv6 route connected command:

FRR1#sh ipv6 route connected

Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, f - OpenFabric, .> - selected route, * - FIB route, q - queued, r - rejected, b - backup t - trapped, o - offload failure   C>* 2001:db8:1111::/128 is directly connected, lo, 03:13:22 C * fe80::/64 is directly connected, eth2, 03:13:23 C>* fe80::/64 is directly connected, eth0, 03:13:23

Looking at the output, only the lo interface will be put into the Babel routing domain. IPv6 Link Local LL addressing on the eth0 and eth2 interfaces, will not be put into the Babel routing domain. Using the redistribute connected is currently the only working approach of putting IPv6 networks into the Babel routing domain. This is what happens when you try to be careful and add interfaces into routing domain using the best practice approach:

FRR1# conf t
FRR1(config)# router babel
FRR1(config-router)# network
IF_OR_ADDR  Interface or address
FRR1(config-router)# network 1.1.1.1
% [BABELD] Unknown command: network 1.1.1.1
FRR1(config-router)# network 2001:db8:1111::
% [BABELD] Unknown command: network 2001:db8:1111::
FRR1(config-router)# network 2001:db8:1111::/128
% [BABELD] Unknown command: network 2001:db8:1111::/128
FRR1(config-router)# network 2001:db8:1111::/64
% [BABELD] Unknown command: network 2001:db8:1111::/64
FRR1(config-router)#

Putting IP addressing does not work using the network command. Adding networks works only by the interface name lo eth0. The network command enables the babel routing protocol on a particular interface. Routers from neighborships on dedicated interfaces, these dedicated interfaces, where neighbors are awaited need to be configured with the network <IF> command.

Babel passive interface adding, where no Babel neighborship will be formed, like the interface lo interface works now only using the redistribute connected router command.

FRR1

conf t
!
! Configure int lo address:
!
interface lo
 ipv6 address 2001:db8:1111::/128
exit
!
! Enable the routing process:
!
router babel
 !
 ! Enable routing on physical interfaces:
 !
 network eth0
 network eth1
 network eth2
 !
 ! Advertise loopback address:
 !
 redistribute ipv6 connected
exit
!
end

FRR2

conf t
!
interface lo
 ipv6 address 2001:db8:2222::/128
exit
!
router babel
 network eth0
 network eth1
 network eth2
 redistribute ipv6 connected
exit
!
end

FRR3

conf t
!
interface lo
 ipv6 address 2001:db8:3333::/128
exit
!
router babel
 network eth0
 network eth1
 network eth2
 redistribute ipv6 connected
exit
!
end

show commands

show babel neighbor

After finished the configuration on all topology routers. Verify if the routers form neighborships on directly connected links:

FRR1#show babel neighbor

Neighbour fe80::e36:85ff:fe4b:2 dev eth2 reach ffff rxcost 256 txcost 256 rtt 0.000 rttcost 0. Neighbour fe80::ea5:99ff:fe66:0 dev eth0 reach ffff rxcost 256 txcost 256 rtt 0.000 rttcost 0.

The show babel neighbor output shows the metrics and cost on the interface:

  • interface eth2
  • reachability ffff (best?)
  • recive cost 256
  • transmit cost 256
  • round trip time 0
  • round trip time cost 0

show babel interface

FRR1#show babel interface eth0

eth0 is up ifindex 2, MTU 1500 bytes Babel protocol is running on this interface Operating mode is wireless Split horizon mode is Off Hello interval is 4000 ms Update interval is 16000 ms Rxcost multiplier is 256

In the default configuration every interface in Babel will be set in the wireless mode using following settings:

  • Operating mode wireless
  • Split horizon mode Off
  • Hello 4 seconds
  • Update interval 16 seconds
  • RXcost multiplier 256

show ipv6 route babel

FRR1#show ipv6 route babel

Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, f - OpenFabric, .> - selected route, * - FIB route, q - queued, r - rejected, b - backup t - trapped, o - offload failure   A>* 2001:db8:2222::/128 [100/0] via fe80::ea5:99ff:fe66:0, eth0, weight 1, 00:04:13 A>* 2001:db8:3333::/128 [100/0] via fe80::e36:85ff:fe4b:2, eth2, weight 1, 00:02:38

Babel routes with Administrative Distance of 100 and 0 metrics. Available via LL interface addressing on both interfaces eth0 and eth2. With a weight of 1, and time since the route has become available in the routing table. Verify using the Administrative Distance on various network operating systems. Administrative Distance, called also route priority or priority is a network operating system specific option. Different implementation will most probably set different default values.

configure commands

babel interface wired

The topology relies on wired connections, per default all interfaces in BABEL are assumed to be in wireless mode. Adjust the configuration in the netlab on directly connected interfaces for FRR1, FRR2 and FRR3 routers to be set to wired mode:

conf t
!
int eth0
 babel wired
int eth1
 babel wired
int eth2
 babel wired
!
end

This configuration step has a impact on the used BABEL metrics. The wired interfaces have lower cost multiplier, so are cheaper to use, wired interfaces more preferred than the wireless from the standpoint of BABEL routing process.

show babel neighbor

Show the babel neighbor connected to the FRR1 router. Notice the neighborship are formed via LL addresses, and the changed rxcost/txcost int the output:

FRR1#show babel neighbor

Neighbour fe80::ea5:99ff:fe66:0 dev eth0 reach ffff rxcost 96 txcost 96 rtt 0.000 rttcost 0. Neighbour fe80::e36:85ff:fe4b:2 dev eth2 reach ffff rxcost 96 txcost 96 rtt 0.000 rttcost 0.

The output shows following metrics and cost for the interface eth2:

  • interface eth2
  • reachability ffff (best?)
  • recive cost 96
  • transmit cost 96
  • round trip time 0
  • round trip time cost 0

show babel interface

Review the babel interface eth0 configuration. Notice the change of Rxcost multiplier from 256 to 96 and the Split horizon option has been set to On:

R1#show babel interface eth0

eth0 is up ifindex 2, MTU 1500 bytes Babel protocol is running on this interface Operating mode is wired Split horizon mode is On Hello interval is 4000 ms Update interval is 16000 ms Rxcost multiplier is 96

Wired mode babel default interface settings:

  • Operating mode wired
  • Split horizon mode On
  • Hello 4 seconds
  • Update interval 16 seconds
  • RXcost multiplier 96

show ipv6 route babel

Show the ipv6 BABEL routes in the routing table. The Administrative Distance is set to 100, note that no metrics are applied on the vtysh output [100/0]. The metrics of the babel route are set to 0. This is something that might be missing in FRR for wired links, either not displayed correctly, or still not working in this babel implementation:

R1#show ipv6 route babel

Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, f - OpenFabric, .> - selected route, * - FIB route, q - queued, r - rejected, b - backup t - trapped, o - offload failure   A>* 2001:db8:2222::/128 [100/0] via fe80::ea5:99ff:fe66:0, eth0, weight 1, 02:35:49 A>* 2001:db8:3333::/128 [100/0] via fe80::e36:85ff:fe4b:2, eth2, weight 1, 02:35:45

show ipv6 route

Display the whole IPv6 routing table. Notice the lo address is directly connected, indicating which router the output is from 2001:db8:1111::/128 FRR1:

FRR1#sh ipv6 route

Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3, I - IS-IS, B - BGP, N - NHRP, T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR, f - OpenFabric, .> - selected route, * - FIB route, q - queued, r - rejected, b - backup t - trapped, o - offload failure   C>* 2001:db8:1111::/128 is directly connected, lo, 02:36:19 A>* 2001:db8:2222::/128 [100/0] via fe80::ea5:99ff:fe66:0, eth0, weight 1, 02:36:18 A>* 2001:db8:3333::/128 [100/0] via fe80::e36:85ff:fe4b:2, eth2, weight 1, 02:36:14 C * fe80::/64 is directly connected, eth2, 02:36:20 C>* fe80::/64 is directly connected, eth0, 02:36:20

iproute2

The ipv6 routing table shown by the iproute2 utility. Notice the metric of babel is set to 20:

user % ip -6 route

2001:db8:1111:: dev lo proto kernel metric 256 pref medium 2001:db8:2222:: nhid 10 via fe80::e64:9cff:fe5b:0 dev eth0 proto babel metric 20 pref medium 2001:db8:3333:: nhid 14 via fe80::e09:efff:febd:2 dev eth2 proto babel metric 20 pref medium fe80::/64 dev eth0 proto kernel metric 256 pref medium fe80::/64 dev eth2 proto kernel metric 256 pref medium

Babel path computation

The metrics are split up in wired and wireless networks. Babel uses different algorithms for different types of networks. It looks the implementation is lacking some of the code to display the metrics properly, at least for the wired FRR implementation part:

  • Path Cost Computation
  • Recommended strategies for computing a link's cost- Appendix A
  • Wired links use k-out-of-j path computation - Appendix A.2.1
  • Wireless links use The Expected Transmission Cost algorithm ETX
  • Recommended default values of the parameters - Appendix B

bug 10893

Note that using FRR version 8.2.2 setting up a lab BABEL netlab initially works.

📘 Note
During further setup of the netlab and initial debugging, noticed the Babel implementation on FRR has a bug. A interface flap, does not initiate forming up a routing neighborship - 10893.

After disrupting the link on eth0 interface on router FRR1, the directly connected neighbor FRR2 will not get reachable via that eth0 interface. Further interface flapping on other routers in the network topology renders the netlab unusable. After the restart of the the network toplogy in GNS3 every neighborship is formed up properly again.

bug fix

How the bug was fixed in the code. File babeld/babel_interface.c received

  • 1 add and
  • 17 deletions

This is the diff of the fix. With following commit message:

babeld: Rehook up interface up events 
When babeld was switched over to the zapi interface up/down callbacks the interface up event was not properly put back in.

Bug has been reported by a debian linux user. Thanks for that bug report.

Summary

Babel implementation lacks the ability to add interfaces or IP addresses into the routing domain. Best approach would be to have syntax like this:

conf t
!
interfaces lo
  router babel
exit
!
int eth0
  router babel
exit
!
router babel
  passive interface lo
end

Instead of putting interfaces into the router babel process. Someone needs to implement this in the babel code. Also all the EIGRP metric like calculation for the routing cost is still lacking. Different algos for different media. However the DUAL algo is calculated from 5 metrics that are taken into account so this might be a longer undertaking. Good to have the RFC's at hand.

Resources