Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bgpd: Clear stale routes with multiple paths (backport #17376) #17380

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions bgpd/bgp_fsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,11 @@ static void bgp_set_llgr_stale(struct peer *peer, afi_t afi, safi_t safi)
COMMUNITY_NO_LLGR))
continue;

if (bgp_attr_get_community(pi->attr) &&
community_include(bgp_attr_get_community(pi->attr),
COMMUNITY_LLGR_STALE))
continue;

if (bgp_debug_neighbor_events(peer))
zlog_debug(
"%pBP Long-lived set stale community (LLGR_STALE) for: %pFX",
Expand All @@ -693,10 +698,15 @@ static void bgp_set_llgr_stale(struct peer *peer, afi_t afi, safi_t safi)
attr = *pi->attr;
bgp_attr_add_llgr_community(&attr);
pi->attr = bgp_attr_intern(&attr);
<<<<<<< HEAD
bgp_recalculate_afi_safi_bestpaths(
peer->bgp, afi, safi);

break;
=======
bgp_process(peer->bgp, rm, pi, afi,
safi);
>>>>>>> 895d586a5f (bgpd: Set LLGR stale routes for all the paths including addpath)
}
}
} else {
Expand All @@ -713,6 +723,11 @@ static void bgp_set_llgr_stale(struct peer *peer, afi_t afi, safi_t safi)
COMMUNITY_NO_LLGR))
continue;

if (bgp_attr_get_community(pi->attr) &&
community_include(bgp_attr_get_community(pi->attr),
COMMUNITY_LLGR_STALE))
continue;

if (bgp_debug_neighbor_events(peer))
zlog_debug(
"%pBP Long-lived set stale community (LLGR_STALE) for: %pFX",
Expand All @@ -721,10 +736,14 @@ static void bgp_set_llgr_stale(struct peer *peer, afi_t afi, safi_t safi)
attr = *pi->attr;
bgp_attr_add_llgr_community(&attr);
pi->attr = bgp_attr_intern(&attr);
<<<<<<< HEAD
bgp_recalculate_afi_safi_bestpaths(peer->bgp,
afi, safi);

break;
=======
bgp_process(peer->bgp, dest, pi, afi, safi);
>>>>>>> 895d586a5f (bgpd: Set LLGR stale routes for all the paths including addpath)
}
}
}
Expand Down
2 changes: 0 additions & 2 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -5910,7 +5910,6 @@ void bgp_clear_stale_route(struct peer *peer, afi_t afi, safi_t safi)
vpn_leak_to_vrf_withdraw(pi);

bgp_rib_remove(rm, pi, peer, afi, safi);
break;
}
}
} else {
Expand Down Expand Up @@ -5939,7 +5938,6 @@ void bgp_clear_stale_route(struct peer *peer, afi_t afi, safi_t safi)
pi);

bgp_rib_remove(dest, pi, peer, afi, safi);
break;
}
}
}
Expand Down
Empty file.
23 changes: 23 additions & 0 deletions tests/topotests/bgp_addpath_graceful_restart/r1/frr.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
!
int r1-eth0
ip address 192.168.1.1/24
!
int r1-eth1
ip address 192.168.2.1/24
!
router bgp 65001
no bgp ebgp-requires-policy
no bgp network import-check
neighbor 192.168.1.2 remote-as auto
neighbor 192.168.1.2 timers 1 3
neighbor 192.168.1.2 timers connect 1
neighbor 192.168.2.2 remote-as auto
neighbor 192.168.2.2 timers 1 3
neighbor 192.168.2.2 timers connect 1
neighbor r1-eth1 interface remote-as auto
neighbor r1-eth1 timers 1 3
neighbor r1-eth1 timers connect 1
address-family ipv4 unicast
network 10.0.0.1/32
exit-address-family
!
28 changes: 28 additions & 0 deletions tests/topotests/bgp_addpath_graceful_restart/r2/frr.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
!
int r2-eth0
ip address 192.168.1.2/24
!
int r2-eth1
ip address 192.168.2.2/24
!
int r2-eth2
ip address 192.168.3.2/24
!
router bgp 65002
bgp graceful-restart
bgp graceful-restart preserve-fw-state
bgp graceful-restart restart-time 10
no bgp ebgp-requires-policy
neighbor 192.168.1.1 remote-as auto
neighbor 192.168.1.1 timers 1 3
neighbor 192.168.1.1 timers connect 1
neighbor 192.168.2.1 remote-as auto
neighbor 192.168.2.1 timers 1 3
neighbor 192.168.2.1 timers connect 1
neighbor 192.168.3.3 remote-as auto
neighbor 192.168.3.3 timers 1 3
neighbor 192.168.3.3 timers connect 1
address-family ipv4 unicast
neighbor 192.168.3.3 addpath-tx-all-paths
exit-address-family
!
13 changes: 13 additions & 0 deletions tests/topotests/bgp_addpath_graceful_restart/r3/frr.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
!
int r3-eth0
ip address 192.168.3.3/24
!
router bgp 65003
bgp graceful-restart
bgp graceful-restart preserve-fw-state
bgp graceful-restart restart-time 10
no bgp ebgp-requires-policy
neighbor 192.168.3.2 remote-as auto
neighbor 192.168.3.2 timers 1 3
neighbor 192.168.3.2 timers connect 1
!
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#!/usr/bin/env python
# SPDX-License-Identifier: ISC

