From nobody Wed May 20 20:58:54 2026 X-Original-To: dev-commits-src-main@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 4gLP666ZMcz6fPjk for ; Wed, 20 May 2026 20:58:54 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gLP6655Hrz41mJ for ; Wed, 20 May 2026 20:58:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779310734; 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=gnm1OWTji7GqoDJl20qrjxnMCzk41Myr5rGYW9bKpBQ=; b=GNOyXOzUl7MYIsRU8h2Gb78ALdoD4x34RoC9bY3rxowJ8fXK7QmYlIsAsPCSEKCL4UNexU 1KpdtMHDBwk/M/aegr9kK+ZDcCF61d6zUy/VfB/gxZGlcpJ8dWKUQ3rleZloY/u1RQD2zy oG7TVE0IUNxcYdXDFnjwpr3BOp7SkA2LNHPYJo2T76zA8algJbABch1vnzwdNuWq+tNZRu dmDIUdjS3hafYXq5GtZTHF4TA2D18uJD1ndDftkOur06VJAsItyIfVjrcYnUbJqvWmeiwz hRrqYTQS45ouniKJAOoLogmzp4idK/aG7NQHcKQw3Wlge8R832BZPAHQKp+yNQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779310734; a=rsa-sha256; cv=none; b=oj4T2ubtIHZwwxJXMo+CCKscACoTv2dGNyVsiTOTa3aEY6ibDD4LzMn18cLoBuZ+xtdne3 2xBWyDKGDZ7zRQfXURZRGx+PSIt6ClSN+Nc7JPfK5rZ7IvLmgFk+G4eoZ6S2pCxqFwIBKI Jnui5fJkxhXXgzWHXx6sdxY1Sp4JOdDPBVU/izQ0mAXTHw2X3OtLiFMRE6ZVYp3puv3ZOX uzztFYLC8GWpE8MAhkaqhU9hAHpCoquIHMsPB6/c2MzylM/TKwZSLnAU7lbngni8PVbLLF apLP3gaWmphghP4o2GiLfvGiEssq/EwReEOQBXytb4kk8pSKrxPQR5lxg745nw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779310734; 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=gnm1OWTji7GqoDJl20qrjxnMCzk41Myr5rGYW9bKpBQ=; b=ABEgYbjPTvhSDO9LCkSoHSeghmy2N3EB/x65W+txX9tfcTjte+tu8QFLd/9kdubLf/DIC6 kk47YfW5gwzNX0L44WSxpxiFvIXl1djIn3o486aZkXGmw9+LL8tmN7YwwH3X8QiWwm16gK vdY1JbVIehcBpd+IRbWWQ715niBsoUTUxBK4Sz1pTUn4SsQJNbxPUyOHU88JdathZJolcv eMXQ3Q9CfHpBLHXHzqRJmYPfq6w3z3EeOPpZMvKYZ+CT11lPKbMWcNTKiFFYAFKhOdzBOq 5hE/YOUAtEwU2K2H57TEzI+u5zYDS+rced/87dtvizvzcqqn+PsjURHDK2bgNw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gLP664VNtz1GWT for ; Wed, 20 May 2026 20:58:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 40322 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 20 May 2026 20:58:54 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Pouria Mousavizadeh Tehrani Subject: git: 1f03c62e43a0 - main - netstat(1): Show metric value for routes List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: pouria X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 1f03c62e43a02ec705b9998f37edde0258c442e9 Auto-Submitted: auto-generated Date: Wed, 20 May 2026 20:58:54 +0000 Message-Id: <6a0e208e.40322.18657a80@gitrepo.freebsd.org> The branch main has been updated by pouria: URL: https://cgit.FreeBSD.org/src/commit/?id=1f03c62e43a02ec705b9998f37edde0258c442e9 commit 1f03c62e43a02ec705b9998f37edde0258c442e9 Author: Pouria Mousavizadeh Tehrani AuthorDate: 2026-05-15 10:08:16 +0000 Commit: Pouria Mousavizadeh Tehrani CommitDate: 2026-05-20 20:55:10 +0000 netstat(1): Show metric value for routes Add metric support and show its value in wide flag and libxo output. Also, add metric to the description of wide flag (`-w`) in routing display (`-r`) section of manual page. Reviewed by: markj (manpage) Discussed with: markj Differential Revision: https://reviews.freebsd.org/D57011 --- usr.bin/netstat/common.h | 1 + usr.bin/netstat/netstat.1 | 4 ++-- usr.bin/netstat/route.c | 12 ++++++++---- usr.bin/netstat/route_netlink.c | 9 ++++++--- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/usr.bin/netstat/common.h b/usr.bin/netstat/common.h index d5d39902037b..a2b560c1b849 100644 --- a/usr.bin/netstat/common.h +++ b/usr.bin/netstat/common.h @@ -52,6 +52,7 @@ struct _wid { int pksent; int mtu; int iface; + int metric; int expire; }; void set_wid(int fam); diff --git a/usr.bin/netstat/netstat.1 b/usr.bin/netstat/netstat.1 index 5c7f2336c06b..52e91c20d5eb 100644 --- a/usr.bin/netstat/netstat.1 +++ b/usr.bin/netstat/netstat.1 @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd April 7, 2026 +.Dd May 18, 2026 .Dt NETSTAT 1 .Os .Sh NAME @@ -678,7 +678,7 @@ Do not resolve numeric addresses and port numbers to names. See .Sx GENERAL OPTIONS . .It Fl W -Show the path MTU for each route, and print interface names with a +Show the metric and path MTU for each route, and print interface names with a wider field size. .It Fl F Display the routing table with the number diff --git a/usr.bin/netstat/route.c b/usr.bin/netstat/route.c index 697c7ba2e9e1..1337a48faeed 100644 --- a/usr.bin/netstat/route.c +++ b/usr.bin/netstat/route.c @@ -205,13 +205,14 @@ pr_rthdr(int af1 __unused) if (Wflag) { xo_emit("{T:/%-*.*s} {T:/%-*.*s} {T:/%-*.*s} {T:/%*.*s} " - "{T:/%*.*s} {T:/%*.*s} {T:/%*s}\n", + "{T:/%*.*s} {T:/%*.*s} {T:/%*.*s} {T:/%*s}\n", wid.dst, wid.dst, "Destination", wid.gw, wid.gw, "Gateway", wid.flags, wid.flags, "Flags", wid.mtu, wid.mtu, "Nhop#", wid.mtu, wid.mtu, "Mtu", wid.iface, wid.iface, "Netif", + wid.metric, wid.metric, "Metric", wid.expire, "Expire"); } else { xo_emit("{T:/%-*.*s} {T:/%-*.*s} {T:/%-*.*s} {T:/%*.*s} " @@ -233,6 +234,7 @@ set_wid(int fam) wid.pksent = 8; wid.mtu = 6; wid.iface = WID_IF_DEFAULT; + wid.metric = 8; wid.expire = 6; } @@ -326,8 +328,9 @@ p_rtentry_sysctl(const char *name, struct rt_msghdr *rtm) snprintf(buffer, sizeof(buffer), "{[:-%d}{:flags/%%s}{]:} ", wid.flags - protrusion); p_flags(rtm->rtm_flags, buffer); - /* Output path weight as non-visual property */ + /* Output path weight and metric as non-visual property */ xo_emit("{e:weight/%u}", rtm->rtm_rmx.rmx_weight); + xo_emit("{e:metric/%lu}", rtm->rtm_rmx.rmx_metric); if (Wflag) { /* XXX: use=0? */ xo_emit("{t:nhop/%*lu} ", wid.mtu, rtm->rtm_rmx.rmx_nhidx); @@ -346,9 +349,10 @@ p_rtentry_sysctl(const char *name, struct rt_msghdr *rtm) strlcpy(prettyname, "---", sizeof(prettyname)); } - if (Wflag) + if (Wflag) { xo_emit("{t:interface-name/%*s}", wid.iface, prettyname); - else + xo_emit("{t:metric/%*lu} ", wid.metric, rtm->rtm_rmx.rmx_metric); + } else xo_emit("{t:interface-name/%*.*s}", wid.iface, wid.iface, prettyname); if (rtm->rtm_rmx.rmx_expire) { diff --git a/usr.bin/netstat/route_netlink.c b/usr.bin/netstat/route_netlink.c index 2c4b7a5c6b00..f7349650f4c6 100644 --- a/usr.bin/netstat/route_netlink.c +++ b/usr.bin/netstat/route_netlink.c @@ -177,8 +177,9 @@ p_path(struct snl_parsed_route *rt, bool is_mpath) snprintf(buffer, sizeof(buffer), "{[:-%d}{:flags/%%s}{]:} ", wid.flags - protrusion); p_flags(rt->rta_rtflags | RTF_UP, buffer); - /* Output path weight as non-visual property */ + /* Output path weight and metric as non-visual property */ xo_emit("{e:weight/%u}", rt->rtax_weight); + xo_emit("{e:metric/%lu}", rt->rta_metric); if (is_mpath) xo_emit("{e:nhg-kidx/%u}", rt->rta_knh_id); else @@ -213,9 +214,10 @@ p_path(struct snl_parsed_route *rt, bool is_mpath) } - if (Wflag) + if (Wflag) { xo_emit("{t:interface-name/%*s}", wid.iface, prettyname); - else + xo_emit("{t:metric/%*lu} ", wid.metric, rt->rta_metric); + } else xo_emit("{t:interface-name/%*.*s}", wid.iface, wid.iface, prettyname); if (rt->rta_expire > 0) { @@ -242,6 +244,7 @@ p_rtentry_netlink(struct snl_state *ss, const char *name, struct nlmsghdr *hdr) rt.rta_gw = nhop->gw; rt.rta_oif = nhop->ifindex; rt.rtax_weight = nhop->rtnh_weight; + rt.rta_metric = nhop->rta_metric; rt.rta_rtflags = nhop->rta_rtflags ? nhop->rta_rtflags : orig_rtflags; rt.rtax_mtu = nhop->rtax_mtu ? nhop->rtax_mtu : orig_mtu; rt.rta_expire = nhop->rta_expire;