xref: /freebsd/cddl/usr.sbin/dwatch/libexec/udp (revision 5bf5ca772c6de2d53344a78cf461447cc322ccea)
1*5bf5ca77SDevin Teske# -*- tab-width: 4 -*- ;; Emacs
2*5bf5ca77SDevin Teske# vi: set filetype=sh tabstop=8 shiftwidth=8 noexpandtab :: Vi/ViM
3*5bf5ca77SDevin Teske############################################################ IDENT(1)
4*5bf5ca77SDevin Teske#
5*5bf5ca77SDevin Teske# $Title: dwatch(8) module for dtrace_udp(4) $
6*5bf5ca77SDevin Teske# $Copyright: 2014-2018 Devin Teske. All rights reserved. $
7*5bf5ca77SDevin Teske# $FreeBSD$
8*5bf5ca77SDevin Teske#
9*5bf5ca77SDevin Teske############################################################ DESCRIPTION
10*5bf5ca77SDevin Teske#
11*5bf5ca77SDevin Teske# Display local/remote UDP addresses/ports and bytes sent/received for UDP I/O
12*5bf5ca77SDevin Teske#
13*5bf5ca77SDevin Teske############################################################ PROBE
14*5bf5ca77SDevin Teske
15*5bf5ca77SDevin Teskecase "$PROFILE" in
16*5bf5ca77SDevin Teskeudp) : ${PROBE:=udp:::send, udp:::receive} ;;
17*5bf5ca77SDevin Teske  *) : ${PROBE:=udp:::${PROFILE#udp-}}
18*5bf5ca77SDevin Teskeesac
19*5bf5ca77SDevin Teske
20*5bf5ca77SDevin Teske############################################################ GLOBALS
21*5bf5ca77SDevin Teske
22*5bf5ca77SDevin Teske#
23*5bf5ca77SDevin Teske# This profile does not support these dwatch features
24*5bf5ca77SDevin Teske# NB: They are disabled here so they have no effect when profile is loaded
25*5bf5ca77SDevin Teske#
26*5bf5ca77SDevin Teskeunset EXECNAME		# -k name
27*5bf5ca77SDevin Teskeunset EXECREGEX		# -z regex
28*5bf5ca77SDevin Teskeunset GROUP		# -g group
29*5bf5ca77SDevin Teskeunset PID		# -p pid
30*5bf5ca77SDevin Teskeunset PSARGS		# affects -d
31*5bf5ca77SDevin Teskeunset PSTREE		# -R
32*5bf5ca77SDevin Teskeunset USER		# -u user
33*5bf5ca77SDevin Teske
34*5bf5ca77SDevin Teske############################################################ ACTIONS
35*5bf5ca77SDevin Teske
36*5bf5ca77SDevin Teskeexec 9<<EOF
37*5bf5ca77SDevin Teskethis string	flow;
38*5bf5ca77SDevin Teskethis string	local;
39*5bf5ca77SDevin Teskethis string	remote;
40*5bf5ca77SDevin Teskethis u_char	local6;
41*5bf5ca77SDevin Teskethis u_char	recv;
42*5bf5ca77SDevin Teskethis u_char	remote6;
43*5bf5ca77SDevin Teskethis uint16_t	length;
44*5bf5ca77SDevin Teskethis uint16_t	lport;
45*5bf5ca77SDevin Teskethis uint16_t	rport;
46*5bf5ca77SDevin Teske
47*5bf5ca77SDevin Teske$PROBE /* probe ID $ID */
48*5bf5ca77SDevin Teske{${TRACE:+
49*5bf5ca77SDevin Teske	printf("<$ID>");
50*5bf5ca77SDevin Teske}
51*5bf5ca77SDevin Teske	/*
52*5bf5ca77SDevin Teske	 * dtrace_udp(4)
53*5bf5ca77SDevin Teske	 */
54*5bf5ca77SDevin Teske	this->recv = probename == "receive" ? 1 : 0;
55*5bf5ca77SDevin Teske	this->flow = this->recv ? "<-" : "->";
56*5bf5ca77SDevin Teske
57*5bf5ca77SDevin Teske	/*
58*5bf5ca77SDevin Teske	 * ipinfo_t *
59*5bf5ca77SDevin Teske	 */
60*5bf5ca77SDevin Teske	this->local  = this->recv ? args[2]->ip_daddr : args[2]->ip_saddr;
61*5bf5ca77SDevin Teske	this->remote = this->recv ? args[2]->ip_saddr : args[2]->ip_daddr;
62*5bf5ca77SDevin Teske
63*5bf5ca77SDevin Teske	/*
64*5bf5ca77SDevin Teske	 * udpinfo_t *
65*5bf5ca77SDevin Teske	 */
66*5bf5ca77SDevin Teske	this->length = (uint16_t)args[4]->udp_length;
67*5bf5ca77SDevin Teske	this->lport  = this->recv ? args[4]->udp_dport : args[4]->udp_sport;
68*5bf5ca77SDevin Teske	this->rport  = this->recv ? args[4]->udp_sport : args[4]->udp_dport;
69*5bf5ca77SDevin Teske
70*5bf5ca77SDevin Teske	/*
71*5bf5ca77SDevin Teske	 * IPv6 support
72*5bf5ca77SDevin Teske	 */
73*5bf5ca77SDevin Teske	this->local6 = strstr(this->local, ":") != NULL ? 1 : 0;
74*5bf5ca77SDevin Teske	this->remote6 = strstr(this->remote, ":") != NULL ? 1 : 0;
75*5bf5ca77SDevin Teske	this->local = strjoin(strjoin(this->local6 ? "[" : "",
76*5bf5ca77SDevin Teske		this->local), this->local6 ? "]" : "");
77*5bf5ca77SDevin Teske	this->remote = strjoin(strjoin(this->remote6 ? "[" : "",
78*5bf5ca77SDevin Teske		this->remote), this->remote6 ? "]" : "");
79*5bf5ca77SDevin Teske}
80*5bf5ca77SDevin TeskeEOF
81*5bf5ca77SDevin TeskeACTIONS=$( cat <&9 )
82*5bf5ca77SDevin TeskeID=$(( $ID + 1 ))
83*5bf5ca77SDevin Teske
84*5bf5ca77SDevin Teske############################################################ EVENT TAG
85*5bf5ca77SDevin Teske
86*5bf5ca77SDevin Teskeexec 9<<EOF
87*5bf5ca77SDevin Teske	printf("%s: ", "$PROFILE");
88*5bf5ca77SDevin TeskeEOF
89*5bf5ca77SDevin TeskeEVENT_TAG=$( cat <&9 )
90*5bf5ca77SDevin Teske
91*5bf5ca77SDevin Teske############################################################ EVENT DETAILS
92*5bf5ca77SDevin Teske
93*5bf5ca77SDevin Teskeexec 9<<EOF
94*5bf5ca77SDevin Teske	/*
95*5bf5ca77SDevin Teske	 * Print network I/O details
96*5bf5ca77SDevin Teske	 */
97*5bf5ca77SDevin Teske	printf("%s:%u %s %s:%u %d byte%s",
98*5bf5ca77SDevin Teske		this->local, this->lport,
99*5bf5ca77SDevin Teske		this->flow,
100*5bf5ca77SDevin Teske		this->remote, this->rport,
101*5bf5ca77SDevin Teske		this->length,
102*5bf5ca77SDevin Teske		this->length == 1 ? "" : "s");
103*5bf5ca77SDevin TeskeEOF
104*5bf5ca77SDevin TeskeEVENT_DETAILS=$( cat <&9 )
105*5bf5ca77SDevin Teske
106*5bf5ca77SDevin Teske################################################################################
107*5bf5ca77SDevin Teske# END
108*5bf5ca77SDevin Teske################################################################################
109