git: 209668726c2f - main - sockstat: provide more BBLog information

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Wed, 26 Aug 2026 18:37:16 UTC
The branch main has been updated by tuexen:

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

commit 209668726c2fff047b27a13c6add7e9820696651
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2026-08-26 18:32:20 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2026-08-26 18:36:26 +0000

    sockstat: provide more BBLog information
    
    When using -b, provide in addition to the BBLog state also the number
    of entries stored at the endpoint, the corresponding upper limit and
    the next sequence number to be assigned.
    
    Reviewed by:            rrs
    MFC after:              1 week
    MFC to:                 stable/15
    MFC to:                 stable/14
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D59131
---
 sys/netinet/tcp_subr.c      |  3 +++
 sys/netinet/tcp_var.h       |  5 ++++-
 usr.bin/sockstat/main.c     | 50 ++++++++++++++++++++++++++++++++++++++++++---
 usr.bin/sockstat/sockstat.1 | 17 +++++++++++++--
 4 files changed, 69 insertions(+), 6 deletions(-)

diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index af381b0b4102..44288d8f344d 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -4295,6 +4295,9 @@ tcp_inptoxtp(const struct inpcb *inp, struct xtcpcb *xt)
 	bcopy(CC_ALGO(tp)->name, xt->xt_cc, TCP_CA_NAME_MAX);
 #ifdef TCP_BLACKBOX
 	(void)tcp_log_get_id(tp, xt->xt_logid);
+	xt->t_lognum = tp->t_lognum;
+	xt->t_loglimit = tp->t_loglimit;
+	xt->t_logsn = tp->t_logsn;
 #endif
 
 	xt->xt_len = sizeof(struct xtcpcb);
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 2989b9b15ed9..39a5cca1d635 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -1233,7 +1233,10 @@ struct xtcpcb {
 	uint32_t	t_dsack_pack;		/* (n) */
 	uint16_t	xt_encaps_port;		/* (s) */
 	int16_t		spare16;
-	int32_t		spare32[22];
+	int32_t		t_lognum;		/* (s) */
+	int32_t		t_loglimit;		/* (s) */
+	uint32_t	t_logsn;		/* (s) */
+	int32_t		spare32[19];
 } __aligned(8);
 
 #ifdef _KERNEL
