xref: /freebsd/cddl/lib/libdtrace/sctp.d (revision 10ff414c)
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  * $FreeBSD$
22  */
23 /*
24  * Copyright (c) 2018 Michael Tuexen <tuexen@FreeBSD.org>
25  */
26 
27 #pragma D depends_on library ip.d
28 #pragma D depends_on library socket.d
29 #pragma D depends_on module kernel
30 #pragma D depends_on provider sctp
31 
32 #pragma D binding "1.13" SCTP_STATE_MASK
33 inline int32_t SCTP_STATE_MASK =		0x0000007f;
34 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_PENDING
35 inline int32_t SCTP_STATE_SHUTDOWN_PENDING =	0x00000080;
36 #pragma D binding "1.13" SCTP_STATE_CLOSED_SOCKET
37 inline int32_t SCTP_STATE_CLOSED_SOCKET =	0x00000100;
38 #pragma D binding "1.13" SCTP_STATE_ABOUT_TO_BE_FREED
39 inline int32_t SCTP_STATE_ABOUT_TO_BE_FREED =	0x00000200;
40 #pragma D binding "1.13" SCTP_STATE_ABOUT_TO_BE_FREED
41 inline int32_t SCTP_STATE_PARTIAL_MSG_LEFT =	0x00000400;
42 #pragma D binding "1.13" SCTP_STATE_PARTIAL_MSG_LEFT
43 inline int32_t SCTP_STATE_WAS_ABORTED =		0x00000800;
44 #pragma D binding "1.13" SCTP_STATE_IN_ACCEPT_QUEUE
45 inline int32_t SCTP_STATE_IN_ACCEPT_QUEUE =	0x00001000;
46 #pragma D binding "1.13" SCTP_STATE_BOUND
47 inline int32_t SCTP_STATE_BOUND =		0x00001000;
48 #pragma D binding "1.13" SCTP_STATE_EMPTY
49 inline int32_t SCTP_STATE_EMPTY =		0x00000000;
50 #pragma D binding "1.13" SCTP_STATE_CLOSED
51 inline int32_t SCTP_STATE_CLOSED =		0x00000000;
52 #pragma D binding "1.13" SCTP_STATE_INUSE
53 inline int32_t SCTP_STATE_INUSE =		0x00000001;
54 #pragma D binding "1.13" SCTP_STATE_COOKIE_WAIT
55 inline int32_t SCTP_STATE_COOKIE_WAIT =		0x00000002;
56 #pragma D binding "1.13" SCTP_STATE_COOKIE_ECHOED
57 inline int32_t SCTP_STATE_COOKIE_ECHOED =	0x00000004;
58 #pragma D binding "1.13" SCTP_STATE_ESTABLISHED
59 inline int32_t SCTP_STATE_ESTABLISHED =		0x00000008;
60 #pragma D binding "1.13" SCTP_STATE_OPEN
61 inline int32_t SCTP_STATE_OPEN =		0x00000008;
62 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_SENT
63 inline int32_t SCTP_STATE_SHUTDOWN_SENT =	0x00000010;
64 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_RECEIVED
65 inline int32_t SCTP_STATE_SHUTDOWN_RECEIVED =	0x00000020;
66 #pragma D binding "1.13" SCTP_STATE_SHUTDOWN_ACK_SENT
67 inline int32_t SCTP_STATE_SHUTDOWN_ACK_SENT =	0x00000040;
68 
69 /* SCTP association state strings. */
70 #pragma D binding "1.13" sctp_state_string
71 inline string sctp_state_string[int32_t state] =
72 	state & SCTP_STATE_ABOUT_TO_BE_FREED ?				"state-closed" :
73 	state & SCTP_STATE_SHUTDOWN_PENDING ?				"state-shutdown-pending" :
74 	(state & SCTP_STATE_MASK) == SCTP_STATE_EMPTY ?			"state-closed" :
75 	(state & SCTP_STATE_MASK) == SCTP_STATE_INUSE ?			"state-closed" :
76 	(state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_WAIT ?		"state-cookie-wait" :
77 	(state & SCTP_STATE_MASK) == SCTP_STATE_COOKIE_ECHOED ?		"state-cookie-echoed" :
78 	(state & SCTP_STATE_MASK) == SCTP_STATE_OPEN ?			"state-established" :
79 	(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_SENT ?		"state-shutdown-sent" :
80 	(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_RECEIVED ?	"state-shutdown-received" :
81 	(state & SCTP_STATE_MASK) == SCTP_STATE_SHUTDOWN_ACK_SENT ?	"state-shutdown-ack-sent" :
82 	"<unknown>";
83 
84 /*
85  * sctpsinfo contains stable SCTP details.
86  */
87 typedef struct sctpsinfo {
88 	uintptr_t sctps_addr;			/* pointer to struct sctp_tcb */
89 	int sctps_num_raddrs;			/* number of remote addresses */
90 	uintptr_t sctps_raddrs;			/* pointer to struct sctp_nets */
91 	int sctps_num_laddrs;			/* number of local addresses */
92 	uintptr_t sctps_laddrs;			/* pointer to struct sctp_laddr */
93 	uint16_t sctps_lport;			/* local port */
94 	uint16_t sctps_rport;			/* remote port */
95 	string sctps_laddr;			/* local address, as a string */
96 	string sctps_raddr;			/* remote address, as a string */
97 	int32_t sctps_state;
98 } sctpsinfo_t;
99 
100 /*
101  * sctplsinfo provides the old SCTP state for state changes.
102  */
103 typedef struct sctplsinfo {
104 	int32_t sctps_state;			/* previous SCTP state */
105 } sctplsinfo_t;
106 
107 /*
108  * sctpinfo is the SCTP header fields.
109  */
110 typedef struct sctpinfo {
111 	uint16_t sctp_sport;			/* source port */
112 	uint16_t sctp_dport;			/* destination port */
113 	uint32_t sctp_verify;			/* verification tag */
114 	uint32_t sctp_checksum;			/* CRC32C of the SCTP packet */
115 	struct sctphdr *sctp_hdr;		/* raw SCTP header */
116 } sctpinfo_t;
117 
118 #pragma D binding "1.13" translator
119 translator csinfo_t < struct sctp_tcb *p > {
120 	cs_addr =	NULL;
121 	cs_cid =	(uint64_t)p;
122 	cs_pid =	0;
123 	cs_zoneid =	0;
124 };
125 
126 #pragma D binding "1.13" translator
127 translator sctpsinfo_t < struct sctp_tcb *p > {
128 	sctps_addr =		(uintptr_t)p;
129 	sctps_num_raddrs =	p == NULL ? -1 : p->asoc.numnets;
130 	sctps_raddrs =		p == NULL ? NULL : (uintptr_t)(p->asoc.nets.tqh_first);
131 	sctps_num_laddrs =	p == NULL ? -1 :
132 	    p->sctp_ep == NULL ? -1 :
133 	    p->sctp_ep->laddr_count;
134 	sctps_laddrs =		p == NULL ? NULL :
135 	    p->sctp_ep == NULL ? NULL :
136 	    (uintptr_t)(p->sctp_ep->sctp_addr_list.lh_first);
137 	sctps_lport =		p == NULL ? 0 :
138 	    p->sctp_ep == NULL ? 0 :
139 	    ntohs(p->sctp_ep->ip_inp.inp.inp_inc.inc_ie.ie_lport);
140 	sctps_rport =		p == NULL ? 0 : ntohs(p->rport);
141 	sctps_laddr =		p == NULL ? "<unknown>" :
142 	    p->asoc.primary_destination == NULL ? "<unknown>" :
143 	    p->asoc.primary_destination->ro._s_addr == NULL ? "<unknown>" :
144 	    p->asoc.primary_destination->ro._s_addr->address.sa.sa_family == AF_INET ?
145 	    inet_ntoa(&p->asoc.primary_destination->ro._s_addr->address.sin.sin_addr.s_addr) :
146 	    p->asoc.primary_destination->ro._s_addr->address.sa.sa_family == AF_INET6 ?
147 	    inet_ntoa6(&p->asoc.primary_destination->ro._s_addr->address.sin6.sin6_addr) :
148 	    "<unknown>";
149 	sctps_raddr =		p == NULL ? "<unknown>" :
150 	    p->asoc.primary_destination == NULL ? "<unknown>" :
151 	    p->asoc.primary_destination->ro._l_addr.sa.sa_family == AF_INET ?
152 	    inet_ntoa(&p->asoc.primary_destination->ro._l_addr.sin.sin_addr.s_addr) :
153 	    p->asoc.primary_destination->ro._l_addr.sa.sa_family == AF_INET6 ?
154 	    inet_ntoa6(&p->asoc.primary_destination->ro._l_addr.sin6.sin6_addr) :
155 	    "<unknown>";
156 	sctps_state =		p == NULL ? SCTP_STATE_CLOSED : p->asoc.state;
157 };
158 
159 #pragma D binding "1.13" translator
160 translator sctpinfo_t < struct sctphdr *p > {
161 	sctp_sport =		p == NULL ? 0 : ntohs(p->src_port);
162 	sctp_dport =		p == NULL ? 0 : ntohs(p->dest_port);
163 	sctp_verify =		p == NULL ? 0 : ntohl(p->v_tag);
164 	sctp_checksum =		p == NULL ? 0 : ntohl(p->checksum);
165 	sctp_hdr =		p;
166 };
167 
168 #pragma D binding "1.13" translator
169 translator sctplsinfo_t < int state > {
170 	sctps_state = state;
171 };
172