xref: /onnv-gate/usr/src/lib/libdtrace/common/tcp.d.in (revision 12507:501806a754d2)
1*12507SAlan.Maguire@Sun.COM/*
2*12507SAlan.Maguire@Sun.COM * CDDL HEADER START
3*12507SAlan.Maguire@Sun.COM *
4*12507SAlan.Maguire@Sun.COM * The contents of this file are subject to the terms of the
5*12507SAlan.Maguire@Sun.COM * Common Development and Distribution License (the "License").
6*12507SAlan.Maguire@Sun.COM * You may not use this file except in compliance with the License.
7*12507SAlan.Maguire@Sun.COM *
8*12507SAlan.Maguire@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*12507SAlan.Maguire@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*12507SAlan.Maguire@Sun.COM * See the License for the specific language governing permissions
11*12507SAlan.Maguire@Sun.COM * and limitations under the License.
12*12507SAlan.Maguire@Sun.COM *
13*12507SAlan.Maguire@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*12507SAlan.Maguire@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*12507SAlan.Maguire@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*12507SAlan.Maguire@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*12507SAlan.Maguire@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*12507SAlan.Maguire@Sun.COM *
19*12507SAlan.Maguire@Sun.COM * CDDL HEADER END
20*12507SAlan.Maguire@Sun.COM */
21*12507SAlan.Maguire@Sun.COM/*
22*12507SAlan.Maguire@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*12507SAlan.Maguire@Sun.COM */
24*12507SAlan.Maguire@Sun.COM
25*12507SAlan.Maguire@Sun.COM#pragma D depends_on module unix
26*12507SAlan.Maguire@Sun.COM#pragma D depends_on provider tcp
27*12507SAlan.Maguire@Sun.COM
28*12507SAlan.Maguire@Sun.COMinline int TH_FIN = @TH_FIN@;
29*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_FIN
30*12507SAlan.Maguire@Sun.COMinline int TH_SYN = @TH_SYN@;
31*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_SYN
32*12507SAlan.Maguire@Sun.COMinline int TH_RST = @TH_RST@;
33*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_RST
34*12507SAlan.Maguire@Sun.COMinline int TH_PUSH = @TH_PUSH@;
35*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_PUSH
36*12507SAlan.Maguire@Sun.COMinline int TH_ACK = @TH_ACK@;
37*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_ACK
38*12507SAlan.Maguire@Sun.COMinline int TH_URG = @TH_URG@;
39*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_URG
40*12507SAlan.Maguire@Sun.COMinline int TH_ECE = @TH_ECE@;
41*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_ECE
42*12507SAlan.Maguire@Sun.COMinline int TH_CWR = @TH_CWR@;
43*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TH_CWR
44*12507SAlan.Maguire@Sun.COM
45*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_CLOSED = @TCPS_CLOSED@;
46*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_CLOSED
47*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_IDLE = @TCPS_IDLE@;
48*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_IDLE
49*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_BOUND = @TCPS_BOUND@;
50*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_BOUND
51*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_LISTEN = @TCPS_LISTEN@;
52*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_LISTEN
53*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_SYN_SENT = @TCPS_SYN_SENT@;
54*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_SYN_SENT
55*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_SYN_RECEIVED = @TCPS_SYN_RCVD@;
56*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_SYN_RECEIVED
57*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_ESTABLISHED = @TCPS_ESTABLISHED@;
58*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_ESTABLISHED
59*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_CLOSE_WAIT = @TCPS_CLOSE_WAIT@;
60*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_CLOSE_WAIT
61*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_FIN_WAIT_1 = @TCPS_FIN_WAIT_1@;
62*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_FIN_WAIT_1
63*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_CLOSING = @TCPS_CLOSING@;
64*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_CLOSING
65*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_LAST_ACK = @TCPS_LAST_ACK@;
66*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_LAST_ACK
67*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_FIN_WAIT_2 = @TCPS_FIN_WAIT_2@;
68*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_FIN_WAIT_2
69*12507SAlan.Maguire@Sun.COMinline int32_t TCP_STATE_TIME_WAIT = @TCPS_TIME_WAIT@;
70*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" TCP_STATE_TIME_WAIT
71*12507SAlan.Maguire@Sun.COM
72*12507SAlan.Maguire@Sun.COM/*
73*12507SAlan.Maguire@Sun.COM * Convert a TCP state value to a string.
74*12507SAlan.Maguire@Sun.COM */
75*12507SAlan.Maguire@Sun.COMinline string tcp_state_string[int32_t state] =
76*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_CLOSED ? "state-closed" :
77*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_IDLE ? "state-idle" :
78*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_BOUND ? "state-bound" :
79*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_LISTEN ? "state-listen" :
80*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_SYN_SENT ? "state-syn-sent" :
81*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_SYN_RECEIVED ? "state-syn-received" :
82*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_ESTABLISHED ? "state-established" :
83*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_CLOSE_WAIT ? "state-close-wait" :
84*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_FIN_WAIT_1 ? "state-fin-wait-1" :
85*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_CLOSING ? "state-closing" :
86*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_LAST_ACK ? "state-last-ack" :
87*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_FIN_WAIT_2 ? "state-fin-wait-2" :
88*12507SAlan.Maguire@Sun.COM	state == TCP_STATE_TIME_WAIT ? "state-time-wait" :
89*12507SAlan.Maguire@Sun.COM	"<unknown>";
90*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" tcp_state_string
91*12507SAlan.Maguire@Sun.COM
92*12507SAlan.Maguire@Sun.COM/*
93*12507SAlan.Maguire@Sun.COM * tcpinfo is the TCP header fields.
94*12507SAlan.Maguire@Sun.COM */
95*12507SAlan.Maguire@Sun.COMtypedef struct tcpinfo {
96*12507SAlan.Maguire@Sun.COM	uint16_t tcp_sport;		/* source port */
97*12507SAlan.Maguire@Sun.COM	uint16_t tcp_dport;		/* destination port */
98*12507SAlan.Maguire@Sun.COM	uint32_t tcp_seq;		/* sequence number */
99*12507SAlan.Maguire@Sun.COM	uint32_t tcp_ack;		/* acknowledgment number */
100*12507SAlan.Maguire@Sun.COM	uint8_t tcp_offset;		/* data offset, in bytes */
101*12507SAlan.Maguire@Sun.COM	uint8_t tcp_flags;		/* flags */
102*12507SAlan.Maguire@Sun.COM	uint16_t tcp_window;		/* window size */
103*12507SAlan.Maguire@Sun.COM	uint16_t tcp_checksum;		/* checksum */
104*12507SAlan.Maguire@Sun.COM	uint16_t tcp_urgent;		/* urgent data pointer */
105*12507SAlan.Maguire@Sun.COM	tcph_t *tcp_hdr;		/* raw TCP header */
106*12507SAlan.Maguire@Sun.COM} tcpinfo_t;
107*12507SAlan.Maguire@Sun.COM
108*12507SAlan.Maguire@Sun.COM/*
109*12507SAlan.Maguire@Sun.COM * tcpsinfo contains stable TCP details from tcp_t.
110*12507SAlan.Maguire@Sun.COM */
111*12507SAlan.Maguire@Sun.COMtypedef struct tcpsinfo {
112*12507SAlan.Maguire@Sun.COM	uintptr_t tcps_addr;
113*12507SAlan.Maguire@Sun.COM	int tcps_local;			/* is delivered locally, boolean */
114*12507SAlan.Maguire@Sun.COM	int tcps_active;		/* active open (from here), boolean */
115*12507SAlan.Maguire@Sun.COM	uint16_t tcps_lport;		/* local port */
116*12507SAlan.Maguire@Sun.COM	uint16_t tcps_rport;		/* remote port */
117*12507SAlan.Maguire@Sun.COM	string tcps_laddr;		/* local address, as a string */
118*12507SAlan.Maguire@Sun.COM	string tcps_raddr;		/* remote address, as a string */
119*12507SAlan.Maguire@Sun.COM	int32_t tcps_state;		/* TCP state */
120*12507SAlan.Maguire@Sun.COM	uint32_t tcps_iss;		/* Initial sequence # sent */
121*12507SAlan.Maguire@Sun.COM	uint32_t tcps_suna;		/* sequence # sent but unacked */
122*12507SAlan.Maguire@Sun.COM	uint32_t tcps_snxt;		/* next sequence # to send */
123*12507SAlan.Maguire@Sun.COM	uint32_t tcps_rack;		/* sequence # we have acked */
124*12507SAlan.Maguire@Sun.COM	uint32_t tcps_rnxt;		/* next sequence # expected */
125*12507SAlan.Maguire@Sun.COM	uint32_t tcps_swnd;		/* send window size */
126*12507SAlan.Maguire@Sun.COM	int32_t tcps_snd_ws;		/* send window scaling */
127*12507SAlan.Maguire@Sun.COM	uint32_t tcps_rwnd;		/* receive window size */
128*12507SAlan.Maguire@Sun.COM	int32_t tcps_rcv_ws;		/* receive window scaling */
129*12507SAlan.Maguire@Sun.COM	uint32_t tcps_cwnd;		/* congestion window */
130*12507SAlan.Maguire@Sun.COM	uint32_t tcps_cwnd_ssthresh;	/* threshold for congestion avoidance */
131*12507SAlan.Maguire@Sun.COM	uint32_t tcps_sack_fack;	/* SACK sequence # we have acked */
132*12507SAlan.Maguire@Sun.COM	uint32_t tcps_sack_snxt;	/* next SACK seq # for retransmission */
133*12507SAlan.Maguire@Sun.COM	uint32_t tcps_rto;		/* round-trip timeout, msec */
134*12507SAlan.Maguire@Sun.COM	uint32_t tcps_mss;		/* max segment size */
135*12507SAlan.Maguire@Sun.COM	int tcps_retransmit;		/* retransmit send event, boolean */
136*12507SAlan.Maguire@Sun.COM} tcpsinfo_t;
137*12507SAlan.Maguire@Sun.COM
138*12507SAlan.Maguire@Sun.COM/*
139*12507SAlan.Maguire@Sun.COM * tcplsinfo provides the old tcp state for state changes.
140*12507SAlan.Maguire@Sun.COM */
141*12507SAlan.Maguire@Sun.COMtypedef struct tcplsinfo {
142*12507SAlan.Maguire@Sun.COM	int32_t tcps_state;		/* previous TCP state */
143*12507SAlan.Maguire@Sun.COM} tcplsinfo_t;
144*12507SAlan.Maguire@Sun.COM
145*12507SAlan.Maguire@Sun.COM/*
146*12507SAlan.Maguire@Sun.COM * __dtrace_tcp_tcph_t is used by the tcpinfo_t * translator to take either
147*12507SAlan.Maguire@Sun.COM * the non-NULL tcph_t * passed in or, if it is NULL, uses arg3 (tcp_t *)
148*12507SAlan.Maguire@Sun.COM * from the tcp:::send and tcp:::recieve probes and translates the tcp_t *
149*12507SAlan.Maguire@Sun.COM * into the tcpinfo_t.  When no headers are available - as is the case for
150*12507SAlan.Maguire@Sun.COM * TCP fusion tcp:::send and tcp:::receive - this allows us to present the
151*12507SAlan.Maguire@Sun.COM * consumer with header data based on tcp_t * content and hide TCP fusion
152*12507SAlan.Maguire@Sun.COM * implementation details.
153*12507SAlan.Maguire@Sun.COM */
154*12507SAlan.Maguire@Sun.COMtypedef tcph_t * __dtrace_tcp_tcph_t;
155*12507SAlan.Maguire@Sun.COM
156*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" translator
157*12507SAlan.Maguire@Sun.COMtranslator tcpinfo_t < tcph_t *T > {
158*12507SAlan.Maguire@Sun.COM	tcp_sport = ntohs(*(uint16_t *)T->th_lport);
159*12507SAlan.Maguire@Sun.COM	tcp_dport = ntohs(*(uint16_t *)T->th_fport);
160*12507SAlan.Maguire@Sun.COM	tcp_seq = ntohl(*(uint32_t *)T->th_seq);
161*12507SAlan.Maguire@Sun.COM	tcp_ack = ntohl(*(uint32_t *)T->th_ack);
162*12507SAlan.Maguire@Sun.COM	tcp_offset = (*(uint8_t *)T->th_offset_and_rsrvd & 0xf0) >> 2;
163*12507SAlan.Maguire@Sun.COM	tcp_flags = *(uint8_t *)T->th_flags;
164*12507SAlan.Maguire@Sun.COM	tcp_window = ntohs(*(uint16_t *)T->th_win);
165*12507SAlan.Maguire@Sun.COM	tcp_checksum = ntohs(*(uint16_t *)T->th_sum);
166*12507SAlan.Maguire@Sun.COM	tcp_urgent = ntohs(*(uint16_t *)T->th_urp);
167*12507SAlan.Maguire@Sun.COM	tcp_hdr = T;
168*12507SAlan.Maguire@Sun.COM};
169*12507SAlan.Maguire@Sun.COM
170*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" translator
171*12507SAlan.Maguire@Sun.COMtranslator tcpinfo_t < __dtrace_tcp_tcph_t *T > {
172*12507SAlan.Maguire@Sun.COM	tcp_sport =
173*12507SAlan.Maguire@Sun.COM	    T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_lport) :
174*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "send" ?
175*12507SAlan.Maguire@Sun.COM	    ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_lport) :
176*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "receive" ?
177*12507SAlan.Maguire@Sun.COM	    ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_fport) :
178*12507SAlan.Maguire@Sun.COM	    0;
179*12507SAlan.Maguire@Sun.COM	tcp_dport =
180*12507SAlan.Maguire@Sun.COM	    T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_fport) :
181*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "send" ?
182*12507SAlan.Maguire@Sun.COM	    ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_fport) :
183*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "receive" ?
184*12507SAlan.Maguire@Sun.COM	    ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_lport) :
185*12507SAlan.Maguire@Sun.COM	    0;
186*12507SAlan.Maguire@Sun.COM	tcp_seq =
187*12507SAlan.Maguire@Sun.COM	    T != NULL ? ntohl(*(uint32_t *)((tcph_t *)T)->th_seq) :
188*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "send" ?
189*12507SAlan.Maguire@Sun.COM	    ((tcp_t *)arg3)->tcp_snxt - ((tcp_t *)arg3)->tcp_last_sent_len :
190*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "receive" ?
191*12507SAlan.Maguire@Sun.COM	    ((tcp_t *)arg3)->tcp_rnxt - ((tcp_t *)arg3)->tcp_last_recv_len :
192*12507SAlan.Maguire@Sun.COM	    0;
193*12507SAlan.Maguire@Sun.COM	tcp_ack =
194*12507SAlan.Maguire@Sun.COM	    T != NULL ? ntohl(*(uint32_t *)((tcph_t *)T)->th_ack) :
195*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "send" ?
196*12507SAlan.Maguire@Sun.COM	    ((tcp_t *)arg3)->tcp_rnxt :
197*12507SAlan.Maguire@Sun.COM	    arg3 != NULL && probename == "receive" ?
198*12507SAlan.Maguire@Sun.COM	    ((tcp_t *)arg3)->tcp_snxt :
199*12507SAlan.Maguire@Sun.COM	    0;
200*12507SAlan.Maguire@Sun.COM	tcp_offset = T != NULL ?
201*12507SAlan.Maguire@Sun.COM	    (*(uint8_t *)((tcph_t *)T)->th_offset_and_rsrvd & 0xf0) >> 2 :
202*12507SAlan.Maguire@Sun.COM	    @TCP_MIN_HEADER_LENGTH@;
203*12507SAlan.Maguire@Sun.COM	tcp_flags = T != NULL ? *(uint8_t *)((tcph_t *)T)->th_flags : TH_ACK;
204*12507SAlan.Maguire@Sun.COM	tcp_window = T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_win) :
205*12507SAlan.Maguire@Sun.COM	    arg3 != NULL ? ((tcp_t *)arg3)->tcp_swnd : 0;
206*12507SAlan.Maguire@Sun.COM	tcp_checksum = T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_sum) :
207*12507SAlan.Maguire@Sun.COM	    0;
208*12507SAlan.Maguire@Sun.COM	tcp_urgent = T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_urp) : 0;
209*12507SAlan.Maguire@Sun.COM	tcp_hdr = NULL;
210*12507SAlan.Maguire@Sun.COM};
211*12507SAlan.Maguire@Sun.COM
212*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" translator
213*12507SAlan.Maguire@Sun.COMtranslator tcpsinfo_t < tcp_t *T > {
214*12507SAlan.Maguire@Sun.COM	tcps_addr = (uintptr_t)T;
215*12507SAlan.Maguire@Sun.COM	/*
216*12507SAlan.Maguire@Sun.COM	 * The following two members should just use tcp_t->tcp_loopback
217*12507SAlan.Maguire@Sun.COM	 * and tcp_t->tcp_active_open, however these are bit fields and
218*12507SAlan.Maguire@Sun.COM	 * can't be used until CR 6876830 is fixed.  Meanwhile we source
219*12507SAlan.Maguire@Sun.COM	 * them a different way.
220*12507SAlan.Maguire@Sun.COM	 */
221*12507SAlan.Maguire@Sun.COM	tcps_local = T ? T->tcp_ipha ?
222*12507SAlan.Maguire@Sun.COM	    T->tcp_ipha->ipha_src == T->tcp_ipha->ipha_dst : 1 : 0;
223*12507SAlan.Maguire@Sun.COM	tcps_active = T ? !T->tcp_saved_listener : 0;
224*12507SAlan.Maguire@Sun.COM	tcps_lport = T ?
225*12507SAlan.Maguire@Sun.COM	    ntohs(T->tcp_connp->u_port.connu_ports.connu_lport) : 0;
226*12507SAlan.Maguire@Sun.COM	tcps_rport = T ?
227*12507SAlan.Maguire@Sun.COM	    ntohs(T->tcp_connp->u_port.connu_ports.connu_fport) : 0;
228*12507SAlan.Maguire@Sun.COM	tcps_laddr = T ?
229*12507SAlan.Maguire@Sun.COM	    inet_ntoa6(&T->tcp_connp->connua_v6addr.connua_laddr) : "<unknown>";
230*12507SAlan.Maguire@Sun.COM	tcps_raddr = T ?
231*12507SAlan.Maguire@Sun.COM	    inet_ntoa6(&T->tcp_connp->connua_v6addr.connua_faddr) : "<unknown>";
232*12507SAlan.Maguire@Sun.COM	tcps_state = T ? T->tcp_state : TCP_STATE_CLOSED;
233*12507SAlan.Maguire@Sun.COM	tcps_iss = T ? T->tcp_iss : 0;
234*12507SAlan.Maguire@Sun.COM	tcps_suna = T ? T->tcp_suna : 0;
235*12507SAlan.Maguire@Sun.COM	tcps_snxt = T ? T->tcp_snxt : 0;
236*12507SAlan.Maguire@Sun.COM	tcps_rack = T ? T->tcp_rack : 0;
237*12507SAlan.Maguire@Sun.COM	tcps_rnxt = T ? T->tcp_rnxt : 0;
238*12507SAlan.Maguire@Sun.COM	tcps_swnd = T ? T->tcp_swnd : 0;
239*12507SAlan.Maguire@Sun.COM	tcps_snd_ws = T ? T->tcp_snd_ws : 0;
240*12507SAlan.Maguire@Sun.COM	tcps_rwnd = T ? T->tcp_rwnd : 0;
241*12507SAlan.Maguire@Sun.COM	tcps_rcv_ws = T ? T->tcp_rcv_ws : 0;
242*12507SAlan.Maguire@Sun.COM	tcps_cwnd = T ? T->tcp_cwnd : 0;
243*12507SAlan.Maguire@Sun.COM	tcps_cwnd_ssthresh = T ? T->tcp_cwnd_ssthresh : 0;
244*12507SAlan.Maguire@Sun.COM	tcps_sack_fack = T ? T->tcp_sack_info.tcp_fack : 0;
245*12507SAlan.Maguire@Sun.COM	tcps_sack_snxt = T ? T->tcp_sack_info.tcp_sack_snxt : 0;
246*12507SAlan.Maguire@Sun.COM	tcps_rto = T ? T->tcp_rto : 0;
247*12507SAlan.Maguire@Sun.COM	tcps_mss = T ? T->tcp_mss : 0;
248*12507SAlan.Maguire@Sun.COM	/*
249*12507SAlan.Maguire@Sun.COM	 * Determine if send is a retransmission by comparing the seq # to
250*12507SAlan.Maguire@Sun.COM	 * tcp_rexmit_nxt/tcp_rexmit_max - if the value is >= rexmit_nxt and
251*12507SAlan.Maguire@Sun.COM	 * < rexmit_max, this is a retransmission.  Cannot use tcp_rexmit
252*12507SAlan.Maguire@Sun.COM	 * bitfield value due to CR 6876830.
253*12507SAlan.Maguire@Sun.COM	 */
254*12507SAlan.Maguire@Sun.COM	tcps_retransmit = T && probename == "send" && arg4 != NULL &&
255*12507SAlan.Maguire@Sun.COM	    ntohl(*(uint32_t *)((tcph_t *)arg4)->th_seq) >= T->tcp_rexmit_nxt &&
256*12507SAlan.Maguire@Sun.COM	    ntohl(*(uint32_t *)((tcph_t *)arg4)->th_seq) <  T->tcp_rexmit_max ?
257*12507SAlan.Maguire@Sun.COM	    1 : 0;
258*12507SAlan.Maguire@Sun.COM};
259*12507SAlan.Maguire@Sun.COM
260*12507SAlan.Maguire@Sun.COM/*
261*12507SAlan.Maguire@Sun.COM * Note: although we specify that the old state argument used as the
262*12507SAlan.Maguire@Sun.COM * input to the tcplsinfo_t translator is an int32_t, it reaches us as an
263*12507SAlan.Maguire@Sun.COM * int64_t (since it is a probe argument) so explicitly cast it back to
264*12507SAlan.Maguire@Sun.COM * interpret the negatively-valued states correctly.
265*12507SAlan.Maguire@Sun.COM */
266*12507SAlan.Maguire@Sun.COM#pragma D binding "1.6.3" translator
267*12507SAlan.Maguire@Sun.COMtranslator tcplsinfo_t < int64_t I > {
268*12507SAlan.Maguire@Sun.COM	tcps_state = (int32_t) I;
269*12507SAlan.Maguire@Sun.COM};
270