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
This commit is contained in:
Michael Tuexen
2025-10-31 14:05:02 -04:00
parent 3adaacad11
commit 9aa5a79e2a
4 changed files with 27 additions and 11 deletions
+9 -3
View File
@@ -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
+1 -1
View File
@@ -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;
+3
View File
@@ -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_ */
+14 -7
View File
@@ -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;
}