From nobody Fri Dec 19 14:13:21 2025 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 4dXqJK4Vhlz6Ll91 for ; Fri, 19 Dec 2025 14:13:21 +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 "R12" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dXqJK3JVFz3L9g for ; Fri, 19 Dec 2025 14:13:21 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766153601; 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=rfG7ru3u/euoQnWKdjR7o2kbYk2+08q/070W7hkIazk=; b=hu1mUl07RZznpktwZ0V8sdPJcpCMhIe2+KbJIrPIbJrxcisYLBfXeOkt0z1lVP/VUdZTtg /zFaaUR5rR5U/+54ivTthYTCj6L1jj/Qo/2iFVKGSfDxlikmsIbnGjsuNaRBrmaOxO6zGm PsqiUZJlliLk6Qy1iAJSic5KbbCmmHOnIkOwzzkOAuELUefnSuO9kn75iEMKup2f/WTeQk k6CccCyQNdj5mvvKe39FlmUq2SwMPGVZQyYyPdgS+OBtL3QZrg2mzwtSiRuR70LkQVEKL7 jnBLecaLjLdliTb+Ycngs7iYzwdzwCNQyuRjgwmX+rQ0fEfTOMaoGYK+VwhhNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1766153601; 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=rfG7ru3u/euoQnWKdjR7o2kbYk2+08q/070W7hkIazk=; b=IgXFV1bEoadvOltyNYkfh2Pu6uoLDv9FPyiVY1Ro9DlsWLFto1Pt2xuamnbICAzQTxdFLq 4EbyGRAFiJ+MO1aOnS0uwUQlGrz3zaK0ulGQDA+Nc6nlGOz1ZAutDTJvzRwaBM/b6HQ97D FGv6NiLxTygWECD6W76uLNO3fXPcronBVGOShoPAQ5zg3LPkZF6iqjJ0SoA/Z4GCm9ChG8 njTVJPucMCzkcQY9d5SN3O08s9JMIzskcI++XSd6d4gfUuLLDewGHSgK8zHqnAkjSm2TiT X1C1XCAuzL9vA5T9Bu2V/5kbNz8z/Wbt4eFLdMukrPGjp+kES1IN7ubYYNglPw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1766153601; a=rsa-sha256; cv=none; b=HZawnkimV+oYxa4rPGVXkpsSd8GdMHqgAjctnY7RO8VQUpHFR51l+CBFkyhfOpx8gd6mxi +MinVB6aGm3w81vEp/7VNVMl/9HIaOO+U/zDTTq6aNfo91fnm0g7/j8Qllc8yHTUP0Qkgk IzywI+2fWrHs0NyKGECVe4uD4zjbIYr3+yeQFsWOM8CE33h1aUl3npiMPoCIEOSREjcAsT gazKLUi2KgnVMSpTGPztoK8oosR15Q8QpJVal8vysQ1NOk8QgyWPJ8DaKB4DCyAGElH2/V 1s2mzBAeR9M6vcTmgx9Ci1myMR6du+Z4APBrBI+MNs4Yfa6tZzblY7o2pHDumA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dXqJK2lttz1Qh2 for ; Fri, 19 Dec 2025 14:13:21 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3ca96 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 19 Dec 2025 14:13:21 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: df6861d755c8 - main - ifconfig: Fix the -L flag when using netlink 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: df6861d755c8f72380ae7fb8df535b27eba8c0be Auto-Submitted: auto-generated Date: Fri, 19 Dec 2025 14:13:21 +0000 Message-Id: <69455d81.3ca96.63fd1fee@gitrepo.freebsd.org> The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=df6861d755c8f72380ae7fb8df535b27eba8c0be commit df6861d755c8f72380ae7fb8df535b27eba8c0be Author: Mark Johnston AuthorDate: 2025-12-19 14:11:20 +0000 Commit: Mark Johnston CommitDate: 2025-12-19 14:11:20 +0000 ifconfig: Fix the -L flag when using netlink By default, when ifconfig shows a v6 address derived from a router-advertised prefix, it shows the initial preferred and valid lifetimes. When -L is specified, it is supposed to show the remaining lifetimes, but this was broken in the conversion to netlink. Fix that, and add a regression test which validates ifconfig output before and after a short-lived address expires. Reported by: Franco Fichtner Reviewed by: melifaro, allanjude, Seyed Pouria Mousavizadeh Tehrani Fixes: 4c91a5dfe483 ("ifconfig: make interface and address listing use Netlink as transport") MFC after: 2 weeks Sponsored by: OPNsense Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D54294 --- sbin/ifconfig/af_inet6.c | 6 +++-- tests/sys/netinet6/ndp.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++++ tests/sys/netinet6/ra.py | 11 ++++++++- 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/sbin/ifconfig/af_inet6.c b/sbin/ifconfig/af_inet6.c index 9386f5eaf513..365f01be9590 100644 --- a/sbin/ifconfig/af_inet6.c +++ b/sbin/ifconfig/af_inet6.c @@ -375,8 +375,10 @@ show_lifetime(struct ifa_cacheinfo *ci) vl = (ci->ifa_valid == ND6_INFINITE_LIFETIME) ? 0 : ci->ifa_valid; clock_gettime(CLOCK_MONOTONIC_FAST, &now); - print_lifetime("pltime", pl + now.tv_sec, &now); - print_lifetime("vltime", vl + now.tv_sec, &now); + print_lifetime("pltime", + pl + (ip6lifetime ? ci->tstamp / 1000 : now.tv_sec), &now); + print_lifetime("vltime", + vl + (ip6lifetime ? ci->tstamp / 1000 : now.tv_sec), &now); } static void diff --git a/tests/sys/netinet6/ndp.sh b/tests/sys/netinet6/ndp.sh index 21a50cda02ba..3464ac59c898 100755 --- a/tests/sys/netinet6/ndp.sh +++ b/tests/sys/netinet6/ndp.sh @@ -226,10 +226,72 @@ ndp_prefix_len_mismatch_cleanup() { vnet_cleanup } +atf_test_case "ndp_prefix_lifetime" "cleanup" +ndp_prefix_lifetime_head() { + atf_set descr 'Test ndp slaac address lifetime handling' + atf_set require.user root + atf_set require.progs python3 scapy +} + +ndp_prefix_lifetime_body() { + local epair0 jname prefix + + vnet_init + + jname="v6t-ndp_prefix_lifetime" + + epair0=$(vnet_mkepair) + + vnet_mkjail ${jname} ${epair0}a + + ndp_if_up ${epair0}a ${jname} + ndp_if_up ${epair0}b + atf_check jexec ${jname} ifconfig ${epair0}a inet6 accept_rtadv no_dad + + prefix="2001:db8:ffff:1000:" + + # Send an RA advertising a prefix. + atf_check -e ignore python3 $(atf_get_srcdir)/ra.py \ + --sendif ${epair0}b \ + --dst $(ndp_if_lladdr ${epair0}a ${jname}) \ + --src $(ndp_if_lladdr ${epair0}b) \ + --prefix "2001:db8:ffff:1000::" --prefixlen 64 \ + --validlifetime 10 --preferredlifetime 5 + + # Wait for a default router to appear. + while [ -z "$(jexec ${jname} ndp -r)" ]; do + sleep 0.1 + done + atf_check \ + -o match:"^default[[:space:]]+fe80:" \ + jexec ${jname} netstat -rn -6 + + atf_check \ + -o match:"inet6 ${prefix}.* prefixlen 64 autoconf pltime 5 vltime 10" \ + jexec ${jname} ifconfig ${epair0}a + + # Wait for the address to become deprecated. + sleep 6 + atf_check \ + -o match:"inet6 ${prefix}.* prefixlen 64 deprecated autoconf pltime 0 vltime [1-9]+" \ + jexec ${jname} ifconfig -L ${epair0}a + + # Wait for the address to expire. + sleep 6 + atf_check \ + -o not-match:"inet6 ${prefix}.*" \ + jexec ${jname} ifconfig ${epair0}a +} + +ndp_prefix_lifetime_cleanup() { + vnet_cleanup +} + atf_init_test_cases() { atf_add_test_case "ndp_add_gu_success" atf_add_test_case "ndp_del_gu_success" atf_add_test_case "ndp_slaac_default_route" atf_add_test_case "ndp_prefix_len_mismatch" + atf_add_test_case "ndp_prefix_lifetime" } diff --git a/tests/sys/netinet6/ra.py b/tests/sys/netinet6/ra.py index a5016b3f6e9b..1b08c3e53c05 100644 --- a/tests/sys/netinet6/ra.py +++ b/tests/sys/netinet6/ra.py @@ -25,12 +25,21 @@ def main(): help='The prefix to be advertised') parser.add_argument('--prefixlen', nargs=1, required=True, type=int, help='The prefix length to be advertised') + parser.add_argument('--validlifetime', nargs=1, required=False, + type=int, default=4294967295, + help='The valid lifetime of the prefix') + parser.add_argument('--preferredlifetime', nargs=1, required=False, + type=int, default=4294967295, + help='The preferred lifetime of the prefix') args = parser.parse_args() pkt = sp.Ether() / \ sp.IPv6(src=args.src, dst=args.dst) / \ sp.ICMPv6ND_RA(chlim=64) / \ - sp.ICMPv6NDOptPrefixInfo(prefix=args.prefix, prefixlen=args.prefixlen) + sp.ICMPv6NDOptPrefixInfo(prefix=args.prefix, + prefixlen=args.prefixlen, + validlifetime=args.validlifetime, + preferredlifetime=args.preferredlifetime) sp.sendp(pkt, iface=args.sendif[0], verbose=False) sys.exit(0)