From: Jafar Al-Gharaibeh Date: Wed, 21 Aug 2024 18:40:18 +0000 (-0500) Subject: Revert "Merge pull request #15368 from louis-6wind/fix-6pe" X-Git-Tag: base_10.2~171^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=741c0303952294d670c9194404f741c3033de4a3;p=matthieu%2Ffrr.git Revert "Merge pull request #15368 from louis-6wind/fix-6pe" This reverts commit df98e8836897135b34080909bb6c4d91218a8e59, reversing changes made to b6521192354df3f614b244323876e43dd0b58e56. --- diff --git a/bgpd/bgp_updgrp_packet.c b/bgpd/bgp_updgrp_packet.c index b359b2c253..8cd851b9ac 100644 --- a/bgpd/bgp_updgrp_packet.c +++ b/bgpd/bgp_updgrp_packet.c @@ -523,16 +523,11 @@ struct stream *bpacket_reformat_for_peer(struct bpacket *pkt, gnh_modified = 1; } - if (peer->nexthop.v4.s_addr != INADDR_ANY && - (IN6_IS_ADDR_UNSPECIFIED(mod_v6nhg) || - (peer->connection->su.sa.sa_family == AF_INET && - paf->afi == AFI_IP6))) { - /* set a IPv4 mapped IPv6 address if no global IPv6 - * address is found or if announcing IPv6 prefix - * over an IPv4 BGP session. - */ - ipv4_to_ipv4_mapped_ipv6(mod_v6nhg, peer->nexthop.v4); - gnh_modified = 1; + if (IN6_IS_ADDR_UNSPECIFIED(mod_v6nhg)) { + if (peer->nexthop.v4.s_addr != INADDR_ANY) { + ipv4_to_ipv4_mapped_ipv6(mod_v6nhg, + peer->nexthop.v4); + } } if (IS_MAPPED_IPV6(&peer->nexthop.v6_global)) { diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/__init__.py b/tests/topotests/bgp_6vpe_ebgp_topo1/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/h1/zebra.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/h1/zebra.conf deleted file mode 100644 index 06a23bb0fd..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/h1/zebra.conf +++ /dev/null @@ -1,4 +0,0 @@ -ipv6 route fd00:200::/64 fd00:100::2 -interface eth-pe1 - ipv6 address fd00:100::1/64 -! diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/h2/zebra.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/h2/zebra.conf deleted file mode 100644 index 2dadfc4007..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/h2/zebra.conf +++ /dev/null @@ -1,8 +0,0 @@ -ipv6 route fd00:100::/64 fd00:200::5 -interface eth-pe2 - ipv6 address fd00:200::6/64 - ipv6 address fd00:201::6/64 - ipv6 address fd00:300::6/64 - ipv6 address fd00:400::6/64 - ipv6 address fd01:200::6/64 -! diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgp_summary.json b/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgp_summary.json deleted file mode 100644 index c2100add8e..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgp_summary.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "ipv6Vpn": { - "routerId": "198.51.100.2", - "as": 65500, - "peers": { - "192.0.2.5": { - "remoteAs": 65501, - "state": "Established", - "peerState": "OK" - } - } - } -} diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgp_vrf_ipv6.json b/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgp_vrf_ipv6.json deleted file mode 100644 index c6e776d069..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgp_vrf_ipv6.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "vrfName": "vrf1", - "routerId": "198.51.100.2", - "defaultLocPrf": 100, - "localAS": 65500, - "routes": { - "fd00:100::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:100::/64", - "metric": 0, - "weight": 32768, - "path": "", - "nexthops": [ - { - "ip": "::", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:200::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:200::/64", - "metric": 0, - "weight": 0, - "path": "65501", - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:201::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:201::/64", - "metric": 0, - "weight": 0, - "path": "65501", - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:300::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:300::/64", - "metric": 0, - "weight": 0, - "path": "65501", - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:400::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:400::/64", - "metric": 0, - "weight": 0, - "path": "65501", - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd01:200::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd01:200::/64", - "metric": 0, - "weight": 0, - "path": "65501", - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ] - } -} diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgpd.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgpd.conf deleted file mode 100644 index 26e94d4b97..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/bgpd.conf +++ /dev/null @@ -1,32 +0,0 @@ -! -!debug bgp zebra -router bgp 65500 - bgp router-id 198.51.100.2 - no bgp ebgp-requires-policy - neighbor 192.0.2.5 remote-as 65501 - neighbor 192.0.2.5 capability extended-nexthop - address-family ipv4 unicast - no neighbor 192.0.2.5 activate - exit-address-family - address-family ipv6 vpn - neighbor 192.0.2.5 activate - neighbor 192.0.2.5 route-map rmap in - exit-address-family -exit -router bgp 65500 vrf vrf1 - bgp router-id 198.51.100.2 - address-family ipv6 unicast - redistribute connected - label vpn export 101 - rd vpn export 444:1 - rt vpn both 52:100 - export vpn - import vpn - exit-address-family -! -interface eth-pe2 - mpls bgp forwarding -! -route-map rmap permit 1 - set ipv6 next-hop prefer-global -! diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/ipv6_routes_vrf.json b/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/ipv6_routes_vrf.json deleted file mode 100644 index 154574963b..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/ipv6_routes_vrf.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "fd00:100::/64": [ - { - "prefix": "fd00:100::/64", - "protocol": "connected", - "vrfName": "vrf1", - "selected": true, - "destSelected": true, - "distance": 0, - "metric": 0, - "installed": true, - "nexthops": [ - { - "fib": true, - "directlyConnected": true, - "interfaceName": "eth-h1", - "active": true - } - ] - } - ], - "fd00:200::/64": [ - { - "prefix": "fd00:200::/64", - "protocol": "bgp", - "vrfName": "vrf1", - "selected": true, - "destSelected": true, - "distance": 20, - "metric": 0, - "installed": true, - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "vrf": "default", - "active": true, - "labels": [ - 102 - ], - "weight": 1 - } - ] - } - ], - "fd00:201::/64": [ - { - "prefix": "fd00:201::/64", - "protocol": "bgp", - "vrfName": "vrf1", - "selected": true, - "destSelected": true, - "distance": 20, - "metric": 0, - "installed": true, - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "vrf": "default", - "active": true, - "labels": [ - 102 - ], - "weight": 1 - } - ] - } - ], - "fd00:300::/64": [ - { - "prefix": "fd00:300::/64", - "protocol": "bgp", - "vrfName": "vrf1", - "selected": true, - "destSelected": true, - "distance": 20, - "metric": 0, - "installed": true, - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "vrf": "default", - "active": true, - "labels": [ - 102 - ], - "weight": 1 - } - ] - } - ], - "fd00:400::/64": [ - { - "prefix": "fd00:400::/64", - "protocol": "bgp", - "vrfName": "vrf1", - "selected": true, - "destSelected": true, - "distance": 20, - "metric": 0, - "installed": true, - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "vrf": "default", - "active": true, - "labels": [ - 102 - ], - "weight": 1 - } - ] - } - ], - "fd01:200::/64": [ - { - "prefix": "fd01:200::/64", - "protocol": "bgp", - "vrfName": "vrf1", - "selected": true, - "destSelected": true, - "distance": 20, - "metric": 0, - "installed": true, - "nexthops": [ - { - "ip": "::ffff:c000:205", - "afi": "ipv6", - "vrf": "default", - "active": true, - "labels": [ - 102 - ], - "weight": 1 - } - ] - } - ] -} diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/isisd.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/isisd.conf deleted file mode 100644 index 61f2fe7def..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/isisd.conf +++ /dev/null @@ -1,23 +0,0 @@ -! -interface lo - ip router isis 1 - isis hello-interval 1 - isis hello-multiplier 3 -! -interface eth-pe2 - ip router isis 1 - isis hello-interval 1 - isis hello-multiplier 3 -! -router isis 1 - net 49.0000.0007.e901.2222.00 - is-type level-1 - lsp-gen-interval 1 - mpls-te on - mpls-te router-address 198.51.100.2 - segment-routing on - segment-routing node-msd 8 - segment-routing global-block 1000 10000 local-block 30000 30999 - segment-routing prefix 198.51.100.2/32 index 22 -! - diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/zebra.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/zebra.conf deleted file mode 100644 index 7ddd98f6e7..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe1/zebra.conf +++ /dev/null @@ -1,11 +0,0 @@ -! -interface eth-h1 - ipv6 address fd00:100::2/64 -! -interface eth-pe2 - ip address 192.0.2.2/24 - ipv6 address ::ffff:192.0.2.2/120 -! -interface lo - ip address 198.51.100.2/32 -! diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgp_summary.json b/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgp_summary.json deleted file mode 100644 index d74079498e..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgp_summary.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "ipv6Vpn": { - "routerId": "198.51.100.5", - "as": 65501, - "peers": { - "192.0.2.2": { - "remoteAs": 65500, - "state": "Established", - "peerState": "OK" - } - } - } -} diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgp_vrf_ipv6.json b/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgp_vrf_ipv6.json deleted file mode 100644 index ec42999e8a..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgp_vrf_ipv6.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "vrfName": "vrf1", - "routerId": "198.51.100.5", - "defaultLocPrf": 100, - "localAS": 65501, - "routes": { - "fd00:100::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:100::/64", - "metric": 0, - "weight": 0, - "path": "65500", - "nexthops": [ - { - "ip": "::ffff:c000:202", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:200::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:200::/64", - "metric": 0, - "weight": 32768, - "path": "", - "nexthops": [ - { - "ip": "::", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:201::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:201::/64", - "metric": 0, - "weight": 32768, - "path": "", - "nexthops": [ - { - "ip": "::", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:300::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:300::/64", - "metric": 0, - "weight": 32768, - "path": "", - "nexthops": [ - { - "ip": "::", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd00:400::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd00:400::/64", - "metric": 0, - "weight": 32768, - "path": "", - "nexthops": [ - { - "ip": "::", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ], - "fd01:200::/64": [ - { - "valid": true, - "bestpath": true, - "network": "fd01:200::/64", - "metric": 0, - "weight": 32768, - "path": "", - "nexthops": [ - { - "ip": "::", - "afi": "ipv6", - "scope": "global", - "used": true - } - ] - } - ] - } -} diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgpd.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgpd.conf deleted file mode 100644 index 03b63af90f..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/bgpd.conf +++ /dev/null @@ -1,31 +0,0 @@ -! -router bgp 65501 - bgp router-id 198.51.100.5 - no bgp ebgp-requires-policy - neighbor 192.0.2.2 remote-as 65500 - neighbor 192.0.2.2 capability extended-nexthop - address-family ipv4 unicast - no neighbor 192.0.2.2 activate - exit-address-family - address-family ipv6 vpn - neighbor 192.0.2.2 activate - neighbor 192.0.2.2 route-map rmap in - exit-address-family -exit -router bgp 65501 vrf vrf1 - bgp router-id 198.51.100.5 - address-family ipv6 unicast - redistribute connected - label vpn export 102 - rd vpn export 444:2 - rt vpn both 52:100 - export vpn - import vpn -exit-address-family -! -interface eth-pe1 - mpls bgp forwarding -! -route-map rmap permit 1 - set ipv6 next-hop prefer-global -! \ No newline at end of file diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/isisd.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/isisd.conf deleted file mode 100644 index f210554ff6..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/isisd.conf +++ /dev/null @@ -1,22 +0,0 @@ -! -interface lo - ip router isis 1 - isis hello-interval 1 - isis hello-multiplier 3 -! -interface eth-pe1 - ip router isis 1 - isis hello-interval 1 - isis hello-multiplier 3 -! -router isis 1 - net 49.0000.0007.e901.5555.00 - is-type level-1 - lsp-gen-interval 1 - mpls-te on - mpls-te router-address 198.51.100.5 - segment-routing on - segment-routing node-msd 8 - segment-routing global-block 1000 10000 local-block 33000 33999 - segment-routing prefix 198.51.100.5/32 index 55 -! diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/zebra.conf b/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/zebra.conf deleted file mode 100644 index bf20638684..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/pe2/zebra.conf +++ /dev/null @@ -1,15 +0,0 @@ -! -interface eth-h2 - ipv6 address fd00:200::5/64 - ipv6 address fd00:201::5/64 - ipv6 address fd00:300::5/64 - ipv6 address fd00:400::5/64 - ipv6 address fd01:200::5/64 -! -interface eth-pe1 - ip address 192.0.2.5/24 - ipv6 address ::ffff:192.0.2.5/120 -! -interface lo - ip address 198.51.100.5/32 -! diff --git a/tests/topotests/bgp_6vpe_ebgp_topo1/test_bgp_6vpe_ebgp_topo1.py b/tests/topotests/bgp_6vpe_ebgp_topo1/test_bgp_6vpe_ebgp_topo1.py deleted file mode 100644 index 477cfa206b..0000000000 --- a/tests/topotests/bgp_6vpe_ebgp_topo1/test_bgp_6vpe_ebgp_topo1.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python -# SPDX-License-Identifier: ISC - -# -# Copyright (c) 2023 by 6WIND -# - -""" -Test the FRR BGP 6VPE functionality -""" - -import os -import sys -import json -from functools import partial -import pytest - -# Save the Current Working Directory to find configuration files. -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.checkping import check_ping - -pytestmark = [pytest.mark.bgpd, pytest.mark.isisd] - - -def build_topo(tgen): - """ - +---+ +---+ +---+ +---+ - | h1|----|pe1|----|pe2|----| h2| - +---+ +---+ +---+ +---+ - """ - - def connect_routers(tgen, left, right): - pe = None - host = None - for rname in [left, right]: - if rname not in tgen.routers().keys(): - tgen.add_router(rname) - if "pe" in rname: - pe = tgen.gears[rname] - if "h" in rname: - host = tgen.gears[rname] - - switch = tgen.add_switch("s-{}-{}".format(left, right)) - switch.add_link(tgen.gears[left], nodeif="eth-{}".format(right)) - switch.add_link(tgen.gears[right], nodeif="eth-{}".format(left)) - - if pe and host: - pe.cmd("ip link add vrf1 type vrf table 10") - pe.cmd("ip link set vrf1 up") - pe.cmd("ip link set dev eth-{} master vrf1".format(host.name)) - - if "p" in left and "p" in right: - # PE <-> P or P <-> P - tgen.gears[left].run("sysctl -w net.mpls.conf.eth-{}.input=1".format(right)) - tgen.gears[right].run("sysctl -w net.mpls.conf.eth-{}.input=1".format(left)) - - connect_routers(tgen, "h1", "pe1") - connect_routers(tgen, "pe1", "pe2") - connect_routers(tgen, "pe2", "h2") - - -def setup_module(mod): - "Sets up the pytest environment" - - tgen = Topogen(build_topo, mod.__name__) - tgen.start_topology() - logger.info("setup_module") - - for rname, router in tgen.routers().items(): - router.load_config( - TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) - ) - if "h" in rname: - # hosts - continue - - router.load_config( - TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname)) - ) - - router.load_config( - TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) - ) - - # Initialize all routers. - tgen.start_router() - - -def teardown_module(_mod): - "Teardown the pytest environment" - tgen = get_topogen() - tgen.stop_topology() - - -def test_bgp_convergence(): - "Assert that BGP is converging." - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - logger.info("waiting for bgp peers to go up") - - router_list = ["pe1", "pe2"] - - for name in router_list: - router = tgen.gears[name] - ref_file = "{}/{}/bgp_summary.json".format(CWD, router.name) - expected = json.loads(open(ref_file).read()) - test_func = partial( - topotest.router_json_cmp, router, "show bgp summary json", expected - ) - _, res = topotest.run_and_expect(test_func, None, count=90, wait=1) - assertmsg = "{}: bgp did not converge".format(router.name) - assert res is None, assertmsg - - -def test_bgp_ipv6_vpn(): - "Assert that BGP is exchanging BGP route." - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - logger.info("waiting for bgp peers exchanging UPDATES") - - router_list = ["pe1", "pe2"] - - for name in router_list: - router = tgen.gears[name] - ref_file = "{}/{}/bgp_vrf_ipv6.json".format(CWD, router.name) - expected = json.loads(open(ref_file).read()) - test_func = partial( - topotest.router_json_cmp, - router, - "show bgp vrf vrf1 ipv6 unicast json", - expected, - ) - _, res = topotest.run_and_expect(test_func, None, count=30, wait=1) - assertmsg = "{}: BGP UPDATE exchange failure".format(router.name) - assert res is None, assertmsg - - -def test_zebra_ipv6_installed(): - "Assert that routes are installed." - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - pe1 = tgen.gears["pe1"] - logger.info("check ipv6 routes installed on pe1") - - ref_file = "{}/{}/ipv6_routes_vrf.json".format(CWD, pe1.name) - expected = json.loads(open(ref_file).read()) - test_func = partial( - topotest.router_json_cmp, pe1, "show ipv6 route vrf vrf1 json", expected - ) - _, res = topotest.run_and_expect(test_func, None, count=30, wait=1) - assertmsg = "{}: Zebra Installation failure on vrf vrf1".format(pe1.name) - assert res is None, assertmsg - - -def test_bgp_ping6_ok(): - "Check that h1 pings h2" - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - check_ping("h1", "fd00:200::6", True, 5, 1) - - -if __name__ == "__main__": - args = ["-s"] + sys.argv[1:] - sys.exit(pytest.main(args)) diff --git a/tests/topotests/bgp_nexthop_mp_ipv4_6/test_nexthop_mp_ipv4_6.py b/tests/topotests/bgp_nexthop_mp_ipv4_6/test_nexthop_mp_ipv4_6.py deleted file mode 100644 index e1c28084de..0000000000 --- a/tests/topotests/bgp_nexthop_mp_ipv4_6/test_nexthop_mp_ipv4_6.py +++ /dev/null @@ -1,282 +0,0 @@ -#!/usr/bin/env python -# SPDX-License-Identifier: ISC - -# -# Copyright (c) 2024 by 6WIND -# - -""" -Test BGP nexthop conformity with IPv4,6 MP-BGP over IPv4 peering -""" - -import os -import sys -import json -from functools import partial -import pytest - -# Save the Current Working Directory to find configuration files. -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.checkping import check_ping -from lib.bgp import verify_bgp_convergence_from_running_config - -pytestmark = [pytest.mark.bgpd, pytest.mark.isisd] - - -def build_topo(tgen): - r""" - +---+ - | h1| - +---+ - | - +---+ - | r1| AS 65100 - +---+ - / \ _____________ - / \ - +---+ +---+ - | r2| | r3| rr1 is route-reflector - +---+ +---+ for r2 and r3 - \ / - \ / - +---+ - |rr1| AS 65000 - +---+ - / \ - / \ - +---+ +---+ - | r4| | r5| iBGP full-mesh between - +---+ +---+ rr1, r4, r5 and r6 - \ / - \ / - +---+ - | r6| - +---+ - | _____________ - | - | +---+ - [sw1]-----|rs1| AS 65200 - /\ +---+ rs1: route-server - / \ - / \ _____________ - +---+ +---+ - | r7| | r8| AS 65700 (r7) - +---+ +---+ AS 65800 (r8) - | | - +---+ +---+ - | h2| | h3| - +---+ +---+ - """ - - def connect_routers(tgen, left, right): - for rname in [left, right]: - if rname not in tgen.routers().keys(): - tgen.add_router(rname) - - switch = tgen.add_switch("s-{}-{}".format(left, right)) - switch.add_link(tgen.gears[left], nodeif="eth-{}".format(right)) - switch.add_link(tgen.gears[right], nodeif="eth-{}".format(left)) - - def connect_switchs(tgen, rname, switch): - if rname not in tgen.routers().keys(): - tgen.add_router(rname) - - switch.add_link(tgen.gears[rname], nodeif="eth-{}".format(switch.name)) - - connect_routers(tgen, "h1", "r1") - connect_routers(tgen, "r1", "r2") - connect_routers(tgen, "r1", "r3") - connect_routers(tgen, "r2", "rr1") - connect_routers(tgen, "r3", "rr1") - connect_routers(tgen, "rr1", "r4") - connect_routers(tgen, "rr1", "r5") - connect_routers(tgen, "r4", "r6") - connect_routers(tgen, "r5", "r6") - - sw1 = tgen.add_switch("sw1") - connect_switchs(tgen, "r6", sw1) - connect_switchs(tgen, "rs1", sw1) - connect_switchs(tgen, "r7", sw1) - connect_switchs(tgen, "r8", sw1) - - connect_routers(tgen, "r7", "h2") - connect_routers(tgen, "r8", "h3") - - -def setup_module(mod): - "Sets up the pytest environment" - - tgen = Topogen(build_topo, mod.__name__) - tgen.start_topology() - logger.info("setup_module") - - for rname, router in tgen.routers().items(): - router.load_config( - TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname)) - ) - if "h" in rname: - # hosts - continue - - router.load_config( - TopoRouter.RD_BGP, os.path.join(CWD, "{}/bgpd.conf".format(rname)) - ) - - if rname in ["r1", "r7", "r8", "rs1"]: - # external routers - continue - - router.load_config( - TopoRouter.RD_ISIS, os.path.join(CWD, "{}/isisd.conf".format(rname)) - ) - - # Initialize all routers. - tgen.start_router() - - -def teardown_module(_mod): - "Teardown the pytest environment" - tgen = get_topogen() - tgen.stop_topology() - - -def test_bgp_convergence(): - "Assert that BGP is converging." - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - logger.info("waiting for bgp peers to go up") - - for rname in tgen.routers().keys(): - if "h" in rname: - # hosts - continue - result = verify_bgp_convergence_from_running_config(tgen, dut=rname) - assert result is True, "BGP is not converging on {}".format(rname) - - -def test_bgp_ipv4_nexthop_step1(): - "Assert that BGP has correct ipv4 nexthops." - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - for rname, router in tgen.routers().items(): - if "h" in rname: - # hosts - continue - if "rs1" in rname: - continue - ref_file = "{}/{}/bgp_ipv4.json".format(CWD, rname) - expected = json.loads(open(ref_file).read()) - test_func = partial( - topotest.router_json_cmp, - router, - "show bgp ipv4 unicast json", - expected, - ) - _, res = topotest.run_and_expect(test_func, None, count=30, wait=1) - assertmsg = "{}: BGP IPv4 Nexthop failure".format(rname) - assert res is None, assertmsg - - -def test_bgp_ipv6_nexthop_step1(): - "Assert that BGP has correct ipv6 nexthops." - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - for rname, router in tgen.routers().items(): - if "h" in rname: - # hosts - continue - if "rs1" in rname: - continue - ref_file = "{}/{}/bgp_ipv6_step1.json".format(CWD, rname) - expected = json.loads(open(ref_file).read()) - test_func = partial( - topotest.router_json_cmp, - router, - "show bgp ipv6 unicast json", - expected, - ) - _, res = topotest.run_and_expect(test_func, None, count=30, wait=1) - assertmsg = "{}: BGP IPv6 Nexthop failure".format(rname) - assert res is None, assertmsg - - -def test_bgp_ping_ok_step1(): - "Check that h1 pings h2 and h3" - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - check_ping("h1", "192.168.7.1", True, 5, 1) - check_ping("h1", "fd00:700::1", True, 5, 1) - check_ping("h1", "192.168.8.1", True, 5, 1) - check_ping("h1", "fd00:800::1", True, 5, 1) - - -def test_bgp_ipv6_nexthop_step2(): - """ - Remove IPv6 global on r1 and r7 - Assert that BGP has correct ipv6 nexthops. - """ - - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - tgen.gears["r1"].vtysh_cmd( - """ -configure -interface eth-r2 - no ipv6 address fd00:0:1::1/64 -! -interface eth-r3 - no ipv6 address fd00:0:2::1/64 -""" - ) - - for rname, router in tgen.routers().items(): - if "h" in rname: - # hosts - continue - if "rs1" in rname: - continue - ref_file = "{}/{}/bgp_ipv6_step2.json".format(CWD, rname) - expected = json.loads(open(ref_file).read()) - test_func = partial( - topotest.router_json_cmp, - router, - "show bgp ipv6 unicast json", - expected, - ) - _, res = topotest.run_and_expect(test_func, None, count=30, wait=1) - assertmsg = "{}: BGP IPv6 Nexthop failure".format(rname) - assert res is None, assertmsg - - -def test_bgp_ping_ok_step2(): - "Check that h1 pings h2 and h3" - tgen = get_topogen() - if tgen.routers_have_failure(): - pytest.skip(tgen.errors) - - check_ping("h1", "192.168.7.1", True, 5, 1) - check_ping("h1", "fd00:700::1", True, 5, 1) - check_ping("h1", "192.168.8.1", True, 5, 1) - check_ping("h1", "fd00:800::1", True, 5, 1) - - -if __name__ == "__main__": - args = ["-s"] + sys.argv[1:] - sys.exit(pytest.main(args))