xref: /freebsd/share/dtrace/tcpdebug (revision 5d06879adb95ac922703072a28fc11048d809a4b)
1*5d06879aSGeorge V. Neville-Neil#!/usr/sbin/dtrace -s
2*5d06879aSGeorge V. Neville-Neil/*
3*5d06879aSGeorge V. Neville-Neil * Copyright (c) 2015 George V. Neville-Neil
4*5d06879aSGeorge V. Neville-Neil * All rights reserved.
5*5d06879aSGeorge V. Neville-Neil *
6*5d06879aSGeorge V. Neville-Neil * Redistribution and use in source and binary forms, with or without
7*5d06879aSGeorge V. Neville-Neil * modification, are permitted provided that the following conditions
8*5d06879aSGeorge V. Neville-Neil * are met:
9*5d06879aSGeorge V. Neville-Neil * 1. Redistributions of source code must retain the above copyright
10*5d06879aSGeorge V. Neville-Neil *    notice, this list of conditions and the following disclaimer.
11*5d06879aSGeorge V. Neville-Neil * 2. Redistributions in binary form must reproduce the above copyright
12*5d06879aSGeorge V. Neville-Neil *    notice, this list of conditions and the following disclaimer in the
13*5d06879aSGeorge V. Neville-Neil *    documentation and/or other materials provided with the distribution.
14*5d06879aSGeorge V. Neville-Neil *
15*5d06879aSGeorge V. Neville-Neil * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*5d06879aSGeorge V. Neville-Neil * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*5d06879aSGeorge V. Neville-Neil * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*5d06879aSGeorge V. Neville-Neil * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*5d06879aSGeorge V. Neville-Neil * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*5d06879aSGeorge V. Neville-Neil * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*5d06879aSGeorge V. Neville-Neil * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*5d06879aSGeorge V. Neville-Neil * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*5d06879aSGeorge V. Neville-Neil * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*5d06879aSGeorge V. Neville-Neil * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*5d06879aSGeorge V. Neville-Neil * SUCH DAMAGE.
26*5d06879aSGeorge V. Neville-Neil *
27*5d06879aSGeorge V. Neville-Neil * $FreeBSD$
28*5d06879aSGeorge V. Neville-Neil *
29*5d06879aSGeorge V. Neville-Neil * The tcpdebug D script uses the tcp:kernel::debug tracepoints
30*5d06879aSGeorge V. Neville-Neil * to replicate the action of turning on TCPDEBUG in a kernel configuration.
31*5d06879aSGeorge V. Neville-Neil *
32*5d06879aSGeorge V. Neville-Neil * A TCP debug statement shows a connection's
33*5d06879aSGeorge V. Neville-Neil *
34*5d06879aSGeorge V. Neville-Neil * direction:	input, output, user, drop
35*5d06879aSGeorge V. Neville-Neil * state:	CLOSED,	LISTEN,	SYN_SENT, SYN_RCVD, ESTABLISHED,
36*5d06879aSGeorge V. Neville-Neil * 		CLOSE_WAIT, FIN_WAIT_1, CLOSING, LAST_ACK, FIN_WAIT_2,TIME_WAIT
37*5d06879aSGeorge V. Neville-Neil * sequence:	sequence space
38*5d06879aSGeorge V. Neville-Neil *
39*5d06879aSGeorge V. Neville-Neil * congestion:	rcv_nxt, rcv_wnd, rcv_up, snd_una, snd_nxt, snx_max,
40*5d06879aSGeorge V. Neville-Neil *		snd_wl1, snd_wl2, snd_wnd
41*5d06879aSGeorge V. Neville-Neil *
42*5d06879aSGeorge V. Neville-Neil * NOTE: Only sockets with SO_DEBUG set will be shown.
43*5d06879aSGeorge V. Neville-Neil *
44*5d06879aSGeorge V. Neville-Neil * Usage: tcpdebug
45*5d06879aSGeorge V. Neville-Neil */
46*5d06879aSGeorge V. Neville-Neil
47*5d06879aSGeorge V. Neville-Neil#pragma D option quiet
48*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-input
49*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/
50*5d06879aSGeorge V. Neville-Neil{
51*5d06879aSGeorge V. Neville-Neil	seq = args[1]->tcp_seq;
52*5d06879aSGeorge V. Neville-Neil	ack = args[1]->tcp_ack;
53*5d06879aSGeorge V. Neville-Neil	len = args[2]->ip_plength - sizeof(struct tcphdr);
54*5d06879aSGeorge V. Neville-Neil	flags = args[1]->tcp_flags;
55*5d06879aSGeorge V. Neville-Neil
56*5d06879aSGeorge V. Neville-Neil	printf("%p %s: input [%xu..%xu]", arg0,
57*5d06879aSGeorge V. Neville-Neil	       tcp_state_string[args[0]->tcps_state], seq, seq + len);
58*5d06879aSGeorge V. Neville-Neil
59*5d06879aSGeorge V. Neville-Neil	printf("@%x, urp=%x", ack, args[1]->tcp_urgent);
60*5d06879aSGeorge V. Neville-Neil
61*5d06879aSGeorge V. Neville-Neil	printf("%s", flags != 0 ? "<" : "");
62*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_SYN ? "SYN," :"");
63*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_ACK ? "ACK," :"");
64*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_FIN ? "FIN," :"");
65*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_RST ? "RST," :"");
66*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_PUSH ? "PUSH," :"");
67*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_URG ? "URG," :"");
68*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_ECE ? "ECE," :"");
69*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_CWR ? "CWR" :"");
70*5d06879aSGeorge V. Neville-Neil	printf("%s", flags != 0 ? ">" : "");
71*5d06879aSGeorge V. Neville-Neil
72*5d06879aSGeorge V. Neville-Neil	printf("\n");
73*5d06879aSGeorge V. Neville-Neil	printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
74*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
75*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
76*5d06879aSGeorge V. Neville-Neil	printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
77*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
78*5d06879aSGeorge V. Neville-Neil
79*5d06879aSGeorge V. Neville-Neil}
80*5d06879aSGeorge V. Neville-Neil
81*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-output
82*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/
83*5d06879aSGeorge V. Neville-Neil{
84*5d06879aSGeorge V. Neville-Neil	seq = args[1]->tcp_seq;
85*5d06879aSGeorge V. Neville-Neil	ack = args[1]->tcp_ack;
86*5d06879aSGeorge V. Neville-Neil	len = args[2]->ip_plength - 20;
87*5d06879aSGeorge V. Neville-Neil
88*5d06879aSGeorge V. Neville-Neil	printf("%p %s: output [%x..%x]", arg0,
89*5d06879aSGeorge V. Neville-Neil	       tcp_state_string[args[0]->tcps_state], seq, seq + len);
90*5d06879aSGeorge V. Neville-Neil
91*5d06879aSGeorge V. Neville-Neil	printf("@%x, urp=%x", ack, args[1]->tcp_urgent);
92*5d06879aSGeorge V. Neville-Neil
93*5d06879aSGeorge V. Neville-Neil	printf("%s", flags != 0 ? "<" : "");
94*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_SYN ? "SYN," :"");
95*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_ACK ? "ACK," :"");
96*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_FIN ? "FIN," :"");
97*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_RST ? "RST," :"");
98*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_PUSH ? "PUSH," :"");
99*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_URG ? "URG," :"");
100*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_ECE ? "ECE," :"");
101*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_CWR ? "CWR" :"");
102*5d06879aSGeorge V. Neville-Neil	printf("%s", flags != 0 ? ">" : "");
103*5d06879aSGeorge V. Neville-Neil
104*5d06879aSGeorge V. Neville-Neil	printf("\n");
105*5d06879aSGeorge V. Neville-Neil	printf("\trcv_(nxt,wnd,up) (%u,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
106*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
107*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
108*5d06879aSGeorge V. Neville-Neil	printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
109*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
110*5d06879aSGeorge V. Neville-Neil
111*5d06879aSGeorge V. Neville-Neil}
112*5d06879aSGeorge V. Neville-Neil
113*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-drop
114*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/
115*5d06879aSGeorge V. Neville-Neil{
116*5d06879aSGeorge V. Neville-Neil	printf("%p %s: output [x..x] @%x, urp=%x\n", arg0,
117*5d06879aSGeorge V. Neville-Neil	       tcp_state_string[args[0]->tcps_state],
118*5d06879aSGeorge V. Neville-Neil	       args[1]->tcp_ack,
119*5d06879aSGeorge V. Neville-Neil	       args[1]->tcp_urgent);
120*5d06879aSGeorge V. Neville-Neil
121*5d06879aSGeorge V. Neville-Neil	seq = args[1]->tcp_seq;
122*5d06879aSGeorge V. Neville-Neil	ack = args[1]->tcp_ack;
123*5d06879aSGeorge V. Neville-Neil	len = args[2]->ip_plength;
124*5d06879aSGeorge V. Neville-Neil
125*5d06879aSGeorge V. Neville-Neil	printf("%p %s: drop [%x..%x]", arg0,
126*5d06879aSGeorge V. Neville-Neil	       tcp_state_string[args[0]->tcps_state], seq, seq + len);
127*5d06879aSGeorge V. Neville-Neil
128*5d06879aSGeorge V. Neville-Neil	printf("@%x, urp=%x", ack, args[1]->tcp_urgent);
129*5d06879aSGeorge V. Neville-Neil
130*5d06879aSGeorge V. Neville-Neil	printf("%s", flags != 0 ? "<" : "");
131*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_SYN ? "SYN," :"");
132*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_ACK ? "ACK," :"");
133*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_FIN ? "FIN," :"");
134*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_RST ? "RST," :"");
135*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_PUSH ? "PUSH," :"");
136*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_URG ? "URG," :"");
137*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_ECE ? "ECE," :"");
138*5d06879aSGeorge V. Neville-Neil	printf("%s", flags & TH_CWR ? "CWR" :"");
139*5d06879aSGeorge V. Neville-Neil	printf("%s", flags != 0 ? ">" : "");
140*5d06879aSGeorge V. Neville-Neil
141*5d06879aSGeorge V. Neville-Neil	printf("\n");
142*5d06879aSGeorge V. Neville-Neil	printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
143*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
144*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
145*5d06879aSGeorge V. Neville-Neil	printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
146*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
147*5d06879aSGeorge V. Neville-Neil
148*5d06879aSGeorge V. Neville-Neil}
149*5d06879aSGeorge V. Neville-Neil
150*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-user
151*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/
152*5d06879aSGeorge V. Neville-Neil{
153*5d06879aSGeorge V. Neville-Neil	printf("%p %s: user ", arg0,
154*5d06879aSGeorge V. Neville-Neil	       tcp_state_string[args[0]->tcps_state]);
155*5d06879aSGeorge V. Neville-Neil
156*5d06879aSGeorge V. Neville-Neil	printf("%s", prureq_string[arg1]);
157*5d06879aSGeorge V. Neville-Neil	printf("\n");
158*5d06879aSGeorge V. Neville-Neil	printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
159*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
160*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
161*5d06879aSGeorge V. Neville-Neil	printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
162*5d06879aSGeorge V. Neville-Neil	       args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
163*5d06879aSGeorge V. Neville-Neil
164*5d06879aSGeorge V. Neville-Neil}
165*5d06879aSGeorge V. Neville-Neil
166