mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 08:56:13 +00:00
tests: an srv6 sid reachability use-case
Verify that SRv6 SID becomes unreachable and further the IPv4 route in L3VPN becomes invalid. Signed-off-by: Dmytro Shytyi <dmytro.shytyi@6wind.com>
This commit is contained in:
parent
b3ac50287d
commit
51014631f0
@ -0,0 +1,4 @@
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.1.254
|
||||
ipv6 route ::/0 2001:1::ffff
|
||||
!
|
6
tests/topotests/bgp_srv6_sid_reachability/c11/zebra.conf
Normal file
6
tests/topotests/bgp_srv6_sid_reachability/c11/zebra.conf
Normal file
@ -0,0 +1,6 @@
|
||||
hostname c11
|
||||
!
|
||||
interface eth0
|
||||
ip address 192.168.1.1/24
|
||||
ipv6 address 2001:1::1/64
|
||||
!
|
@ -0,0 +1,4 @@
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.1.254
|
||||
ipv6 route ::/0 2001:1::ffff
|
||||
!
|
6
tests/topotests/bgp_srv6_sid_reachability/c12/zebra.conf
Normal file
6
tests/topotests/bgp_srv6_sid_reachability/c12/zebra.conf
Normal file
@ -0,0 +1,6 @@
|
||||
hostname c12
|
||||
!
|
||||
interface eth0
|
||||
ip address 192.168.1.1/24
|
||||
ipv6 address 2001:1::1/64
|
||||
!
|
@ -0,0 +1,4 @@
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.2.254
|
||||
ipv6 route ::/0 2001:2::ffff
|
||||
!
|
6
tests/topotests/bgp_srv6_sid_reachability/c21/zebra.conf
Normal file
6
tests/topotests/bgp_srv6_sid_reachability/c21/zebra.conf
Normal file
@ -0,0 +1,6 @@
|
||||
hostname c21
|
||||
!
|
||||
interface eth0
|
||||
ip address 192.168.2.1/24
|
||||
ipv6 address 2001:2::1/64
|
||||
!
|
@ -0,0 +1,5 @@
|
||||
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.2.254
|
||||
ipv6 route ::/0 2001:2::ffff
|
||||
!
|
9
tests/topotests/bgp_srv6_sid_reachability/c22/zebra.conf
Normal file
9
tests/topotests/bgp_srv6_sid_reachability/c22/zebra.conf
Normal file
@ -0,0 +1,9 @@
|
||||
hostname c22
|
||||
!
|
||||
interface eth0
|
||||
ip address 192.168.2.1/24
|
||||
ipv6 address 2001:2::1/64
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.2.254
|
||||
ipv6 route ::/0 2001:2::ffff
|
||||
!
|
@ -0,0 +1,4 @@
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.3.254
|
||||
ipv6 route ::/0 2001:3::ffff
|
||||
!
|
6
tests/topotests/bgp_srv6_sid_reachability/c31/zebra.conf
Normal file
6
tests/topotests/bgp_srv6_sid_reachability/c31/zebra.conf
Normal file
@ -0,0 +1,6 @@
|
||||
hostname c31
|
||||
!
|
||||
interface eth0
|
||||
ip address 192.168.3.1/24
|
||||
ipv6 address 2001:3::1/64
|
||||
!
|
@ -0,0 +1,4 @@
|
||||
!
|
||||
ip route 0.0.0.0/0 192.168.3.254
|
||||
ipv6 route ::/0 2001:3::ffff
|
||||
!
|
6
tests/topotests/bgp_srv6_sid_reachability/c32/zebra.conf
Normal file
6
tests/topotests/bgp_srv6_sid_reachability/c32/zebra.conf
Normal file
@ -0,0 +1,6 @@
|
||||
hostname c32
|
||||
!
|
||||
interface eth0
|
||||
ip address 192.168.3.1/24
|
||||
ipv6 address 2001:3::1/64
|
||||
!
|
61
tests/topotests/bgp_srv6_sid_reachability/r1/bgpd.conf
Normal file
61
tests/topotests/bgp_srv6_sid_reachability/r1/bgpd.conf
Normal file
@ -0,0 +1,61 @@
|
||||
frr defaults traditional
|
||||
!
|
||||
hostname r1
|
||||
password zebra
|
||||
!
|
||||
log commands
|
||||
!
|
||||
router bgp 65001
|
||||
bgp router-id 192.0.2.1
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp default ipv4-unicast
|
||||
neighbor 2001:db8:12::2 remote-as 65002
|
||||
neighbor 2001:db8:12::2 timers 3 10
|
||||
neighbor 2001:db8:12::2 timers connect 1
|
||||
neighbor 2001:db8:12::2 capability extended-nexthop
|
||||
neighbor 2001:db8:13::3 remote-as 65001
|
||||
neighbor 2001:db8:13::3 timers 3 10
|
||||
neighbor 2001:db8:13::3 timers connect 1
|
||||
neighbor 2001:db8:13::3 capability extended-nexthop
|
||||
!
|
||||
segment-routing srv6
|
||||
locator default
|
||||
!
|
||||
address-family ipv4 vpn
|
||||
neighbor 2001:db8:12::2 activate
|
||||
neighbor 2001:db8:13::3 activate
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
router bgp 65001 vrf vrf10
|
||||
bgp router-id 192.0.2.1
|
||||
!
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
sid vpn export 1
|
||||
rd vpn export 65001:10
|
||||
rt vpn both 0:10
|
||||
import vpn
|
||||
export vpn
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
router bgp 65001 vrf vrf20
|
||||
bgp router-id 192.0.2.1
|
||||
!
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
sid vpn export 2
|
||||
rd vpn export 65001:20
|
||||
rt vpn both 0:20
|
||||
import vpn
|
||||
export vpn
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
interface eth0
|
||||
mpls bgp forwarding
|
||||
!
|
||||
interface eth1
|
||||
mpls bgp forwarding
|
||||
!
|
@ -0,0 +1,4 @@
|
||||
!
|
||||
ipv6 route 2001:db8:2:2::/64 2001:db8:12::2
|
||||
ipv6 route 2001:db8:3:3::/64 2001:db8:13::3
|
||||
!
|
32
tests/topotests/bgp_srv6_sid_reachability/r1/zebra.conf
Normal file
32
tests/topotests/bgp_srv6_sid_reachability/r1/zebra.conf
Normal file
@ -0,0 +1,32 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname r1
|
||||
!
|
||||
interface lo
|
||||
ipv6 address 2001:db8:1:1::1/128
|
||||
!
|
||||
interface eth0
|
||||
ipv6 address 2001:db8:12::1/64
|
||||
!
|
||||
interface eth1
|
||||
ipv6 address 2001:db8:13::1/64
|
||||
!
|
||||
interface eth2 vrf vrf10
|
||||
ip address 192.168.1.254/24
|
||||
!
|
||||
interface eth3 vrf vrf20
|
||||
ip address 192.168.1.254/24
|
||||
!
|
||||
segment-routing
|
||||
srv6
|
||||
locators
|
||||
locator default
|
||||
prefix 2001:db8:1:1::/64
|
||||
!
|
||||
!
|
||||
!
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
50
tests/topotests/bgp_srv6_sid_reachability/r2/bgpd.conf
Normal file
50
tests/topotests/bgp_srv6_sid_reachability/r2/bgpd.conf
Normal file
@ -0,0 +1,50 @@
|
||||
frr defaults traditional
|
||||
!
|
||||
hostname r2
|
||||
password zebra
|
||||
!
|
||||
log commands
|
||||
!
|
||||
router bgp 65002
|
||||
bgp router-id 192.0.2.2
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp default ipv4-unicast
|
||||
neighbor 2001:db8:12::1 remote-as 65001
|
||||
neighbor 2001:db8:12::1 timers 3 10
|
||||
neighbor 2001:db8:12::1 timers connect 1
|
||||
neighbor 2001:db8:12::1 capability extended-nexthop
|
||||
!
|
||||
segment-routing srv6
|
||||
locator default
|
||||
!
|
||||
address-family ipv4 vpn
|
||||
neighbor 2001:db8:12::1 activate
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
router bgp 65002 vrf vrf10
|
||||
bgp router-id 192.0.2.2
|
||||
!
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
sid vpn export 1
|
||||
rd vpn export 65002:10
|
||||
rt vpn both 0:10
|
||||
import vpn
|
||||
export vpn
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
router bgp 65002 vrf vrf20
|
||||
bgp router-id 192.0.2.2
|
||||
!
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
sid vpn export 2
|
||||
rd vpn export 65002:20
|
||||
rt vpn both 0:20
|
||||
import vpn
|
||||
export vpn
|
||||
exit-address-family
|
||||
!
|
||||
!
|
@ -0,0 +1,4 @@
|
||||
!
|
||||
ipv6 route 2001:db8:1:1::/64 2001:db8:12::1
|
||||
ipv6 route 2001:db8:3:3::/64 2001:db8:12::1
|
||||
!
|
29
tests/topotests/bgp_srv6_sid_reachability/r2/zebra.conf
Normal file
29
tests/topotests/bgp_srv6_sid_reachability/r2/zebra.conf
Normal file
@ -0,0 +1,29 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname r2
|
||||
!
|
||||
interface lo
|
||||
ipv6 address 2001:db8:2:2::1/128
|
||||
!
|
||||
interface eth0
|
||||
ipv6 address 2001:db8:12::2/64
|
||||
!
|
||||
interface eth1 vrf vrf10
|
||||
ip address 192.168.2.254/24
|
||||
!
|
||||
interface eth2 vrf vrf20
|
||||
ip address 192.168.2.254/24
|
||||
!
|
||||
segment-routing
|
||||
srv6
|
||||
locators
|
||||
locator default
|
||||
prefix 2001:db8:2:2::/64
|
||||
!
|
||||
!
|
||||
!
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
50
tests/topotests/bgp_srv6_sid_reachability/r3/bgpd.conf
Normal file
50
tests/topotests/bgp_srv6_sid_reachability/r3/bgpd.conf
Normal file
@ -0,0 +1,50 @@
|
||||
frr defaults traditional
|
||||
!
|
||||
hostname r2
|
||||
password zebra
|
||||
!
|
||||
log commands
|
||||
!
|
||||
router bgp 65001
|
||||
bgp router-id 192.0.2.3
|
||||
no bgp ebgp-requires-policy
|
||||
no bgp default ipv4-unicast
|
||||
neighbor 2001:db8:13::1 remote-as 65001
|
||||
neighbor 2001:db8:13::1 timers 3 10
|
||||
neighbor 2001:db8:13::1 timers connect 1
|
||||
neighbor 2001:db8:13::1 capability extended-nexthop
|
||||
!
|
||||
segment-routing srv6
|
||||
locator default
|
||||
!
|
||||
address-family ipv4 vpn
|
||||
neighbor 2001:db8:13::1 activate
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
router bgp 65001 vrf vrf10
|
||||
bgp router-id 192.0.2.3
|
||||
!
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
sid vpn export 1
|
||||
rd vpn export 65001:10
|
||||
rt vpn both 0:10
|
||||
import vpn
|
||||
export vpn
|
||||
exit-address-family
|
||||
!
|
||||
!
|
||||
router bgp 65001 vrf vrf20
|
||||
bgp router-id 192.0.2.2
|
||||
!
|
||||
address-family ipv4 unicast
|
||||
redistribute connected
|
||||
sid vpn export 2
|
||||
rd vpn export 65001:20
|
||||
rt vpn both 0:20
|
||||
import vpn
|
||||
export vpn
|
||||
exit-address-family
|
||||
!
|
||||
!
|
@ -0,0 +1,6 @@
|
||||
!
|
||||
ipv6 route 2001:db8:12::/64 2001:db8:13::1
|
||||
!
|
||||
ipv6 route 2001:db8:1:1::/64 2001:db8:13::1
|
||||
ipv6 route 2001:db8:2:2::/64 2001:db8:13::1
|
||||
!
|
29
tests/topotests/bgp_srv6_sid_reachability/r3/zebra.conf
Normal file
29
tests/topotests/bgp_srv6_sid_reachability/r3/zebra.conf
Normal file
@ -0,0 +1,29 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname r2
|
||||
!
|
||||
interface lo
|
||||
ipv6 address 2001:db8:3:3::1/128
|
||||
!
|
||||
interface eth0
|
||||
ipv6 address 2001:db8:13::3/64
|
||||
!
|
||||
interface eth1 vrf vrf10
|
||||
ip address 192.168.3.254/24
|
||||
!
|
||||
interface eth2 vrf vrf20
|
||||
ip address 192.168.3.254/24
|
||||
!
|
||||
segment-routing
|
||||
srv6
|
||||
locators
|
||||
locator default
|
||||
prefix 2001:db8:3:3::/64
|
||||
!
|
||||
!
|
||||
!
|
||||
ip forwarding
|
||||
ipv6 forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
169
tests/topotests/bgp_srv6_sid_reachability/test_bgp_srv6_sid_reachability.py
Executable file
169
tests/topotests/bgp_srv6_sid_reachability/test_bgp_srv6_sid_reachability.py
Executable file
@ -0,0 +1,169 @@
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: ISC
|
||||
|
||||
#
|
||||
# Part of NetDEF Topology Tests
|
||||
#
|
||||
# Copyright (c) 2023 by 6WIND
|
||||
#
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import json
|
||||
import functools
|
||||
import pytest
|
||||
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
from lib import topotest
|
||||
from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
from lib.common_config import required_linux_kernel_version
|
||||
from lib.checkping import check_ping
|
||||
|
||||
pytestmark = [pytest.mark.bgpd, pytest.mark.staticd]
|
||||
|
||||
|
||||
def build_topo(tgen):
|
||||
tgen.add_router("r1")
|
||||
tgen.add_router("r2")
|
||||
tgen.add_router("r3")
|
||||
|
||||
tgen.add_router("c11")
|
||||
tgen.add_router("c12")
|
||||
tgen.add_router("c21")
|
||||
tgen.add_router("c22")
|
||||
tgen.add_router("c31")
|
||||
tgen.add_router("c32")
|
||||
|
||||
tgen.add_link(tgen.gears["r1"], tgen.gears["r2"], "eth0", "eth0")
|
||||
tgen.add_link(tgen.gears["r1"], tgen.gears["r3"], "eth1", "eth0")
|
||||
tgen.add_link(tgen.gears["r1"], tgen.gears["c11"], "eth2", "eth0")
|
||||
tgen.add_link(tgen.gears["r1"], tgen.gears["c12"], "eth3", "eth0")
|
||||
tgen.add_link(tgen.gears["r2"], tgen.gears["c21"], "eth1", "eth0")
|
||||
tgen.add_link(tgen.gears["r2"], tgen.gears["c22"], "eth2", "eth0")
|
||||
tgen.add_link(tgen.gears["r3"], tgen.gears["c31"], "eth1", "eth0")
|
||||
tgen.add_link(tgen.gears["r3"], tgen.gears["c32"], "eth2", "eth0")
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
result = required_linux_kernel_version("5.15")
|
||||
if result is not True:
|
||||
pytest.skip("Kernel requirements are not met")
|
||||
|
||||
tgen = Topogen(build_topo, mod.__name__)
|
||||
tgen.start_topology()
|
||||
|
||||
for rname, router in tgen.routers().items():
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_STATIC, os.path.join(CWD, "{}/staticd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.gears["r1"].run("sysctl net.vrf.strict_mode=1")
|
||||
tgen.gears["r1"].run("ip link add vrf10 type vrf table 10")
|
||||
tgen.gears["r1"].run("ip link set vrf10 up")
|
||||
tgen.gears["r1"].run("ip link add vrf20 type vrf table 20")
|
||||
tgen.gears["r1"].run("ip link set vrf20 up")
|
||||
tgen.gears["r1"].run("ip link set eth2 master vrf10")
|
||||
tgen.gears["r1"].run("ip link set eth3 master vrf20")
|
||||
|
||||
tgen.gears["r2"].run("sysctl net.vrf.strict_mode=1")
|
||||
tgen.gears["r2"].run("ip link add vrf10 type vrf table 10")
|
||||
tgen.gears["r2"].run("ip link set vrf10 up")
|
||||
tgen.gears["r2"].run("ip link add vrf20 type vrf table 20")
|
||||
tgen.gears["r2"].run("ip link set vrf20 up")
|
||||
tgen.gears["r2"].run("ip link set eth1 master vrf10")
|
||||
tgen.gears["r2"].run("ip link set eth2 master vrf20")
|
||||
|
||||
tgen.gears["r3"].run("sysctl net.vrf.strict_mode=1")
|
||||
tgen.gears["r3"].run("ip link add vrf10 type vrf table 10")
|
||||
tgen.gears["r3"].run("ip link set vrf10 up")
|
||||
tgen.gears["r3"].run("ip link add vrf20 type vrf table 20")
|
||||
tgen.gears["r3"].run("ip link set vrf20 up")
|
||||
tgen.gears["r3"].run("ip link set eth1 master vrf10")
|
||||
tgen.gears["r3"].run("ip link set eth2 master vrf20")
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
tgen = get_topogen()
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def test_ping():
|
||||
tgen = get_topogen()
|
||||
|
||||
check_ping("c11", "192.168.2.1", True, 10, 1)
|
||||
check_ping("c11", "192.168.3.1", True, 10, 1)
|
||||
check_ping("c12", "192.168.2.1", True, 10, 1)
|
||||
check_ping("c12", "192.168.3.1", True, 10, 1)
|
||||
check_ping("c21", "192.168.3.1", True, 10, 1)
|
||||
check_ping("c22", "192.168.3.1", True, 10, 1)
|
||||
|
||||
|
||||
def test_sid_unreachable_nht():
|
||||
get_topogen().gears["r1"].vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
no ipv6 route 2001:db8:2:2::/64 2001:db8:12::2
|
||||
"""
|
||||
)
|
||||
check_ping("c11", "192.168.2.1", False, 10, 1)
|
||||
|
||||
|
||||
def test_sid_reachable_again_nht():
|
||||
get_topogen().gears["r1"].vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
ipv6 route 2001:db8:2:2::/64 2001:db8:12::2
|
||||
"""
|
||||
)
|
||||
check_ping("c11", "192.168.2.1", True, 10, 1)
|
||||
|
||||
|
||||
def test_sid_unreachable_bgp_update():
|
||||
get_topogen().gears["r2"].vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
router bgp 65002
|
||||
no segment-routing srv6
|
||||
exit
|
||||
router bgp 65002 vrf vrf10
|
||||
address-family ipv4 unicast
|
||||
no sid vpn export 1
|
||||
"""
|
||||
)
|
||||
check_ping("c11", "192.168.2.1", False, 10, 1)
|
||||
|
||||
|
||||
def test_sid_reachable_again_bgp_update():
|
||||
get_topogen().gears["r2"].vtysh_cmd(
|
||||
"""
|
||||
configure terminal
|
||||
router bgp 65002
|
||||
segment-routing srv6
|
||||
locator default
|
||||
exit
|
||||
exit
|
||||
router bgp 65002 vrf vrf10
|
||||
address-family ipv4 unicast
|
||||
sid vpn export 1
|
||||
"""
|
||||
)
|
||||
check_ping("c11", "192.168.2.1", True, 10, 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
Loading…
Reference in New Issue
Block a user