aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tuexen <tuexen@FreeBSD.org>2022-02-01 14:37:03 +0000
committerMichael Tuexen <tuexen@FreeBSD.org>2022-02-01 14:37:03 +0000
commit5f64777a4fe38acb412762fa92da583a1018e609 (patch)
treebfb93bd735de318e08b6dccfb17f9a54e42dbcf4
parent21a37c3cc610d08d5f9d5319451b97f1a6a13320 (diff)
downloadsrc-5f64777a4fe38acb412762fa92da583a1018e609.tar.gz
src-5f64777a4fe38acb412762fa92da583a1018e609.zip
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
-rw-r--r--usr.bin/sockstat/sockstat.111
-rw-r--r--usr.bin/sockstat/sockstat.c22
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)