tcp.d.in revision 9cd928fe5e3ea4e05f64cfb380beb54b2623e7dc
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * CDDL HEADER START
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * The contents of this file are subject to the terms of the
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * Common Development and Distribution License (the "License").
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * You may not use this file except in compliance with the License.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * See the License for the specific language governing permissions
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * and limitations under the License.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * When distributing Covered Code, include this CDDL HEADER in each
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * If applicable, add the following below this CDDL HEADER, with the
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * fields enclosed by brackets "[]" replaced with your own identifying
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * information: Portions Copyright [yyyy] [name of copyright owner]
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * CDDL HEADER END
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_CLOSED = @TCPS_CLOSED@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_LISTEN = @TCPS_LISTEN@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_SYN_SENT = @TCPS_SYN_SENT@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_SYN_RECEIVED = @TCPS_SYN_RCVD@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire#pragma D binding "1.6.3" TCP_STATE_SYN_RECEIVED
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_ESTABLISHED = @TCPS_ESTABLISHED@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_CLOSE_WAIT = @TCPS_CLOSE_WAIT@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_FIN_WAIT_1 = @TCPS_FIN_WAIT_1@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_CLOSING = @TCPS_CLOSING@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_LAST_ACK = @TCPS_LAST_ACK@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_FIN_WAIT_2 = @TCPS_FIN_WAIT_2@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguireinline int32_t TCP_STATE_TIME_WAIT = @TCPS_TIME_WAIT@;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * Convert a TCP state value to a string.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_SYN_SENT ? "state-syn-sent" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_SYN_RECEIVED ? "state-syn-received" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_ESTABLISHED ? "state-established" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_CLOSE_WAIT ? "state-close-wait" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_FIN_WAIT_1 ? "state-fin-wait-1" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_LAST_ACK ? "state-last-ack" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_FIN_WAIT_2 ? "state-fin-wait-2" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire state == TCP_STATE_TIME_WAIT ? "state-time-wait" :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire "<unknown>";
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * tcpinfo is the TCP header fields.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint8_t tcp_offset; /* data offset, in bytes */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * tcpsinfo contains stable TCP details from tcp_t.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire int tcps_local; /* is delivered locally, boolean */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire int tcps_active; /* active open (from here), boolean */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire string tcps_laddr; /* local address, as a string */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire string tcps_raddr; /* remote address, as a string */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_iss; /* Initial sequence # sent */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_suna; /* sequence # sent but unacked */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_snxt; /* next sequence # to send */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_rack; /* sequence # we have acked */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_rnxt; /* next sequence # expected */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire int32_t tcps_rcv_ws; /* receive window scaling */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_cwnd_ssthresh; /* threshold for congestion avoidance */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_sack_fack; /* SACK sequence # we have acked */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_sack_snxt; /* next SACK seq # for retransmission */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire uint32_t tcps_rto; /* round-trip timeout, msec */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire int tcps_retransmit; /* retransmit send event, boolean */
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * tcplsinfo provides the old tcp state for state changes.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * __dtrace_tcp_tcph_t is used by the tcpinfo_t * translator to take either
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * the non-NULL tcph_t * passed in or, if it is NULL, uses arg3 (tcp_t *)
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * from the tcp:::send and tcp:::recieve probes and translates the tcp_t *
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * into the tcpinfo_t. When no headers are available - as is the case for
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * TCP fusion tcp:::send and tcp:::receive - this allows us to present the
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * consumer with header data based on tcp_t * content and hide TCP fusion
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * implementation details.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcp_offset = (*(uint8_t *)T->th_offset_and_rsrvd & 0xf0) >> 2;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguiretranslator tcpinfo_t < __dtrace_tcp_tcph_t *T > {
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_lport) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_lport) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_fport) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_fport) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_fport) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohs(((tcp_t *)arg3)->tcp_connp->u_port.connu_ports.connu_lport) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire T != NULL ? ntohl(*(uint32_t *)((tcph_t *)T)->th_seq) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ((tcp_t *)arg3)->tcp_snxt - ((tcp_t *)arg3)->tcp_last_sent_len :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ((tcp_t *)arg3)->tcp_rnxt - ((tcp_t *)arg3)->tcp_last_recv_len :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire T != NULL ? ntohl(*(uint32_t *)((tcph_t *)T)->th_ack) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire (*(uint8_t *)((tcph_t *)T)->th_offset_and_rsrvd & 0xf0) >> 2 :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcp_flags = T != NULL ? *(uint8_t *)((tcph_t *)T)->th_flags : TH_ACK;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcp_window = T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_win) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcp_checksum = T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_sum) :
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcp_urgent = T != NULL ? ntohs(*(uint16_t *)((tcph_t *)T)->th_urp) : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * The following two members should just use tcp_t->tcp_loopback
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * and tcp_t->tcp_active_open, however these are bit fields and
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * can't be used until CR 6876830 is fixed. Meanwhile we source
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * them a different way.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire T->tcp_ipha->ipha_src == T->tcp_ipha->ipha_dst : 1 : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohs(T->tcp_connp->u_port.connu_ports.connu_lport) : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohs(T->tcp_connp->u_port.connu_ports.connu_fport) : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire inet_ntoa6(&T->tcp_connp->connua_v6addr.connua_laddr) : "<unknown>";
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire inet_ntoa6(&T->tcp_connp->connua_v6addr.connua_faddr) : "<unknown>";
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcps_state = T ? T->tcp_state : TCP_STATE_CLOSED;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcps_cwnd_ssthresh = T ? T->tcp_cwnd_ssthresh : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcps_sack_fack = T ? T->tcp_sack_info.tcp_fack : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcps_sack_snxt = T ? T->tcp_sack_info.tcp_sack_snxt : 0;
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * Determine if send is a retransmission by comparing the seq # to
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * tcp_rexmit_nxt/tcp_rexmit_max - if the value is >= rexmit_nxt and
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * < rexmit_max, this is a retransmission. Cannot use tcp_rexmit
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * bitfield value due to CR 6876830.
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire tcps_retransmit = T && probename == "send" && arg4 != NULL &&
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohl(*(uint32_t *)((tcph_t *)arg4)->th_seq) >= T->tcp_rexmit_nxt &&
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire ntohl(*(uint32_t *)((tcph_t *)arg4)->th_seq) < T->tcp_rexmit_max ?
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * Note: although we specify that the old state argument used as the
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * input to the tcplsinfo_t translator is an int32_t, it reaches us as an
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * int64_t (since it is a probe argument) so explicitly cast it back to
9cd928fe5e3ea4e05f64cfb380beb54b2623e7dcAlan Maguire * interpret the negatively-valued states correctly.