1*5d06879aSGeorge V. Neville-Neil#!/usr/sbin/dtrace -s 2*5d06879aSGeorge V. Neville-Neil/* 3*5d06879aSGeorge V. Neville-Neil * Copyright (c) 2015 George V. Neville-Neil 4*5d06879aSGeorge V. Neville-Neil * All rights reserved. 5*5d06879aSGeorge V. Neville-Neil * 6*5d06879aSGeorge V. Neville-Neil * Redistribution and use in source and binary forms, with or without 7*5d06879aSGeorge V. Neville-Neil * modification, are permitted provided that the following conditions 8*5d06879aSGeorge V. Neville-Neil * are met: 9*5d06879aSGeorge V. Neville-Neil * 1. Redistributions of source code must retain the above copyright 10*5d06879aSGeorge V. Neville-Neil * notice, this list of conditions and the following disclaimer. 11*5d06879aSGeorge V. Neville-Neil * 2. Redistributions in binary form must reproduce the above copyright 12*5d06879aSGeorge V. Neville-Neil * notice, this list of conditions and the following disclaimer in the 13*5d06879aSGeorge V. Neville-Neil * documentation and/or other materials provided with the distribution. 14*5d06879aSGeorge V. Neville-Neil * 15*5d06879aSGeorge V. Neville-Neil * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*5d06879aSGeorge V. Neville-Neil * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*5d06879aSGeorge V. Neville-Neil * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*5d06879aSGeorge V. Neville-Neil * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*5d06879aSGeorge V. Neville-Neil * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*5d06879aSGeorge V. Neville-Neil * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*5d06879aSGeorge V. Neville-Neil * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*5d06879aSGeorge V. Neville-Neil * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*5d06879aSGeorge V. Neville-Neil * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*5d06879aSGeorge V. Neville-Neil * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*5d06879aSGeorge V. Neville-Neil * SUCH DAMAGE. 26*5d06879aSGeorge V. Neville-Neil * 27*5d06879aSGeorge V. Neville-Neil * $FreeBSD$ 28*5d06879aSGeorge V. Neville-Neil * 29*5d06879aSGeorge V. Neville-Neil * The tcpdebug D script uses the tcp:kernel::debug tracepoints 30*5d06879aSGeorge V. Neville-Neil * to replicate the action of turning on TCPDEBUG in a kernel configuration. 31*5d06879aSGeorge V. Neville-Neil * 32*5d06879aSGeorge V. Neville-Neil * A TCP debug statement shows a connection's 33*5d06879aSGeorge V. Neville-Neil * 34*5d06879aSGeorge V. Neville-Neil * direction: input, output, user, drop 35*5d06879aSGeorge V. Neville-Neil * state: CLOSED, LISTEN, SYN_SENT, SYN_RCVD, ESTABLISHED, 36*5d06879aSGeorge V. Neville-Neil * CLOSE_WAIT, FIN_WAIT_1, CLOSING, LAST_ACK, FIN_WAIT_2,TIME_WAIT 37*5d06879aSGeorge V. Neville-Neil * sequence: sequence space 38*5d06879aSGeorge V. Neville-Neil * 39*5d06879aSGeorge V. Neville-Neil * congestion: rcv_nxt, rcv_wnd, rcv_up, snd_una, snd_nxt, snx_max, 40*5d06879aSGeorge V. Neville-Neil * snd_wl1, snd_wl2, snd_wnd 41*5d06879aSGeorge V. Neville-Neil * 42*5d06879aSGeorge V. Neville-Neil * NOTE: Only sockets with SO_DEBUG set will be shown. 43*5d06879aSGeorge V. Neville-Neil * 44*5d06879aSGeorge V. Neville-Neil * Usage: tcpdebug 45*5d06879aSGeorge V. Neville-Neil */ 46*5d06879aSGeorge V. Neville-Neil 47*5d06879aSGeorge V. Neville-Neil#pragma D option quiet 48*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-input 49*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/ 50*5d06879aSGeorge V. Neville-Neil{ 51*5d06879aSGeorge V. Neville-Neil seq = args[1]->tcp_seq; 52*5d06879aSGeorge V. Neville-Neil ack = args[1]->tcp_ack; 53*5d06879aSGeorge V. Neville-Neil len = args[2]->ip_plength - sizeof(struct tcphdr); 54*5d06879aSGeorge V. Neville-Neil flags = args[1]->tcp_flags; 55*5d06879aSGeorge V. Neville-Neil 56*5d06879aSGeorge V. Neville-Neil printf("%p %s: input [%xu..%xu]", arg0, 57*5d06879aSGeorge V. Neville-Neil tcp_state_string[args[0]->tcps_state], seq, seq + len); 58*5d06879aSGeorge V. Neville-Neil 59*5d06879aSGeorge V. Neville-Neil printf("@%x, urp=%x", ack, args[1]->tcp_urgent); 60*5d06879aSGeorge V. Neville-Neil 61*5d06879aSGeorge V. Neville-Neil printf("%s", flags != 0 ? "<" : ""); 62*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_SYN ? "SYN," :""); 63*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_ACK ? "ACK," :""); 64*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_FIN ? "FIN," :""); 65*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_RST ? "RST," :""); 66*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_PUSH ? "PUSH," :""); 67*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_URG ? "URG," :""); 68*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_ECE ? "ECE," :""); 69*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_CWR ? "CWR" :""); 70*5d06879aSGeorge V. Neville-Neil printf("%s", flags != 0 ? ">" : ""); 71*5d06879aSGeorge V. Neville-Neil 72*5d06879aSGeorge V. Neville-Neil printf("\n"); 73*5d06879aSGeorge V. Neville-Neil printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", 74*5d06879aSGeorge V. Neville-Neil args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup, 75*5d06879aSGeorge V. Neville-Neil args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax); 76*5d06879aSGeorge V. Neville-Neil printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", 77*5d06879aSGeorge V. Neville-Neil args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd); 78*5d06879aSGeorge V. Neville-Neil 79*5d06879aSGeorge V. Neville-Neil} 80*5d06879aSGeorge V. Neville-Neil 81*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-output 82*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/ 83*5d06879aSGeorge V. Neville-Neil{ 84*5d06879aSGeorge V. Neville-Neil seq = args[1]->tcp_seq; 85*5d06879aSGeorge V. Neville-Neil ack = args[1]->tcp_ack; 86*5d06879aSGeorge V. Neville-Neil len = args[2]->ip_plength - 20; 87*5d06879aSGeorge V. Neville-Neil 88*5d06879aSGeorge V. Neville-Neil printf("%p %s: output [%x..%x]", arg0, 89*5d06879aSGeorge V. Neville-Neil tcp_state_string[args[0]->tcps_state], seq, seq + len); 90*5d06879aSGeorge V. Neville-Neil 91*5d06879aSGeorge V. Neville-Neil printf("@%x, urp=%x", ack, args[1]->tcp_urgent); 92*5d06879aSGeorge V. Neville-Neil 93*5d06879aSGeorge V. Neville-Neil printf("%s", flags != 0 ? "<" : ""); 94*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_SYN ? "SYN," :""); 95*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_ACK ? "ACK," :""); 96*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_FIN ? "FIN," :""); 97*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_RST ? "RST," :""); 98*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_PUSH ? "PUSH," :""); 99*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_URG ? "URG," :""); 100*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_ECE ? "ECE," :""); 101*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_CWR ? "CWR" :""); 102*5d06879aSGeorge V. Neville-Neil printf("%s", flags != 0 ? ">" : ""); 103*5d06879aSGeorge V. Neville-Neil 104*5d06879aSGeorge V. Neville-Neil printf("\n"); 105*5d06879aSGeorge V. Neville-Neil printf("\trcv_(nxt,wnd,up) (%u,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", 106*5d06879aSGeorge V. Neville-Neil args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup, 107*5d06879aSGeorge V. Neville-Neil args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax); 108*5d06879aSGeorge V. Neville-Neil printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", 109*5d06879aSGeorge V. Neville-Neil args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd); 110*5d06879aSGeorge V. Neville-Neil 111*5d06879aSGeorge V. Neville-Neil} 112*5d06879aSGeorge V. Neville-Neil 113*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-drop 114*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/ 115*5d06879aSGeorge V. Neville-Neil{ 116*5d06879aSGeorge V. Neville-Neil printf("%p %s: output [x..x] @%x, urp=%x\n", arg0, 117*5d06879aSGeorge V. Neville-Neil tcp_state_string[args[0]->tcps_state], 118*5d06879aSGeorge V. Neville-Neil args[1]->tcp_ack, 119*5d06879aSGeorge V. Neville-Neil args[1]->tcp_urgent); 120*5d06879aSGeorge V. Neville-Neil 121*5d06879aSGeorge V. Neville-Neil seq = args[1]->tcp_seq; 122*5d06879aSGeorge V. Neville-Neil ack = args[1]->tcp_ack; 123*5d06879aSGeorge V. Neville-Neil len = args[2]->ip_plength; 124*5d06879aSGeorge V. Neville-Neil 125*5d06879aSGeorge V. Neville-Neil printf("%p %s: drop [%x..%x]", arg0, 126*5d06879aSGeorge V. Neville-Neil tcp_state_string[args[0]->tcps_state], seq, seq + len); 127*5d06879aSGeorge V. Neville-Neil 128*5d06879aSGeorge V. Neville-Neil printf("@%x, urp=%x", ack, args[1]->tcp_urgent); 129*5d06879aSGeorge V. Neville-Neil 130*5d06879aSGeorge V. Neville-Neil printf("%s", flags != 0 ? "<" : ""); 131*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_SYN ? "SYN," :""); 132*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_ACK ? "ACK," :""); 133*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_FIN ? "FIN," :""); 134*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_RST ? "RST," :""); 135*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_PUSH ? "PUSH," :""); 136*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_URG ? "URG," :""); 137*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_ECE ? "ECE," :""); 138*5d06879aSGeorge V. Neville-Neil printf("%s", flags & TH_CWR ? "CWR" :""); 139*5d06879aSGeorge V. Neville-Neil printf("%s", flags != 0 ? ">" : ""); 140*5d06879aSGeorge V. Neville-Neil 141*5d06879aSGeorge V. Neville-Neil printf("\n"); 142*5d06879aSGeorge V. Neville-Neil printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", 143*5d06879aSGeorge V. Neville-Neil args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup, 144*5d06879aSGeorge V. Neville-Neil args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax); 145*5d06879aSGeorge V. Neville-Neil printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", 146*5d06879aSGeorge V. Neville-Neil args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd); 147*5d06879aSGeorge V. Neville-Neil 148*5d06879aSGeorge V. Neville-Neil} 149*5d06879aSGeorge V. Neville-Neil 150*5d06879aSGeorge V. Neville-Neiltcp:kernel::debug-user 151*5d06879aSGeorge V. Neville-Neil/args[0]->tcps_debug/ 152*5d06879aSGeorge V. Neville-Neil{ 153*5d06879aSGeorge V. Neville-Neil printf("%p %s: user ", arg0, 154*5d06879aSGeorge V. Neville-Neil tcp_state_string[args[0]->tcps_state]); 155*5d06879aSGeorge V. Neville-Neil 156*5d06879aSGeorge V. Neville-Neil printf("%s", prureq_string[arg1]); 157*5d06879aSGeorge V. Neville-Neil printf("\n"); 158*5d06879aSGeorge V. Neville-Neil printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n", 159*5d06879aSGeorge V. Neville-Neil args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup, 160*5d06879aSGeorge V. Neville-Neil args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax); 161*5d06879aSGeorge V. Neville-Neil printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n", 162*5d06879aSGeorge V. Neville-Neil args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd); 163*5d06879aSGeorge V. Neville-Neil 164*5d06879aSGeorge V. Neville-Neil} 165*5d06879aSGeorge V. Neville-Neil 166