Babel + IPv4 = parse error

Julian Schuh julez at julez.in
Sun Jun 10 11:22:17 CEST 2018


Hi all,

for a current project I’m planning on using Babel as a lightweight, dual-stack routing protocol for a couple of simple tasks. For a proof of concept I’ve been using BIRD, and a plan to continue using BIRD at least in the backend.

Sadly, I quickly hit a showstopper: none of the routes (neither v4 nor v6) exported from one side were imported on the other side. While investigating the problem I quickly stumbled over the following line in the debug log:
“bird: bb: Bad TLV from fe80::xxx via vh type 8 pos 16 - parse error”
After playing around for a little bit I found out: The problem appears whenever the route advertisement contains v4 routes.

I’m using BIRD 2.0.2. I used the following setup to reproduce the problem:
Two network namespaces, “default" and “test", connected via an veth pair.
In both namespaces I’m running a BIRD instance with the following configs:

default:
############################################
debug protocols all;

router id 127.0.0.17;

protocol device {
}

protocol babel bb {
       interface "v*" {
       };

       ipv4 {
               import all;
               export none;
       };
       ipv6 {
               import all;
               export none;
       };
};
############################################

test:
############################################
debug protocols all;

router id 127.0.0.18;

protocol device {
}

protocol kernel v4 {
       ipv4 {
             import all;
             export all;
       };
       learn;
}

protocol kernel v6 {
       ipv6 {
               import all;
               export all;
       };
       learn;
};

protocol babel bb {
       interface "v*" {
       };

       ipv4 {
               import none;
               export all;
       };
       ipv6 {
               import none;
               export all;
       };
}
############################################

(1) In test, I create an IPv6 route. It gets propagates to default:

test> show route: fd77:8888::/32       unicast [v6 09:02:15.854] * (10) via fd54:7777::1 on gre0
test> show route export bb: fd77:8888::/32       unicast [v6 09:02:15.854] * (10) via fd54:7777::1 on gre0
test> show protocol all bb: ipv4: 0 exported, ipv6: 1 exported

default> show route: fd77:8888::/32       unicast [bb 09:04:23.648] * (130/96) [00:00:00:00:7f:00:00:12] via fe80::3028:9aff:fea7:4a62 on vh
default> show protocol all bb: ipv4: 0 imported, ipv6: 1 imported

(2) Now, I add a v4 route on test:
test> ip r a 1.2.3.0/24 via 10.10.10.16 dev gre0
show route [export] now shows both routes, v4 and v6. show protocol all bb show 1 exported for each v4 and v6.
In this moment, I start receiving parse errors in the debug log of the other side (default):  Bad TLV from fe80::3028:9aff:fea7:4a62 via vh type 8 pos 16 - parse error   

Interestingly, when retracting the route, the update seems to work:
test> ip r d 1.2.3.0/24 via 10.10.10.16 dev gre0
Debug output on other side (default): Handling update for 1.2.3.0/24 with seqno 1 metric 65535

TL;DR: There _seems_ to be a bug in the babel protocol implementation that leads to parse errors and thus missed route advertisements if ipv4 routes are conveyed. This does not happen with ipv4 route retractions.

I would really appreciate any help. If it’s a bug I would happily test source code patches.

Thanks in advance and best Regards
Julian Schuh


More information about the Bird-users mailing list