From f118424e3bdf63c4741c3cc5ce792b9668bf984b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Krienb=C3=BChl?= Date: Tue, 10 Oct 2023 22:23:18 +0200 Subject: [PATCH] tests: Add OSPF test for issue 14488 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OSPF on IPv4/IPv6 removes the wrong routes in certain cases, causing issues when removing and re-enabling interfaces. This test proofs that. These tests all pass with https://github.com/FRRouting/frr/pull/13340 and the latest master (d2324b7b4a02e9ef6a219578567932addeb7f593). See https://github.com/FRRouting/frr/issues/14488 Ticket: #3684268 Signed-off-by: Denis Krienbühl (cherry picked from commit 616e1fa9df13cf2f269fdfb70b9bae7cd592fc4e) --- tests/topotests/ospf_topo2/__init__.py | 0 tests/topotests/ospf_topo2/r1/frr.conf | 61 ++++ tests/topotests/ospf_topo2/r2/frr.conf | 61 ++++ tests/topotests/ospf_topo2/r3/frr.conf | 61 ++++ tests/topotests/ospf_topo2/r4/frr.conf | 61 ++++ .../topotests/ospf_topo2/test_ospf_topo2.dot | 44 +++ .../topotests/ospf_topo2/test_ospf_topo2.png | Bin 0 -> 88488 bytes tests/topotests/ospf_topo2/test_ospf_topo2.py | 317 ++++++++++++++++++ 8 files changed, 605 insertions(+) create mode 100644 tests/topotests/ospf_topo2/__init__.py create mode 100644 tests/topotests/ospf_topo2/r1/frr.conf create mode 100644 tests/topotests/ospf_topo2/r2/frr.conf create mode 100644 tests/topotests/ospf_topo2/r3/frr.conf create mode 100644 tests/topotests/ospf_topo2/r4/frr.conf create mode 100644 tests/topotests/ospf_topo2/test_ospf_topo2.dot create mode 100644 tests/topotests/ospf_topo2/test_ospf_topo2.png create mode 100644 tests/topotests/ospf_topo2/test_ospf_topo2.py diff --git a/tests/topotests/ospf_topo2/__init__.py b/tests/topotests/ospf_topo2/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/topotests/ospf_topo2/r1/frr.conf b/tests/topotests/ospf_topo2/r1/frr.conf new file mode 100644 index 000000000000..9bc336185946 --- /dev/null +++ b/tests/topotests/ospf_topo2/r1/frr.conf @@ -0,0 +1,61 @@ +frr defaults traditional +hostname r1 +log syslog informational +service integrated-vtysh-config +! +ip router-id 192.0.2.1 +! +interface eth1 + ip address 192.0.2.1/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::1/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth2 + ip address 192.0.2.1/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::1/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth3 + ip address 192.0.2.1/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::1/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface lo + ip address 192.0.2.1/32 + ip ospf area 0.0.0.0 + ip ospf passive + ipv6 address 2001:db8::1/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 passive +exit +! +router ospf + log-adjacency-changes +exit +! +router ospf6 + log-adjacency-changes +exit +! +end \ No newline at end of file diff --git a/tests/topotests/ospf_topo2/r2/frr.conf b/tests/topotests/ospf_topo2/r2/frr.conf new file mode 100644 index 000000000000..d2ffb7337791 --- /dev/null +++ b/tests/topotests/ospf_topo2/r2/frr.conf @@ -0,0 +1,61 @@ +frr defaults traditional +hostname r2 +log syslog informational +service integrated-vtysh-config +! +ip router-id 192.0.2.2 +! +interface eth1 + ip address 192.0.2.2/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::2/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth2 + ip address 192.0.2.2/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::2/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth3 + ip address 192.0.2.2/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::2/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface lo + ip address 192.0.2.2/32 + ip ospf area 0.0.0.0 + ip ospf passive + ipv6 address 2001:db8::2/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 passive +exit +! +router ospf + log-adjacency-changes +exit +! +router ospf6 + log-adjacency-changes +exit +! +end \ No newline at end of file diff --git a/tests/topotests/ospf_topo2/r3/frr.conf b/tests/topotests/ospf_topo2/r3/frr.conf new file mode 100644 index 000000000000..e87b8972f041 --- /dev/null +++ b/tests/topotests/ospf_topo2/r3/frr.conf @@ -0,0 +1,61 @@ +frr defaults traditional +hostname r3 +log syslog informational +service integrated-vtysh-config +! +ip router-id 192.0.2.3 +! +interface eth1 + ip address 192.0.2.3/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::3/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth2 + ip address 192.0.2.3/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::3/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth3 + ip address 192.0.2.3/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::3/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface lo + ip address 192.0.2.3/32 + ip ospf area 0.0.0.0 + ip ospf passive + ipv6 address 2001:db8::3/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 passive +exit +! +router ospf + log-adjacency-changes +exit +! +router ospf6 + log-adjacency-changes +exit +! +end \ No newline at end of file diff --git a/tests/topotests/ospf_topo2/r4/frr.conf b/tests/topotests/ospf_topo2/r4/frr.conf new file mode 100644 index 000000000000..4e33d75299a2 --- /dev/null +++ b/tests/topotests/ospf_topo2/r4/frr.conf @@ -0,0 +1,61 @@ +frr defaults traditional +hostname r4 +log syslog informational +service integrated-vtysh-config +! +ip router-id 192.0.2.4 +! +interface eth1 + ip address 192.0.2.4/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::4/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth2 + ip address 192.0.2.4/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::4/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface eth3 + ip address 192.0.2.4/32 + ip ospf area 0.0.0.0 + ip ospf dead-interval minimal hello-multiplier 4 + ip ospf network point-to-point + ipv6 address 2001:db8::4/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 dead-interval 4 + ipv6 ospf6 hello-interval 1 + ipv6 ospf6 network point-to-point +exit +! +interface lo + ip address 192.0.2.4/32 + ip ospf area 0.0.0.0 + ip ospf passive + ipv6 address 2001:db8::4/128 + ipv6 ospf6 area 0.0.0.0 + ipv6 ospf6 passive +exit +! +router ospf + log-adjacency-changes +exit +! +router ospf6 + log-adjacency-changes +exit +! +end \ No newline at end of file diff --git a/tests/topotests/ospf_topo2/test_ospf_topo2.dot b/tests/topotests/ospf_topo2/test_ospf_topo2.dot new file mode 100644 index 000000000000..e35afbbaad7c --- /dev/null +++ b/tests/topotests/ospf_topo2/test_ospf_topo2.dot @@ -0,0 +1,44 @@ +graph template { + label="ospf_topo2"; + splines = "line" + + # Routers + r1 [ + shape=doubleoctagon, + label="r1\n192.0.2.1\n2001:db8::1", + fillcolor="#f08080", + style=filled, + ]; + r2 [ + shape=doubleoctagon, + label="r2\n\192.0.2.2\n2001:db8::2", + fillcolor="#f08080", + style=filled, + ]; + r3 [ + shape=doubleoctagon, + label="r3\n192.0.2.3\n2001:db8::3", + fillcolor="#f08080", + style=filled, + ]; + r4 [ + shape=doubleoctagon, + label="r4\n192.0.2.4\n2001:db8::4", + fillcolor="#f08080", + style=filled, + ]; + + # Connections + r1 -- r2 [label="eth1"]; + r1 -- r2 [label="eth2"]; + + r2 -- r3 [label="eth3\neth1"]; + r1 -- r4 [label="eth3\neth1"]; + + r4 -- r3 [label="eth2"]; + r4 -- r3 [label="eth3"]; + + # Group r1 and r2 above, r3 and r4 below + { rank=min; r1; r2; } + { rank=max; r3; r4; } +} diff --git a/tests/topotests/ospf_topo2/test_ospf_topo2.png b/tests/topotests/ospf_topo2/test_ospf_topo2.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb0a1d68499cc6aaef07a242ec295e553eedaea GIT binary patch literal 88488 zcmaI82RzpM`#*k5$X*dyxf2%0Akxep-h^*|9y|efK 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 }Y^c-;H9r>&5c-jVM^G%z%_@vp-H8kv)vC#Y6 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 literal 0 HcmV?d00001 diff --git a/tests/topotests/ospf_topo2/test_ospf_topo2.py b/tests/topotests/ospf_topo2/test_ospf_topo2.py new file mode 100644 index 000000000000..8be06e41aff2 --- /dev/null +++ b/tests/topotests/ospf_topo2/test_ospf_topo2.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python +# -*- coding: utf-8 eval: (blacken-mode 1) -*- +# SPDX-License-Identifier: ISC +# +# test_ospf_topo2.py +# Part of NetDEF Topology Tests +# +# Copyright (c) 2017 by +# Network Device Education Foundation, Inc. ("NetDEF") +# + +""" +test_ospf_topo2.py: Test correct route removal. + +Proofs the following issue: +https://github.com/FRRouting/frr/issues/14488 + +""" + +import ipaddress +import json +import pytest +import sys +import time + +from lib.topogen import Topogen + + +pytestmark = [ + pytest.mark.ospf6d, + pytest.mark.ospfd, +] + + +def build_topo(tgen): + """Build the topology used by all tests below.""" + + # Create 4 routers + r1 = tgen.add_router("r1") + r2 = tgen.add_router("r2") + r3 = tgen.add_router("r3") + r4 = tgen.add_router("r4") + + # The r1/r2 and r3/r4 router pairs have two connections each + tgen.add_link(r1, r2, ifname1="eth1", ifname2="eth1") + tgen.add_link(r1, r2, ifname1="eth2", ifname2="eth2") + tgen.add_link(r3, r4, ifname1="eth2", ifname2="eth2") + tgen.add_link(r3, r4, ifname1="eth3", ifname2="eth3") + + # The r1/r4 and r2/r3 router pairs have one connection each + tgen.add_link(r1, r4, ifname1="eth3", ifname2="eth1") + tgen.add_link(r2, r3, ifname1="eth3", ifname2="eth1") + + +@pytest.fixture(scope="function") +def tgen(request): + """Setup/Teardown the environment and provide tgen argument to tests. + + Do this once per function as some of the tests will leave the router + in an unclean state. + + """ + + tgen = Topogen(build_topo, request.module.__name__) + tgen.start_topology() + + router_list = tgen.routers() + + for rname, router in router_list.items(): + router.load_frr_config("frr.conf") + + tgen.start_router() + + yield tgen + + tgen.stop_topology() + + +def ospf_neighbors(router, ip_version): + """List the OSPF neighbors for the given router and IP version.""" + + if ip_version == 4: + cmd = "show ip ospf neighbor json" + else: + cmd = "show ipv6 ospf neighbor json" + + output = router.vtysh_cmd(cmd) + + if ip_version == 4: + return [v for n in json.loads(output)["neighbors"].values() for v in n] + else: + return json.loads(output)["neighbors"] + + +def ospf_neighbor_uptime(router, interface, ip_version): + """Uptime of the neighbor with the given interface name in seconds.""" + + for neighbor in ospf_neighbors(router, ip_version): + if ip_version == 4: + if not neighbor["ifaceName"].startswith("{}:".format(interface)): + continue + + return neighbor["upTimeInMsec"] / 1000 + else: + if neighbor["interfaceName"] != interface: + continue + + h, m, s = [int(d) for d in neighbor["duration"].split(":")] + return h * 3600 + m * 60 + s + + raise KeyError( + "No IPv{} neighbor with interface name {} on {}".format( + ip_version, interface, router.name + ) + ) + + +def ospf_routes(router, prefix): + """List the OSPF routes for the given router and prefix.""" + + if ipaddress.ip_interface(prefix).ip.version == 4: + cmd = "show ip route {} json" + else: + cmd = "show ipv6 route {} json" + + output = router.vtysh_cmd(cmd.format(prefix)) + return json.loads(output)[prefix] + + +def ospf_nexthops(router, prefix, protocol): + """List the OSPF nexthops for the given prefix.""" + + for route in ospf_routes(router, prefix): + if route["protocol"] != protocol: + continue + + for nexthop in route["nexthops"]: + yield nexthop + + +def ospf_directly_connected_interfaces(router, ip_version): + """The names of the directly connected interfaces, as discovered + through the OSPF nexthops. + + """ + + if ip_version == 4: + prefix = "192.0.2.{}/32".format(router.name.strip("r")) + else: + prefix = "fe80::/64" + + hops = ospf_nexthops(router, prefix, protocol="connected") + return sorted([n["interfaceName"] for n in hops if n["directlyConnected"]]) + + +def wait_for_ospf(router, ip_version, neighbors, timeout=60): + """Wait until the router has the given number of neighbors that are + fully converged. + + Note that this checks for the exact number of neighbors, so if one neighbor + is requested and three are converged, the wait continues. + + """ + + until = time.monotonic() + timeout + + if ip_version == 4: + filter = {"converged": "Full"} + else: + filter = {"state": "Full"} + + def is_match(neighbor): + for k, v in filter.items(): + if neighbor[k] != v: + return False + + return True + + while time.monotonic() < until: + found = sum(1 for n in ospf_neighbors(router, ip_version) if is_match(n)) + + if neighbors == found: + return + + raise TimeoutError( + "Waited over {}s for {} neighbors to reach {}".format( + timeout, neighbors, filter + ) + ) + + +@pytest.mark.parametrize("ip_version", [4, 6]) +def test_interface_up(tgen, ip_version): + """Verify the initial routing table, before any changes.""" + + # Wait for the routers to be ready + routers = {id: tgen.gears[id] for id in ("r1", "r2", "r3", "r4")} + + for router in routers.values(): + wait_for_ospf(router, ip_version=ip_version, neighbors=3) + + # Verify that the link-local routes are correct + for router in routers.values(): + connected = ospf_directly_connected_interfaces(router, ip_version) + + if ip_version == 4: + expected = ["eth1", "eth2", "eth3", "lo"] + else: + expected = ["eth1", "eth2", "eth3"] + + assert ( + connected == expected + ), "Expected all interfaces to be connected on {}".format(router.name) + + +@pytest.mark.parametrize("ip_version", [4, 6]) +def test_interface_down(tgen, ip_version): + """Verify the routing table after taking interfaces down.""" + + # Wait for the routers to be ready + routers = {id: tgen.gears[id] for id in ("r1", "r2", "r3", "r4")} + + for id, router in routers.items(): + wait_for_ospf(router, ip_version=ip_version, neighbors=3) + + # Keep track of the uptime of the eth3 neighbor + uptime = ospf_neighbor_uptime(routers["r1"], "eth3", ip_version) + before = time.monotonic() + + # Take the links between r1 and r2 down + routers["r1"].cmd_raises("ip link set down dev eth1") + routers["r1"].cmd_raises("ip link set down dev eth2") + + # Wait for OSPF to converge + wait_for_ospf(routers["r1"], ip_version=ip_version, neighbors=1) + + # The uptime of the unaffected eth3 neighbor should be monotonic + new_uptime = ospf_neighbor_uptime(routers["r1"], "eth3", ip_version) + took = round(time.monotonic() - before, 3) + + # IPv6 has a resolution of 1s, for IPv4 some slack is necesssary. + if ip_version == 4: + offset = 0.25 + else: + offset = 1 + + assert ( + new_uptime + offset >= uptime + took + ), "The eth3 neighbor uptime must not decrease" + + # We should only find eth3 once OSPF has converged + connected = ospf_directly_connected_interfaces(routers["r1"], ip_version) + + if ip_version == 4: + expected = ["eth3", "lo"] + else: + expected = ["eth3"] + + assert connected == expected, "Expected only eth1 and eth2 to be disconnected" + + +@pytest.mark.parametrize("ip_version", [4, 6]) +def test_interface_flap(tgen, ip_version): + """Verify the routing table after enabling an interface that was down.""" + + # Wait for the routers to be ready + routers = {id: tgen.gears[id] for id in ("r1", "r2", "r3", "r4")} + + for id, router in routers.items(): + wait_for_ospf(router, ip_version=ip_version, neighbors=3) + + # Keep track of the uptime of the eth3 neighbor + uptime = ospf_neighbor_uptime(routers["r1"], "eth3", ip_version) + before = time.monotonic() + + # Take the links between r1 and r2 down + routers["r1"].cmd_raises("ip link set down dev eth1") + routers["r2"].cmd_raises("ip link set down dev eth2") + + # Wait for OSPF to converge + wait_for_ospf(routers["r1"], ip_version=ip_version, neighbors=1) + + # Take the links between r1 and r2 up + routers["r1"].cmd_raises("ip link set up dev eth1") + routers["r2"].cmd_raises("ip link set up dev eth2") + + # Wait for OSPF to converge + wait_for_ospf(routers["r1"], ip_version=ip_version, neighbors=3) + + # The uptime of the unaffected eth3 neighbor should be monotonic + new_uptime = ospf_neighbor_uptime(routers["r1"], "eth3", ip_version) + took = round(time.monotonic() - before, 3) + + # IPv6 has a resolution of 1s, for IPv4 some slack is necesssary. + if ip_version == 4: + offset = 0.25 + else: + offset = 1 + + assert ( + new_uptime + offset >= uptime + took + ), "The eth3 neighbor uptime must not decrease" + + # We should find all interfaces again + connected = ospf_directly_connected_interfaces(routers["r1"], ip_version) + + if ip_version == 4: + expected = ["eth1", "eth2", "eth3", "lo"] + else: + expected = ["eth1", "eth2", "eth3"] + + assert connected == expected, "Expected all interfaces to be connected" + + +if __name__ == "__main__": + args = ["-s"] + sys.argv[1:] + sys.exit(pytest.main(args))