X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/bd504ef0e0b883cdd7917b73b3574eb9ce669905..39236c6e673c41db228275375ab7fdb0f837b292:/bsd/dev/dtrace/scripts/tcp.d diff --git a/bsd/dev/dtrace/scripts/tcp.d b/bsd/dev/dtrace/scripts/tcp.d new file mode 100644 index 000000000..3aca8b7bb --- /dev/null +++ b/bsd/dev/dtrace/scripts/tcp.d @@ -0,0 +1,254 @@ +/* + * Copyright (c) 2006-2008 Apple Computer, Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +#pragma D depends_on library darwin.d +#pragma D depends_on module mach_kernel +#pragma D depends_on provider tcp + +/* + * TCP flags + */ +inline int TH_FIN = 0x01; +#pragma D binding "1.0" TH_FIN +inline int TH_SYN = 0x02; +#pragma D binding "1.0" TH_SYN +inline int TH_RST = 0x04; +#pragma D binding "1.0" TH_RST +inline int TH_PUSH = 0x08; +#pragma D binding "1.0" TH_PUSH +inline int TH_ACK = 0x10; +#pragma D binding "1.0" TH_ACK +inline int TH_URG = 0x20; +#pragma D binding "1.0" TH_URG +inline int TH_ECE = 0x40; +#pragma D binding "1.0" TH_ECE +inline int TH_CWR = 0x80; +#pragma D binding "1.0" TH_CWR + +/* + * TCP states + */ +inline int TCPS_CLOSED = 0; +#pragma D binding "1.0" TCPS_CLOSED +inline int TCPS_LISTEN = 1; +#pragma D binding "1.0" TCPS_LISTEN +inline int TCPS_SYN_SENT = 2; +#pragma D binding "1.0" TCPS_SYN_SENT +inline int TCPS_SYN_RECEIVED = 3; +#pragma D binding "1.0" TCPS_SYN_RECEIVED +inline int TCPS_ESTABLISHED = 4; +#pragma D binding "1.0" TCPS_ESTABLISHED +inline int TCPS_CLOSE_WAIT = 5; +#pragma D binding "1.0" TCPS_CLOSE_WAIT +inline int TCPS_FIN_WAIT_1 = 6; +#pragma D binding "1.0" TCPS_FIN_WAIT_1 +inline int TCPS_CLOSING = 7; +#pragma D binding "1.0" TCPS_CLOSING +inline int TCPS_LAST_ACK = 8; +#pragma D binding "1.0" TCPS_LAST_ACK +inline int TCPS_FIN_WAIT_2 = 9; +#pragma D binding "1.0" TCPS_FIN_WAIT_2 +inline int TCPS_TIME_WAIT = 10; +#pragma D binding "1.0" TCPS_TIME_WAIT + +/* + * TCP congestion control events + */ +inline int TCP_CC_CWND_INIT = 0; +#pragma D binding "1.0" TCP_CC_CWND_INIT +inline int TCP_CC_INSEQ_ACK_RCVD = 1; +#pragma D binding "1.0" TCP_CC_INSEQ_ACK_RCVD +inline int TCP_CC_ACK_RCVD = 2; +#pragma D binding "1.0" TCP_CC_ACK_RCVD +inline int TCP_CC_ENTER_FASTRECOVERY = 3; +#pragma D binding "1.0" TCP_CC_ENTER_FASTRECOVERY +inline int TCP_CC_IN_FASTRECOVERY = 4; +#pragma D binding "1.0" TCP_CC_IN_FASTRECOVERY +inline int TCP_CC_EXIT_FASTRECOVERY = 5; +#pragma D binding "1.0" TCP_CC_EXIT_FASTRECOVERY +inline int TCP_CC_PARTIAL_ACK = 6; +#pragma D binding "1.0" TCP_CC_PARTIAL_ACK +inline int TCP_CC_IDLE_TIMEOUT = 7; +#pragma D binding "1.0" TCP_CC_IDLE_TIMEOUT +inline int TCP_CC_REXMT_TIMEOUT = 8; +#pragma D binding "1.0" TCP_CC_REXMT_TIMEOUT +inline int TCP_CC_ECN_RCVD = 9; +#pragma D binding "1.0" TCP_CC_ECN_RCVD +inline int TCP_CC_BAD_REXMT_RECOVERY = 10; +#pragma D binding "1.0" TCP_CC_BAD_REXMT_RECOVERY +inline int TCP_CC_OUTPUT_ERROR = 11; +#pragma D binding "1.0" TCP_CC_OUTPUT_ERROR +inline int TCP_CC_CHANGE_ALGO = 12; +#pragma D binding "1.0" TCP_CC_CHANGE_ALGO +inline int TCP_CC_FLOW_CONTROL = 13; +#pragma D binding "1.0" TCP_CC_FLOW_CONTROL +inline int TCP_CC_SUSPEND = 14; +#pragma D binding "1.0" TCP_CC_SUSPEND +inline int TCP_CC_LIMITED_TRANSMIT = 15; +#pragma D binding "1.0" TCP_CC_LIMITED_TRANSMIT +inline int TCP_CC_EARLY_RETRANSMIT = 16; +#pragma D binding "1.0" TCP_CC_EARLY_RETRANSMIT + + +/* + * tcpinfo is the TCP header field + */ +typedef struct tcpinfo { + uint16_t tcp_sport; /* source port */ + uint16_t tcp_dport; /* destination port */ + uint32_t tcp_seq; /* sequence number */ + uint32_t tcp_ack; /* acknowledgement number */ + uint8_t tcp_offset; /* data offset, in bytes */ + uint8_t tcp_flags; /* flags */ + uint16_t tcp_window; /* window size */ + uint16_t tcp_checksum; /* checksum */ + uint16_t tcp_urgent; /* urgent data pointer */ + struct tcphdr *tcp_hdr; /* raw TCP header */ +} tcpinfo_t; + +#pragma D binding "1.0" translator +translator tcpinfo_t < struct tcphdr *T > { + tcp_sport = ntohs(T->th_sport); + tcp_dport = ntohs(T->th_dport); + tcp_seq = ntohl(T->th_seq); + tcp_ack = ntohl(T->th_ack); + tcp_offset = T->th_off << 2; + tcp_flags = T->th_flags; + tcp_window = ntohs(T->th_win); + tcp_checksum = ntohs(T->th_sum); + tcp_urgent = ntohs(T->th_urp); + tcp_hdr = T; +}; + +/* + * tcpsinfo contains stable TCP details from TCP control block + */ +typedef struct tcpsinfo { + int tcps_local; /* is delivered locally, boolean */ + int tcps_active; /* active open, boolean */ + string tcps_state; /* TCP state, as a string */ + u_int t_flags; /* flags */ + uint32_t rcv_nxt; /* receive next */ + uint32_t rcv_adv; /* advertised window */ + uint32_t rcv_wnd; /* receive window */ + uint32_t snd_wnd; /* send window */ + uint32_t snd_cwnd; /* congestion controlled window */ + uint32_t snd_ssthresh; /* slow-start threshold */ + uint32_t snd_una; /* send unacknowledged */ + uint32_t snd_nxt; /* send next */ + uint32_t snd_max; /* send max */ + uint32_t snd_recover; /* send recover for NewReno */ + int t_rxtcur; /* retransmit timeout in ms */ + u_int t_maxseg; /* maximum segment size */ + u_int t_rttbest; /* best rtt we have seen */ + int rcv_numsacks; /* number of sack blocks present */ + int snd_numholes; /* number of holes seen by sender */ + struct tcpcb* tcpcb; /* Pointer to tcp control block */ +} tcpsinfo_t; + +#pragma D binding "1.0" translator +translator tcpsinfo_t < struct tcpcb *T> { + tcps_local = 0; /* Not used */ + tcps_active = 0; + tcps_state = T ? + T->t_state == TCPS_CLOSED ? "state-closed" : + T->t_state == TCPS_LISTEN ? "state-listen" : + T->t_state == TCPS_SYN_SENT ? "state-syn-sent" : + T->t_state == TCPS_SYN_RECEIVED ? "state-syn-received" : + T->t_state == TCPS_ESTABLISHED ? "state-established" : + T->t_state == TCPS_CLOSE_WAIT ? "state-close-wait" : + T->t_state == TCPS_FIN_WAIT_1 ? "state-fin-wait1" : + T->t_state == TCPS_CLOSING ? "state-closing" : + T->t_state == TCPS_LAST_ACK ? "state-last-ack" : + T->t_state == TCPS_FIN_WAIT_2 ? "state-fin-wait2" : + T->t_state == TCPS_TIME_WAIT ? "state-time-wait" : + "" : ""; + t_flags = T->t_flags; + rcv_nxt = T->rcv_nxt; + rcv_adv = T->rcv_adv; + rcv_wnd = T->rcv_wnd; + snd_wnd = T->snd_wnd; + snd_cwnd = T->snd_cwnd; + snd_ssthresh = T->snd_ssthresh; + snd_una = T->snd_una; + snd_nxt = T->snd_nxt; + snd_max = T->snd_max; + snd_recover = T->snd_recover; + t_rxtcur = T->t_rxtcur; + t_maxseg = T->t_maxseg; + t_rttbest = T->t_rttbest; + rcv_numsacks = T->rcv_numsacks; + snd_numholes = T->snd_numholes; + tcpcb = T; +}; + +/* + * tcpnsinfo provides the new tcp state for state changes. + */ +typedef struct tcpnsinfo { + string tcps_state; /* TCP state, as a string */ +} tcpnsinfo_t; + +#pragma D binding "1.0" translator +translator tcpnsinfo_t < int32_t I > { + tcps_state = I ? + I == TCPS_LISTEN ? "state-listen" : + I == TCPS_SYN_SENT ? "state-syn-sent" : + I == TCPS_SYN_RECEIVED ? "state-syn-received" : + I == TCPS_ESTABLISHED ? "state-established" : + I == TCPS_CLOSE_WAIT ? "state-close-wait" : + I == TCPS_FIN_WAIT_1 ? "state-fin-wait1" : + I == TCPS_CLOSING ? "state-closing" : + I == TCPS_LAST_ACK ? "state-last-ack" : + I == TCPS_FIN_WAIT_2 ? "state-fin-wait2" : + I == TCPS_TIME_WAIT ? "state-time-wait" : + "" : "state-closed"; +}; + +/* + * tcpccevent provides the congestion control event for TCP cc probes + */ +typedef struct tcpccevent { + string tcp_cc; /* TCP congestion control event, as a string */ +} tcpccevent_t; + +#pragma D binding "1.0" translator +translator tcpccevent_t < int32_t I > { + tcp_cc = I ? + I == TCP_CC_INSEQ_ACK_RCVD ? "inseq-ack-rcvd" : + I == TCP_CC_ACK_RCVD ? "ack-rcvd" : + I == TCP_CC_ENTER_FASTRECOVERY ? "enter-fastrecovery" : + I == TCP_CC_EXIT_FASTRECOVERY ? "exit-fastrecovery" : + I == TCP_CC_PARTIAL_ACK ? "partial-ack" : + I == TCP_CC_IDLE_TIMEOUT ? "idle-timeout" : + I == TCP_CC_REXMT_TIMEOUT ? "rexmt-timeout" : + I == TCP_CC_ECN_RCVD ? "ecn-rcvd" : + I == TCP_CC_BAD_REXMT_RECOVERY ? "bad-rexmt" : + I == TCP_CC_OUTPUT_ERROR ? "output-error" : + I == TCP_CC_CHANGE_ALGO ? "change-algo" : + I == TCP_CC_FLOW_CONTROL ? "flow-control" : + I == TCP_CC_SUSPEND ? "suspend" : + I == TCP_CC_LIMITED_TRANSMIT ? "limited-transmit" : + I == TCP_CC_EARLY_RETRANSMIT ? "early-rexmt" : + "" : "cwnd-init"; +};