git: 9aa5a79e2af9 - main - ddb: optionally print inp when printing tcpcb

From: Michael Tuexen <tuexen_at_FreeBSD.org>
Date: Fri, 31 Oct 2025 18:08:10 UTC
The branch main has been updated by tuexen:

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

commit 9aa5a79e2af9a6a8930bbe8a7a024df2cf44e433
Author:     Michael Tuexen <tuexen@FreeBSD.org>
AuthorDate: 2025-10-31 18:05:02 +0000
Commit:     Michael Tuexen <tuexen@FreeBSD.org>
CommitDate: 2025-10-31 18:05:02 +0000

    ddb: optionally print inp when printing tcpcb
    
    Add /i option to the ddb commands show tcpcb and show all tcpcbs,
    which enables the printing of the t_inpcb.
    
    Reviewed by:            markj
    MFC after:              3 days
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D53497
---
 share/man/man4/ddb.4     | 12 +++++++++---
 sys/netinet/in_pcb.c     |  2 +-
 sys/netinet/in_pcb.h     |  3 +++
 sys/netinet/tcp_usrreq.c | 21 ++++++++++++++-------
 4 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/share/man/man4/ddb.4 b/share/man/man4/ddb.4
index 3c4894c03d62..a882a5204fb2 100644
--- a/share/man/man4/ddb.4
+++ b/share/man/man4/ddb.4
@@ -24,7 +24,7 @@
 .\" any improvements or extensions that they make and grant Carnegie Mellon
 .\" the rights to redistribute these changes.
 .\"
-.Dd June 10, 2025
+.Dd October 31, 2025
 .Dt DDB 4
 .Os
 .Sh NAME
@@ -604,12 +604,15 @@ The
 modifier will print command line arguments for each process.
 .\"
 .Pp
-.It Ic show Cm all tcpcbs Ns Op Li / Ns Cm b Ns Cm l
+.It Ic show Cm all tcpcbs Ns Op Li / Ns Cm b Ns Cm i Ns Cm l
 Show the same output as "show tcpcb" does, but for all
 TCP control blocks within the system.
 The
 .Cm b
 modifier will request BBLog entries to be printed.
+If the
+.Cm i
+modifier is provided, the corresponding IP control block is also shown.
 Using the
 .Cm l
 modifier will limit the output to TCP control blocks, which are locked.
@@ -1106,7 +1109,7 @@ on i386.)
 Not present on some platforms.
 .\"
 .Pp
-.It Ic show Cm tcpcb Ns Oo Li / Ns Cm b Oc Ar addr
+.It Ic show Cm tcpcb Ns Oo Li / Ns Cm b Ns Cm i Oc Ar addr
 Print TCP control block
 .Vt struct tcpcb
 lying at address
@@ -1117,6 +1120,9 @@ header file.
 The
 .Cm b
 modifier will request BBLog entries to be printed.
+If the
+.Cm i
+modifier is provided, the corresponding IP control block is also shown.
 .\"
 .Pp
 .It Ic show Cm thread Op Ar addr | tid
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index dcd39bca2704..f573e07163fd 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -3058,7 +3058,7 @@ db_print_inconninfo(struct in_conninfo *inc, const char *name, int indent)
 	    ntohs(inc->inc_fport));
 }
 
-static void
+void
 db_print_inpflags(int inp_flags)
 {
 	int comma;
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 9e0618e87601..7d41e3d690e0 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -730,6 +730,9 @@ int	in_pcbquery_txrlevel(struct inpcb *, uint32_t *);
 void	in_pcboutput_txrtlmt(struct inpcb *, struct ifnet *, struct mbuf *);
 void	in_pcboutput_eagain(struct inpcb *);
 #endif
+#ifdef DDB
+void	db_print_inpcb(struct inpcb *, const char *, int);
+#endif
 #endif /* _KERNEL */
 
 #endif /* !_NETINET_IN_PCB_H_ */
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index 98c934955121..c4a54646f3a2 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -3088,7 +3088,8 @@ db_print_bblog_state(int state)
 }
 
 static void
-db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)
+db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog,
+    bool show_inpcb)
 {
 
 	db_print_indent(indent);
@@ -3096,6 +3097,9 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)
 
 	indent += 2;
 
+	if (show_inpcb)
+		db_print_inpcb(tptoinpcb(tp), "t_inpcb", indent);
+
 	db_print_indent(indent);
 	db_printf("t_segq first: %p   t_segqlen: %d   t_dupacks: %d\n",
 	   TAILQ_FIRST(&tp->t_segq), tp->t_segqlen, tp->t_dupacks);
@@ -3227,33 +3231,36 @@ db_print_tcpcb(struct tcpcb *tp, const char *name, int indent, bool show_bblog)
 DB_SHOW_COMMAND(tcpcb, db_show_tcpcb)
 {
 	struct tcpcb *tp;
-	bool show_bblog;
+	bool show_bblog, show_inpcb;
 
 	if (!have_addr) {
-		db_printf("usage: show tcpcb <addr>\n");
+		db_printf("usage: show tcpcb[/bi] <addr>\n");
 		return;
 	}
 	show_bblog = strchr(modif, 'b') != NULL;
+	show_inpcb = strchr(modif, 'i') != NULL;
 	tp = (struct tcpcb *)addr;
-
-	db_print_tcpcb(tp, "tcpcb", 0, show_bblog);
+	db_print_tcpcb(tp, "tcpcb", 0, show_bblog, show_inpcb);
 }
 
 DB_SHOW_ALL_COMMAND(tcpcbs, db_show_all_tcpcbs)
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 	struct inpcb *inp;
-	bool only_locked, show_bblog;
+	struct tcpcb *tp;
+	bool only_locked, show_bblog, show_inpcb;
 
 	only_locked = strchr(modif, 'l') != NULL;
 	show_bblog = strchr(modif, 'b') != NULL;
+	show_inpcb = strchr(modif, 'i') != NULL;
 	VNET_FOREACH(vnet_iter) {
 		CURVNET_SET(vnet_iter);
 		CK_LIST_FOREACH(inp, &V_tcbinfo.ipi_listhead, inp_list) {
 			if (only_locked &&
 			    inp->inp_lock.rw_lock == RW_UNLOCKED)
 				continue;
-			db_print_tcpcb(intotcpcb(inp), "tcpcb", 0, show_bblog);
+			tp = intotcpcb(inp);
+			db_print_tcpcb(tp, "tcpcb", 0, show_bblog, show_inpcb);
 			if (db_pager_quit)
 				break;
 		}