xref: /onnv-gate/usr/src/cmd/dtrace/demo/ip/tcprst.d (revision 7502:da077e5d991e)
1*7502Saruna@cs.umn.edu #!/usr/sbin/dtrace -Cqs
2*7502Saruna@cs.umn.edu /*
3*7502Saruna@cs.umn.edu  * CDDL HEADER START
4*7502Saruna@cs.umn.edu  *
5*7502Saruna@cs.umn.edu  * The contents of this file are subject to the terms of the
6*7502Saruna@cs.umn.edu  * Common Development and Distribution License (the "License").
7*7502Saruna@cs.umn.edu  * You may not use this file except in compliance with the License.
8*7502Saruna@cs.umn.edu  *
9*7502Saruna@cs.umn.edu  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7502Saruna@cs.umn.edu  * or http://www.opensolaris.org/os/licensing.
11*7502Saruna@cs.umn.edu  * See the License for the specific language governing permissions
12*7502Saruna@cs.umn.edu  * and limitations under the License.
13*7502Saruna@cs.umn.edu  *
14*7502Saruna@cs.umn.edu  * When distributing Covered Code, include this CDDL HEADER in each
15*7502Saruna@cs.umn.edu  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7502Saruna@cs.umn.edu  * If applicable, add the following below this CDDL HEADER, with the
17*7502Saruna@cs.umn.edu  * fields enclosed by brackets "[]" replaced with your own identifying
18*7502Saruna@cs.umn.edu  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7502Saruna@cs.umn.edu  *
20*7502Saruna@cs.umn.edu  * CDDL HEADER END
21*7502Saruna@cs.umn.edu  */
22*7502Saruna@cs.umn.edu /*
23*7502Saruna@cs.umn.edu  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24*7502Saruna@cs.umn.edu  * Use is subject to license terms.
25*7502Saruna@cs.umn.edu  */
26*7502Saruna@cs.umn.edu 
27*7502Saruna@cs.umn.edu #pragma D option dynvarsize=64m
28*7502Saruna@cs.umn.edu 
29*7502Saruna@cs.umn.edu #define TH_RST		0x04
30*7502Saruna@cs.umn.edu #define MAX_RECORDS	10
31*7502Saruna@cs.umn.edu #define M_CTL		0x0d
32*7502Saruna@cs.umn.edu 
33*7502Saruna@cs.umn.edu #define PRINT_MAIN_HEADER()						\
34*7502Saruna@cs.umn.edu 	(printf("\n%-25s %-6s %-25s %-6s %-10s %-10s %8s %8s\n",	\
35*7502Saruna@cs.umn.edu 	    "LADDR", "LPORT", "RADDR", "RPORT", "ISS", "IRS",		\
36*7502Saruna@cs.umn.edu 	    "SND_CNT", "RCV_CNT"))
37*7502Saruna@cs.umn.edu 
38*7502Saruna@cs.umn.edu #define PRINT_RECORD_HEADER()						\
39*7502Saruna@cs.umn.edu 	(printf("%-20s %-20s %-3s %15s %15s %8s %8s %5s\n",		\
40*7502Saruna@cs.umn.edu 	    "PROBENAME", "TIME", "S/R", "SEQ", "ACK", "DATALEN",	\
41*7502Saruna@cs.umn.edu 	    "WND", "FLAGS"))
42*7502Saruna@cs.umn.edu 
43*7502Saruna@cs.umn.edu #define PRINT_MAIN_HEADER_VALUES()					\
44*7502Saruna@cs.umn.edu 	(printf("%-25s %-6d %-25s %-6d %-10d %-10d %8d %8d\n",		\
45*7502Saruna@cs.umn.edu 	    laddr[self->conn_id], lport[self->conn_id],			\
46*7502Saruna@cs.umn.edu 	    faddr[self->conn_id], fport[self->conn_id],			\
47*7502Saruna@cs.umn.edu 	    iss[self->conn_id], irs[self->conn_id],			\
48*7502Saruna@cs.umn.edu 	    send_count[self->conn_id], recv_count[self->conn_id]))
49*7502Saruna@cs.umn.edu 
50*7502Saruna@cs.umn.edu #define PRINT_HEADER()							\
51*7502Saruna@cs.umn.edu 	PRINT_MAIN_HEADER(); PRINT_MAIN_HEADER_VALUES();		\
52*7502Saruna@cs.umn.edu 	    PRINT_RECORD_HEADER()
53*7502Saruna@cs.umn.edu 
54*7502Saruna@cs.umn.edu #define PRINT_RECORD(i)							\
55*7502Saruna@cs.umn.edu 	(printf("%-20s %-20Y %-3s %15d %15d %8d %8d %2x\n",		\
56*7502Saruna@cs.umn.edu 	    probe_name[self->conn_id, i],				\
57*7502Saruna@cs.umn.edu 	    conn_time[self->conn_id, i],				\
58*7502Saruna@cs.umn.edu 	    send_recv[self->conn_id, i],				\
59*7502Saruna@cs.umn.edu 	    seqno[self->conn_id, i],					\
60*7502Saruna@cs.umn.edu 	    ack[self->conn_id, i],					\
61*7502Saruna@cs.umn.edu 	    datalen[self->conn_id, i],					\
62*7502Saruna@cs.umn.edu 	    wnd[self->conn_id, i],					\
63*7502Saruna@cs.umn.edu 	    flags[self->conn_id, i]))
64*7502Saruna@cs.umn.edu 
65*7502Saruna@cs.umn.edu tcp-trace-*
66*7502Saruna@cs.umn.edu {
67*7502Saruna@cs.umn.edu 	/* extract connection details */
68*7502Saruna@cs.umn.edu 
69*7502Saruna@cs.umn.edu 	this->mp = (mblk_t *)arg0;
70*7502Saruna@cs.umn.edu 	this->mp = (this->mp->b_datap->db_type == M_CTL?
71*7502Saruna@cs.umn.edu 	    this->mp->b_cont : this->mp);
72*7502Saruna@cs.umn.edu 	self->tcpp = (tcp_t *)arg1;
73*7502Saruna@cs.umn.edu 	this->connp = (conn_t *)self->tcpp->tcp_connp;
74*7502Saruna@cs.umn.edu 
75*7502Saruna@cs.umn.edu 	self->iph = (ipha_t *)this->mp->b_rptr;
76*7502Saruna@cs.umn.edu 	this->iph_length =
77*7502Saruna@cs.umn.edu 	    (int)(((ipha_t *)self->iph)->ipha_version_and_hdr_length
78*7502Saruna@cs.umn.edu 	    & 0xF) << 2;
79*7502Saruna@cs.umn.edu 	self->tcph = (tcpha_t *)((char *)self->iph + this->iph_length);
80*7502Saruna@cs.umn.edu 	this->tcph_length =
81*7502Saruna@cs.umn.edu 	    (((tcph_t *)self->tcph)->th_offset_and_rsrvd[0] >>2) &(0xF << 2);
82*7502Saruna@cs.umn.edu 
83*7502Saruna@cs.umn.edu 	/* ports */
84*7502Saruna@cs.umn.edu 	self->i_lport = ntohs(this->connp->u_port.tcpu_ports.tcpu_lport);
85*7502Saruna@cs.umn.edu 	self->i_fport = ntohs(this->connp->u_port.tcpu_ports.tcpu_fport);
86*7502Saruna@cs.umn.edu 
87*7502Saruna@cs.umn.edu 	/* IP addresses */
88*7502Saruna@cs.umn.edu 	this->i_fad = (in6_addr_t *)&this->connp->connua_v6addr.connua_faddr;
89*7502Saruna@cs.umn.edu 	this->i_lad = (in6_addr_t *)&this->connp->connua_v6addr.connua_laddr;
90*7502Saruna@cs.umn.edu 
91*7502Saruna@cs.umn.edu 	/* the address would either be IPv6 or IPv4-mapped-IPv6  */
92*7502Saruna@cs.umn.edu 	self->i_faddr = inet_ntop(AF_INET6, (void *)this->i_fad);
93*7502Saruna@cs.umn.edu 	self->i_laddr = inet_ntop(AF_INET6, (void *)this->i_lad);
94*7502Saruna@cs.umn.edu 
95*7502Saruna@cs.umn.edu 	/* create connection identifier, so we can track packets by conn */
96*7502Saruna@cs.umn.edu 	self->conn_id = (uint64_t)self->tcpp->tcp_connp;
97*7502Saruna@cs.umn.edu }
98*7502Saruna@cs.umn.edu 
99*7502Saruna@cs.umn.edu tcp-trace-*
100*7502Saruna@cs.umn.edu /first[self->conn_id] == 0/
101*7502Saruna@cs.umn.edu {
102*7502Saruna@cs.umn.edu 	/* initialize counters - this is the first packet for this connection */
103*7502Saruna@cs.umn.edu 	pcount[self->conn_id] = -1;
104*7502Saruna@cs.umn.edu 	rollover[self->conn_id] = 0;
105*7502Saruna@cs.umn.edu 	end_ptr[self->conn_id] = 0;
106*7502Saruna@cs.umn.edu 	num[self->conn_id] = 0;
107*7502Saruna@cs.umn.edu 
108*7502Saruna@cs.umn.edu 	first[self->conn_id] = 1;
109*7502Saruna@cs.umn.edu 
110*7502Saruna@cs.umn.edu 	/* connection info */
111*7502Saruna@cs.umn.edu 	laddr[self->conn_id] = self->i_laddr;
112*7502Saruna@cs.umn.edu 	faddr[self->conn_id] = self->i_faddr;
113*7502Saruna@cs.umn.edu 	lport[self->conn_id] = self->i_lport;
114*7502Saruna@cs.umn.edu 	fport[self->conn_id] = self->i_fport;
115*7502Saruna@cs.umn.edu 	iss[self->conn_id] = self->tcpp->tcp_iss;
116*7502Saruna@cs.umn.edu 	irs[self->conn_id] = self->tcpp->tcp_irs;
117*7502Saruna@cs.umn.edu 
118*7502Saruna@cs.umn.edu }
119*7502Saruna@cs.umn.edu 
120*7502Saruna@cs.umn.edu tcp-trace-*
121*7502Saruna@cs.umn.edu {
122*7502Saruna@cs.umn.edu 	/* counters, to keep track of how much info to dump */
123*7502Saruna@cs.umn.edu 	pcount[self->conn_id]++;
124*7502Saruna@cs.umn.edu 	rollover[self->conn_id] |= pcount[self->conn_id]/MAX_RECORDS;
125*7502Saruna@cs.umn.edu 	pcount[self->conn_id] = pcount[self->conn_id]%MAX_RECORDS;
126*7502Saruna@cs.umn.edu 	self->pcount = pcount[self->conn_id];
127*7502Saruna@cs.umn.edu 	end_ptr[self->conn_id] = self->pcount;
128*7502Saruna@cs.umn.edu 	num[self->conn_id] = (rollover[self->conn_id]?
129*7502Saruna@cs.umn.edu 	    MAX_RECORDS : pcount[self->conn_id] + 1);
130*7502Saruna@cs.umn.edu 	conn_time[self->conn_id, self->pcount] = walltimestamp;
131*7502Saruna@cs.umn.edu 
132*7502Saruna@cs.umn.edu 	/* tcp state info */
133*7502Saruna@cs.umn.edu 	seqno[self->conn_id, self->pcount] = ntohl(self->tcph->tha_seq);
134*7502Saruna@cs.umn.edu 	ack[self->conn_id, self->pcount] = ntohl(self->tcph->tha_ack);
135*7502Saruna@cs.umn.edu 	datalen[self->conn_id, self->pcount] =  ntohs(self->iph->ipha_length);
136*7502Saruna@cs.umn.edu 	wnd[self->conn_id, self->pcount] =  ntohs(self->tcph->tha_win);
137*7502Saruna@cs.umn.edu 	probe_name[self->conn_id, self->pcount] = probename;
138*7502Saruna@cs.umn.edu 
139*7502Saruna@cs.umn.edu 	/* flag 0x04 indicates a RST packet */
140*7502Saruna@cs.umn.edu 	flags[self->conn_id, self->pcount] = self->tcph->tha_flags;
141*7502Saruna@cs.umn.edu 	self->flags = self->tcph->tha_flags;
142*7502Saruna@cs.umn.edu }
143*7502Saruna@cs.umn.edu 
144*7502Saruna@cs.umn.edu tcp-trace-send
145*7502Saruna@cs.umn.edu {
146*7502Saruna@cs.umn.edu 	send_count[self->conn_id]++;
147*7502Saruna@cs.umn.edu 	send_recv[self->conn_id, self->pcount] = "S";
148*7502Saruna@cs.umn.edu }
149*7502Saruna@cs.umn.edu 
150*7502Saruna@cs.umn.edu tcp-trace-recv
151*7502Saruna@cs.umn.edu {
152*7502Saruna@cs.umn.edu 	recv_count[self->conn_id]++;
153*7502Saruna@cs.umn.edu 	send_recv[self->conn_id, self->pcount] = "R";
154*7502Saruna@cs.umn.edu }
155*7502Saruna@cs.umn.edu 
156*7502Saruna@cs.umn.edu tcp-trace-*
157*7502Saruna@cs.umn.edu /(self->flags & TH_RST)/
158*7502Saruna@cs.umn.edu {
159*7502Saruna@cs.umn.edu 	PRINT_HEADER();
160*7502Saruna@cs.umn.edu 
161*7502Saruna@cs.umn.edu 	self->i = (end_ptr[self->conn_id] + MAX_RECORDS - num[self->conn_id]
162*7502Saruna@cs.umn.edu 	    + 1)%MAX_RECORDS;
163*7502Saruna@cs.umn.edu }
164*7502Saruna@cs.umn.edu 
165*7502Saruna@cs.umn.edu tcp-trace-*
166*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 10)/
167*7502Saruna@cs.umn.edu {
168*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
169*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
170*7502Saruna@cs.umn.edu 
171*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
172*7502Saruna@cs.umn.edu }
173*7502Saruna@cs.umn.edu 
174*7502Saruna@cs.umn.edu tcp-trace-*
175*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 9)/
176*7502Saruna@cs.umn.edu {
177*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
178*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
179*7502Saruna@cs.umn.edu 
180*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
181*7502Saruna@cs.umn.edu }
182*7502Saruna@cs.umn.edu 
183*7502Saruna@cs.umn.edu tcp-trace-*
184*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 8)/
185*7502Saruna@cs.umn.edu {
186*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
187*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
188*7502Saruna@cs.umn.edu 
189*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
190*7502Saruna@cs.umn.edu }
191*7502Saruna@cs.umn.edu 
192*7502Saruna@cs.umn.edu tcp-trace-*
193*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 7)/
194*7502Saruna@cs.umn.edu {
195*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
196*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
197*7502Saruna@cs.umn.edu 
198*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
199*7502Saruna@cs.umn.edu }
200*7502Saruna@cs.umn.edu 
201*7502Saruna@cs.umn.edu tcp-trace-*
202*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 6)/
203*7502Saruna@cs.umn.edu {
204*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
205*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
206*7502Saruna@cs.umn.edu 
207*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
208*7502Saruna@cs.umn.edu }
209*7502Saruna@cs.umn.edu 
210*7502Saruna@cs.umn.edu tcp-trace-*
211*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 5)/
212*7502Saruna@cs.umn.edu {
213*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
214*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
215*7502Saruna@cs.umn.edu 
216*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
217*7502Saruna@cs.umn.edu }
218*7502Saruna@cs.umn.edu 
219*7502Saruna@cs.umn.edu tcp-trace-*
220*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 4)/
221*7502Saruna@cs.umn.edu {
222*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
223*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
224*7502Saruna@cs.umn.edu 
225*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
226*7502Saruna@cs.umn.edu }
227*7502Saruna@cs.umn.edu 
228*7502Saruna@cs.umn.edu tcp-trace-*
229*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 3)/
230*7502Saruna@cs.umn.edu {
231*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
232*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
233*7502Saruna@cs.umn.edu 
234*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
235*7502Saruna@cs.umn.edu }
236*7502Saruna@cs.umn.edu 
237*7502Saruna@cs.umn.edu tcp-trace-*
238*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 2)/
239*7502Saruna@cs.umn.edu {
240*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
241*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
242*7502Saruna@cs.umn.edu 
243*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
244*7502Saruna@cs.umn.edu }
245*7502Saruna@cs.umn.edu 
246*7502Saruna@cs.umn.edu tcp-trace-*
247*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 1)/
248*7502Saruna@cs.umn.edu {
249*7502Saruna@cs.umn.edu 	PRINT_RECORD(self->i);
250*7502Saruna@cs.umn.edu 	self->i = (self->i + 1)%MAX_RECORDS;
251*7502Saruna@cs.umn.edu 
252*7502Saruna@cs.umn.edu 	num[self->conn_id]--;
253*7502Saruna@cs.umn.edu 	self->reset = self->conn_id;
254*7502Saruna@cs.umn.edu }
255*7502Saruna@cs.umn.edu 
256*7502Saruna@cs.umn.edu tcp-trace-*
257*7502Saruna@cs.umn.edu /self->reset/
258*7502Saruna@cs.umn.edu {
259*7502Saruna@cs.umn.edu 	pcount[self->reset] = -1;
260*7502Saruna@cs.umn.edu 	rollover[self->reset] = 0;
261*7502Saruna@cs.umn.edu 	end_ptr[self->reset] = 0;
262*7502Saruna@cs.umn.edu 	num[self->reset] = 0;
263*7502Saruna@cs.umn.edu 
264*7502Saruna@cs.umn.edu 	self->reset = 0;
265*7502Saruna@cs.umn.edu }
266*7502Saruna@cs.umn.edu 
267*7502Saruna@cs.umn.edu conn-destroy
268*7502Saruna@cs.umn.edu {
269*7502Saruna@cs.umn.edu 	/* clear old connection state */
270*7502Saruna@cs.umn.edu 	this->conn_id = (uint64_t)arg0;
271*7502Saruna@cs.umn.edu 
272*7502Saruna@cs.umn.edu 	pcount[this->conn_id] = -1;
273*7502Saruna@cs.umn.edu 	rollover[this->conn_id] = 0;
274*7502Saruna@cs.umn.edu 	end_ptr[this->conn_id] = 0;
275*7502Saruna@cs.umn.edu 	num[this->conn_id] = 0;
276*7502Saruna@cs.umn.edu 	first[this->conn_id] = 0;
277*7502Saruna@cs.umn.edu 
278*7502Saruna@cs.umn.edu 	laddr[this->conn_id] = 0;
279*7502Saruna@cs.umn.edu 	faddr[this->conn_id] = 0;
280*7502Saruna@cs.umn.edu 	lport[this->conn_id] = 0;
281*7502Saruna@cs.umn.edu 	fport[this->conn_id] = 0;
282*7502Saruna@cs.umn.edu 	iss[this->conn_id] = 0;
283*7502Saruna@cs.umn.edu 	irs[this->conn_id] = 0;
284*7502Saruna@cs.umn.edu }
285