mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-06-06 09:36:35 +00:00
tests: Check if iBGP session can drop invalid AIGP attribute
Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
(cherry picked from commit f58227c91e
)
This commit is contained in:
parent
408cf3786e
commit
2b05ddbe74
@ -1,8 +1,8 @@
|
|||||||
neighbor 10.0.0.1 {
|
neighbor 10.0.0.1 {
|
||||||
router-id 10.0.0.2;
|
router-id 10.0.0.254;
|
||||||
local-address 10.0.0.2;
|
local-address 10.0.0.254;
|
||||||
local-as 65001;
|
local-as 65254;
|
||||||
peer-as 65002;
|
peer-as 65001;
|
||||||
|
|
||||||
capability {
|
capability {
|
||||||
route-refresh;
|
route-refresh;
|
||||||
@ -12,13 +12,28 @@ neighbor 10.0.0.1 {
|
|||||||
route 192.168.100.101/32 {
|
route 192.168.100.101/32 {
|
||||||
atomic-aggregate;
|
atomic-aggregate;
|
||||||
community 65001:101;
|
community 65001:101;
|
||||||
next-hop 10.0.0.2;
|
next-hop 10.0.0.254;
|
||||||
}
|
}
|
||||||
|
|
||||||
route 192.168.100.102/32 {
|
route 192.168.100.102/32 {
|
||||||
originator-id 10.0.0.2;
|
originator-id 10.0.0.254;
|
||||||
community 65001:102;
|
community 65001:102;
|
||||||
next-hop 10.0.0.2;
|
next-hop 10.0.0.254;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
neighbor 10.0.0.2 {
|
||||||
|
router-id 10.0.0.254;
|
||||||
|
local-address 10.0.0.254;
|
||||||
|
local-as 65254;
|
||||||
|
peer-as 65254;
|
||||||
|
|
||||||
|
static {
|
||||||
|
route 192.168.100.101/32 {
|
||||||
|
# AIGP invalid attribute: flagged as transitive + optional.
|
||||||
|
attribute [0x1a 0xc0 0x00000064];
|
||||||
|
next-hop 10.0.0.254;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
!
|
|
||||||
router bgp 65002
|
|
||||||
no bgp ebgp-requires-policy
|
|
||||||
neighbor 10.0.0.2 remote-as external
|
|
||||||
neighbor 10.0.0.2 timers 3 10
|
|
||||||
!
|
|
9
tests/topotests/bgp_path_attribute_discard/r1/frr.conf
Normal file
9
tests/topotests/bgp_path_attribute_discard/r1/frr.conf
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
!
|
||||||
|
interface r1-eth0
|
||||||
|
ip address 10.0.0.1/24
|
||||||
|
!
|
||||||
|
router bgp 65001
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor 10.0.0.254 remote-as external
|
||||||
|
neighbor 10.0.0.254 timers 3 10
|
||||||
|
!
|
@ -1,4 +0,0 @@
|
|||||||
!
|
|
||||||
interface r1-eth0
|
|
||||||
ip address 10.0.0.1/24
|
|
||||||
!
|
|
10
tests/topotests/bgp_path_attribute_discard/r2/frr.conf
Normal file
10
tests/topotests/bgp_path_attribute_discard/r2/frr.conf
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
!
|
||||||
|
interface r2-eth0
|
||||||
|
ip address 10.0.0.2/24
|
||||||
|
!
|
||||||
|
router bgp 65254
|
||||||
|
no bgp ebgp-requires-policy
|
||||||
|
neighbor 10.0.0.254 remote-as internal
|
||||||
|
neighbor 10.0.0.254 timers 3 10
|
||||||
|
neighbor 10.0.0.254 path-attribute discard 26
|
||||||
|
!
|
@ -31,10 +31,12 @@ pytestmark = [pytest.mark.bgpd]
|
|||||||
|
|
||||||
def build_topo(tgen):
|
def build_topo(tgen):
|
||||||
r1 = tgen.add_router("r1")
|
r1 = tgen.add_router("r1")
|
||||||
peer1 = tgen.add_exabgp_peer("peer1", ip="10.0.0.2", defaultRoute="via 10.0.0.1")
|
r2 = tgen.add_router("r2")
|
||||||
|
peer1 = tgen.add_exabgp_peer("peer1", ip="10.0.0.254", defaultRoute="via 10.0.0.1")
|
||||||
|
|
||||||
switch = tgen.add_switch("s1")
|
switch = tgen.add_switch("s1")
|
||||||
switch.add_link(r1)
|
switch.add_link(r1)
|
||||||
|
switch.add_link(r2)
|
||||||
switch.add_link(peer1)
|
switch.add_link(peer1)
|
||||||
|
|
||||||
|
|
||||||
@ -42,10 +44,10 @@ def setup_module(mod):
|
|||||||
tgen = Topogen(build_topo, mod.__name__)
|
tgen = Topogen(build_topo, mod.__name__)
|
||||||
tgen.start_topology()
|
tgen.start_topology()
|
||||||
|
|
||||||
router = tgen.gears["r1"]
|
for _, (rname, router) in enumerate(tgen.routers().items(), 1):
|
||||||
router.load_config(TopoRouter.RD_ZEBRA, os.path.join(CWD, "r1/zebra.conf"))
|
router.load_frr_config(os.path.join(CWD, "{}/frr.conf".format(rname)))
|
||||||
router.load_config(TopoRouter.RD_BGP, os.path.join(CWD, "r1/bgpd.conf"))
|
|
||||||
router.start()
|
tgen.start_router()
|
||||||
|
|
||||||
peer = tgen.gears["peer1"]
|
peer = tgen.gears["peer1"]
|
||||||
peer.start(os.path.join(CWD, "peer1"), os.path.join(CWD, "exabgp.env"))
|
peer.start(os.path.join(CWD, "peer1"), os.path.join(CWD, "exabgp.env"))
|
||||||
@ -63,6 +65,7 @@ def test_bgp_path_attribute_discard():
|
|||||||
pytest.skip(tgen.errors)
|
pytest.skip(tgen.errors)
|
||||||
|
|
||||||
r1 = tgen.gears["r1"]
|
r1 = tgen.gears["r1"]
|
||||||
|
r2 = tgen.gears["r2"]
|
||||||
|
|
||||||
def _bgp_converge():
|
def _bgp_converge():
|
||||||
output = json.loads(r1.vtysh_cmd("show bgp ipv4 unicast json detail"))
|
output = json.loads(r1.vtysh_cmd("show bgp ipv4 unicast json detail"))
|
||||||
@ -103,7 +106,7 @@ def test_bgp_path_attribute_discard():
|
|||||||
"""
|
"""
|
||||||
configure terminal
|
configure terminal
|
||||||
router bgp
|
router bgp
|
||||||
neighbor 10.0.0.2 path-attribute discard 6 8
|
neighbor 10.0.0.254 path-attribute discard 6 8
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -139,6 +142,28 @@ def test_bgp_path_attribute_discard():
|
|||||||
result is None
|
result is None
|
||||||
), "Failed to discard path attributes (atomic-aggregate, community)"
|
), "Failed to discard path attributes (atomic-aggregate, community)"
|
||||||
|
|
||||||
|
def _bgp_check_if_aigp_invalid_attribute_discarded():
|
||||||
|
output = json.loads(r2.vtysh_cmd("show bgp ipv4 unicast json detail"))
|
||||||
|
expected = {
|
||||||
|
"routes": {
|
||||||
|
"192.168.100.101/32": {
|
||||||
|
"paths": [
|
||||||
|
{
|
||||||
|
"valid": True,
|
||||||
|
"aigpMetric": None,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return topotest.json_cmp(output, expected)
|
||||||
|
|
||||||
|
test_func = functools.partial(_bgp_check_if_aigp_invalid_attribute_discarded)
|
||||||
|
_, result = topotest.run_and_expect(test_func, None, count=30, wait=0.5)
|
||||||
|
assert (
|
||||||
|
result is None
|
||||||
|
), "Failed to discard AIGP invalid path attribute (iBGP session)"
|
||||||
|
|
||||||
|
|
||||||
def test_memory_leak():
|
def test_memory_leak():
|
||||||
"Run the memory leak test and report results."
|
"Run the memory leak test and report results."
|
||||||
|
Loading…
Reference in New Issue
Block a user