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
This commit is contained in:
Michael Tuexen 2022-02-01 15:37:03 +01:00
parent 21a37c3cc6
commit 5f64777a4f
2 changed files with 29 additions and 4 deletions

View File

@ -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

View File

@ -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)