freebsd-nq/cddl/lib/libdtrace/sctp.d
Michael Tuexen 1e88cc8b59 Add support for send, receive and state-change DTrace providers for
SCTP. They are based on what is specified in the Solaris DTrace manual
for Solaris 11.4.

Reviewed by:		0mp, dteske, markj
Relnotes:		yes
Differential Revision:	https://reviews.freebsd.org/D16839
2018-08-22 21:23:32 +00:00

172 lines
6.9 KiB
D

/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* $FreeBSD$
*/
/*
* Copyright (c) 2018 Michael Tuexen <tuexen@FreeBSD.org>
*/
#pragma D depends_on library ip.d
#pragma D depends_on library socket.d
#pragma D depends_on module kernel
#pragma D depends_on provider sctp
#pragma D binding "1.13" SCTP_STATE_MASK
inline int32_t SCTP_STATE_MASK = 0x0000007f;
#pragma D binding "1.13" SCTP_STATE_SHUTDOWN_PENDING
inline int32_t SCTP_STATE_SHUTDOWN_PENDING = 0x00000080;
#pragma D binding "1.13" SCTP_STATE_CLOSED_SOCKET
inline int32_t SCTP_STATE_CLOSED_SOCKET = 0x00000100;
#pragma D binding "1.13" SCTP_STATE_ABOUT_TO_BE_FREED
inline int32_t SCTP_STATE_ABOUT_TO_BE_FREED = 0x00000200;
#pragma D binding "1.13" SCTP_STATE_ABOUT_TO_BE_FREED
inline int32_t SCTP_STATE_PARTIAL_MSG_LEFT = 0x00000400;
#pragma D binding "1.13" SCTP_STATE_PARTIAL_MSG_LEFT
inline int32_t SCTP_STATE_WAS_ABORTED = 0x00000800;
#pragma D binding "1.13" SCTP_STATE_IN_ACCEPT_QUEUE
inline int32_t SCTP_STATE_IN_ACCEPT_QUEUE = 0x00001000;
#pragma D binding "1.13" SCTP_STATE_BOUND
inline int32_t SCTP_STATE_BOUND = 0x00001000;
#pragma D binding "1.13" SCTP_STATE_EMPTY
inline int32_t SCTP_STATE_EMPTY = 0x00000000;
#pragma D binding "1.13" SCTP_STATE_CLOSED
inline int32_t SCTP_STATE_CLOSED = 0x00000000;
#pragma D binding "1.13" SCTP_STATE_INUSE
inline int32_t SCTP_STATE_INUSE = 0x00000001;
#pragma D binding "1.13" SCTP_STATE_COOKIE_WAIT
inline int32_t SCTP_STATE_COOKIE_WAIT = 0x00000002;
#pragma D binding "1.13" SCTP_STATE_COOKIE_ECHOED
inline int32_t SCTP_STATE_COOKIE_ECHOED = 0x00000004;
#pragma D binding "1.13" SCTP_STATE_ESTABLISHED
inline int32_t SCTP_STATE_ESTABLISHED = 0x00000008;
#pragma D binding "1.13" SCTP_STATE_OPEN
inline int32_t SCTP_STATE_OPEN = 0x00000008;
#pragma D binding "1.13" SCTP_STATE_SHUTDOWN_SENT
inline int32_t SCTP_STATE_SHUTDOWN_SENT = 0x00000010;
#pragma D binding "1.13" SCTP_STATE_SHUTDOWN_RECEIVED
inline int32_t SCTP_STATE_SHUTDOWN_RECEIVED = 0x00000020;
#pragma D binding "1.13" SCTP_STATE_SHUTDOWN_ACK_SENT
inline int32_t SCTP_STATE_SHUTDOWN_ACK_SENT = 0x00000040;
/* SCTP association state strings. */
#pragma D binding "1.13" sctp_state_string
inline string sctp_state_string[int32_t state] =
state & SCTP_STATE_ABOUT_TO_BE_FREED ? "state-closed" :
state & SCTP_STATE_SHUTDOWN_PENDING ? "state-shutdown-pending" :
(state & SCTP_STATE_MASK) == SCTP_STATE_EMPTY ? "state-closed" :
(state & SCTP_STATE_MASK) == SCTP_STATE_INUSE ? "state-closed" :
(state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT ? "state-cookie-wait" :
(state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED ? "state-cookie-echoed" :
(state & SCTP_STATE_MASK) == SCTP_STATE_OPEN ? "state-established" :
(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_SENT ? "state-shutdown-sent" :
(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_RECEIVED ? "state-shutdown-received" :
(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_ACK_SENT ? "state-shutdown-ack-sent" :
"<unknown>";
/*
* sctpsinfo contains stable SCTP details.
*/
typedef struct sctpsinfo {
uintptr_t sctps_addr; /* pointer to struct sctp_tcb */
int sctps_num_raddrs; /* number of remote addresses */
uintptr_t sctps_raddrs; /* pointer to struct sctp_nets */
int sctps_num_laddrs; /* number of local addresses */
uintptr_t sctps_laddrs; /* pointer to struct sctp_laddr */
uint16_t sctps_lport; /* local port */
uint16_t sctps_rport; /* remote port */
string sctps_laddr; /* local address, as a string */
string sctps_raddr; /* remote address, as a string */
int32_t sctps_state;
} sctpsinfo_t;
/*
* sctplsinfo provides the old SCTP state for state changes.
*/
typedef struct sctplsinfo {
int32_t sctps_state; /* previous SCTP state */
} sctplsinfo_t;
/*
* sctpinfo is the SCTP header fields.
*/
typedef struct sctpinfo {
uint16_t sctp_sport; /* source port */
uint16_t sctp_dport; /* destination port */
uint32_t sctp_verify; /* verification tag */
uint32_t sctp_checksum; /* CRC32C of the SCTP packet */
struct sctphdr *sctp_hdr; /* raw SCTP header */
} sctpinfo_t;
#pragma D binding "1.13" translator
translator csinfo_t < struct sctp_tcb *p > {
cs_addr = NULL;
cs_cid = (uint64_t)p;
cs_pid = 0;
cs_zoneid = 0;
};
#pragma D binding "1.13" translator
translator sctpsinfo_t < struct sctp_tcb *p > {
sctps_addr = (uintptr_t)p;
sctps_num_raddrs = p == NULL ? -1 : p->asoc.numnets;
sctps_raddrs = p == NULL ? NULL : (uintptr_t)(p->asoc.nets.tqh_first);
sctps_num_laddrs = p == NULL ? -1 :
p->sctp_ep == NULL ? -1 :
p->sctp_ep->laddr_count;
sctps_laddrs = p == NULL ? NULL :
p->sctp_ep == NULL ? NULL :
(uintptr_t)(p->sctp_ep->sctp_addr_list.lh_first);
sctps_lport = p == NULL ? 0 :
p->sctp_ep == NULL ? 0 :
ntohs(p->sctp_ep->ip_inp.inp.inp_inc.inc_ie.ie_lport);
sctps_rport = p == NULL ? 0 : ntohs(p->rport);
sctps_laddr = p == NULL ? "<unknown>" :
p->asoc.primary_destination == NULL ? "<unknown>" :
p->asoc.primary_destination->ro._s_addr == NULL ? "<unknown>" :
p->asoc.primary_destination->ro._s_addr->address.sa.sa_family == AF_INET ?
inet_ntoa(&p->asoc.primary_destination->ro._s_addr->address.sin.sin_addr.s_addr) :
p->asoc.primary_destination->ro._s_addr->address.sa.sa_family == AF_INET6 ?
inet_ntoa6(&p->asoc.primary_destination->ro._s_addr->address.sin6.sin6_addr) :
"<unknown>";
sctps_raddr = p == NULL ? "<unknown>" :
p->asoc.primary_destination == NULL ? "<unknown>" :
p->asoc.primary_destination->ro._l_addr.sa.sa_family == AF_INET ?
inet_ntoa(&p->asoc.primary_destination->ro._l_addr.sin.sin_addr.s_addr) :
p->asoc.primary_destination->ro._l_addr.sa.sa_family == AF_INET6 ?
inet_ntoa6(&p->asoc.primary_destination->ro._l_addr.sin6.sin6_addr) :
"<unknown>";
sctps_state = p == NULL ? SCTP_STATE_CLOSED : p->asoc.state;
};
#pragma D binding "1.13" translator
translator sctpinfo_t < struct sctphdr *p > {
sctp_sport = p == NULL ? 0 : ntohs(p->src_port);
sctp_dport = p == NULL ? 0 : ntohs(p->dest_port);
sctp_verify = p == NULL ? 0 : ntohl(p->v_tag);
sctp_checksum = p == NULL ? 0 : ntohl(p->checksum);
sctp_hdr = p;
};
#pragma D binding "1.13" translator
translator sctplsinfo_t < int state > {
sctps_state = state;
};