From nobody Fri Jan 13 21:25:39 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4NtvbS0bb5z2ql3F; Fri, 13 Jan 2023 21:25:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4NtvbR4rCmz43RG; Fri, 13 Jan 2023 21:25:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673645139; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=v2mF4TY7Ieg6Y9DlvCS0rDIRGsl+yzAO8VVXDYCjLk4=; b=IkVUsjJdDwIL0ArmIqVRObV9EzE2jP6QkbYVkJUv8OB1GVoeeFVrhCU1vgMC1rCb35VmDG qz7E1biypnxJKXJVg6NJR09m6HbhH7CyaTFd0GVlv3yP/DQWwZPC+HbU1t3CPdHWtQXQ8G Mu5Gbt69LSJgkMRig5dio0v8QNLl0JH/RaAO6IWZQoMwgvDniXrodmfexjsb4xMapG3aoo VKJ9m9t5Hn5kNurYY+z6IfP7lxCI4fSt5UUn1gXEuI2Uj3nw/wt1H/c7cUozYmUoVdKjaY BnlQ/10sWu2pvmbiT2HrseEROFQWKp+DL5QI377pDZncopHF/wWSdah4ktkXmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673645139; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=v2mF4TY7Ieg6Y9DlvCS0rDIRGsl+yzAO8VVXDYCjLk4=; b=TPWA3RgXw+UVCtWRXzqseOLEjSZhZk2N5HNqJXxnsLFlo9JlPbB0+Ky5iqVKwyHBVzquIA 3P0Kt6EjJwALqmUZeDA1eITRoWvJuwjeDnm1v3x5r2ACq25zZ17SANRKTys9d32ZQB1qc1 vCT+pTaxKG1ekXLK0p08sn4TTJKb3VMto9+0mLJHKPi9nvnzQ+1VGFDp6cohB0yoHQBsDV +W4fHixYbDSMRZIuF63AyDZBR1s++V9UUTaZBo7UQBFda33LvEXFT0AHu8ercpUYzlaxpb ATJPTMQhKMXcVbYpSx2pPV4D0fVx23rfafgeaBhWeVgGOM2mTI/oyc6BgsSaqg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1673645139; a=rsa-sha256; cv=none; b=aAL+2mF7JcQ0XtT5jvcWAaIb8h3e8Ee0OPb87R9UGOnCHD+GapHBYjPkrZcgSlHCnJSnG0 /DSGWv5swsRrOqchH94p1FLFehZcKrGCV1b5KyvgmLwxtTp4Mz0EdfV2Wb132fBqxSlSNS aGlIXvr7CeobjMBlpD8ac0Qq44eL0uY+ek94CIw6EsdgUorDKl2Sr4T7xhI+nKV3tFYsyW F2tEBcIdqQs8EXKasER4m+0U5/qEGiUrUClqFlpVW2Etayy5Z8hZbEEqzZEuWIfGIscpKP 7BDcxN9sDC/yCWpqnHSxJLf9GXTtHv9haH7DXoH8b4qHQ3oJrKI8kUeZ3WZL0g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4NtvbR3y1qzNJZ; Fri, 13 Jan 2023 21:25:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30DLPdEB042150; Fri, 13 Jan 2023 21:25:39 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30DLPdRB042149; Fri, 13 Jan 2023 21:25:39 GMT (envelope-from git) Date: Fri, 13 Jan 2023 21:25:39 GMT Message-Id: <202301132125.30DLPdRB042149@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 7d15b0f2e42e - stable/13 - tests: add routing tests for switching between same prefixes List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 7d15b0f2e42ea623bd42c987ee70335b6d005af8 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=7d15b0f2e42ea623bd42c987ee70335b6d005af8 commit 7d15b0f2e42ea623bd42c987ee70335b6d005af8 Author: Alexander V. Chernikov AuthorDate: 2022-08-06 10:36:12 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-01-13 21:24:11 +0000 tests: add routing tests for switching between same prefixes Differential Revision: https://reviews.freebsd.org/D36055 MFC after: 2 weeks (cherry picked from commit 7064c94a02af2f8665636a8594557b9e93ad71bf) --- tests/atf_python/sys/net/tools.py | 15 +++++- tests/atf_python/sys/net/vnet.py | 8 +++- tests/sys/net/routing/Makefile | 1 + tests/sys/net/routing/test_routing_l3.py | 81 ++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) diff --git a/tests/atf_python/sys/net/tools.py b/tests/atf_python/sys/net/tools.py index c67941b414fc..23bb5f4b4128 100644 --- a/tests/atf_python/sys/net/tools.py +++ b/tests/atf_python/sys/net/tools.py @@ -41,7 +41,7 @@ class ToolsHelper(object): def get_routes(cls, family: str, fibnum: int = 0): family_key = {"inet": "-4", "inet6": "-6"}.get(family) out = cls.get_output( - "{} {} -rn -F {} --libxo json".format(cls.NETSTAT_PATH, family_key, fibnum) + "{} {} -rnW -F {} --libxo json".format(cls.NETSTAT_PATH, family_key, fibnum) ) js = json.loads(out) js = js["statistics"]["route-information"]["route-table"]["rt-family"] @@ -50,6 +50,19 @@ class ToolsHelper(object): else: return [] + @classmethod + def get_nhops(cls, family: str, fibnum: int = 0): + family_key = {"inet": "-4", "inet6": "-6"}.get(family) + out = cls.get_output( + "{} {} -onW -F {} --libxo json".format(cls.NETSTAT_PATH, family_key, fibnum) + ) + js = json.loads(out) + js = js["statistics"]["route-nhop-information"]["nhop-table"]["rt-family"] + if js: + return js[0]["nh-entry"] + else: + return [] + @classmethod def get_linklocals(cls): ret = {} diff --git a/tests/atf_python/sys/net/vnet.py b/tests/atf_python/sys/net/vnet.py index 663f7695a0cc..0d9f969b28d9 100644 --- a/tests/atf_python/sys/net/vnet.py +++ b/tests/atf_python/sys/net/vnet.py @@ -101,11 +101,15 @@ class VnetInterface(object): addr = ipaddress.ip_interface(_addr) if addr.version == 6: family = "inet6" + cmd = "/sbin/ifconfig {} {} {}".format(self.name, family, addr) else: family = "inet" - cmd = "/sbin/ifconfig {} {} {}".format(self.name, family, addr) + if self.addr_map[family]: + cmd = "/sbin/ifconfig {} alias {}".format(self.name, addr) + else: + cmd = "/sbin/ifconfig {} {} {}".format(self.name, family, addr) self.run_cmd(cmd) - self.addr_map[family][str(addr)] = addr + self.addr_map[family][str(addr.ip)] = addr def delete_addr(self, _addr: str): addr = ipaddress.ip_address(_addr) diff --git a/tests/sys/net/routing/Makefile b/tests/sys/net/routing/Makefile index d71ba828f958..45034ff211b1 100644 --- a/tests/sys/net/routing/Makefile +++ b/tests/sys/net/routing/Makefile @@ -7,6 +7,7 @@ TESTSDIR= ${TESTSBASE}/sys/net/routing ATF_TESTS_C += test_rtsock_l3 ATF_TESTS_C += test_rtsock_lladdr +ATF_TESTS_PYTEST += test_routing_l3.py ATF_TESTS_PYTEST += test_rtsock_multipath.py ${PACKAGE}FILES+= generic_cleanup.sh diff --git a/tests/sys/net/routing/test_routing_l3.py b/tests/sys/net/routing/test_routing_l3.py new file mode 100755 index 000000000000..74017ae0459c --- /dev/null +++ b/tests/sys/net/routing/test_routing_l3.py @@ -0,0 +1,81 @@ +import ipaddress + +import pytest +from atf_python.sys.net.tools import ToolsHelper +from atf_python.sys.net.vnet import VnetTestTemplate + + +class TestIfOps(VnetTestTemplate): + TOPOLOGY = { + "vnet1": {"ifaces": ["if1", "if2"]}, + "if1": {"prefixes4": [], "prefixes6": []}, + "if2": {"prefixes4": [], "prefixes6": []}, + } + + @pytest.mark.parametrize("family", ["inet", "inet6"]) + @pytest.mark.require_user("root") + def test_change_prefix_route(self, family): + """Tests that prefix route changes to the new one upon addr deletion""" + vnet = self.vnet_map["vnet1"] + first_iface = vnet.iface_alias_map["if1"] + second_iface = vnet.iface_alias_map["if2"] + if family == "inet": + first_addr = ipaddress.ip_interface("192.0.2.1/24") + second_addr = ipaddress.ip_interface("192.0.2.2/24") + else: + first_addr = ipaddress.ip_interface("2001:db8::1/64") + second_addr = ipaddress.ip_interface("2001:db8::2/64") + + first_iface.setup_addr(str(first_addr)) + second_iface.setup_addr(str(second_addr)) + + # At this time prefix should be pointing to the first interface + routes = ToolsHelper.get_routes(family) + px = [r for r in routes if r["destination"] == str(first_addr.network)][0] + assert px["interface-name"] == first_iface.name + + # Now delete address from the first interface and verify switchover + first_iface.delete_addr(first_addr.ip) + + routes = ToolsHelper.get_routes(family) + px = [r for r in routes if r["destination"] == str(first_addr.network)][0] + assert px["interface-name"] == second_iface.name + + @pytest.mark.parametrize( + "family", + [ + "inet", + pytest.param("inet6", marks=pytest.mark.xfail(reason="currently fails")), + ], + ) + @pytest.mark.require_user("root") + def test_change_prefix_route_same_iface(self, family): + """Tests that prefix route changes to the new ifa upon addr deletion""" + vnet = self.vnet_map["vnet1"] + first_iface = vnet.iface_alias_map["if1"] + + if family == "inet": + first_addr = ipaddress.ip_interface("192.0.2.1/24") + second_addr = ipaddress.ip_interface("192.0.2.2/24") + else: + first_addr = ipaddress.ip_interface("2001:db8::1/64") + second_addr = ipaddress.ip_interface("2001:db8::2/64") + + first_iface.setup_addr(str(first_addr)) + first_iface.setup_addr(str(second_addr)) + + # At this time prefix should be pointing to the first interface + routes = ToolsHelper.get_routes(family) + px = [r for r in routes if r["destination"] == str(first_addr.network)][0] + assert px["interface-name"] == first_iface.name + + # Now delete address from the first interface and verify switchover + first_iface.delete_addr(str(first_addr.ip)) + + routes = ToolsHelper.get_routes(family) + px = [r for r in routes if r["destination"] == str(first_addr.network)][0] + nhop_kidx = px["nhop"] + assert px["interface-name"] == first_iface.name + nhops = ToolsHelper.get_nhops(family) + nh = [nh for nh in nhops if nh["index"] == nhop_kidx][0] + assert nh["ifa"] == str(second_addr.ip)