BFD getting stuck in Init state when taking down and up the interface

Julian Schuh julez at julez.in
Mon Jan 20 14:41:58 CET 2020


Hi all,

I think I discovered a bug causing BFD sessions to get stuck in the Init 
state when taking down and up the interface that is being for the BFD 
session.

I'm using bird 2.0.7 on linux 4.19.86.

My setup: I have to network namespaces t1 and t2, connected by a veth pair:

ip -n t1 addr show
> 99: t2_1 at if100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
>     link/ether fa:e1:52:51:62:a3 brd ff:ff:ff:ff:ff:ff link-netns t2
>     inet6 2001:db8:1::1/64 scope global
>        valid_lft forever preferred_lft forever
>     inet6 fe80::f8e1:52ff:fe51:62a3/64 scope link
>        valid_lft forever preferred_lft forever

ip -n t2 addr show
> 100: t1_1 at if99: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
>     link/ether b2:0e:f4:60:1b:08 brd ff:ff:ff:ff:ff:ff link-netns t1
>     inet6 2001:db8:1::2/64 scope global
>        valid_lft forever preferred_lft forever
>     inet6 fe80::b00e:f4ff:fe60:1b08/64 scope link
>        valid_lft forever preferred_lft forever



The bird config on both sides is almost identical:

t1:
> protocol device {
>     debug all;
>     scan time 10;
> }
> 
> router id 1.1.1.1;
> 
> protocol bfd {
>     debug all;
>     interface "*" {
>         min rx interval 50 ms;
>         min tx interval 100 ms;
>         idle tx interval 300 ms;
> 
>     };
>     neighbor 2001:db8:1::2 dev "t2_1" local 2001:db8:1::1;
> }

t2:
> protocol device {
>     debug all;
>     scan time 10;
> }
> 
> router id 2.2.2.2;
> 
> protocol bfd {
>     debug all;
>     interface "*" {
>         min rx interval 50 ms;
>         min tx interval 100 ms;
>         idle tx interval 300 ms;
> 
>     };
>     neighbor 2001:db8:1::1 dev "t1_1" local 2001:db8:1::2;
> }

When starting up bird on both sides, the BFD session comes up just as 
expected.
When taking down the interface t1_1 in netns t2 (ip -n t2 link set down 
dev t1_1), I see the following log message:

> bfd1: Session to 2001:db8:1::1 removed

Now, when taking up the interface instantly, I get the following log 
message, the BFD session gets stuck in the Init state and does not recover:

> bfd1: Socket error: bind: Cannot assign requested address
> bfd1: Session to 2001:db8:1::1 added

When I take down the interface and wait for a subsequent device scan 
(indicated by log message "device1: Scanning interfaces") and only take 
up the interface after the device scan is carried out, all works fine:

>>>> bfd1: Session to 2001:db8:1::1 removed
>>>> device1: Scanning interfaces
>>>> bfd1: Session to 2001:db8:1::1 added

When leaving out the "scan time" statement in the device protocol 
configuration, it doesn't seem to recover at all (probably, as the 
documentation states, a large value is used for the scan time by default).

Thanks in advance for your feedback.

Best Regards
Julian Schuh





















More information about the Bird-users mailing list