diff options
Diffstat (limited to 'cddl/usr.sbin/dwatch/libexec/udp')
-rw-r--r-- | cddl/usr.sbin/dwatch/libexec/udp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/cddl/usr.sbin/dwatch/libexec/udp b/cddl/usr.sbin/dwatch/libexec/udp new file mode 100644 index 000000000000..048f0c9a4102 --- /dev/null +++ b/cddl/usr.sbin/dwatch/libexec/udp @@ -0,0 +1,88 @@ +# -*- tab-width: 4 -*- ;; Emacs +# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM +############################################################ IDENT(1) +# +# $Title: dwatch(8) module for dtrace_udp(4) $ +# $Copyright: 2014-2018 Devin Teske. All rights reserved. $ +# +############################################################ DESCRIPTION +# +# Display local/remote UDP addresses/ports and bytes sent/received for UDP I/O +# +############################################################ PROBE + +case "$PROFILE" in +udp) : ${PROBE:=udp:::send, udp:::receive} ;; + *) : ${PROBE:=udp:::${PROFILE#udp-}} +esac + +############################################################ ACTIONS + +exec 9<<EOF +this string flow; +this string local; +this string remote; +this u_char local6; +this u_char recv; +this u_char remote6; +this uint16_t length; +this uint16_t lport; +this uint16_t rport; + +$PROBE /* probe ID $ID */ +{${TRACE:+ + printf("<$ID>"); +} + /* + * dtrace_udp(4) + */ + this->recv = probename == "receive" ? 1 : 0; + this->flow = this->recv ? "<-" : "->"; + + /* + * ipinfo_t * + */ + this->local = this->recv ? args[2]->ip_daddr : args[2]->ip_saddr; + this->remote = this->recv ? args[2]->ip_saddr : args[2]->ip_daddr; + + /* + * udpinfo_t * + */ + this->length = (uint16_t)args[4]->udp_length; + this->lport = this->recv ? args[4]->udp_dport : args[4]->udp_sport; + this->rport = this->recv ? args[4]->udp_sport : args[4]->udp_dport; + + /* + * IPv6 support + */ + this->local6 = strstr(this->local, ":") != NULL ? 1 : 0; + this->remote6 = strstr(this->remote, ":") != NULL ? 1 : 0; + this->local = strjoin(strjoin(this->local6 ? "[" : "", + this->local), this->local6 ? "]" : ""); + this->remote = strjoin(strjoin(this->remote6 ? "[" : "", + this->remote), this->remote6 ? "]" : ""); +} +EOF +ACTIONS=$( cat <&9 ) +ID=$(( $ID + 1 )) + +############################################################ EVENT DETAILS + +if [ ! "$CUSTOM_DETAILS" ]; then +exec 9<<EOF + /* + * Print network I/O details + */ + printf("%s:%u %s %s:%u %d byte%s", + this->local, this->lport, + this->flow, + this->remote, this->rport, + this->length, + this->length == 1 ? "" : "s"); +EOF +EVENT_DETAILS=$( cat <&9 ) +fi + +################################################################################ +# END +################################################################################ |