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.
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.
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]
24 * Copyright (c) 2018 Michael Tuexen <tuexen@FreeBSD.org>
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
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;
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" :
85 * sctpsinfo contains stable SCTP details.
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 */
101 * sctplsinfo provides the old SCTP state for state changes.
103 typedef struct sctplsinfo {
104 int32_t sctps_state; /* previous SCTP state */
108 * sctpinfo is the SCTP header fields.
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 */
118 #pragma D binding "1.13" translator
119 translator csinfo_t < struct sctp_tcb *p > {
121 cs_cid = (uint64_t)p;
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) :
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) :
156 sctps_state = p == NULL ? SCTP_STATE_CLOSED : p->asoc.state;
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);
168 #pragma D binding "1.13" translator
169 translator sctplsinfo_t < int state > {