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" ;
|