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