# Copyright (c) 2024 by
# Donatas Abraitis <[email protected]>
#

import os
import sys
import json
import pytest
import functools

CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, "../"))

# pylint: disable=C0413
from lib import topotest
from lib.topogen import Topogen, get_topogen
from lib.common_config import kill_router_daemons

pytestmark = [pytest.mark.bgpd]


def setup_module(mod):
topodef = {"s1": ("r1", "r2"), "s2": ("r1", "r2"), "s3": ("r2", "r3")}
tgen = Topogen(topodef, mod.__name__)
tgen.start_topology()

router_list = tgen.routers()

for _, (rname, router) in enumerate(router_list.items(), 1):
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))

tgen.start_router()


def teardown_module(mod):
tgen = get_topogen()
tgen.stop_topology()


def test_bgp_addpath_graceful_restart():
tgen = get_topogen()

if tgen.routers_have_failure():
pytest.skip(tgen.errors)

r2 = tgen.gears["r2"]
r3 = tgen.gears["r3"]

def _bgp_converge():
output = json.loads(r2.vtysh_cmd("show bgp ipv4 unicast summary json"))
expected = {
"peers": {
"192.168.1.1": {
"hostname": "r1",
"remoteAs": 65001,
"localAs": 65002,
"pfxRcd": 1,
"state": "Established",
},
"192.168.2.1": {
"hostname": "r1",
"remoteAs": 65001,
"localAs": 65002,
"pfxRcd": 1,
"state": "Established",
},
"192.168.3.3": {
"hostname": "r3",
"remoteAs": 65003,
"localAs": 65002,
"pfxSnt": 2,
"state": "Established",
},
}
}
return topotest.json_cmp(output, expected)

test_func = functools.partial(
_bgp_converge,
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Initial peering failed"

kill_router_daemons(tgen, "r2", ["bgpd"])

def _bgp_check_stale_routes():
output = json.loads(r3.vtysh_cmd("show bgp ipv4 unicast json"))
expected = {
"routes": {
"10.0.0.1/32": [
{
"stale": True,
"valid": True,
},
{
"stale": True,
"valid": True,
"multipath": True,
},
]
}
}
return topotest.json_cmp(output, expected)

test_func = functools.partial(
_bgp_check_stale_routes,
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Can't see stale routes"

def _bgp_check_stale_routes_cleared():
output = json.loads(r3.vtysh_cmd("show bgp ipv4 unicast json"))
expected = {
"routes": {
"10.0.0.1/32": None,
}
}
return topotest.json_cmp(output, expected)

test_func = functools.partial(
_bgp_check_stale_routes_cleared,
)
_, result = topotest.run_and_expect(test_func, None, count=30, wait=1)
assert result is None, "Can't see stale routes"


if __name__ == "__main__":
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))
Empty file.
23 changes: 23 additions & 0 deletions tests/topotests/bgp_addpath_llgr/r1/frr.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
!
int r1-eth0
ip address 192.168.1.1/24
!
int r1-eth1
ip address 192.168.2.1/24
!
router bgp 65001
no bgp ebgp-requires-policy
no bgp network import-check
neighbor 192.168.1.2 remote-as auto
neighbor 192.168.1.2 timers 1 3
neighbor 192.168.1.2 timers connect 1
neighbor 192.168.2.2 remote-as auto
neighbor 192.168.2.2 timers 1 3
neighbor 192.168.2.2 timers connect 1
neighbor r1-eth1 interface remote-as auto
neighbor r1-eth1 timers 1 3
neighbor r1-eth1 timers connect 1
address-family ipv4 unicast
network 10.0.0.1/32
exit-address-family
!
29 changes: 29 additions & 0 deletions tests/topotests/bgp_addpath_llgr/r2/frr.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
!
int r2-eth0
ip address 192.168.1.2/24
!
int r2-eth1
ip address 192.168.2.2/24
!
int r2-eth2
ip address 192.168.3.2/24
!
router bgp 65002
bgp graceful-restart
bgp graceful-restart preserve-fw-state
bgp graceful-restart restart-time 0
bgp long-lived-graceful-restart stale-time 10
no bgp ebgp-requires-policy
neighbor 192.168.1.1 remote-as auto
neighbor 192.168.1.1 timers 1 3
neighbor 192.168.1.1 timers connect 1
neighbor 192.168.2.1 remote-as auto
neighbor 192.168.2.1 timers 1 3
neighbor 192.168.2.1 timers connect 1
neighbor 192.168.3.3 remote-as auto
neighbor 192.168.3.3 timers 1 3
neighbor 192.168.3.3 timers connect 1
address-family ipv4 unicast
neighbor 192.168.3.3 addpath-tx-all-paths
exit-address-family
!
14 changes: 14 additions & 0 deletions tests/topotests/bgp_addpath_llgr/r3/frr.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
!
int r3-eth0
ip address 192.168.3.3/24
!
router bgp 65003
bgp graceful-restart
bgp graceful-restart preserve-fw-state
bgp graceful-restart restart-time 0
bgp long-lived-graceful-restart stale-time 10
no bgp ebgp-requires-policy
neighbor 192.168.3.2 remote-as auto
neighbor 192.168.3.2 timers 1 3
neighbor 192.168.3.2 timers connect 1
!
Loading
Loading