xref: /freebsd/cddl/lib/libdtrace/sctp.d (revision 783d3ff6d7fae619db8a7990b8a6387de0c677b5)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2018 Michael Tuexen <tuexen@FreeBSD.org>
23  */
24 
25 #pragma D depends_on library ip.d
26 #pragma D depends_on library socket.d
27 #pragma D depends_on module kernel
28 #pragma D depends_on provider sctp
29 
30 #pragma D binding "1.13" SCTP_STATE_MASK
31 inline int32_t SCTP_STATE_MASK =		0x0000007f;
32 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_PENDING
33 inline int32_t SCTP_STATE_SHUTDOWN_PENDING =	0x00000080;
34 #pragma D binding "1.13" SCTP_STATE_CLOSED_SOCKET
35 inline int32_t SCTP_STATE_CLOSED_SOCKET =	0x00000100;
36 #pragma D binding "1.13" SCTP_STATE_ABOUT_TO_BE_FREED
37 inline int32_t SCTP_STATE_ABOUT_TO_BE_FREED =	0x00000200;
38 #pragma D binding "1.13" SCTP_STATE_ABOUT_TO_BE_FREED
39 inline int32_t SCTP_STATE_PARTIAL_MSG_LEFT =	0x00000400;
40 #pragma D binding "1.13" SCTP_STATE_PARTIAL_MSG_LEFT
41 inline int32_t SCTP_STATE_WAS_ABORTED =		0x00000800;
42 #pragma D binding "1.13" SCTP_STATE_IN_ACCEPT_QUEUE
43 inline int32_t SCTP_STATE_IN_ACCEPT_QUEUE =	0x00001000;
44 #pragma D binding "1.13" SCTP_STATE_BOUND
45 inline int32_t SCTP_STATE_BOUND =		0x00001000;
46 #pragma D binding "1.13" SCTP_STATE_EMPTY
47 inline int32_t SCTP_STATE_EMPTY =		0x00000000;
48 #pragma D binding "1.13" SCTP_STATE_CLOSED
49 inline int32_t SCTP_STATE_CLOSED =		0x00000000;
50 #pragma D binding "1.13" SCTP_STATE_INUSE
51 inline int32_t SCTP_STATE_INUSE =		0x00000001;
52 #pragma D binding "1.13" SCTP_STATE_COOKIE_WAIT
53 inline int32_t SCTP_STATE_COOKIE_WAIT =		0x00000002;
54 #pragma D binding "1.13" SCTP_STATE_COOKIE_ECHOED
55 inline int32_t SCTP_STATE_COOKIE_ECHOED =	0x00000004;
56 #pragma D binding "1.13" SCTP_STATE_ESTABLISHED
57 inline int32_t SCTP_STATE_ESTABLISHED =		0x00000008;
58 #pragma D binding "1.13" SCTP_STATE_OPEN
59 inline int32_t SCTP_STATE_OPEN =		0x00000008;
60 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_SENT
61 inline int32_t SCTP_STATE_SHUTDOWN_SENT =	0x00000010;
62 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_RECEIVED
63 inline int32_t SCTP_STATE_SHUTDOWN_RECEIVED =	0x00000020;
64 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_ACK_SENT
65 inline int32_t SCTP_STATE_SHUTDOWN_ACK_SENT =	0x00000040;
66 
67 /* SCTP association state strings. */
68 #pragma D binding "1.13" sctp_state_string
69 inline string sctp_state_string[int32_t state] =
70 	state & SCTP_STATE_ABOUT_TO_BE_FREED ?				"state-closed" :
71 	state & SCTP_STATE_SHUTDOWN_PENDING ?				"state-shutdown-pending" :
72 	(state & SCTP_STATE_MASK) == SCTP_STATE_EMPTY ?			"state-closed" :
73 	(state & SCTP_STATE_MASK) == SCTP_STATE_INUSE ?			"state-closed" :
74 	(state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT ?		"state-cookie-wait" :
75 	(state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED ?		"state-cookie-echoed" :
76 	(state & SCTP_STATE_MASK) == SCTP_STATE_OPEN ?			"state-established" :
77 	(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_SENT ?		"state-shutdown-sent" :
78 	(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_RECEIVED ?	"state-shutdown-received" :
79 	(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_ACK_SENT ?	"state-shutdown-ack-sent" :
80 	"<unknown>";
81 
82 /*
83  * sctpsinfo contains stable SCTP details.
84  */
85 typedef struct sctpsinfo {
86 	uintptr_t sctps_addr;			/* pointer to struct sctp_tcb */
87 	int sctps_num_raddrs;			/* number of remote addresses */
88 	uintptr_t sctps_raddrs;			/* pointer to struct sctp_nets */
89 	int sctps_num_laddrs;			/* number of local addresses */
90 	uintptr_t sctps_laddrs;			/* pointer to struct sctp_laddr */
91 	uint16_t sctps_lport;			/* local port */
92 	uint16_t sctps_rport;			/* remote port */
93 	string sctps_laddr;			/* local address, as a string */
94 	string sctps_raddr;			/* remote address, as a string */
95 	int32_t sctps_state;
96 } sctpsinfo_t;
97 
98 /*
99  * sctplsinfo provides the old SCTP state for state changes.
100  */
101 typedef struct sctplsinfo {
102 	int32_t sctps_state;			/* previous SCTP state */
103 } sctplsinfo_t;
104 
105 /*
106  * sctpinfo is the SCTP header fields.
107  */
108 typedef struct sctpinfo {
109 	uint16_t sctp_sport;			/* source port */
110 	uint16_t sctp_dport;			/* destination port */
111 	uint32_t sctp_verify;			/* verification tag */
112 	uint32_t sctp_checksum;			/* CRC32C of the SCTP packet */
113 	struct sctphdr *sctp_hdr;		/* raw SCTP header */
114 } sctpinfo_t;
115 
116 #pragma D binding "1.13" translator
117 translator csinfo_t < struct sctp_tcb *p > {
118 	cs_addr =	NULL;
119 	cs_cid =	(uint64_t)p;
120 	cs_pid =	0;
121 	cs_zoneid =	0;
122 };
123 
124 #pragma D binding "1.13" translator
125 translator sctpsinfo_t < struct sctp_tcb *p > {
126 	sctps_addr =		(uintptr_t)p;
127 	sctps_num_raddrs =	p == NULL ? -1 : p->asoc.numnets;
128 	sctps_raddrs =		p == NULL ? NULL : (uintptr_t)(p->asoc.nets.tqh_first);
129 	sctps_num_laddrs =	p == NULL ? -1 :
130 	    p->sctp_ep == NULL ? -1 :
131 	    p->sctp_ep->laddr_count;
132 	sctps_laddrs =		p == NULL ? NULL :
133 	    p->sctp_ep == NULL ? NULL :
134 	    (uintptr_t)(p->sctp_ep->sctp_addr_list.lh_first);
135 	sctps_lport =		p == NULL ? 0 :
136 	    p->sctp_ep == NULL ? 0 :
137 	    ntohs(p->sctp_ep->ip_inp.inp.inp_inc.inc_ie.ie_lport);
138 	sctps_rport =		p == NULL ? 0 : ntohs(p->rport);
139 	sctps_laddr =		p == NULL ? "<unknown>" :
140 	    p->asoc.primary_destination == NULL ? "<unknown>" :
141 	    p->asoc.primary_destination->ro._s_addr == NULL ? "<unknown>" :
142 	    p->asoc.primary_destination->ro._s_addr->address.sa.sa_family == AF_INET ?
143 	    inet_ntoa(&p->asoc.primary_destination->ro._s_addr->address.sin.sin_addr.s_addr) :
144 	    p->asoc.primary_destination->ro._s_addr->address.sa.sa_family == AF_INET6 ?
145 	    inet_ntoa6(&p->asoc.primary_destination->ro._s_addr->address.sin6.sin6_addr) :
146 	    "<unknown>";
147 	sctps_raddr =		p == NULL ? "<unknown>" :
148 	    p->asoc.primary_destination == NULL ? "<unknown>" :
149 	    p->asoc.primary_destination->ro._l_addr.sa.sa_family == AF_INET ?
150 	    inet_ntoa(&p->asoc.primary_destination->ro._l_addr.sin.sin_addr.s_addr) :
151 	    p->asoc.primary_destination->ro._l_addr.sa.sa_family == AF_INET6 ?
152 	    inet_ntoa6(&p->asoc.primary_destination->ro._l_addr.sin6.sin6_addr) :
153 	    "<unknown>";
154 	sctps_state =		p == NULL ? SCTP_STATE_CLOSED : p->asoc.state;
155 };
156 
157 #pragma D binding "1.13" translator
158 translator sctpinfo_t < struct sctphdr *p > {
159 	sctp_sport =		p == NULL ? 0 : ntohs(p->src_port);
160 	sctp_dport =		p == NULL ? 0 : ntohs(p->dest_port);
161 	sctp_verify =		p == NULL ? 0 : ntohl(p->v_tag);
162 	sctp_checksum =		p == NULL ? 0 : ntohl(p->checksum);
163 	sctp_hdr =		p;
164 };
165 
166 #pragma D binding "1.13" translator
167 translator sctplsinfo_t < int state > {
168 	sctps_state = state;
169 };
170