diff --git a/usr.bin/sockstat/main.c b/usr.bin/sockstat/main.c
index d448f7fcf005..1a93d3b1b522 100644
--- a/usr.bin/sockstat/main.c
+++ b/usr.bin/sockstat/main.c
@@ -198,6 +198,9 @@ struct sock {
 	int state;
 	int fibnum;
 	int bblog_state;
+	int bblog_num;
+	int bblog_limit;
+	unsigned int bblog_sn;
 	const struct proto *proto;
 	const char *protoname;
 	char stack[TCP_FUNCTION_NAME_LEN_MAX];
@@ -749,6 +752,9 @@ gather_inet(struct proto *proto)
 		if (proto == &protos[TCP]) {
 			sock->state = xtp->t_state;
 			sock->bblog_state = xtp->t_logstate;
+			sock->bblog_num = xtp->t_lognum;
+			sock->bblog_limit = xtp->t_loglimit;
+			sock->bblog_sn = xtp->t_logsn;
 			memcpy(sock->stack, xtp->xt_stack,
 			    TCP_FUNCTION_NAME_LEN_MAX);
 			memcpy(sock->cc, xtp->xt_cc, TCP_CA_NAME_MAX);
@@ -1195,6 +1201,9 @@ struct col_widths {
 	int path_state;
 	int conn_state;
 	int bblog_state;
+	int bblog_num;
+	int bblog_limit;
+	int bblog_sn;
 	int stack;
 	int cc;
 };
@@ -1315,6 +1324,12 @@ calculate_sock_column_widths(struct col_widths *cw, struct sock *s)
 			if (opt_b && s->proto == &protos[TCP]) {
 				len = strlen(bblog_state(s->bblog_state));
 				cw->bblog_state = MAX(cw->bblog_state, len);
+				len = snprintf(NULL, 0, "%d", s->bblog_num);
+				cw->bblog_num = MAX(cw->bblog_num, len);
+				len = snprintf(NULL, 0, "%d", s->bblog_limit);
+				cw->bblog_limit = MAX(cw->bblog_limit, len);
+				len = snprintf(NULL, 0, "%u", s->bblog_sn);
+				cw->bblog_sn = MAX(cw->bblog_sn, len);
 			}
 			first = false;
 		}
@@ -1533,13 +1548,32 @@ display_sock(struct sock *s, struct col_widths *cw, char *buf, size_t bufsize)
 					    cw->conn_state, "??");
 			}
 			if (opt_b) {
-				if (s->proto == &protos[TCP])
+				if (s->proto == &protos[TCP]) {
 					xo_emit(" {:bblog-state/%-*s}",
 					    cw->bblog_state,
 					    bblog_state(s->bblog_state));
-				else if (!is_xo_style_encoding)
+					snprintf(buf, bufsize, "%d",
+					    s->bblog_num);
+					xo_emit(" {:bblog-number/%*s}",
+					    cw->bblog_num, buf);
+					snprintf(buf, bufsize, "%d",
+					    s->bblog_limit);
+					xo_emit(" {:bblog-limit/%*s}",
+					    cw->bblog_limit, buf);
+					snprintf(buf, bufsize, "%u",
+					    s->bblog_sn);
+					xo_emit(" {:bblog-serial-number/%*s}",
+					    cw->bblog_sn, buf);
+				} else if (!is_xo_style_encoding) {
 					xo_emit(" {:bblog-state/%-*s}",
 					    cw->bblog_state, "??");
+					xo_emit(" {:bblog-number/%*s}",
+					    cw->bblog_num, "??");
+					xo_emit(" {:bblog-limit/%*s}",
+					    cw->bblog_limit, "??");
+					xo_emit(" {:bblog-serial-number/%*s}",
+					    cw->bblog_sn, "??");
+				}
 			}
 			if (opt_S) {
 				if (s->proto == &protos[TCP])
@@ -1599,6 +1633,9 @@ display(void)
 			  *__HDR_PATH_STATE="PATH STATE",
 			  *__HDR_CONN_STATE="CONN STATE",
 			  *__HDR_BBLOG_STATE="BBLOG STATE",
+			  *__HDR_BBLOG_NUM="BBLOG NUM",
+			  *__HDR_BBLOG_LIMIT="BBLOG LIM",
+			  *__HDR_BBLOG_SN="BBLOG SN",
 			  *__HDR_STACK="STACK",
 			  *__HDR_CC="CC";
 
@@ -1631,6 +1668,9 @@ display(void)
 			.path_state = strlen(__HDR_PATH_STATE),
 			.conn_state = strlen(__HDR_CONN_STATE),
 			.bblog_state = strlen(__HDR_BBLOG_STATE),
+			.bblog_num = strlen(__HDR_BBLOG_NUM),
+			.bblog_limit = strlen(__HDR_BBLOG_LIMIT),
+			.bblog_sn = strlen(__HDR_BBLOG_SN),
 			.stack = strlen(__HDR_STACK),
 			.cc = strlen(__HDR_CC),
 		};
@@ -1665,8 +1705,12 @@ display(void)
 				    __HDR_PATH_STATE);
 			xo_emit(" {T:/%-*s}", cw.conn_state, __HDR_CONN_STATE);
 		}
-		if (opt_b)
+		if (opt_b) {
 			xo_emit(" {T:/%-*s}", cw.bblog_state, __HDR_BBLOG_STATE);
+			xo_emit(" {T:/%*s}", cw.bblog_num, __HDR_BBLOG_NUM);
+			xo_emit(" {T:/%*s}", cw.bblog_limit, __HDR_BBLOG_LIMIT);
+			xo_emit(" {T:/%*s}", cw.bblog_sn, __HDR_BBLOG_SN);
+		}
 		if (opt_S)
 			xo_emit(" {T:/%-*s}", cw.stack, __HDR_STACK);
 		if (opt_C)
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index b8fb420bb105..3a1009f4d64f 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 8, 2026
+.Dd August 26, 2026
 .Dt SOCKSTAT 1
 .Os
 .Sh NAME
@@ -67,7 +67,7 @@ Show
 Show the address of a protocol control block (PCB) associated with a socket;
 used for debugging.
 .It Fl b
-Show the BBLog state of the socket.
+Show BBLog related information for the socket.
 This is currently only implemented for TCP.
 .It Fl C
 Display the congestion control module, if applicable.
@@ -228,6 +228,19 @@ is specified (only for SCTP or TCP).
 The BBLog state if
 .Fl b
 is specified (only for TCP).
+.It Li BBLOG NUM
+The number of BBLog entries currently being stored at the endpoint if
+.Fl b
+is specified (only for TCP).
+.It Li BBLOG LIM
+The maximum number of BBLog entries which can be stored at the endpoint
+if
+.Fl b
+is specified (only for TCP).
+.It Li BBLOG SN
+The next BBLog sequence number to be assigned if
+.Fl b
+is specified (only for TCP).
 .It Li STACK
 The protocol stack if
 .Fl S