mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-11-03 06:28:33 +00:00
VRF-Lite: Fix export of withdraw-in-progress routes
Problem:
Stale routes are seen in the bgp table(ipv4 and ipv6)
RCA:
Scenario1:
Interface down and withdraw is in-progress.
Router bgp config leading to re-leaking.
Now, withdraw-in-progress routes,
are again leaked to bgp vrf instance(s) importing routes.
Whenever we see an interface down
and corresponding address delete,
while withdrawal of exported routes is in-progress,
routes are marked as being removed and put into work queue.
‘router bgp’ config is updated, which triggers
bgp_vpn_leak_export; which exports routes from configured bgp vrf to VPN.
So withdraw-in-progress routes,
are again leaked to bgp vrf instance(s) importing routes; leading to stale routes.
Scenario2:
- 'no import vrf non-default-vrf’ [in the default vrf]
- bgp update from the peer withdrawing prefix [non-default vrf]
- 'import vrf non-default-vrf’ [configured in the default vrf]
While withdrawal of exported routes is in-progress,
routes are marked as being removed and put into work queue,
In the meantime, if import vrf is configured,
which exports routes from configured bgp vrf to VPN.
So withdraw-in-progress new routes,
are again leaked to bgp vrf instance(s) importing routes; leading to stale routes.
Fix:
Whenever leaking routes (leak_update),
for already existing routes,
skip the routes with bgp_path_info
marked as being removed.
Also added the log message for the return.
Co-authored-by: Santosh P K <sapk@vmware.com>
Co-authored-by: Kantesh Mundaragi <kmundaragi@vmware.com>
Signed-off-by: Abhinay Ramesh <rabhinay@vmware.com>
This commit is contained in:
parent
6b2433c63f
commit
8fac400c79
@ -540,6 +540,17 @@ leak_update(struct bgp *bgp, /* destination bgp instance */
|
||||
if (bpi) {
|
||||
bool labelssame = labels_same(bpi, label, num_labels);
|
||||
|
||||
if (CHECK_FLAG(source_bpi->flags, BGP_PATH_REMOVED)
|
||||
&& CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED)) {
|
||||
if (debug) {
|
||||
zlog_debug(
|
||||
"%s: ->%s(s_flags: 0x%x b_flags: 0x%x): %pFX: Found route, being removed, not leaking",
|
||||
__func__, bgp->name_pretty,
|
||||
source_bpi->flags, bpi->flags, p);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (attrhash_cmp(bpi->attr, new_attr) && labelssame
|
||||
&& !CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED)) {
|
||||
|
||||
@ -613,6 +624,16 @@ leak_update(struct bgp *bgp, /* destination bgp instance */
|
||||
return bpi;
|
||||
}
|
||||
|
||||
if (CHECK_FLAG(source_bpi->flags, BGP_PATH_REMOVED)) {
|
||||
if (debug) {
|
||||
zlog_debug(
|
||||
"%s: ->%s(s_flags: 0x%x): %pFX: New route, being removed, not leaking",
|
||||
__func__, bgp->name_pretty,
|
||||
source_bpi->flags, p);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
new = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_IMPORTED, 0,
|
||||
bgp->peer_self, new_attr, bn);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user