xref: /freebsd/cddl/usr.sbin/dwatch/libexec/mib (revision 434283fda99e89af20c3fe95fde427624ae96d04)
1*434283fdSDevin Teske# -*- tab-width: 4 -*- ;; Emacs
2*434283fdSDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
3*434283fdSDevin Teske############################################################ IDENT(1)
4*434283fdSDevin Teske#
5*434283fdSDevin Teske# $Title: dwatch(8) module for network stack counter probes $
6*434283fdSDevin Teske# $Copyright: 2026 Devin Teske. All rights reserved. $
7*434283fdSDevin Teske#
8*434283fdSDevin Teske############################################################ DESCRIPTION
9*434283fdSDevin Teske#
10*434283fdSDevin Teske# Print network stack statistics counters as they increment, via the
11*434283fdSDevin Teske# mib SDT probes (one probe per counter of the IP, ICMP, UDP, and TCP
12*434283fdSDevin Teske# MIBs). The tcp-retransmit profile watches the counters that signal
13*434283fdSDevin Teske# congestion or loss on the send path -- data packet retransmissions,
14*434283fdSDevin Teske# retransmit timer expirations, and connections dropped by retransmit
15*434283fdSDevin Teske# exhaustion -- answering "is this network slow because TCP is
16*434283fdSDevin Teske# resending?" as events with process context, not just netstat(1)
17*434283fdSDevin Teske# deltas. Use mib-NAME to watch a single counter by name (e.g.,
18*434283fdSDevin Teske# mib-tcps_sndrexmitpack). NB: the probes exist only in kernels built
19*434283fdSDevin Teske# with options KDTRACE_MIB_SDT (enabled by default in -CURRENT via
20*434283fdSDevin Teske# std.debug); elsewhere dtrace(1) will refuse the script. Counters
21*434283fdSDevin Teske# bumped outside syscall context (e.g., timers) are tagged with the
22*434283fdSDevin Teske# interrupted thread, commonly [clock] or [intr].
23*434283fdSDevin Teske#
24*434283fdSDevin Teske############################################################ PROBE
25*434283fdSDevin Teske
26*434283fdSDevin Teskecase "$PROFILE" in
27*434283fdSDevin Teskemib)
28*434283fdSDevin Teske	: ${PROBE:=mib:::} ;;
29*434283fdSDevin Tesketcp-retransmit)
30*434283fdSDevin Teske	: ${PROBE:=$( echo \
31*434283fdSDevin Teske		mib:tcp:count:tcps_sndrexmitpack, \
32*434283fdSDevin Teske		mib:tcp:count:tcps_sndrexmitbad, \
33*434283fdSDevin Teske		mib:tcp:count:tcps_rexmttimeo, \
34*434283fdSDevin Teske		mib:tcp:count:tcps_timeoutdrop )} ;;
35*434283fdSDevin Teske*)
36*434283fdSDevin Teske	: ${PROBE:=mib:::${PROFILE#mib-}}
37*434283fdSDevin Teskeesac
38*434283fdSDevin Teske
39*434283fdSDevin Teske############################################################ ACTIONS
40*434283fdSDevin Teske
41*434283fdSDevin Teskeexec 9<<EOF
42*434283fdSDevin Teskethis string	mib_desc;
43*434283fdSDevin Teske
44*434283fdSDevin Teske/*
45*434283fdSDevin Teske * Counters that signal send-path congestion or loss, described
46*434283fdSDevin Teske */
47*434283fdSDevin Teskeinline string mib_tcp_desc[string name] =
48*434283fdSDevin Teske	name == "tcps_sndrexmitpack" ?	"data packet retransmitted" :
49*434283fdSDevin Teske	name == "tcps_sndrexmitbad" ?	"unnecessary retransmission" :
50*434283fdSDevin Teske	name == "tcps_rexmttimeo" ?	"retransmit timeout" :
51*434283fdSDevin Teske	name == "tcps_timeoutdrop" ?
52*434283fdSDevin Teske		"connection dropped by retransmit timeout" :
53*434283fdSDevin Teske	name;
54*434283fdSDevin Teske
55*434283fdSDevin Teske$PROBE /* probe ID $ID */
56*434283fdSDevin Teske{${TRACE:+
57*434283fdSDevin Teske	printf("<$ID>");}
58*434283fdSDevin Teske	this->mib_desc = mib_tcp_desc[probename];
59*434283fdSDevin Teske}
60*434283fdSDevin TeskeEOF
61*434283fdSDevin TeskeACTIONS=$( cat <&9 )
62*434283fdSDevin TeskeID=$(( $ID + 1 ))
63*434283fdSDevin Teske
64*434283fdSDevin Teske############################################################ EVENT DETAILS
65*434283fdSDevin Teske
66*434283fdSDevin Teskeif [ ! "$CUSTOM_DETAILS" ]; then
67*434283fdSDevin Teskeexec 9<<EOF
68*434283fdSDevin Teske	/*
69*434283fdSDevin Teske	 * Print counter increment details
70*434283fdSDevin Teske	 */
71*434283fdSDevin Teske	printf("%s (+%d)", this->mib_desc, (int)arg0);
72*434283fdSDevin TeskeEOF
73*434283fdSDevin TeskeEVENT_DETAILS=$( cat <&9 )
74*434283fdSDevin Teskefi
75*434283fdSDevin Teske
76*434283fdSDevin Teske################################################################################
77*434283fdSDevin Teske# END
78*434283fdSDevin Teske################################################################################
79