git: 5f64777a4fe3 - main - sockstat: add -i to display inp_gencnt

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Wed, 02 Feb 2022 18:56:27 UTC
The branch main has been updated by tuexen:

URL: https://cgit.FreeBSD.org/src/commit/?id=5f64777a4fe38acb412762fa92da583a1018e609

commit 5f64777a4fe38acb412762fa92da583a1018e609
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2022-02-01 14:37:03 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2022-02-01 14:37:03 +0000

    sockstat: add -i to display inp_gencnt
    
    The inp_gencnt will be used to identify a TCP endpoint by an upcoming
    command line tool to set TCP socket options.
    
    Reviewed by:            rscheff
    MFC after:              1 week
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D34137
---
 usr.bin/sockstat/sockstat.1 | 11 +++++++++--
 usr.bin/sockstat/sockstat.c | 22 ++++++++++++++++++++--
 2 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index bf04028ce9d4..bc8fa628f725 100644
--- a/usr.bin/sockstat/sockstat.1
+++ b/usr.bin/sockstat/sockstat.1
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd November 11, 2021
+.Dd February 2, 2022
 .Dt SOCKSTAT 1
 .Os
 .Sh NAME
@@ -35,7 +35,7 @@
 .Nd list open sockets
 .Sh SYNOPSIS
 .Nm
-.Op Fl 46CcLlnqSsUuvw
+.Op Fl 46CciLlnqSsUuvw
 .Op Fl j Ar jail
 .Op Fl p Ar ports
 .Op Fl P Ar protocols
@@ -61,6 +61,9 @@ Display the congestion control module, if applicable.
 This is currently only implemented for TCP.
 .It Fl c
 Show connected sockets.
+.It Fl i
+Display the
+.Dv inp_gencnt .
 .It Fl j Ar jail
 Show only sockets belonging to the specified jail ID or name.
 .It Fl L
@@ -160,6 +163,10 @@ if the endpoint could not be determined.
 (Internet sockets only)
 The address the foreign end of the socket is bound to (see
 .Xr getpeername 2 ) .
+.It Li ID
+The inp_gencnt if
+.Fl i
+is specified (only for TCP or UDP).
 .It Li ENCAPS
 The remote UDP encapsulation port number if
 .Fl U
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
index 1a4413116a79..ddf9be139c9e 100644
--- a/usr.bin/sockstat/sockstat.c
+++ b/usr.bin/sockstat/sockstat.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <jail.h>
 #include <netdb.h>
 #include <pwd.h>
@@ -83,6 +84,7 @@ static int	 opt_4;		/* Show IPv4 sockets */
 static int	 opt_6;		/* Show IPv6 sockets */
 static int	 opt_C;		/* Show congestion control */
 static int	 opt_c;		/* Show connected sockets */
+static int	 opt_i;		/* Show inp_gencnt */
 static int	 opt_j;		/* Show specified jail */
 static int	 opt_L;		/* Don't show IPv4 or IPv6 loopback sockets */
 static int	 opt_l;		/* Show listening sockets */
@@ -120,6 +122,7 @@ struct addr {
 struct sock {
 	kvaddr_t socket;
 	kvaddr_t pcb;
+	uint64_t inp_gencnt;
 	int shown;
 	int vflag;
 	int family;
@@ -713,6 +716,7 @@ gather_inet(int proto)
 			err(1, "malloc()");
 		sock->socket = so->xso_so;
 		sock->proto = proto;
+		sock->inp_gencnt = xip->inp_gencnt;
 		if (xip->inp_vflag & INP_IPV4) {
 			sock->family = AF_INET;
 			sockaddr(&laddr->address, sock->family,
@@ -1107,6 +1111,15 @@ displaysock(struct sock *s, int pos)
 		default:
 			abort();
 		}
+		if (opt_i) {
+			if (s->proto == IPPROTO_TCP ||
+			    s->proto == IPPROTO_UDP) {
+				while (pos < offset)
+					pos += xprintf(" ");
+				pos += xprintf("%" PRIu64, s->inp_gencnt);
+			}
+			offset += 9;
+		}
 		if (opt_U) {
 			if (faddr != NULL &&
 			    ((s->proto == IPPROTO_SCTP &&
@@ -1204,6 +1217,8 @@ display(void)
 		    "USER", "COMMAND", "PID", "FD", "PROTO",
 		    opt_w ? 45 : 21, "LOCAL ADDRESS",
 		    opt_w ? 45 : 21, "FOREIGN ADDRESS");
+		if (opt_i)
+			printf(" %-8s", "ID");
 		if (opt_U)
 			printf(" %-6s", "ENCAPS");
 		if (opt_s) {
@@ -1324,7 +1339,7 @@ static void
 usage(void)
 {
 	fprintf(stderr,
-	    "usage: sockstat [-46cLlSsUuvw] [-j jid] [-p ports] [-P protocols]\n");
+	    "usage: sockstat [-46ciLlSsUuvw] [-j jid] [-p ports] [-P protocols]\n");
 	exit(1);
 }
 
@@ -1339,7 +1354,7 @@ main(int argc, char *argv[])
 	int o, i;
 
 	opt_j = -1;
-	while ((o = getopt(argc, argv, "46Ccj:Llnp:P:qSsUuvw")) != -1)
+	while ((o = getopt(argc, argv, "46Ccij:Llnp:P:qSsUuvw")) != -1)
 		switch (o) {
 		case '4':
 			opt_4 = 1;
@@ -1353,6 +1368,9 @@ main(int argc, char *argv[])
 		case 'c':
 			opt_c = 1;
 			break;
+		case 'i':
+			opt_i = 1;
+			break;
 		case 'j':
 			opt_j = jail_getid(optarg);
 			if (opt_j < 0)