Hello again -

a couple of days ago I converted one of my test route-server setups from „dual BIRD-1.6.3“ to „single BIRD-2.0.0“ by simply „merging“ bird6.conf and bird.conf into a single (unified) new bird.conf - also observing the guidelines laid out in https://gitlab.labs.nic.cz/labs/bird/wikis/transition-notes-to-bird-2

The results of this simple approach are between weird and stunning:

  1. I now have a bird process which is consuming 100% of one CPU. It is still talking to me through birdc, but is very sluggish, i.e. bringing up peers or tearing them down takes a long time - you even see states, like „flushing“ in „show proto all XXX“ for quite some time, which you normally don’t even notice, because they are usually very transitive :-)

    I haven’t gotten deeper into the problem, yet, but there appears to be a loop involving the affected peer’s Export Updates:

        Route change stats:     received   rejected   filtered    ignored   accepted
          Import updates:         670962          0          0          0     670962
          Import withdraws:          216          0        ---          0        216
          Export updates:      317034802  159525749  157509053        ---          0
          Export withdraws:          468        ---        ---        ---          0

    (those numbers are increasing fast)

  2. Some of my peers were/are already MP-BGP capable and so some IPv6 peers now came up with „Hey, you speak IPv4 too? Cool! Here are some 700.000 routes for your, my friend!“, which is totally explicable, yet it surprised my a teeny bit, anyway :-)

    It should be made clear in the documentation, that BGP protocol definitions without explicit address-family → „channel“ definitions my eventually (see below) ending up MP-BGP sessions with the above effect!?

  3. Most surprising: My multiple-inheritance approach, using multiple, chained template definitions for my BGP „protocols“/sessions/peers broke in the weirdest way: I now have multiple IPv6 and IPv4 channels on some of my protocols with different parameterizations:

    bird> show protocols all BOGONS6
    Name       Proto      Table      State  Since         Info
    BOGONS6    BGP        ---        up     17:04:11.929  Established   
      BGP state:          Established
        Neighbor address: 2620:0:6b0::26e5:4207
        Neighbor AS:      65332
        Neighbor ID:      38.229.66.20
        Local capabilities
          Multiprotocol
            AF announced: ipv4 ipv4 ipv6 ipv6
          Route refresh
          Graceful restart
            Restart time: 120
            AF supported: ipv4 ipv6
            AF preserved:
          4-octet AS numbers
          ADD-PATH
            RX: ipv4 ipv6
            TX: ipv4 ipv6
          Enhanced refresh
        Neighbor capabilities
          Multiprotocol
            AF announced: ipv6
          Route refresh
          4-octet AS numbers
        Session:          external multihop AS4
        Source address:   2001:XXXXXXXXXXXX:2c9b
        Hold timer:       120.187/240
        Keepalive timer:  2.682/80
      Channel ipv6
        State:          UP
        Table:          master6
        Preference:     100
        Input filter:   ACCEPT
        Output filter:  REJECT
        Routes:         0 imported, 0 filtered, 0 exported
        Route change stats:     received   rejected   filtered    ignored   accepted
          Import updates:              0          0          0          0          0
          Import withdraws:            0          0        ---          0          0
          Export updates:          49787          0      49787        ---          0
          Export withdraws:          261        ---        ---        ---          0
        BGP Next hop:   2001:XXXXXXXXXXXX:2c9b
        IGP IPv6 table: master6
      Channel ipv4
        State:          DOWN
        Table:          master4
        Preference:     100
        Input filter:   ACCEPT
        Output filter:  REJECT
        IGP IPv4 table: master4
      Channel ipv6
        State:          UP
        Table:          master6
        Preference:     100
        Input filter:   no_defaults
        Output filter:  REJECT
        Routes:         0 imported, 0 exported
        Route change stats:     received   rejected   filtered    ignored   accepted
          Import updates:              0          0          0          0          0
          Import withdraws:            0          0        ---          0          0
          Export updates:          49787          0      49787        ---          0
          Export withdraws:          261        ---        ---        ---          0
        BGP Next hop:   2001:XXXXXXXXXXX:2c9b
        IGP IPv6 table: master6
      Channel ipv4
        State:          DOWN
        Table:          master4
        Preference:     100
        Input filter:   no_defaults
        Output filter:  REJECT
        IGP IPv4 table: master4

    This appears to be the result of 

    template bgp ALL_BGP {
            local as MY_AS;
            ipv6 {
                    add paths on;
                    graceful restart on;
                    import keep filtered on;
            };
            ipv4 {
                    add paths on;
                    graceful restart on;
                    import keep filtered on;
            };
    }

    template bgp UPLINK from ALL_BGP {
            allow local as 4;
            ipv6 {
                    export none;
                    import filter no_defaults;
            };
            ipv4 {
                    export none;
                    import filter no_defaults;
            };
    }

    protocol bgp BOGONS6 from UPLINK {
            neighbor 2620:0:6B0::26E5:4207 as 65332;
            source address 2001:XXXXXXXXXX:fe00:2c9b;
            multihop 255;
    }

    (which is, as explained above, a result of simply merging former bird6.conf and bird.conf files)

    Again, this is somehow „explicable“, yet completely surprising and „Something must be done against that!!!!11!!11 BURN THE WITCH!!!“ ;-), either within the documentation or within the code.
    (it seems the ipv6/ipv4 channel definitions within the templates each create their own instances instead of inheriting/enhancing (from) the ones upstream???)

    @Ondrej, et.al., is this even a „supported mode of operation“ → multiple IPv6 and IPv4 channels within one protocol?

So this still somehow works, yet still with the 100% CPU consumption.

@bird-devs: How would you like to address above issues? Yes, I can probably clean up the config file, which would probably even make the 100%-issue go away. But imho it shouldn’t be possible in the first place to create configs like these without BIRD at least kicking and screaming loudly about it.

NB: This a a test-setup on a test-machine, so I’ll happily create accounts for you, if you send me an ssh-pubkey through email, if you like to have a „live look“ at the beast!? (it practically lives in your garden anyway → 14ms RTT to nic.cz :-)

Liebe Grüße aus Berlin,

Clemens