Hi all,

I have encountered a problem with how BIRD opens the listening socket for 
strict bind BGP.

In particular, BIRD sometimes tries to open the listening socket for the 
protocol when the configured local IP is not yet present on the interface. It 
seems that BIRD will try to bind the BGP socket to the configured IP if any 
address exists on the protocol interface that can be used to reach the 
neighbor. Let me give an example to clarify.

I have a minimal reproducible example with the following BGP configuration:

    router id 192.168.0.1;

    protocol device {
        scan time 10;
    }

    protocol bgp bgp_01 {
            ipv4 {
                    import all;
                    export all;
            };
            debug all;
            local 192.168.0.1 port 179 as 1;
            neighbor 192.168.0.2 port 179 as 1;
            interface "host1";
            direct;
            strict bind yes;
    }

Given this configuration, I can reproduce the problem behaviour by starting the 
protocol with no addressing on the host1 interface and then adding an address 
which includes the neighbor IP in its subnet, e.g. 192.168.0.3/24. Once this 
address/route is added, BIRD logs the following:

    Jan 07 12:09:31 router03 bird[57497]: bgp_01: Neighbor ready
    Jan 07 12:09:31 router03 bird[57497]: bgp_01: Socket error: bind: Cannot 
assign requested address
    Jan 07 12:09:31 router03 bird[57497]: bgp_01: Cannot open listening socket

And the protocol enters an error state:

    BIRD 2.0.6 ready.
    Name       Proto      Table      State  Since         Info
    device1    Device     ---        up     11:55:51.049
    bgp_01     BGP        ---        down   12:09:31.264  Error: No listening 
socket

The reason this error is so problematic for me is that the protocol cannot 
recover from this state without administrative intervention (e.g. configuring 
bird or restarting the protocol).

So, I have two questions:

    1. Is this correct behaviour?
    2. Can I configure BIRD so that my protocol is able to recover after 
suffering a socket error like this?

I should also mention I can actually observe this socket error occur when 
adding the 'correct' address to the protocol interface, but only in the context 
of a larger application and only some of the time.

Thanks,
Ben






Reply via email to