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