tests: Add test to check importing routes to VRF

After implementing ACCEPT_OWN extended community, bgpd can't import VPN
routes to the VRFs whose RD is matched with that of VPN routes. This
commit adds new test to check the effect of the next commit.

Signed-off-by: Ryoga Saito <ryoga.saito@linecorp.com>
This commit is contained in:
Ryoga Saito 2023-01-19 20:51:33 +09:00
parent 69306c44e8
commit 03cc2022d2
16 changed files with 165 additions and 30 deletions

View File

@ -0,0 +1,4 @@
!
ip route 0.0.0.0/0 192.168.3.254
ipv6 route ::/0 2001:3::ffff
!

View File

@ -0,0 +1,6 @@
hostname c31
!
interface eth0
ip address 192.168.3.1/24
ipv6 address 2001:3::1/64
!

View File

@ -0,0 +1,4 @@
!
ip route 0.0.0.0/0 192.168.3.254
ipv6 route ::/0 2001:3::ffff
!

View File

@ -0,0 +1,6 @@
hostname c32
!
interface eth0
ip address 192.168.3.1/24
ipv6 address 2001:3::1/64
!

View File

@ -11,16 +11,21 @@ router bgp 65001
bgp router-id 192.0.2.1 bgp router-id 192.0.2.1
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
no bgp default ipv4-unicast no bgp default ipv4-unicast
neighbor 2001:db8::2 remote-as 65002 neighbor 2001:db8:12::2 remote-as 65002
neighbor 2001:db8::2 timers 3 10 neighbor 2001:db8:12::2 timers 3 10
neighbor 2001:db8::2 timers connect 1 neighbor 2001:db8:12::2 timers connect 1
neighbor 2001:db8::2 capability extended-nexthop 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 segment-routing srv6
locator default locator default
! !
address-family ipv4 vpn address-family ipv4 vpn
neighbor 2001:db8::2 activate neighbor 2001:db8:12::2 activate
neighbor 2001:db8:13::3 activate
exit-address-family exit-address-family
! !
! !

View File

@ -1,3 +1,4 @@
! !
ipv6 route 2001:db8:2:2::/64 2001:db8::2 ipv6 route 2001:db8:2:2::/64 2001:db8:12::2
ipv6 route 2001:db8:3:3::/64 2001:db8:13::3
! !

View File

@ -6,12 +6,15 @@ interface lo
ipv6 address 2001:db8:1:1::1/128 ipv6 address 2001:db8:1:1::1/128
! !
interface eth0 interface eth0
ipv6 address 2001:db8::1/64 ipv6 address 2001:db8:12::1/64
! !
interface eth1 vrf vrf10 interface eth1
ipv6 address 2001:db8:13::1/64
!
interface eth2 vrf vrf10
ip address 192.168.1.254/24 ip address 192.168.1.254/24
! !
interface eth2 vrf vrf20 interface eth3 vrf vrf20
ip address 192.168.1.254/24 ip address 192.168.1.254/24
! !
segment-routing segment-routing

View File

@ -11,16 +11,16 @@ router bgp 65002
bgp router-id 192.0.2.2 bgp router-id 192.0.2.2
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
no bgp default ipv4-unicast no bgp default ipv4-unicast
neighbor 2001:db8::1 remote-as 65001 neighbor 2001:db8:12::1 remote-as 65001
neighbor 2001:db8::1 timers 3 10 neighbor 2001:db8:12::1 timers 3 10
neighbor 2001:db8::1 timers connect 1 neighbor 2001:db8:12::1 timers connect 1
neighbor 2001:db8::1 capability extended-nexthop neighbor 2001:db8:12::1 capability extended-nexthop
! !
segment-routing srv6 segment-routing srv6
locator default locator default
! !
address-family ipv4 vpn address-family ipv4 vpn
neighbor 2001:db8::1 activate neighbor 2001:db8:12::1 activate
exit-address-family exit-address-family
! !
! !

View File

@ -1,3 +1,4 @@
! !
ipv6 route 2001:db8:1:1::/64 2001:db8::1 ipv6 route 2001:db8:1:1::/64 2001:db8:12::1
ipv6 route 2001:db8:3:3::/64 2001:db8:12::1
! !

