The branch main has been updated by tuexen:

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

commit d801cc2d8542854a5dee9bfb25a15af6fa1dafad
Author:     Michael Tuexen <[email protected]>
AuthorDate: 2025-10-06 23:24:43 +0000
Commit:     Michael Tuexen <[email protected]>
CommitDate: 2025-10-06 23:24:43 +0000

    sockstat: support reporting of BBLog state
    
    Add a -b option to print the BBLog state for TCP sockets.
    
    Reviewed by:            jtl, rrs
    MFC after:              3 days
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D52944
---
 usr.bin/sockstat/main.c     | 55 +++++++++++++++++++++++++++++++++++++++++++--
 usr.bin/sockstat/sockstat.1 | 11 +++++++--
 2 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/usr.bin/sockstat/main.c b/usr.bin/sockstat/main.c
index 2e75e4966d80..3b989c4283e4 100644
--- a/usr.bin/sockstat/main.c
+++ b/usr.bin/sockstat/main.c
@@ -51,6 +51,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>
@@ -84,6 +85,7 @@
 static bool     opt_4;         /* Show IPv4 sockets */
 static bool     opt_6;         /* Show IPv6 sockets */
 static bool     opt_A;         /* Show kernel address of pcb */
+static bool     opt_b;         /* Show BBLog state */
 static bool     opt_C;         /* Show congestion control */
 static bool     opt_c;         /* Show connected sockets */
 static bool     opt_f;         /* Show FIB numbers */
@@ -141,6 +143,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];
@@ -738,6 +741,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);
@@ -1056,6 +1060,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 int
 format_unix_faddr(struct addr *faddr, char *buf, size_t bufsize) {
        #define SAFEBUF  (buf == NULL ? NULL : buf + pos)
@@ -1143,6 +1178,7 @@ struct col_widths {
        int encaps;
        int path_state;
        int conn_state;
+       int bblog_state;
        int stack;
        int cc;
 };
@@ -1485,6 +1521,15 @@ display_sock(struct sock *s, struct col_widths *cw, char 
*buf, size_t bufsize)
                                        xo_emit(" {:conn-state/%-*s}",
                                                cw->conn_state, "??");
                        }
+                       if (opt_b) {
+                               if (s->proto == IPPROTO_TCP)
+                                       xo_emit(" {:bblog-state/%-*s}",
+                                               cw->bblog_state,
+                                               bblog_state(s->bblog_state));
+                               else if (!is_xo_style_encoding)
+                                       xo_emit(" {:bblog-state/%-*s}",
+                                               cw->bblog_state, "??");
+                       }
                        if (opt_S) {
                                if (s->proto == IPPROTO_TCP)
                                        xo_emit(" {:stack/%-*s}",
@@ -1544,6 +1589,7 @@ display(void)
                        .encaps = strlen("ENCAPS"),
                        .path_state = strlen("PATH STATE"),
                        .conn_state = strlen("CONN STATE"),
+                       .bblog_state = strlen("BBLOG STATE"),
                        .stack = strlen("STACK"),
                        .cc = strlen("CC"),
                };
@@ -1576,6 +1622,8 @@ display(void)
                        xo_emit(" {T:/%-*s}", cw.path_state, "PATH STATE");
                        xo_emit(" {T:/%-*s}", cw.conn_state, "CONN STATE");
                }
+               if (opt_b)
+                       xo_emit(" {T:/%-*s}", cw.bblog_state, "BBLOG STATE");
                if (opt_S)
                        xo_emit(" {T:/%-*s}", cw.stack, "STACK");
                if (opt_C)
@@ -1706,7 +1754,7 @@ static void
 usage(void)
 {
        xo_error(
-"usage: sockstat [--libxo ...] [-46ACcfIiLlnqSsUuvw] [-j jid] [-p ports]\n"
+"usage: sockstat [--libxo ...] [-46AbCcfIiLlnqSsUuvw] [-j jid] [-p ports]\n"
 "                [-P protocols]\n");
        exit(1);
 }
@@ -1728,7 +1776,7 @@ main(int argc, char *argv[])
                xo_get_style(NULL) != XO_STYLE_HTML)
                is_xo_style_encoding = true;
        opt_j = -1;
-       while ((o = getopt(argc, argv, "46ACcfIij:Llnp:P:qSsUuvw")) != -1)
+       while ((o = getopt(argc, argv, "46AbCcfIij:Llnp:P:qSsUuvw")) != -1)
                switch (o) {
                case '4':
                        opt_4 = true;
@@ -1739,6 +1787,9 @@ main(int argc, char *argv[])
                case 'A':
                        opt_A = true;
                        break;
+               case 'b':
+                       opt_b = true;
+                       break;
                case 'C':
                        opt_C = true;
                        break;
diff --git a/usr.bin/sockstat/sockstat.1 b/usr.bin/sockstat/sockstat.1
index 091911cd0879..dabb3042bfd4 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 July 17, 2025
+.Dd October 7, 2025
 .Dt SOCKSTAT 1
 .Os
 .Sh NAME
@@ -34,7 +34,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl -libxo
-.Op Fl 46ACcfIiLlnqSsUuvw
+.Op Fl 46AbCcfIiLlnqSsUuvw
 .Op Fl j Ar jail
 .Op Fl p Ar ports
 .Op Fl P Ar protocols
@@ -65,6 +65,9 @@ Show
 .It Fl A
 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.
+This is currently only implemented for TCP.
 .It Fl C
 Display the congestion control module, if applicable.
 This is currently only implemented for TCP.
@@ -206,6 +209,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

Reply via email to