git: 8e8956f7f997 - main - ddb: use %b when showing flags for a tcpcb

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Sun, 02 Nov 2025 20:18:09 UTC
The branch main has been updated by tuexen:

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

commit 8e8956f7f99759b21bc07e884ad89d1927c39e8d
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2025-11-02 16:15:47 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2025-11-02 16:15:47 +0000

    ddb: use %b when showing flags for a tcpcb
    
    This is much more compact. Thanks to markj@ for suggesting the change.
    
    Reviewed by:            markj, Peter Lei, imp, Nick Banks
    MFC after:              3 days
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D53510
---
 sys/netinet/tcp_usrreq.c | 265 +----------------------------------------------
 sys/netinet/tcp_var.h    |  29 ++++++
 2 files changed, 33 insertions(+), 261 deletions(-)

diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index c4a54646f3a2..4d1a6455d09e 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -2798,258 +2798,6 @@ db_print_tstate(int t_state)
 	}
 }
 
-static void
-db_print_tflags(u_int t_flags)
-{
-	int comma;
-
-	comma = 0;
-	if (t_flags & TF_ACKNOW) {
-		db_printf("%sTF_ACKNOW", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_DELACK) {
-		db_printf("%sTF_DELACK", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_NODELAY) {
-		db_printf("%sTF_NODELAY", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_NOOPT) {
-		db_printf("%sTF_NOOPT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_SENTFIN) {
-		db_printf("%sTF_SENTFIN", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_REQ_SCALE) {
-		db_printf("%sTF_REQ_SCALE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_RCVD_SCALE) {
-		db_printf("%sTF_RECVD_SCALE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_REQ_TSTMP) {
-		db_printf("%sTF_REQ_TSTMP", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_RCVD_TSTMP) {
-		db_printf("%sTF_RCVD_TSTMP", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_SACK_PERMIT) {
-		db_printf("%sTF_SACK_PERMIT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_NEEDSYN) {
-		db_printf("%sTF_NEEDSYN", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_NEEDFIN) {
-		db_printf("%sTF_NEEDFIN", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_NOPUSH) {
-		db_printf("%sTF_NOPUSH", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_PREVVALID) {
-		db_printf("%sTF_PREVVALID", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_WAKESOR) {
-		db_printf("%sTF_WAKESOR", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_GPUTINPROG) {
-		db_printf("%sTF_GPUTINPROG", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_MORETOCOME) {
-		db_printf("%sTF_MORETOCOME", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_SONOTCONN) {
-		db_printf("%sTF_SONOTCONN", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_LASTIDLE) {
-		db_printf("%sTF_LASTIDLE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_RXWIN0SENT) {
-		db_printf("%sTF_RXWIN0SENT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_FASTRECOVERY) {
-		db_printf("%sTF_FASTRECOVERY", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_WASFRECOVERY) {
-		db_printf("%sTF_WASFRECOVERY", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_SIGNATURE) {
-		db_printf("%sTF_SIGNATURE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_FORCEDATA) {
-		db_printf("%sTF_FORCEDATA", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_TSO) {
-		db_printf("%sTF_TSO", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_TOE) {
-		db_printf("%sTF_TOE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_CLOSED) {
-		db_printf("%sTF_CLOSED", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_SENTSYN) {
-		db_printf("%sTF_SENTSYN", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_LRD) {
-		db_printf("%sTF_LRD", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_CONGRECOVERY) {
-		db_printf("%sTF_CONGRECOVERY", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_WASCRECOVERY) {
-		db_printf("%sTF_WASCRECOVERY", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags & TF_FASTOPEN) {
-		db_printf("%sTF_FASTOPEN", comma ? ", " : "");
-		comma = 1;
-	}
-}
-
-static void
-db_print_tflags2(u_int t_flags2)
-{
-	int comma;
-
-	comma = 0;
-	if (t_flags2 & TF2_PLPMTU_BLACKHOLE) {
-		db_printf("%sTF2_PLPMTU_BLACKHOLE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_PLPMTU_PMTUD) {
-		db_printf("%sTF2_PLPMTU_PMTUD", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_PLPMTU_MAXSEGSNT) {
-		db_printf("%sTF2_PLPMTU_MAXSEGSNT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_LOG_AUTO) {
-		db_printf("%sTF2_LOG_AUTO", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_DROP_AF_DATA) {
-		db_printf("%sTF2_DROP_AF_DATA", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_ECN_PERMIT) {
-		db_printf("%sTF2_ECN_PERMIT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_ECN_SND_CWR) {
-		db_printf("%sTF2_ECN_SND_CWR", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_ECN_SND_ECE) {
-		db_printf("%sTF2_ECN_SND_ECE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_ACE_PERMIT) {
-		db_printf("%sTF2_ACE_PERMIT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_HPTS_CPU_SET) {
-		db_printf("%sTF2_HPTS_CPU_SET", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_FBYTES_COMPLETE) {
-		db_printf("%sTF2_FBYTES_COMPLETE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_ECN_USE_ECT1) {
-		db_printf("%sTF2_ECN_USE_ECT1", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_TCP_ACCOUNTING) {
-		db_printf("%sTF2_TCP_ACCOUNTING", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_HPTS_CALLS) {
-		db_printf("%sTF2_HPTS_CALLS", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_MBUF_L_ACKS) {
-		db_printf("%sTF2_MBUF_L_ACKS", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_MBUF_ACKCMP) {
-		db_printf("%sTF2_MBUF_ACKCMP", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_SUPPORTS_MBUFQ) {
-		db_printf("%sTF2_SUPPORTS_MBUFQ", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_MBUF_QUEUE_READY) {
-		db_printf("%sTF2_MBUF_QUEUE_READY", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_DONT_SACK_QUEUE) {
-		db_printf("%sTF2_DONT_SACK_QUEUE", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_CANNOT_DO_ECN) {
-		db_printf("%sTF2_CANNOT_DO_ECN", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_PROC_SACK_PROHIBIT) {
-		db_printf("%sTF2_PROC_SACK_PROHIBIT", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_IPSEC_TSO) {
-		db_printf("%sTF2_IPSEC_TSO", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_flags2 & TF2_NO_ISS_CHECK) {
-		db_printf("%sTF2_NO_ISS_CHECK", comma ? ", " : "");
-		comma = 1;
-	}
-}
-
-static void
-db_print_toobflags(char t_oobflags)
-{
-	int comma;
-
-	comma = 0;
-	if (t_oobflags & TCPOOB_HAVEDATA) {
-		db_printf("%sTCPOOB_HAVEDATA", comma ? ", " : "");
-		comma = 1;
-	}
-	if (t_oobflags & TCPOOB_HADDATA) {
-		db_printf("%sTCPOOB_HADDATA", comma ? ", " : "");
-		comma = 1;
-	}
-}
-
 static void
 db_print_bblog_state(int state)
 {
@@ -3114,14 +2862,10 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog,
 	db_printf(")\n");
 
 	db_print_indent(indent);
-	db_printf("t_flags: 0x%x (", tp->t_flags);
-	db_print_tflags(tp->t_flags);
-	db_printf(")\n");
+	db_printf("t_flags: 0x%b\n", tp->t_flags, TF_BITS);
 
 	db_print_indent(indent);
-	db_printf("t_flags2: 0x%x (", tp->t_flags2);
-	db_print_tflags2(tp->t_flags2);
-	db_printf(")\n");
+	db_printf("t_flags2: 0x%b\n", tp->t_flags2, TF2_BITS);
 
 	db_print_indent(indent);
 	db_printf("snd_una: 0x%08x   snd_max: 0x%08x   snd_nxt: 0x%08x\n",
@@ -3168,9 +2912,8 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog,
 	    tp->t_rttupdated, tp->max_sndwnd, tp->t_softerror);
 
 	db_print_indent(indent);
-	db_printf("t_oobflags: 0x%x (", tp->t_oobflags);
-	db_print_toobflags(tp->t_oobflags);
-	db_printf(")   t_iobc: 0x%02x\n", tp->t_iobc);
+	db_printf("t_oobflags: 0x%b   t_iobc: 0x%02x\n", tp->t_oobflags,
+	    TCPOOB_BITS, tp->t_iobc);
 
 	db_print_indent(indent);
 	db_printf("snd_scale: %u   rcv_scale: %u   request_r_scale: %u\n",
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index c3be95c80798..f9297be46af7 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -795,6 +795,17 @@ tcp_packets_this_ack(struct tcpcb *tp, tcp_seq ack)
 #define	TF_WASCRECOVERY	0x40000000	/* was in congestion recovery */
 #define	TF_FASTOPEN	0x80000000	/* TCP Fast Open indication */
 
+/* t_flags description for use with printf(9) %b identifier. */
+#define	TF_BITS	"\20" \
+    "\1TF_ACKNOW\2TF_DELACK\3TF_NODELAY\4TF_NOOPT" \
+    "\5TF_SENTFIN\6TF_REQ_SCALE\7TF_RCVD_SCALE\10TF_REQ_TSTMP" \
+    "\11TF_RCVD_TSTMP\12TF_SACK_PERMIT\13TF_NEEDSYN\14TF_NEEDFIN" \
+    "\15TF_NOPUSH\16TF_PREVVALID\17TF_WAKESOR\20TF_GPUTINPROG" \
+    "\21TF_MORETOCOME\22TF_SONOTCONN\23TF_LASTIDLE\24TF_RXWIN0SENT" \
+    "\25TF_FASTRECOVERY\26TF_WASFRECOVERY\27TF_SIGNATURE\30TF_FORCEDATA" \
+    "\31TF_TSO\32TF_TOE\33TF_CLOSED\34TF_SENTSYN" \
+    "\35TF_LRD\36TF_CONGRECOVERY\37TF_WASCRECOVERY\40TF_FASTOPEN"
+
 #define	IN_FASTRECOVERY(t_flags)	(t_flags & TF_FASTRECOVERY)
 #define	ENTER_FASTRECOVERY(t_flags)	t_flags |= TF_FASTRECOVERY
 #define	EXIT_FASTRECOVERY(t_flags)	t_flags &= ~TF_FASTRECOVERY
@@ -815,6 +826,9 @@ tcp_packets_this_ack(struct tcpcb *tp, tcp_seq ack)
 #define	TCPOOB_HAVEDATA	0x01
 #define	TCPOOB_HADDATA	0x02
 
+/* t_oobflags description for use with printf(9) %b identifier. */
+#define	TCPOOB_BITS	"\20\1TCPOOB_HAVEDATA\2TCPOOB_HADDATA"
+
 /*
  * Flags for the extended TCP flags field, t_flags2
  */
@@ -842,6 +856,21 @@ tcp_packets_this_ack(struct tcpcb *tp, tcp_seq ack)
 #define	TF2_IPSEC_TSO		0x00200000 /* IPSEC + TSO supported */
 #define	TF2_NO_ISS_CHECK	0x00400000 /* Don't check SEG.ACK against ISS */
 
+/* t_flags2 description for use with printf(9) %b identifier. */
+#define	TF2_BITS	"\20" \
+    "\1TF2_PLPMTU_BLACKHOLE\2TF2_PLPMTU_PMTUD" \
+    "\3TF2_PLPMTU_MAXSEGSNT\4TF2_LOG_AUTO" \
+    "\5TF2_DROP_AF_DATA\6TF2_ECN_PERMIT" \
+    "\7TF2_ECN_SND_CWR\10TF2_ECN_SND_ECE" \
+    "\11TF2_ACE_PERMIT\12TF2_HPTS_CPU_SET" \
+    "\13TF2_FBYTES_COMPLETE\14TF2_ECN_USE_ECT1" \
+    "\15TF2_TCP_ACCOUNTING\16TF2_HPTS_CALLS" \
+    "\17TF2_MBUF_L_ACKS\20TF2_MBUF_ACKCMP" \
+    "\21TF2_SUPPORTS_MBUFQ\22TF2_MBUF_QUEUE_READY" \
+    "\23TF2_DONT_SACK_QUEUE\24TF2_CANNOT_DO_ECN" \
+    "\25TF2_PROC_SACK_PROHIBIT\26TF2_IPSEC_TSO" \
+    "\27TF2_NO_ISS_CHECK"
+
 /*
  * Structure to hold TCP options that are only used during segment
  * processing (in tcp_input), but not held in the tcpcb.