View File

@ -6,7 +6,7 @@ interface lo
ipv6 address 2001:db8:2:2::1/128 ipv6 address 2001:db8:2:2::1/128
! !
interface eth0 interface eth0
ipv6 address 2001:db8::2/64 ipv6 address 2001:db8:12::2/64
! !
interface eth1 vrf vrf10 interface eth1 vrf vrf10
ip address 192.168.2.254/24 ip address 192.168.2.254/24

View File

@ -0,0 +1,52 @@
frr defaults traditional
!
hostname r2
password zebra
!
log stdout notifications
log monitor notifications
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
!
!

View File

@ -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
!

View 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
!

View File

@ -44,17 +44,23 @@ pytestmark = [pytest.mark.bgpd]
def build_topo(tgen): def build_topo(tgen):
tgen.add_router("r1") tgen.add_router("r1")
tgen.add_router("r2") tgen.add_router("r2")
tgen.add_router("r3")
tgen.add_router("c11") tgen.add_router("c11")
tgen.add_router("c12") tgen.add_router("c12")
tgen.add_router("c21") tgen.add_router("c21")
tgen.add_router("c22") 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["r2"], "eth0", "eth0")
tgen.add_link(tgen.gears["r1"], tgen.gears["c11"], "eth1", "eth0") tgen.add_link(tgen.gears["r1"], tgen.gears["r3"], "eth1", "eth0")
tgen.add_link(tgen.gears["r1"], tgen.gears["c12"], "eth2", "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["c21"], "eth1", "eth0")
tgen.add_link(tgen.gears["r2"], tgen.gears["c22"], "eth2", "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): def setup_module(mod):
@ -66,20 +72,23 @@ def setup_module(mod):
tgen.start_topology() tgen.start_topology()
for rname, router in tgen.routers().items(): for rname, router in tgen.routers().items():
router.load_config(TopoRouter.RD_ZEBRA, router.load_config(
os.path.join(CWD, '{}/zebra.conf'.format(rname))) 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(
router.load_config(TopoRouter.RD_BGP, TopoRouter.RD_STATIC, os.path.join(CWD, "{}/staticd.conf".format(rname))
os.path.join(CWD, '{}/bgpd.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("sysctl net.vrf.strict_mode=1")
tgen.gears["r1"].run("ip link add vrf10 type vrf table 10") 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 set vrf10 up")
tgen.gears["r1"].run("ip link add vrf20 type vrf table 20") 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 vrf20 up")
tgen.gears["r1"].run("ip link set eth1 master vrf10") tgen.gears["r1"].run("ip link set eth2 master vrf10")
tgen.gears["r1"].run("ip link set eth2 master vrf20") tgen.gears["r1"].run("ip link set eth3 master vrf20")
tgen.gears["r2"].run("sysctl net.vrf.strict_mode=1") 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 add vrf10 type vrf table 10")
@ -89,6 +98,14 @@ def setup_module(mod):
tgen.gears["r2"].run("ip link set eth1 master vrf10") tgen.gears["r2"].run("ip link set eth1 master vrf10")
tgen.gears["r2"].run("ip link set eth2 master vrf20") 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() tgen.start_router()
@ -115,12 +132,13 @@ def check_ping4(name, dest_addr, expected):
def test_ping(): def test_ping():
tgen = get_topogen() tgen = get_topogen()
logger.info(tgen.gears["c11"].run("ip route show"))
# tests for ipv4-vpn
check_ping4("c11", "192.168.2.1", True) check_ping4("c11", "192.168.2.1", True)
check_ping4("c11", "192.168.3.1", True)
check_ping4("c12", "192.168.2.1", True) check_ping4("c12", "192.168.2.1", True)
check_ping4("c21", "192.168.1.1", True) check_ping4("c12", "192.168.3.1", True)
check_ping4("c22", "192.168.1.1", True) check_ping4("c21", "192.168.3.1", True)
check_ping4("c22", "192.168.3.1", True)
if __name__ == "__main__": if __name__ == "__main__":