]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - cddl/lib/libdtrace/sctp.d
Add support for send, receive and state-change DTrace providers for
[FreeBSD/FreeBSD.git] / cddl / lib / libdtrace / sctp.d
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 };