Static protocol reconfiguration results in sub-optimal route updates
Damian Zaremba
damian at damianzaremba.co.uk
Fri Mar 5 14:43:05 CET 2021
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