Static protocol reconfiguration results in sub-optimal route updates

Maria Matejka maria.matejka at nic.cz
Fri Mar 5 15:11:57 CET 2021


Hello!

Well, this seems to be a forgotten part of the static protocol. I see 
the bug, there is a missing reload hook in the appropriate channel. 
Queuing this to be fixed soon.

Thank you for the report!

Maria

On 3/5/21 2:43 PM, Damian Zaremba wrote:
> Hi,
> 
> I recently observed a case where bird 2.0.7 emits sub-optimal route 
> updates during a reconfiguration.
> 
> Using the sample configuration of e.g.
> 
> ipv4 table seed;
> ipv4 table announce;
> 
> protocol static {
>    route 203.0.113.0/24 unreachable;
>    ipv4 { table seed; };
> }
> 
> protocol pipe {
>    table announce;
>    peer table seed;
>    import filter { bgp_large_community.add((65000, 1, 1)); accept; };
> }
> 
> protocol bgp {
>    debug all;
>    ipv4 { table announce; export all; };
>    local 10.240.0.226 as 65000;
>    neighbor 10.240.1.59 as 65000;
> }
> 
> When the pipe configuration is updated to e.g.
> 
> import filter { bgp_large_community.add((65000, 1, 2)); accept; };
> 
> Bird replaces the route into the BGP protocol;
> 
> 2021-03-05 11:57:36.168 <INFO> Reconfiguring
> 2021-03-05 11:57:36.168 <INFO> Reloading channel pipe1.sec
> 2021-03-05 11:57:36.168 <TRACE> bgp1: Reconfigured
> 2021-03-05 11:57:36.168 <INFO> Reconfigured
> 2021-03-05 11:57:36.168 <TRACE> bgp1.ipv4 < replaced 203.0.113.0/24 
> unreachable
> 2021-03-05 11:57:36.168 <TRACE> bgp1: Sending UPDATE
> 
> And emits a single update as expected;
> 
> $ cat bgp.pcap | pbgpp --filter-message-type=UPDATE -
> [BGPMessage UPDATE] - 63 Bytes
> |- MAC: 42:01:0a:f0:00:01 -> 42:01:0a:f0:01:3b
> |- IP: 10.240.0.226:32871 -> 10.240.1.59:179
> |- Timestamp: 2021-03-05 12:04:50.255913 (1614945890.255913)
> |
> |- Update Message Sub-Type: ANNOUNCE
> |- Withdrawn Routes Length: 0 Bytes
> |- Total Path Attribute Length: 36 Bytes
> |- Prefix (NLRI):
> |--- 203.0.113.0/24
> |- Path Attributes:
> |--- ORIGIN: IGP
> |- Path Attributes:
> |--- AS_PATH:
> |- Path Attributes:
> |--- NEXT_HOP: 10.240.0.226
> |- Path Attributes:
> |--- LOCAL_PREF:
> |- Path Attributes:
> |--- LARGE_COMMUNITIES: 65000:1:2
> 
> 
> However if we directly feed the table from a static protocol e.g.
> 
> ipv4 table announce;
> 
> protocol static {
>    route 203.0.113.0/24 unreachable;
>    ipv4 {
>      table announce;
>      import filter { bgp_large_community.add((65000, 1, 1)); accept; };
>    };
> }
> 
> protocol bgp {
>    debug all;
>    ipv4 { table announce; export all; };
>    local 10.240.0.226 as 65000;
>    neighbor 10.240.1.59 as 65000;
> }
> 
> The same filter update results in a protocol restart e.g.
> 
> 2021-03-05 12:10:39.042 <INFO> Reconfiguring
> 2021-03-05 12:10:39.042 <INFO> Cannot reconfigure channel static1.ipv4
> 2021-03-05 12:10:39.042 <INFO> Restarting protocol static1
> 2021-03-05 12:10:39.042 <TRACE> bgp1: Reconfigured
> 2021-03-05 12:10:39.042 <TRACE> bgp1.ipv4 < removed 203.0.113.0/24 
> unreachable
> 2021-03-05 12:10:39.042 <TRACE> bgp1: Sending UPDATE
> 2021-03-05 12:10:39.042 <TRACE> bgp1.ipv4 < added 203.0.113.0/24 
> unreachable
> 2021-03-05 12:10:39.042 <INFO> Reconfigured
> 2021-03-05 12:10:39.042 <TRACE> bgp1: Sending UPDATE
> 
> And our client receives 2 distinct UPDATE packets, the first being an 
> explicit withdrawal, followed by an announcement;
> 
> [BGPMessage UPDATE] - 27 Bytes
> |- MAC: 42:01:0a:f0:00:01 -> 42:01:0a:f0:01:3b
> |- IP: 10.240.0.226:48185 -> 10.240.1.59:179
> |- Timestamp: 2021-03-05 12:10:39.43871 (1614946239.43871)
> |
> |- Update Message Sub-Type: WITHDRAWAL
> |- Withdrawn Routes Length: 4 Bytes
> |- Total Path Attribute Length: 0 Bytes
> |- Withdrawn Routes:
> |--- 203.0.113.0/24
> 
> 
> [BGPMessage UPDATE] - 63 Bytes
> |- MAC: 42:01:0a:f0:00:01 -> 42:01:0a:f0:01:3b
> |- IP: 10.240.0.226:48185 -> 10.240.1.59:179
> |- Timestamp: 2021-03-05 12:10:39.44893 (1614946239.44893)
> |
> |- Update Message Sub-Type: ANNOUNCE
> |- Withdrawn Routes Length: 0 Bytes
> |- Total Path Attribute Length: 36 Bytes
> |- Prefix (NLRI):
> |--- 203.0.113.0/24
> |- Path Attributes:
> |--- ORIGIN: IGP
> |- Path Attributes:
> |--- AS_PATH:
> |- Path Attributes:
> |--- NEXT_HOP: 10.240.0.226
> |- Path Attributes:
> |--- LOCAL_PREF:
> |- Path Attributes:
> |--- LARGE_COMMUNITIES: 65000:1:2
> 
> When this happens during a long converge, the clients can experience a 
> significant gap between the withdrawal and announcement causing 
> sub-optimal state on the clients; we have observed this to be more than 
> 10min in edge cases.
> 
> Under Bird 1.6.5 we see the same restart & route remove/add in the log 
> however we see only 1 UPDATE emitted reflecting the attribute change e.g.
> 
> 2021-03-05 12:34:40 <INFO> Reconfiguring
> 2021-03-05 12:34:40 <INFO> Reloading protocol static1
> 2021-03-05 12:34:40 <INFO> Restarting protocol static1
> 2021-03-05 12:34:40 <TRACE> bgp1: Reconfigured
> 2021-03-05 12:34:40 <INFO> Reconfigured
> 2021-03-05 12:34:40 <TRACE> bgp1 < removed 203.0.113.0/24 unreachable
> 2021-03-05 12:34:40 <TRACE> bgp1 < added 203.0.113.0/24 unreachable
> 2021-03-05 12:34:40 <TRACE> bgp1: Sending UPDATE
> 
> $ cat bgp.pcap | pbgpp --filter-message-type=UPDATE -
> [BGPMessage UPDATE] - 63 Bytes
> |- MAC: 42:01:0a:f0:00:01 -> 42:01:0a:f0:01:3b
> |- IP: 10.240.0.226:52101 -> 10.240.1.59:179
> |- Timestamp: 2021-03-05 12:34:41.414028 (1614947681.414028)
> |
> |- Update Message Sub-Type: ANNOUNCE
> |- Withdrawn Routes Length: 0 Bytes
> |- Total Path Attribute Length: 36 Bytes
> |- Prefix (NLRI):
> |--- 203.0.113.0/24
> |- Path Attributes:
> |--- ORIGIN: IGP
> |- Path Attributes:
> |--- AS_PATH:
> |- Path Attributes:
> |--- NEXT_HOP: 10.240.0.226
> |- Path Attributes:
> |--- LOCAL_PREF:
> |- Path Attributes:
> |--- LARGE_COMMUNITIES: 65000:1:2
> 
> - Damian
> 


More information about the Bird-users mailing list