git: 051a2132f41d - main - sockstat: Show the address of the spliced socket when -I is specified
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 10 Sep 2024 16:55:24 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=051a2132f41d8394a34b29ac3cfebf8601ede5b6
commit 051a2132f41d8394a34b29ac3cfebf8601ede5b6
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-09-10 16:51:18 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-09-10 16:52:01 +0000
sockstat: Show the address of the spliced socket when -I is specified
MFC after: 3 months
Sponsored by: Klara, Inc.
Sponsored by: Stormshield
Differential Revision: https://reviews.freebsd.org/D46413
---
usr.bin/sockstat/sockstat.1 | 11 +++++++++--
usr.bin/sockstat/sockstat.c | 31 +++++++++++++++++++++++++++++--
2 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index 2e1b06688afa..d7174b48f8d5 100644
--- a/usr.bin/sockstat/sockstat.1
+++ b/usr.bin/sockstat/sockstat.1
@@ -25,7 +25,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd June 6, 2022
+.Dd July 9, 2024
.Dt SOCKSTAT 1
.Os
.Sh NAME
@@ -33,7 +33,7 @@
.Nd list open sockets
.Sh SYNOPSIS
.Nm
-.Op Fl 46CciLlnqSsUuvw
+.Op Fl 46CcIiLlnqSsUuvw
.Op Fl j Ar jail
.Op Fl p Ar ports
.Op Fl P Ar protocols
@@ -59,6 +59,13 @@ Display the congestion control module, if applicable.
This is currently only implemented for TCP.
.It Fl c
Show connected sockets.
+.It Fl I
+Show the local address of the socket to which the current socket is spliced, if
+any.
+See the
+.Xr setsockopt 2
+.Dv SO_SPLICE
+option for more information.
.It Fl i
Display the
.Dv inp_gencnt .
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
index 5eac327ca184..d2581d9f042e 100644
--- a/usr.bin/sockstat/sockstat.c
+++ b/usr.bin/sockstat/sockstat.c
@@ -82,6 +82,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 spliced socket addresses */
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 */
@@ -132,6 +133,7 @@ struct sock {
RB_ENTRY(sock) pcb_tree;
kvaddr_t socket;
kvaddr_t pcb;
+ kvaddr_t splice_socket;
uint64_t inp_gencnt;
int shown;
int vflag;
@@ -766,6 +768,7 @@ gather_inet(int proto)
if ((faddr = calloc(1, sizeof *faddr)) == NULL)
err(1, "malloc()");
sock->socket = so->xso_so;
+ sock->splice_socket = so->so_splice_so;
sock->proto = proto;
sock->inp_gencnt = xip->inp_gencnt;
if (xip->inp_vflag & INP_IPV4) {
@@ -1201,6 +1204,25 @@ displaysock(struct sock *s, int pos)
default:
abort();
}
+ if (opt_I) {
+ if (s->splice_socket != 0) {
+ struct sock *sp;
+
+ sp = RB_FIND(socks_t, &socks, &(struct sock)
+ { .socket = s->splice_socket });
+ if (sp != NULL) {
+ while (pos < offset)
+ pos += xprintf(" ");
+ pos += printaddr(&sp->laddr->address);
+ } else {
+ while (pos < offset)
+ pos += xprintf(" ");
+ pos += xprintf("??");
+ offset += opt_w ? 46 : 22;
+ }
+ }
+ offset += opt_w ? 46 : 22;
+ }
if (opt_i) {
if (s->proto == IPPROTO_TCP ||
s->proto == IPPROTO_UDP) {
@@ -1307,6 +1329,8 @@ display(void)
"USER", "COMMAND", "PID", "FD", "PROTO",
opt_w ? 45 : 21, "LOCAL ADDRESS",
opt_w ? 45 : 21, "FOREIGN ADDRESS");
+ if (opt_I)
+ printf(" %-*s", opt_w ? 45 : 21, "SPLICE ADDRESS");
if (opt_i)
printf(" %-8s", "ID");
if (opt_U)
@@ -1430,7 +1454,7 @@ static void
usage(void)
{
fprintf(stderr,
- "usage: sockstat [-46CciLlnqSsUuvw] [-j jid] [-p ports] [-P protocols]\n");
+ "usage: sockstat [-46CcIiLlnqSsUuvw] [-j jid] [-p ports] [-P protocols]\n");
exit(1);
}
@@ -1445,7 +1469,7 @@ main(int argc, char *argv[])
int o, i;
opt_j = -1;
- while ((o = getopt(argc, argv, "46Ccij:Llnp:P:qSsUuvw")) != -1)
+ while ((o = getopt(argc, argv, "46CcIij:Llnp:P:qSsUuvw")) != -1)
switch (o) {
case '4':
opt_4 = 1;
@@ -1459,6 +1483,9 @@ main(int argc, char *argv[])
case 'c':
opt_c = 1;
break;
+ case 'I':
+ opt_I = 1;
+ break;
case 'i':
opt_i = 1;
break;