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)) {
+++ /dev/null
-ipv6 route fd00:200::/64 fd00:100::2
-interface eth-pe1
- ipv6 address fd00:100::1/64
-!
+++ /dev/null
-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
-!
+++ /dev/null
-{
- "ipv6Vpn": {
- "routerId": "198.51.100.2",
- "as": 65500,
- "peers": {
- "192.0.2.5": {
- "remoteAs": 65501,
- "state": "Established",
- "peerState": "OK"
- }
- }
- }
-}
+++ /dev/null
-{
- "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
- }
- ]
- }
- ]
- }
-}
+++ /dev/null
-!
-!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
-!
+++ /dev/null
-{
- "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
- }
- ]
- }
- ]
-}
+++ /dev/null
-!
-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
-!
-
+++ /dev/null
-!
-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
-!
+++ /dev/null
-{
- "ipv6Vpn": {
- "routerId": "198.51.100.5",
- "as": 65501,
- "peers": {
- "192.0.2.2": {
- "remoteAs": 65500,
- "state": "Established",
- "peerState": "OK"
- }
- }
- }
-}
+++ /dev/null
-{
- "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
- }
- ]
- }
- ]
- }
-}
+++ /dev/null
-!
-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
+++ /dev/null
-!
-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
-!
+++ /dev/null
-!
-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
-!
+++ /dev/null
-#!/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))
+++ /dev/null
-#!/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))