Deleted Added
full compact
tcp.d (296335) tcp.d (298087)
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 *
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: head/cddl/lib/libdtrace/tcp.d 296335 2016-03-03 02:46:12Z gnn $
21 * $FreeBSD: head/cddl/lib/libdtrace/tcp.d 298087 2016-04-15 20:27:36Z hiren $
22 */
23/*
24 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25 * Copyright (c) 2013 Mark Johnston <markj@freebsd.org>
26 */
27
28#pragma D depends_on library ip.d
29#pragma D depends_on module kernel
30#pragma D depends_on provider tcp
31
32/*
33 * Convert a TCP state value to a string.
34 */
35#pragma D binding "1.6.3" TCPS_CLOSED
36inline int TCPS_CLOSED = 0;
37#pragma D binding "1.6.3" TCPS_LISTEN
38inline int TCPS_LISTEN = 1;
39#pragma D binding "1.6.3" TCPS_SYN_SENT
40inline int TCPS_SYN_SENT = 2;
41#pragma D binding "1.6.3" TCPS_SYN_RECEIVED
42inline int TCPS_SYN_RECEIVED = 3;
43#pragma D binding "1.6.3" TCPS_ESTABLISHED
44inline int TCPS_ESTABLISHED = 4;
45#pragma D binding "1.6.3" TCPS_CLOSE_WAIT
46inline int TCPS_CLOSE_WAIT = 5;
47#pragma D binding "1.6.3" TCPS_FIN_WAIT_1
48inline int TCPS_FIN_WAIT_1 = 6;
49#pragma D binding "1.6.3" TCPS_CLOSING
50inline int TCPS_CLOSING = 7;
51#pragma D binding "1.6.3" TCPS_LAST_ACK
52inline int TCPS_LAST_ACK = 8;
53#pragma D binding "1.6.3" TCPS_FIN_WAIT_2
54inline int TCPS_FIN_WAIT_2 = 9;
55#pragma D binding "1.6.3" TCPS_TIME_WAIT
56inline int TCPS_TIME_WAIT = 10;
57
58/* TCP segment flags. */
59#pragma D binding "1.6.3" TH_FIN
60inline uint8_t TH_FIN = 0x01;
61#pragma D binding "1.6.3" TH_SYN
62inline uint8_t TH_SYN = 0x02;
63#pragma D binding "1.6.3" TH_RST
64inline uint8_t TH_RST = 0x04;
65#pragma D binding "1.6.3" TH_PUSH
66inline uint8_t TH_PUSH = 0x08;
67#pragma D binding "1.6.3" TH_ACK
68inline uint8_t TH_ACK = 0x10;
69#pragma D binding "1.6.3" TH_URG
70inline uint8_t TH_URG = 0x20;
71#pragma D binding "1.6.3" TH_ECE
72inline uint8_t TH_ECE = 0x40;
73#pragma D binding "1.6.3" TH_CWR
74inline uint8_t TH_CWR = 0x80;
75
76/* TCP connection state strings. */
77#pragma D binding "1.6.3" tcp_state_string
78inline string tcp_state_string[int32_t state] =
79 state == TCPS_CLOSED ? "state-closed" :
80 state == TCPS_LISTEN ? "state-listen" :
81 state == TCPS_SYN_SENT ? "state-syn-sent" :
82 state == TCPS_SYN_RECEIVED ? "state-syn-received" :
83 state == TCPS_ESTABLISHED ? "state-established" :
84 state == TCPS_CLOSE_WAIT ? "state-close-wait" :
85 state == TCPS_FIN_WAIT_1 ? "state-fin-wait-1" :
86 state == TCPS_CLOSING ? "state-closing" :
87 state == TCPS_LAST_ACK ? "state-last-ack" :
88 state == TCPS_FIN_WAIT_2 ? "state-fin-wait-2" :
89 state == TCPS_TIME_WAIT ? "state-time-wait" :
90 "<unknown>";
91
92/*
93 * tcpsinfo contains stable TCP details from tcp_t.
94 */
95typedef struct tcpsinfo {
96 uintptr_t tcps_addr;
97 int tcps_local; /* is delivered locally, boolean */
98 int tcps_active; /* active open (from here), boolean */
99 uint16_t tcps_lport; /* local port */
100 uint16_t tcps_rport; /* remote port */
101 string tcps_laddr; /* local address, as a string */
102 string tcps_raddr; /* remote address, as a string */
103 int32_t tcps_state; /* TCP state */
104 uint32_t tcps_iss; /* Initial sequence # sent */
105 uint32_t tcps_irs; /* Initial sequence # received */
106 uint32_t tcps_suna; /* sequence # sent but unacked */
107 uint32_t tcps_smax; /* highest sequence number sent */
108 uint32_t tcps_snxt; /* next sequence # to send */
109 uint32_t tcps_rack; /* sequence # we have acked */
110 uint32_t tcps_rnxt; /* next sequence # expected */
22 */
23/*
24 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25 * Copyright (c) 2013 Mark Johnston <markj@freebsd.org>
26 */
27
28#pragma D depends_on library ip.d
29#pragma D depends_on module kernel
30#pragma D depends_on provider tcp
31
32/*
33 * Convert a TCP state value to a string.
34 */
35#pragma D binding "1.6.3" TCPS_CLOSED
36inline int TCPS_CLOSED = 0;
37#pragma D binding "1.6.3" TCPS_LISTEN
38inline int TCPS_LISTEN = 1;
39#pragma D binding "1.6.3" TCPS_SYN_SENT
40inline int TCPS_SYN_SENT = 2;
41#pragma D binding "1.6.3" TCPS_SYN_RECEIVED
42inline int TCPS_SYN_RECEIVED = 3;
43#pragma D binding "1.6.3" TCPS_ESTABLISHED
44inline int TCPS_ESTABLISHED = 4;
45#pragma D binding "1.6.3" TCPS_CLOSE_WAIT
46inline int TCPS_CLOSE_WAIT = 5;
47#pragma D binding "1.6.3" TCPS_FIN_WAIT_1
48inline int TCPS_FIN_WAIT_1 = 6;
49#pragma D binding "1.6.3" TCPS_CLOSING
50inline int TCPS_CLOSING = 7;
51#pragma D binding "1.6.3" TCPS_LAST_ACK
52inline int TCPS_LAST_ACK = 8;
53#pragma D binding "1.6.3" TCPS_FIN_WAIT_2
54inline int TCPS_FIN_WAIT_2 = 9;
55#pragma D binding "1.6.3" TCPS_TIME_WAIT
56inline int TCPS_TIME_WAIT = 10;
57
58/* TCP segment flags. */
59#pragma D binding "1.6.3" TH_FIN
60inline uint8_t TH_FIN = 0x01;
61#pragma D binding "1.6.3" TH_SYN
62inline uint8_t TH_SYN = 0x02;
63#pragma D binding "1.6.3" TH_RST
64inline uint8_t TH_RST = 0x04;
65#pragma D binding "1.6.3" TH_PUSH
66inline uint8_t TH_PUSH = 0x08;
67#pragma D binding "1.6.3" TH_ACK
68inline uint8_t TH_ACK = 0x10;
69#pragma D binding "1.6.3" TH_URG
70inline uint8_t TH_URG = 0x20;
71#pragma D binding "1.6.3" TH_ECE
72inline uint8_t TH_ECE = 0x40;
73#pragma D binding "1.6.3" TH_CWR
74inline uint8_t TH_CWR = 0x80;
75
76/* TCP connection state strings. */
77#pragma D binding "1.6.3" tcp_state_string
78inline string tcp_state_string[int32_t state] =
79 state == TCPS_CLOSED ? "state-closed" :
80 state == TCPS_LISTEN ? "state-listen" :
81 state == TCPS_SYN_SENT ? "state-syn-sent" :
82 state == TCPS_SYN_RECEIVED ? "state-syn-received" :
83 state == TCPS_ESTABLISHED ? "state-established" :
84 state == TCPS_CLOSE_WAIT ? "state-close-wait" :
85 state == TCPS_FIN_WAIT_1 ? "state-fin-wait-1" :
86 state == TCPS_CLOSING ? "state-closing" :
87 state == TCPS_LAST_ACK ? "state-last-ack" :
88 state == TCPS_FIN_WAIT_2 ? "state-fin-wait-2" :
89 state == TCPS_TIME_WAIT ? "state-time-wait" :
90 "<unknown>";
91
92/*
93 * tcpsinfo contains stable TCP details from tcp_t.
94 */
95typedef struct tcpsinfo {
96 uintptr_t tcps_addr;
97 int tcps_local; /* is delivered locally, boolean */
98 int tcps_active; /* active open (from here), boolean */
99 uint16_t tcps_lport; /* local port */
100 uint16_t tcps_rport; /* remote port */
101 string tcps_laddr; /* local address, as a string */
102 string tcps_raddr; /* remote address, as a string */
103 int32_t tcps_state; /* TCP state */
104 uint32_t tcps_iss; /* Initial sequence # sent */
105 uint32_t tcps_irs; /* Initial sequence # received */
106 uint32_t tcps_suna; /* sequence # sent but unacked */
107 uint32_t tcps_smax; /* highest sequence number sent */
108 uint32_t tcps_snxt; /* next sequence # to send */
109 uint32_t tcps_rack; /* sequence # we have acked */
110 uint32_t tcps_rnxt; /* next sequence # expected */
111 uint32_t tcps_swnd; /* send window size */
111 u_long tcps_swnd; /* send window size */
112 int32_t tcps_snd_ws; /* send window scaling */
113 uint32_t tcps_swl1; /* window update seg seq number */
114 uint32_t tcps_swl2; /* window update seg ack number */
115 uint32_t tcps_rup; /* receive urgent pointer */
116 uint32_t tcps_radv; /* advertised window */
112 int32_t tcps_snd_ws; /* send window scaling */
113 uint32_t tcps_swl1; /* window update seg seq number */
114 uint32_t tcps_swl2; /* window update seg ack number */
115 uint32_t tcps_rup; /* receive urgent pointer */
116 uint32_t tcps_radv; /* advertised window */
117 uint32_t tcps_rwnd; /* receive window size */
117 u_long tcps_rwnd; /* receive window size */
118 int32_t tcps_rcv_ws; /* receive window scaling */
118 int32_t tcps_rcv_ws; /* receive window scaling */
119 uint32_t tcps_cwnd; /* congestion window */
120 uint32_t tcps_cwnd_ssthresh; /* threshold for congestion avoidance */
119 u_long tcps_cwnd; /* congestion window */
120 u_long tcps_cwnd_ssthresh; /* threshold for congestion avoidance */
121 uint32_t tcps_srecover; /* for use in NewReno Fast Recovery */
122 uint32_t tcps_sack_fack; /* SACK sequence # we have acked */
123 uint32_t tcps_sack_snxt; /* next SACK seq # for retransmission */
124 uint32_t tcps_rto; /* round-trip timeout, msec */
125 uint32_t tcps_mss; /* max segment size */
126 int tcps_retransmit; /* retransmit send event, boolean */
127 int tcps_srtt; /* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
128 int tcps_debug; /* socket has SO_DEBUG set */
129 int32_t tcps_dupacks; /* consecutive dup acks received */
130 uint32_t tcps_rtttime; /* RTT measurement start time */
131 uint32_t tcps_rtseq; /* sequence # being timed */
132 uint32_t tcps_ts_recent; /* timestamp echo data */
133} tcpsinfo_t;
134
135/*
136 * tcplsinfo provides the old tcp state for state changes.
137 */
138typedef struct tcplsinfo {
139 int32_t tcps_state; /* previous TCP state */
140} tcplsinfo_t;
141
142/*
143 * tcpinfo is the TCP header fields.
144 */
145typedef struct tcpinfo {
146 uint16_t tcp_sport; /* source port */
147 uint16_t tcp_dport; /* destination port */
148 uint32_t tcp_seq; /* sequence number */
149 uint32_t tcp_ack; /* acknowledgment number */
150 uint8_t tcp_offset; /* data offset, in bytes */
151 uint8_t tcp_flags; /* flags */
152 uint16_t tcp_window; /* window size */
153 uint16_t tcp_checksum; /* checksum */
154 uint16_t tcp_urgent; /* urgent data pointer */
155 struct tcphdr *tcp_hdr; /* raw TCP header */
156} tcpinfo_t;
157
158/*
159 * A clone of tcpinfo_t used to handle the fact that the TCP input path
160 * overwrites some fields of the TCP header with their host-order equivalents.
161 * Unfortunately, DTrace doesn't let us simply typedef a new name for struct
162 * tcpinfo and define a separate translator for it.
163 */
164typedef struct tcpinfoh {
165 uint16_t tcp_sport; /* source port */
166 uint16_t tcp_dport; /* destination port */
167 uint32_t tcp_seq; /* sequence number */
168 uint32_t tcp_ack; /* acknowledgment number */
169 uint8_t tcp_offset; /* data offset, in bytes */
170 uint8_t tcp_flags; /* flags */
171 uint16_t tcp_window; /* window size */
172 uint16_t tcp_checksum; /* checksum */
173 uint16_t tcp_urgent; /* urgent data pointer */
174 struct tcphdr *tcp_hdr; /* raw TCP header */
175} tcpinfoh_t;
176
177#pragma D binding "1.6.3" translator
178translator csinfo_t < struct tcpcb *p > {
179 cs_addr = NULL;
180 cs_cid = (uint64_t)(p == NULL ? 0 : p->t_inpcb);
181 cs_pid = 0;
182 cs_zoneid = 0;
183};
184
185#pragma D binding "1.6.3" translator
186translator tcpsinfo_t < struct tcpcb *p > {
187 tcps_addr = (uintptr_t)p;
188 tcps_local = -1; /* XXX */
189 tcps_active = -1; /* XXX */
190 tcps_lport = p == NULL ? 0 : ntohs(p->t_inpcb->inp_inc.inc_ie.ie_lport);
191 tcps_rport = p == NULL ? 0 : ntohs(p->t_inpcb->inp_inc.inc_ie.ie_fport);
192 tcps_laddr = p == NULL ? 0 :
193 p->t_inpcb->inp_vflag == INP_IPV4 ?
194 inet_ntoa(&p->t_inpcb->inp_inc.inc_ie.ie_dependladdr.ie46_local.ia46_addr4.s_addr) :
195 inet_ntoa6(&p->t_inpcb->inp_inc.inc_ie.ie_dependladdr.ie6_local);
196 tcps_raddr = p == NULL ? 0 :
197 p->t_inpcb->inp_vflag == INP_IPV4 ?
198 inet_ntoa(&p->t_inpcb->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4.s_addr) :
199 inet_ntoa6(&p->t_inpcb->inp_inc.inc_ie.ie_dependfaddr.ie6_foreign);
200 tcps_state = p == NULL ? -1 : p->t_state;
201 tcps_iss = p == NULL ? 0 : p->iss;
202 tcps_irs = p == NULL ? 0 : p->irs;
203 tcps_suna = p == NULL ? 0 : p->snd_una;
204 tcps_smax = p == NULL ? 0 : p->snd_max;
205 tcps_snxt = p == NULL ? 0 : p->snd_nxt;
206 tcps_rack = p == NULL ? 0 : p->last_ack_sent;
207 tcps_rnxt = p == NULL ? 0 : p->rcv_nxt;
208 tcps_swnd = p == NULL ? -1 : p->snd_wnd;
209 tcps_snd_ws = p == NULL ? -1 : p->snd_scale;
210 tcps_swl1 = p == NULL ? -1 : p->snd_wl1;
211 tcps_swl2 = p == NULL ? -1 : p->snd_wl2;
212 tcps_radv = p == NULL ? -1 : p->rcv_adv;
213 tcps_rwnd = p == NULL ? -1 : p->rcv_wnd;
214 tcps_rup = p == NULL ? -1 : p->rcv_up;
215 tcps_rcv_ws = p == NULL ? -1 : p->rcv_scale;
216 tcps_cwnd = p == NULL ? -1 : p->snd_cwnd;
217 tcps_cwnd_ssthresh = p == NULL ? -1 : p->snd_ssthresh;
218 tcps_srecover = p == NULL ? -1 : p->snd_recover;
219 tcps_sack_fack = p == NULL ? 0 : p->snd_fack;
220 tcps_sack_snxt = p == NULL ? 0 : p->sack_newdata;
221 tcps_rto = p == NULL ? -1 : (p->t_rxtcur * 1000) / `hz;
222 tcps_mss = p == NULL ? -1 : p->t_maxseg;
223 tcps_retransmit = p == NULL ? -1 : p->t_rxtshift > 0 ? 1 : 0;
224 tcps_srtt = p == NULL ? -1 : p->t_srtt; /* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
225 tcps_debug = p == NULL ? 0 :
226 p->t_inpcb->inp_socket->so_options & 1;
227 tcps_dupacks = p == NULL ? -1 : p->t_dupacks;
228 tcps_rtttime = p == NULL ? -1 : p->t_rtttime;
229 tcps_rtseq = p == NULL ? -1 : p->t_rtseq;
230 tcps_ts_recent = p == NULL ? -1 : p->ts_recent;
231};
232
233#pragma D binding "1.6.3" translator
234translator tcpinfo_t < struct tcphdr *p > {
235 tcp_sport = p == NULL ? 0 : ntohs(p->th_sport);
236 tcp_dport = p == NULL ? 0 : ntohs(p->th_dport);
237 tcp_seq = p == NULL ? -1 : ntohl(p->th_seq);
238 tcp_ack = p == NULL ? -1 : ntohl(p->th_ack);
239 tcp_offset = p == NULL ? -1 : (p->th_off >> 2);
240 tcp_flags = p == NULL ? 0 : p->th_flags;
241 tcp_window = p == NULL ? 0 : ntohs(p->th_win);
242 tcp_checksum = p == NULL ? 0 : ntohs(p->th_sum);
243 tcp_urgent = p == NULL ? 0 : ntohs(p->th_urp);
244 tcp_hdr = (struct tcphdr *)p;
245};
246
247/*
248 * This translator differs from the one for tcpinfo_t in that the sequence
249 * number, acknowledgement number, window size and urgent pointer are already
250 * in host order and thus don't need to be converted.
251 */
252#pragma D binding "1.6.3" translator
253translator tcpinfoh_t < struct tcphdr *p > {
254 tcp_sport = p == NULL ? 0 : ntohs(p->th_sport);
255 tcp_dport = p == NULL ? 0 : ntohs(p->th_dport);
256 tcp_seq = p == NULL ? -1 : p->th_seq;
257 tcp_ack = p == NULL ? -1 : p->th_ack;
258 tcp_offset = p == NULL ? -1 : (p->th_off >> 2);
259 tcp_flags = p == NULL ? 0 : p->th_flags;
260 tcp_window = p == NULL ? 0 : (p->th_win);
261 tcp_checksum = p == NULL ? 0 : ntohs(p->th_sum);
262 tcp_urgent = p == NULL ? 0 : p->th_urp;
263 tcp_hdr = (struct tcphdr *)p;
264};
265
266#pragma D binding "1.6.3" translator
267translator tcplsinfo_t < int s > {
268 tcps_state = s;
269};
270
271
272/* Support for TCP debug */
273
274#pragma D binding "1.12.1" TA_INPUT
275inline int TA_INPUT = 0;
276#pragma D binding "1.12.1" TA_OUTPUT
277inline int TA_OUTPUT = 1;
278#pragma D binding "1.12.1" TA_USER
279inline int TA_USER = 2;
280#pragma D binding "1.12.1" TA_RESPOND
281inline int TA_RESPOND = 3;
282#pragma D binding "1.12.1" TA_DROP
283inline int TA_DROP = 4;
284
285/* direction strings. */
286
287#pragma D binding "1.12.1" tcpdebug_dir_string
288inline string tcpdebug_dir_string[uint8_t direction] =
289 direction == TA_INPUT ? "input" :
290 direction == TA_OUTPUT ? "output" :
291 direction == TA_USER ? "user" :
292 direction == TA_RESPOND ? "respond" :
293 direction == TA_OUTPUT ? "drop" :
294 "unknown" ;
295
296#pragma D binding "1.12.1" tcpflag_string
297inline string tcpflag_string[uint8_t flags] =
298 flags & TH_FIN ? "FIN" :
299 flags & TH_SYN ? "SYN" :
300 flags & TH_RST ? "RST" :
301 flags & TH_PUSH ? "PUSH" :
302 flags & TH_ACK ? "ACK" :
303 flags & TH_URG ? "URG" :
304 flags & TH_ECE ? "ECE" :
305 flags & TH_CWR ? "CWR" :
306 "unknown" ;
307
308#pragma D binding "1.12.1" PRU_ATTACH
309inline int PRU_ATTACH = 0;
310#pragma D binding "1.12.1" PRU_DETACH
311inline int PRU_DETACH = 1;
312#pragma D binding "1.12.1" PRU_BIND
313inline int PRU_BIND = 2;
314#pragma D binding "1.12.1" PRU_LISTEN
315inline int PRU_LISTEN = 3;
316#pragma D binding "1.12.1" PRU_CONNECT
317inline int PRU_CONNECT = 4;
318#pragma D binding "1.12.1" PRU_ACCEPT
319inline int PRU_ACCEPT = 5 ;
320#pragma D binding "1.12.1" PRU_DISCONNECT
321inline int PRU_DISCONNECT= 6;
322#pragma D binding "1.12.1" PRU_SHUTDOWN
323inline int PRU_SHUTDOWN = 7;
324#pragma D binding "1.12.1" PRU_RCVD
325inline int PRU_RCVD = 8;
326#pragma D binding "1.12.1" PRU_SEND
327inline int PRU_SEND = 9;
328#pragma D binding "1.12.1" PRU_ABORT
329inline int PRU_ABORT = 10;
330#pragma D binding "1.12.1" PRU_CONTROL
331inline int PRU_CONTROL = 11;
332#pragma D binding "1.12.1" PRU_SENSE
333inline int PRU_SENSE = 12;
334#pragma D binding "1.12.1" PRU_RCVOOB
335inline int PRU_RCVOOB = 13;
336#pragma D binding "1.12.1" PRU_SENDOOB
337inline int PRU_SENDOOB = 14;
338#pragma D binding "1.12.1" PRU_SOCKADDR
339inline int PRU_SOCKADDR = 15;
340#pragma D binding "1.12.1" PRU_PEERADDR
341inline int PRU_PEERADDR = 16;
342#pragma D binding "1.12.1" PRU_CONNECT2
343inline int PRU_CONNECT2 = 17;
344#pragma D binding "1.12.1" PRU_FASTTIMO
345inline int PRU_FASTTIMO = 18;
346#pragma D binding "1.12.1" PRU_SLOWTIMO
347inline int PRU_SLOWTIMO = 19;
348#pragma D binding "1.12.1" PRU_PROTORCV
349inline int PRU_PROTORCV = 20;
350#pragma D binding "1.12.1" PRU_PROTOSEND
351inline int PRU_PROTOSEND = 21;
352#pragma D binding "1.12.1" PRU_SEND_EOF
353inline int PRU_SEND_EOF = 22;
354#pragma D binding "1.12.1" PRU_SOSETLABEL
355inline int PRU_SOSETLABEL = 23;
356#pragma D binding "1.12.1" PRU_CLOSE
357inline int PRU_CLOSE = 24;
358#pragma D binding "1.12.1" PRU_FLUSH
359inline int PRU_FLUSH = 25;
360
361#pragma D binding "1.12.1" prureq_string
362inline string prureq_string[uint8_t req] =
363 req == PRU_ATTACH ? "ATTACH" :
364 req == PRU_DETACH ? "DETACH" :
365 req == PRU_BIND ? "BIND" :
366 req == PRU_LISTEN ? "LISTEN" :
367 req == PRU_CONNECT ? "CONNECT" :
368 req == PRU_ACCEPT ? "ACCEPT" :
369 req == PRU_DISCONNECT ? "DISCONNECT" :
370 req == PRU_SHUTDOWN ? "SHUTDOWN" :
371 req == PRU_RCVD ? "RCVD" :
372 req == PRU_SEND ? "SEND" :
373 req == PRU_ABORT ? "ABORT" :
374 req == PRU_CONTROL ? "CONTROL" :
375 req == PRU_SENSE ? "SENSE" :
376 req == PRU_RCVOOB ? "RCVOOB" :
377 req == PRU_SENDOOB ? "SENDOOB" :
378 req == PRU_SOCKADDR ? "SOCKADDR" :
379 req == PRU_PEERADDR ? "PEERADDR" :
380 req == PRU_CONNECT2 ? "CONNECT2" :
381 req == PRU_FASTTIMO ? "FASTTIMO" :
382 req == PRU_SLOWTIMO ? "SLOWTIMO" :
383 req == PRU_PROTORCV ? "PROTORCV" :
384 req == PRU_PROTOSEND ? "PROTOSEND" :
385 req == PRU_SEND ? "SEND_EOF" :
386 req == PRU_SOSETLABEL ? "SOSETLABEL" :
387 req == PRU_CLOSE ? "CLOSE" :
388 req == PRU_FLUSH ? "FLUSE" :
389 "unknown" ;
121 uint32_t tcps_srecover; /* for use in NewReno Fast Recovery */
122 uint32_t tcps_sack_fack; /* SACK sequence # we have acked */
123 uint32_t tcps_sack_snxt; /* next SACK seq # for retransmission */
124 uint32_t tcps_rto; /* round-trip timeout, msec */
125 uint32_t tcps_mss; /* max segment size */
126 int tcps_retransmit; /* retransmit send event, boolean */
127 int tcps_srtt; /* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
128 int tcps_debug; /* socket has SO_DEBUG set */
129 int32_t tcps_dupacks; /* consecutive dup acks received */
130 uint32_t tcps_rtttime; /* RTT measurement start time */
131 uint32_t tcps_rtseq; /* sequence # being timed */
132 uint32_t tcps_ts_recent; /* timestamp echo data */
133} tcpsinfo_t;
134
135/*
136 * tcplsinfo provides the old tcp state for state changes.
137 */
138typedef struct tcplsinfo {
139 int32_t tcps_state; /* previous TCP state */
140} tcplsinfo_t;
141
142/*
143 * tcpinfo is the TCP header fields.
144 */
145typedef struct tcpinfo {
146 uint16_t tcp_sport; /* source port */
147 uint16_t tcp_dport; /* destination port */
148 uint32_t tcp_seq; /* sequence number */
149 uint32_t tcp_ack; /* acknowledgment number */
150 uint8_t tcp_offset; /* data offset, in bytes */
151 uint8_t tcp_flags; /* flags */
152 uint16_t tcp_window; /* window size */
153 uint16_t tcp_checksum; /* checksum */
154 uint16_t tcp_urgent; /* urgent data pointer */
155 struct tcphdr *tcp_hdr; /* raw TCP header */
156} tcpinfo_t;
157
158/*
159 * A clone of tcpinfo_t used to handle the fact that the TCP input path
160 * overwrites some fields of the TCP header with their host-order equivalents.
161 * Unfortunately, DTrace doesn't let us simply typedef a new name for struct
162 * tcpinfo and define a separate translator for it.
163 */
164typedef struct tcpinfoh {
165 uint16_t tcp_sport; /* source port */
166 uint16_t tcp_dport; /* destination port */
167 uint32_t tcp_seq; /* sequence number */
168 uint32_t tcp_ack; /* acknowledgment number */
169 uint8_t tcp_offset; /* data offset, in bytes */
170 uint8_t tcp_flags; /* flags */
171 uint16_t tcp_window; /* window size */
172 uint16_t tcp_checksum; /* checksum */
173 uint16_t tcp_urgent; /* urgent data pointer */
174 struct tcphdr *tcp_hdr; /* raw TCP header */
175} tcpinfoh_t;
176
177#pragma D binding "1.6.3" translator
178translator csinfo_t < struct tcpcb *p > {
179 cs_addr = NULL;
180 cs_cid = (uint64_t)(p == NULL ? 0 : p->t_inpcb);
181 cs_pid = 0;
182 cs_zoneid = 0;
183};
184
185#pragma D binding "1.6.3" translator
186translator tcpsinfo_t < struct tcpcb *p > {
187 tcps_addr = (uintptr_t)p;
188 tcps_local = -1; /* XXX */
189 tcps_active = -1; /* XXX */
190 tcps_lport = p == NULL ? 0 : ntohs(p->t_inpcb->inp_inc.inc_ie.ie_lport);
191 tcps_rport = p == NULL ? 0 : ntohs(p->t_inpcb->inp_inc.inc_ie.ie_fport);
192 tcps_laddr = p == NULL ? 0 :
193 p->t_inpcb->inp_vflag == INP_IPV4 ?
194 inet_ntoa(&p->t_inpcb->inp_inc.inc_ie.ie_dependladdr.ie46_local.ia46_addr4.s_addr) :
195 inet_ntoa6(&p->t_inpcb->inp_inc.inc_ie.ie_dependladdr.ie6_local);
196 tcps_raddr = p == NULL ? 0 :
197 p->t_inpcb->inp_vflag == INP_IPV4 ?
198 inet_ntoa(&p->t_inpcb->inp_inc.inc_ie.ie_dependfaddr.ie46_foreign.ia46_addr4.s_addr) :
199 inet_ntoa6(&p->t_inpcb->inp_inc.inc_ie.ie_dependfaddr.ie6_foreign);
200 tcps_state = p == NULL ? -1 : p->t_state;
201 tcps_iss = p == NULL ? 0 : p->iss;
202 tcps_irs = p == NULL ? 0 : p->irs;
203 tcps_suna = p == NULL ? 0 : p->snd_una;
204 tcps_smax = p == NULL ? 0 : p->snd_max;
205 tcps_snxt = p == NULL ? 0 : p->snd_nxt;
206 tcps_rack = p == NULL ? 0 : p->last_ack_sent;
207 tcps_rnxt = p == NULL ? 0 : p->rcv_nxt;
208 tcps_swnd = p == NULL ? -1 : p->snd_wnd;
209 tcps_snd_ws = p == NULL ? -1 : p->snd_scale;
210 tcps_swl1 = p == NULL ? -1 : p->snd_wl1;
211 tcps_swl2 = p == NULL ? -1 : p->snd_wl2;
212 tcps_radv = p == NULL ? -1 : p->rcv_adv;
213 tcps_rwnd = p == NULL ? -1 : p->rcv_wnd;
214 tcps_rup = p == NULL ? -1 : p->rcv_up;
215 tcps_rcv_ws = p == NULL ? -1 : p->rcv_scale;
216 tcps_cwnd = p == NULL ? -1 : p->snd_cwnd;
217 tcps_cwnd_ssthresh = p == NULL ? -1 : p->snd_ssthresh;
218 tcps_srecover = p == NULL ? -1 : p->snd_recover;
219 tcps_sack_fack = p == NULL ? 0 : p->snd_fack;
220 tcps_sack_snxt = p == NULL ? 0 : p->sack_newdata;
221 tcps_rto = p == NULL ? -1 : (p->t_rxtcur * 1000) / `hz;
222 tcps_mss = p == NULL ? -1 : p->t_maxseg;
223 tcps_retransmit = p == NULL ? -1 : p->t_rxtshift > 0 ? 1 : 0;
224 tcps_srtt = p == NULL ? -1 : p->t_srtt; /* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
225 tcps_debug = p == NULL ? 0 :
226 p->t_inpcb->inp_socket->so_options & 1;
227 tcps_dupacks = p == NULL ? -1 : p->t_dupacks;
228 tcps_rtttime = p == NULL ? -1 : p->t_rtttime;
229 tcps_rtseq = p == NULL ? -1 : p->t_rtseq;
230 tcps_ts_recent = p == NULL ? -1 : p->ts_recent;
231};
232
233#pragma D binding "1.6.3" translator
234translator tcpinfo_t < struct tcphdr *p > {
235 tcp_sport = p == NULL ? 0 : ntohs(p->th_sport);
236 tcp_dport = p == NULL ? 0 : ntohs(p->th_dport);
237 tcp_seq = p == NULL ? -1 : ntohl(p->th_seq);
238 tcp_ack = p == NULL ? -1 : ntohl(p->th_ack);
239 tcp_offset = p == NULL ? -1 : (p->th_off >> 2);
240 tcp_flags = p == NULL ? 0 : p->th_flags;
241 tcp_window = p == NULL ? 0 : ntohs(p->th_win);
242 tcp_checksum = p == NULL ? 0 : ntohs(p->th_sum);
243 tcp_urgent = p == NULL ? 0 : ntohs(p->th_urp);
244 tcp_hdr = (struct tcphdr *)p;
245};
246
247/*
248 * This translator differs from the one for tcpinfo_t in that the sequence
249 * number, acknowledgement number, window size and urgent pointer are already
250 * in host order and thus don't need to be converted.
251 */
252#pragma D binding "1.6.3" translator
253translator tcpinfoh_t < struct tcphdr *p > {
254 tcp_sport = p == NULL ? 0 : ntohs(p->th_sport);
255 tcp_dport = p == NULL ? 0 : ntohs(p->th_dport);
256 tcp_seq = p == NULL ? -1 : p->th_seq;
257 tcp_ack = p == NULL ? -1 : p->th_ack;
258 tcp_offset = p == NULL ? -1 : (p->th_off >> 2);
259 tcp_flags = p == NULL ? 0 : p->th_flags;
260 tcp_window = p == NULL ? 0 : (p->th_win);
261 tcp_checksum = p == NULL ? 0 : ntohs(p->th_sum);
262 tcp_urgent = p == NULL ? 0 : p->th_urp;
263 tcp_hdr = (struct tcphdr *)p;
264};
265
266#pragma D binding "1.6.3" translator
267translator tcplsinfo_t < int s > {
268 tcps_state = s;
269};
270
271
272/* Support for TCP debug */
273
274#pragma D binding "1.12.1" TA_INPUT
275inline int TA_INPUT = 0;
276#pragma D binding "1.12.1" TA_OUTPUT
277inline int TA_OUTPUT = 1;
278#pragma D binding "1.12.1" TA_USER
279inline int TA_USER = 2;
280#pragma D binding "1.12.1" TA_RESPOND
281inline int TA_RESPOND = 3;
282#pragma D binding "1.12.1" TA_DROP
283inline int TA_DROP = 4;
284
285/* direction strings. */
286
287#pragma D binding "1.12.1" tcpdebug_dir_string
288inline string tcpdebug_dir_string[uint8_t direction] =
289 direction == TA_INPUT ? "input" :
290 direction == TA_OUTPUT ? "output" :
291 direction == TA_USER ? "user" :
292 direction == TA_RESPOND ? "respond" :
293 direction == TA_OUTPUT ? "drop" :
294 "unknown" ;
295
296#pragma D binding "1.12.1" tcpflag_string
297inline string tcpflag_string[uint8_t flags] =
298 flags & TH_FIN ? "FIN" :
299 flags & TH_SYN ? "SYN" :
300 flags & TH_RST ? "RST" :
301 flags & TH_PUSH ? "PUSH" :
302 flags & TH_ACK ? "ACK" :
303 flags & TH_URG ? "URG" :
304 flags & TH_ECE ? "ECE" :
305 flags & TH_CWR ? "CWR" :
306 "unknown" ;
307
308#pragma D binding "1.12.1" PRU_ATTACH
309inline int PRU_ATTACH = 0;
310#pragma D binding "1.12.1" PRU_DETACH
311inline int PRU_DETACH = 1;
312#pragma D binding "1.12.1" PRU_BIND
313inline int PRU_BIND = 2;
314#pragma D binding "1.12.1" PRU_LISTEN
315inline int PRU_LISTEN = 3;
316#pragma D binding "1.12.1" PRU_CONNECT
317inline int PRU_CONNECT = 4;
318#pragma D binding "1.12.1" PRU_ACCEPT
319inline int PRU_ACCEPT = 5 ;
320#pragma D binding "1.12.1" PRU_DISCONNECT
321inline int PRU_DISCONNECT= 6;
322#pragma D binding "1.12.1" PRU_SHUTDOWN
323inline int PRU_SHUTDOWN = 7;
324#pragma D binding "1.12.1" PRU_RCVD
325inline int PRU_RCVD = 8;
326#pragma D binding "1.12.1" PRU_SEND
327inline int PRU_SEND = 9;
328#pragma D binding "1.12.1" PRU_ABORT
329inline int PRU_ABORT = 10;
330#pragma D binding "1.12.1" PRU_CONTROL
331inline int PRU_CONTROL = 11;
332#pragma D binding "1.12.1" PRU_SENSE
333inline int PRU_SENSE = 12;
334#pragma D binding "1.12.1" PRU_RCVOOB
335inline int PRU_RCVOOB = 13;
336#pragma D binding "1.12.1" PRU_SENDOOB
337inline int PRU_SENDOOB = 14;
338#pragma D binding "1.12.1" PRU_SOCKADDR
339inline int PRU_SOCKADDR = 15;
340#pragma D binding "1.12.1" PRU_PEERADDR
341inline int PRU_PEERADDR = 16;
342#pragma D binding "1.12.1" PRU_CONNECT2
343inline int PRU_CONNECT2 = 17;
344#pragma D binding "1.12.1" PRU_FASTTIMO
345inline int PRU_FASTTIMO = 18;
346#pragma D binding "1.12.1" PRU_SLOWTIMO
347inline int PRU_SLOWTIMO = 19;
348#pragma D binding "1.12.1" PRU_PROTORCV
349inline int PRU_PROTORCV = 20;
350#pragma D binding "1.12.1" PRU_PROTOSEND
351inline int PRU_PROTOSEND = 21;
352#pragma D binding "1.12.1" PRU_SEND_EOF
353inline int PRU_SEND_EOF = 22;
354#pragma D binding "1.12.1" PRU_SOSETLABEL
355inline int PRU_SOSETLABEL = 23;
356#pragma D binding "1.12.1" PRU_CLOSE
357inline int PRU_CLOSE = 24;
358#pragma D binding "1.12.1" PRU_FLUSH
359inline int PRU_FLUSH = 25;
360
361#pragma D binding "1.12.1" prureq_string
362inline string prureq_string[uint8_t req] =
363 req == PRU_ATTACH ? "ATTACH" :
364 req == PRU_DETACH ? "DETACH" :
365 req == PRU_BIND ? "BIND" :
366 req == PRU_LISTEN ? "LISTEN" :
367 req == PRU_CONNECT ? "CONNECT" :
368 req == PRU_ACCEPT ? "ACCEPT" :
369 req == PRU_DISCONNECT ? "DISCONNECT" :
370 req == PRU_SHUTDOWN ? "SHUTDOWN" :
371 req == PRU_RCVD ? "RCVD" :
372 req == PRU_SEND ? "SEND" :
373 req == PRU_ABORT ? "ABORT" :
374 req == PRU_CONTROL ? "CONTROL" :
375 req == PRU_SENSE ? "SENSE" :
376 req == PRU_RCVOOB ? "RCVOOB" :
377 req == PRU_SENDOOB ? "SENDOOB" :
378 req == PRU_SOCKADDR ? "SOCKADDR" :
379 req == PRU_PEERADDR ? "PEERADDR" :
380 req == PRU_CONNECT2 ? "CONNECT2" :
381 req == PRU_FASTTIMO ? "FASTTIMO" :
382 req == PRU_SLOWTIMO ? "SLOWTIMO" :
383 req == PRU_PROTORCV ? "PROTORCV" :
384 req == PRU_PROTOSEND ? "PROTOSEND" :
385 req == PRU_SEND ? "SEND_EOF" :
386 req == PRU_SOSETLABEL ? "SOSETLABEL" :
387 req == PRU_CLOSE ? "CLOSE" :
388 req == PRU_FLUSH ? "FLUSE" :
389 "unknown" ;