The branch stable/14 has been updated by tuexen:

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

commit 117e70a21f7a950395e97f6b352867b6767f5dbc
Author:     Michael Tuexen <[email protected]>
AuthorDate: 2025-10-31 18:05:02 +0000
Commit:     Michael Tuexen <[email protected]>
CommitDate: 2025-11-10 19:32:05 +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
    Sponsored by:           Netflix, Inc.
    Differential Revision:  https://reviews.freebsd.org/D53497
    
    (cherry picked from commit 9aa5a79e2af9a6a8930bbe8a7a024df2cf44e433)
---
 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 08e804c64ff8..031df9c27bf2 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
@@ -580,12 +580,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.
@@ -1082,7 +1085,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
@@ -1093,6 +1096,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 69b68c77ba84..2761c6979f7d 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -3154,7 +3154,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 17f24ba0bee7..9095e6bb71bf 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -723,6 +723,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 daa04845ab79..38c640569f5b 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -3116,7 +3116,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);
@@ -3124,6 +3125,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);
@@ -3255,33 +3259,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;
                }

Reply via email to