]> git.proxmox.com Git - mirror_frr.git/commit
bgpd: Re-use TX Addpath IDs where possible
authorMitch Skiba <mskiba@amazon.com>
Wed, 9 May 2018 23:10:02 +0000 (23:10 +0000)
committerMitch Skiba <mskiba@amazon.com>
Sat, 10 Nov 2018 00:16:36 +0000 (00:16 +0000)
commitdcc68b5e2a598a180b370163a7022324a9b5da96
tree03c08effdbdff6e77a1871fc2ca65073460d3be3
parenta94eca0968d914d58dff819c2411542377f56bae
bgpd: Re-use TX Addpath IDs where possible

The motivation for this patch is to address a concerning behavior of
tx-addpath-bestpath-per-AS. Prior to this patch, all paths' TX ID was
pre-determined as the path was received from a peer. However, this meant
that any time the path selected as best from an AS changed, bgpd had no
choice but to withdraw the previous best path, and advertise the new
best-path under a new TX ID. This could cause significant network
disruption, especially for the subset of prefixes coming from only one
AS that were also communicated over a bestpath-per-AS session.

The patch's general approach is best illustrated by
txaddpath_update_ids. After a bestpath run (required for best-per-AS to
know what will and will not be sent as addpaths) ID numbers will be
stripped from paths that no longer need to be sent, and held in a pool.
Then, paths that will be sent as addpaths and do not already have ID
numbers will allocate new ID numbers, pulling first from that pool.
Finally, anything left in the pool will be returned to the allocator.

In order for this to work, ID numbers had to be split by strategy. The
tx-addpath-All strategy would keep every ID number "in use" constantly,
preventing IDs from being transferred to different paths. Rather than
create two variables for ID, this patch create a more generic array that
will easily enable more addpath strategies to be implemented. The
previously described ID manipulations will happen per addpath strategy,
and will only be run for strategies that are enabled on at least one
peer.

Finally, the ID numbers are allocated from an allocator that tracks per
AFI/SAFI/Addpath Strategy which IDs are in use. Though it would be very
improbable, there was the possibility with the free-running counter
approach for rollover to cause two paths on the same prefix to get
assigned the same TX ID. As remote as the possibility is, we prefer to
not leave it to chance.

This ID re-use method is not perfect. In some cases you could still get
withdraw-then-add behaviors where not strictly necessary. In the case of
bestpath-per-AS this requires one AS to advertise a prefix for the first
time, then a second AS withdraws that prefix, all within the space of an
already pending MRAI timer. In those situations a withdraw-then-add is
more forgivable, and fixing it would probably require a much more
significant effort, as IDs would need to be moved to ADVs instead of
paths.

Signed-off-by Mitchell Skiba <mskiba@amazon.com>
21 files changed:
bgpd/bgp_addpath.c [new file with mode: 0644]
bgpd/bgp_addpath.h [new file with mode: 0644]
bgpd/bgp_addpath_types.h [new file with mode: 0644]
bgpd/bgp_evpn.c
bgpd/bgp_open.c
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_table.c
bgpd/bgp_table.h
bgpd/bgp_updgrp.c
bgpd/bgp_updgrp.h
bgpd/bgp_updgrp_adv.c
bgpd/bgp_updgrp_packet.c
bgpd/bgp_vty.c
bgpd/bgpd.c
bgpd/bgpd.h
bgpd/subdir.am
tests/.gitignore
tests/bgpd/test_bgp_table.c
tests/bgpd/test_peer_attr.c
tests/bgpd/test_peer_attr.py