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