git: b339da5b23e8 - stable/14 - sockstat: support reporting of BBLog state

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Fri, 10 Oct 2025 11:27:52 UTC
The branch stable/14 has been updated by tuexen:

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

commit b339da5b23e8871dd2b56f510ba3db1e09223be3
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2025-10-06 23:24:43 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2025-10-10 11:26:44 +0000

    sockstat: support reporting of BBLog state
    
    Add a -b option to print the BBLog state for TCP sockets.
    Manually tweaked for stable/14.
    
    Reviewed by:            jtl, rrs
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D52944
    
    (cherry picked from commit d801cc2d8542854a5dee9bfb25a15af6fa1dafad)
---
 usr.bin/sockstat/sockstat.1 | 11 +++++++--
 usr.bin/sockstat/sockstat.c | 54 +++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 61 insertions(+), 4 deletions(-)

diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index ca486a088b13..eba4b1c4aed5 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 October 15, 2024
+.Dd October 7, 2025
 .Dt SOCKSTAT 1
 .Os
 .Sh NAME
@@ -33,7 +33,7 @@
 .Nd list open sockets
 .Sh SYNOPSIS
 .Nm
-.Op Fl 46CcfIiLlnqSsUuvw
+.Op Fl 46bCcfIiLlnqSsUuvw
 .Op Fl j Ar jail
 .Op Fl p Ar ports
 .Op Fl P Ar protocols
@@ -54,6 +54,9 @@ Show
 Show
 .Dv AF_INET6
 (IPv6) sockets.
+.It Fl b
+Show the BBLog state of the socket.
+This is currently only implemented for TCP.
 .It Fl C
 Display the congestion control module, if applicable.
 This is currently only implemented for TCP.
@@ -195,6 +198,10 @@ is specified (only for SCTP).
 The connection state if
 .Fl s
 is specified (only for SCTP or TCP).
+.It Li BBLOG STATE
+The BBLog state if
+.Fl b
+is specified (only for TCP).
 .It Li STACK
 The protocol stack if
 .Fl S
diff --git a/usr.bin/sockstat/sockstat.c b/usr.bin/sockstat/sockstat.c
index 11434a6efa68..4548eb8a0b11 100644
--- a/usr.bin/sockstat/sockstat.c
+++ b/usr.bin/sockstat/sockstat.c
@@ -52,6 +52,7 @@
 #include <netinet/tcp_fsm.h>
 #include <netinet/tcp_seq.h>
 #include <netinet/tcp_var.h>
+#include <netinet/tcp_log_buf.h>
 #include <arpa/inet.h>
 
 #include <capsicum_helpers.h>
@@ -81,6 +82,7 @@
 
 static int	 opt_4;		/* Show IPv4 sockets */
 static int	 opt_6;		/* Show IPv6 sockets */
+static bool	 opt_b;		/* Show BBLog state */
 static int	 opt_C;		/* Show congestion control */
 static int	 opt_c;		/* Show connected sockets */
 static int	 opt_f;		/* Show FIB numbers */
@@ -143,6 +145,7 @@ struct sock {
 	int proto;
 	int state;
 	int fibnum;
+	int bblog_state;
 	const char *protoname;
 	char stack[TCP_FUNCTION_NAME_LEN_MAX];
 	char cc[TCP_CA_NAME_MAX];
@@ -797,6 +800,7 @@ gather_inet(int proto)
 		sock->vflag = xip->inp_vflag;
 		if (proto == IPPROTO_TCP) {
 			sock->state = xtp->t_state;
+			sock->bblog_state = xtp->t_logstate;
 			memcpy(sock->stack, xtp->xt_stack,
 			    TCP_FUNCTION_NAME_LEN_MAX);
 			memcpy(sock->cc, xtp->xt_cc, TCP_CA_NAME_MAX);
@@ -1105,6 +1109,37 @@ sctp_path_state(int state)
 	}
 }
 
+static const char *
+bblog_state(int state)
+{
+	switch (state) {
+	case TCP_LOG_STATE_OFF:
+		return "OFF";
+		break;
+	case TCP_LOG_STATE_TAIL:
+		return "TAIL";
+		break;
+	case TCP_LOG_STATE_HEAD:
+		return "HEAD";
+		break;
+	case TCP_LOG_STATE_HEAD_AUTO:
+		return "HEAD_AUTO";
+		break;
+	case TCP_LOG_STATE_CONTINUAL:
+		return "CONTINUAL";
+		break;
+	case TCP_LOG_STATE_TAIL_AUTO:
+		return "TAIL_AUTO";
+		break;
+	case TCP_LOG_VIA_BBPOINTS:
+		return "BBPOINTS";
+		break;
+	default:
+		return "UNKNOWN";
+		break;
+	}
+}
+
 static void
 displaysock(struct sock *s, int pos)
 {
@@ -1299,6 +1334,16 @@ displaysock(struct sock *s, int pos)
 				}
 				offset += 13;
 			}
+			if (opt_b) {
+				if (s->proto == IPPROTO_TCP) {
+					do
+						pos += xprintf(" ");
+					while (pos < offset);
+					pos += xprintf("%s",
+					    bblog_state(s->bblog_state));
+				}
+				offset += 13;
+			}
 			if (opt_S) {
 				if (s->proto == IPPROTO_TCP) {
 					do
@@ -1359,6 +1404,8 @@ display(void)
 			printf(" %-12s", "PATH STATE");
 			printf(" %-12s", "CONN STATE");
 		}
+		if (opt_b)
+			printf(" %-12s", "BBLOG STATE");
 		if (opt_S)
 			printf(" %-*.*s", TCP_FUNCTION_NAME_LEN_MAX,
 			    TCP_FUNCTION_NAME_LEN_MAX, "STACK");
@@ -1477,7 +1524,7 @@ static void
 usage(void)
 {
 	errx(1,
-    "usage: sockstat [-46CcfIiLlnqSsUuvw] [-j jid] [-p ports] [-P protocols]");
+    "usage: sockstat [-46bCcfIiLlnqSsUuvw] [-j jid] [-p ports] [-P protocols]");
 }
 
 int
@@ -1491,7 +1538,7 @@ main(int argc, char *argv[])
 	int o, i;
 
 	opt_j = -1;
-	while ((o = getopt(argc, argv, "46CcfIij:Llnp:P:qSsUuvw")) != -1)
+	while ((o = getopt(argc, argv, "46bCcfIij:Llnp:P:qSsUuvw")) != -1)
 		switch (o) {
 		case '4':
 			opt_4 = 1;
@@ -1499,6 +1546,9 @@ main(int argc, char *argv[])
 		case '6':
 			opt_6 = 1;
 			break;
+		case 'b':
+			opt_b = true;
+			break;
 		case 'C':
 			opt_C = 1;
 			break;