1*7502Saruna@cs.umn.edu #!/usr/sbin/dtrace -Cqs 2*7502Saruna@cs.umn.edu /* 3*7502Saruna@cs.umn.edu * CDDL HEADER START 4*7502Saruna@cs.umn.edu * 5*7502Saruna@cs.umn.edu * The contents of this file are subject to the terms of the 6*7502Saruna@cs.umn.edu * Common Development and Distribution License (the "License"). 7*7502Saruna@cs.umn.edu * You may not use this file except in compliance with the License. 8*7502Saruna@cs.umn.edu * 9*7502Saruna@cs.umn.edu * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7502Saruna@cs.umn.edu * or http://www.opensolaris.org/os/licensing. 11*7502Saruna@cs.umn.edu * See the License for the specific language governing permissions 12*7502Saruna@cs.umn.edu * and limitations under the License. 13*7502Saruna@cs.umn.edu * 14*7502Saruna@cs.umn.edu * When distributing Covered Code, include this CDDL HEADER in each 15*7502Saruna@cs.umn.edu * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7502Saruna@cs.umn.edu * If applicable, add the following below this CDDL HEADER, with the 17*7502Saruna@cs.umn.edu * fields enclosed by brackets "[]" replaced with your own identifying 18*7502Saruna@cs.umn.edu * information: Portions Copyright [yyyy] [name of copyright owner] 19*7502Saruna@cs.umn.edu * 20*7502Saruna@cs.umn.edu * CDDL HEADER END 21*7502Saruna@cs.umn.edu */ 22*7502Saruna@cs.umn.edu /* 23*7502Saruna@cs.umn.edu * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24*7502Saruna@cs.umn.edu * Use is subject to license terms. 25*7502Saruna@cs.umn.edu */ 26*7502Saruna@cs.umn.edu 27*7502Saruna@cs.umn.edu #pragma D option dynvarsize=64m 28*7502Saruna@cs.umn.edu 29*7502Saruna@cs.umn.edu #define TH_RST 0x04 30*7502Saruna@cs.umn.edu #define MAX_RECORDS 10 31*7502Saruna@cs.umn.edu #define M_CTL 0x0d 32*7502Saruna@cs.umn.edu 33*7502Saruna@cs.umn.edu #define PRINT_MAIN_HEADER() \ 34*7502Saruna@cs.umn.edu (printf("\n%-25s %-6s %-25s %-6s %-10s %-10s %8s %8s\n", \ 35*7502Saruna@cs.umn.edu "LADDR", "LPORT", "RADDR", "RPORT", "ISS", "IRS", \ 36*7502Saruna@cs.umn.edu "SND_CNT", "RCV_CNT")) 37*7502Saruna@cs.umn.edu 38*7502Saruna@cs.umn.edu #define PRINT_RECORD_HEADER() \ 39*7502Saruna@cs.umn.edu (printf("%-20s %-20s %-3s %15s %15s %8s %8s %5s\n", \ 40*7502Saruna@cs.umn.edu "PROBENAME", "TIME", "S/R", "SEQ", "ACK", "DATALEN", \ 41*7502Saruna@cs.umn.edu "WND", "FLAGS")) 42*7502Saruna@cs.umn.edu 43*7502Saruna@cs.umn.edu #define PRINT_MAIN_HEADER_VALUES() \ 44*7502Saruna@cs.umn.edu (printf("%-25s %-6d %-25s %-6d %-10d %-10d %8d %8d\n", \ 45*7502Saruna@cs.umn.edu laddr[self->conn_id], lport[self->conn_id], \ 46*7502Saruna@cs.umn.edu faddr[self->conn_id], fport[self->conn_id], \ 47*7502Saruna@cs.umn.edu iss[self->conn_id], irs[self->conn_id], \ 48*7502Saruna@cs.umn.edu send_count[self->conn_id], recv_count[self->conn_id])) 49*7502Saruna@cs.umn.edu 50*7502Saruna@cs.umn.edu #define PRINT_HEADER() \ 51*7502Saruna@cs.umn.edu PRINT_MAIN_HEADER(); PRINT_MAIN_HEADER_VALUES(); \ 52*7502Saruna@cs.umn.edu PRINT_RECORD_HEADER() 53*7502Saruna@cs.umn.edu 54*7502Saruna@cs.umn.edu #define PRINT_RECORD(i) \ 55*7502Saruna@cs.umn.edu (printf("%-20s %-20Y %-3s %15d %15d %8d %8d %2x\n", \ 56*7502Saruna@cs.umn.edu probe_name[self->conn_id, i], \ 57*7502Saruna@cs.umn.edu conn_time[self->conn_id, i], \ 58*7502Saruna@cs.umn.edu send_recv[self->conn_id, i], \ 59*7502Saruna@cs.umn.edu seqno[self->conn_id, i], \ 60*7502Saruna@cs.umn.edu ack[self->conn_id, i], \ 61*7502Saruna@cs.umn.edu datalen[self->conn_id, i], \ 62*7502Saruna@cs.umn.edu wnd[self->conn_id, i], \ 63*7502Saruna@cs.umn.edu flags[self->conn_id, i])) 64*7502Saruna@cs.umn.edu 65*7502Saruna@cs.umn.edu tcp-trace-* 66*7502Saruna@cs.umn.edu { 67*7502Saruna@cs.umn.edu /* extract connection details */ 68*7502Saruna@cs.umn.edu 69*7502Saruna@cs.umn.edu this->mp = (mblk_t *)arg0; 70*7502Saruna@cs.umn.edu this->mp = (this->mp->b_datap->db_type == M_CTL? 71*7502Saruna@cs.umn.edu this->mp->b_cont : this->mp); 72*7502Saruna@cs.umn.edu self->tcpp = (tcp_t *)arg1; 73*7502Saruna@cs.umn.edu this->connp = (conn_t *)self->tcpp->tcp_connp; 74*7502Saruna@cs.umn.edu 75*7502Saruna@cs.umn.edu self->iph = (ipha_t *)this->mp->b_rptr; 76*7502Saruna@cs.umn.edu this->iph_length = 77*7502Saruna@cs.umn.edu (int)(((ipha_t *)self->iph)->ipha_version_and_hdr_length 78*7502Saruna@cs.umn.edu & 0xF) << 2; 79*7502Saruna@cs.umn.edu self->tcph = (tcpha_t *)((char *)self->iph + this->iph_length); 80*7502Saruna@cs.umn.edu this->tcph_length = 81*7502Saruna@cs.umn.edu (((tcph_t *)self->tcph)->th_offset_and_rsrvd[0] >>2) &(0xF << 2); 82*7502Saruna@cs.umn.edu 83*7502Saruna@cs.umn.edu /* ports */ 84*7502Saruna@cs.umn.edu self->i_lport = ntohs(this->connp->u_port.tcpu_ports.tcpu_lport); 85*7502Saruna@cs.umn.edu self->i_fport = ntohs(this->connp->u_port.tcpu_ports.tcpu_fport); 86*7502Saruna@cs.umn.edu 87*7502Saruna@cs.umn.edu /* IP addresses */ 88*7502Saruna@cs.umn.edu this->i_fad = (in6_addr_t *)&this->connp->connua_v6addr.connua_faddr; 89*7502Saruna@cs.umn.edu this->i_lad = (in6_addr_t *)&this->connp->connua_v6addr.connua_laddr; 90*7502Saruna@cs.umn.edu 91*7502Saruna@cs.umn.edu /* the address would either be IPv6 or IPv4-mapped-IPv6 */ 92*7502Saruna@cs.umn.edu self->i_faddr = inet_ntop(AF_INET6, (void *)this->i_fad); 93*7502Saruna@cs.umn.edu self->i_laddr = inet_ntop(AF_INET6, (void *)this->i_lad); 94*7502Saruna@cs.umn.edu 95*7502Saruna@cs.umn.edu /* create connection identifier, so we can track packets by conn */ 96*7502Saruna@cs.umn.edu self->conn_id = (uint64_t)self->tcpp->tcp_connp; 97*7502Saruna@cs.umn.edu } 98*7502Saruna@cs.umn.edu 99*7502Saruna@cs.umn.edu tcp-trace-* 100*7502Saruna@cs.umn.edu /first[self->conn_id] == 0/ 101*7502Saruna@cs.umn.edu { 102*7502Saruna@cs.umn.edu /* initialize counters - this is the first packet for this connection */ 103*7502Saruna@cs.umn.edu pcount[self->conn_id] = -1; 104*7502Saruna@cs.umn.edu rollover[self->conn_id] = 0; 105*7502Saruna@cs.umn.edu end_ptr[self->conn_id] = 0; 106*7502Saruna@cs.umn.edu num[self->conn_id] = 0; 107*7502Saruna@cs.umn.edu 108*7502Saruna@cs.umn.edu first[self->conn_id] = 1; 109*7502Saruna@cs.umn.edu 110*7502Saruna@cs.umn.edu /* connection info */ 111*7502Saruna@cs.umn.edu laddr[self->conn_id] = self->i_laddr; 112*7502Saruna@cs.umn.edu faddr[self->conn_id] = self->i_faddr; 113*7502Saruna@cs.umn.edu lport[self->conn_id] = self->i_lport; 114*7502Saruna@cs.umn.edu fport[self->conn_id] = self->i_fport; 115*7502Saruna@cs.umn.edu iss[self->conn_id] = self->tcpp->tcp_iss; 116*7502Saruna@cs.umn.edu irs[self->conn_id] = self->tcpp->tcp_irs; 117*7502Saruna@cs.umn.edu 118*7502Saruna@cs.umn.edu } 119*7502Saruna@cs.umn.edu 120*7502Saruna@cs.umn.edu tcp-trace-* 121*7502Saruna@cs.umn.edu { 122*7502Saruna@cs.umn.edu /* counters, to keep track of how much info to dump */ 123*7502Saruna@cs.umn.edu pcount[self->conn_id]++; 124*7502Saruna@cs.umn.edu rollover[self->conn_id] |= pcount[self->conn_id]/MAX_RECORDS; 125*7502Saruna@cs.umn.edu pcount[self->conn_id] = pcount[self->conn_id]%MAX_RECORDS; 126*7502Saruna@cs.umn.edu self->pcount = pcount[self->conn_id]; 127*7502Saruna@cs.umn.edu end_ptr[self->conn_id] = self->pcount; 128*7502Saruna@cs.umn.edu num[self->conn_id] = (rollover[self->conn_id]? 129*7502Saruna@cs.umn.edu MAX_RECORDS : pcount[self->conn_id] + 1); 130*7502Saruna@cs.umn.edu conn_time[self->conn_id, self->pcount] = walltimestamp; 131*7502Saruna@cs.umn.edu 132*7502Saruna@cs.umn.edu /* tcp state info */ 133*7502Saruna@cs.umn.edu seqno[self->conn_id, self->pcount] = ntohl(self->tcph->tha_seq); 134*7502Saruna@cs.umn.edu ack[self->conn_id, self->pcount] = ntohl(self->tcph->tha_ack); 135*7502Saruna@cs.umn.edu datalen[self->conn_id, self->pcount] = ntohs(self->iph->ipha_length); 136*7502Saruna@cs.umn.edu wnd[self->conn_id, self->pcount] = ntohs(self->tcph->tha_win); 137*7502Saruna@cs.umn.edu probe_name[self->conn_id, self->pcount] = probename; 138*7502Saruna@cs.umn.edu 139*7502Saruna@cs.umn.edu /* flag 0x04 indicates a RST packet */ 140*7502Saruna@cs.umn.edu flags[self->conn_id, self->pcount] = self->tcph->tha_flags; 141*7502Saruna@cs.umn.edu self->flags = self->tcph->tha_flags; 142*7502Saruna@cs.umn.edu } 143*7502Saruna@cs.umn.edu 144*7502Saruna@cs.umn.edu tcp-trace-send 145*7502Saruna@cs.umn.edu { 146*7502Saruna@cs.umn.edu send_count[self->conn_id]++; 147*7502Saruna@cs.umn.edu send_recv[self->conn_id, self->pcount] = "S"; 148*7502Saruna@cs.umn.edu } 149*7502Saruna@cs.umn.edu 150*7502Saruna@cs.umn.edu tcp-trace-recv 151*7502Saruna@cs.umn.edu { 152*7502Saruna@cs.umn.edu recv_count[self->conn_id]++; 153*7502Saruna@cs.umn.edu send_recv[self->conn_id, self->pcount] = "R"; 154*7502Saruna@cs.umn.edu } 155*7502Saruna@cs.umn.edu 156*7502Saruna@cs.umn.edu tcp-trace-* 157*7502Saruna@cs.umn.edu /(self->flags & TH_RST)/ 158*7502Saruna@cs.umn.edu { 159*7502Saruna@cs.umn.edu PRINT_HEADER(); 160*7502Saruna@cs.umn.edu 161*7502Saruna@cs.umn.edu self->i = (end_ptr[self->conn_id] + MAX_RECORDS - num[self->conn_id] 162*7502Saruna@cs.umn.edu + 1)%MAX_RECORDS; 163*7502Saruna@cs.umn.edu } 164*7502Saruna@cs.umn.edu 165*7502Saruna@cs.umn.edu tcp-trace-* 166*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 10)/ 167*7502Saruna@cs.umn.edu { 168*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 169*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 170*7502Saruna@cs.umn.edu 171*7502Saruna@cs.umn.edu num[self->conn_id]--; 172*7502Saruna@cs.umn.edu } 173*7502Saruna@cs.umn.edu 174*7502Saruna@cs.umn.edu tcp-trace-* 175*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 9)/ 176*7502Saruna@cs.umn.edu { 177*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 178*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 179*7502Saruna@cs.umn.edu 180*7502Saruna@cs.umn.edu num[self->conn_id]--; 181*7502Saruna@cs.umn.edu } 182*7502Saruna@cs.umn.edu 183*7502Saruna@cs.umn.edu tcp-trace-* 184*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 8)/ 185*7502Saruna@cs.umn.edu { 186*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 187*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 188*7502Saruna@cs.umn.edu 189*7502Saruna@cs.umn.edu num[self->conn_id]--; 190*7502Saruna@cs.umn.edu } 191*7502Saruna@cs.umn.edu 192*7502Saruna@cs.umn.edu tcp-trace-* 193*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 7)/ 194*7502Saruna@cs.umn.edu { 195*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 196*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 197*7502Saruna@cs.umn.edu 198*7502Saruna@cs.umn.edu num[self->conn_id]--; 199*7502Saruna@cs.umn.edu } 200*7502Saruna@cs.umn.edu 201*7502Saruna@cs.umn.edu tcp-trace-* 202*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 6)/ 203*7502Saruna@cs.umn.edu { 204*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 205*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 206*7502Saruna@cs.umn.edu 207*7502Saruna@cs.umn.edu num[self->conn_id]--; 208*7502Saruna@cs.umn.edu } 209*7502Saruna@cs.umn.edu 210*7502Saruna@cs.umn.edu tcp-trace-* 211*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 5)/ 212*7502Saruna@cs.umn.edu { 213*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 214*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 215*7502Saruna@cs.umn.edu 216*7502Saruna@cs.umn.edu num[self->conn_id]--; 217*7502Saruna@cs.umn.edu } 218*7502Saruna@cs.umn.edu 219*7502Saruna@cs.umn.edu tcp-trace-* 220*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 4)/ 221*7502Saruna@cs.umn.edu { 222*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 223*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 224*7502Saruna@cs.umn.edu 225*7502Saruna@cs.umn.edu num[self->conn_id]--; 226*7502Saruna@cs.umn.edu } 227*7502Saruna@cs.umn.edu 228*7502Saruna@cs.umn.edu tcp-trace-* 229*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 3)/ 230*7502Saruna@cs.umn.edu { 231*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 232*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 233*7502Saruna@cs.umn.edu 234*7502Saruna@cs.umn.edu num[self->conn_id]--; 235*7502Saruna@cs.umn.edu } 236*7502Saruna@cs.umn.edu 237*7502Saruna@cs.umn.edu tcp-trace-* 238*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 2)/ 239*7502Saruna@cs.umn.edu { 240*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 241*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 242*7502Saruna@cs.umn.edu 243*7502Saruna@cs.umn.edu num[self->conn_id]--; 244*7502Saruna@cs.umn.edu } 245*7502Saruna@cs.umn.edu 246*7502Saruna@cs.umn.edu tcp-trace-* 247*7502Saruna@cs.umn.edu /(self->flags & TH_RST) && (num[self->conn_id] >= 1)/ 248*7502Saruna@cs.umn.edu { 249*7502Saruna@cs.umn.edu PRINT_RECORD(self->i); 250*7502Saruna@cs.umn.edu self->i = (self->i + 1)%MAX_RECORDS; 251*7502Saruna@cs.umn.edu 252*7502Saruna@cs.umn.edu num[self->conn_id]--; 253*7502Saruna@cs.umn.edu self->reset = self->conn_id; 254*7502Saruna@cs.umn.edu } 255*7502Saruna@cs.umn.edu 256*7502Saruna@cs.umn.edu tcp-trace-* 257*7502Saruna@cs.umn.edu /self->reset/ 258*7502Saruna@cs.umn.edu { 259*7502Saruna@cs.umn.edu pcount[self->reset] = -1; 260*7502Saruna@cs.umn.edu rollover[self->reset] = 0; 261*7502Saruna@cs.umn.edu end_ptr[self->reset] = 0; 262*7502Saruna@cs.umn.edu num[self->reset] = 0; 263*7502Saruna@cs.umn.edu 264*7502Saruna@cs.umn.edu self->reset = 0; 265*7502Saruna@cs.umn.edu } 266*7502Saruna@cs.umn.edu 267*7502Saruna@cs.umn.edu conn-destroy 268*7502Saruna@cs.umn.edu { 269*7502Saruna@cs.umn.edu /* clear old connection state */ 270*7502Saruna@cs.umn.edu this->conn_id = (uint64_t)arg0; 271*7502Saruna@cs.umn.edu 272*7502Saruna@cs.umn.edu pcount[this->conn_id] = -1; 273*7502Saruna@cs.umn.edu rollover[this->conn_id] = 0; 274*7502Saruna@cs.umn.edu end_ptr[this->conn_id] = 0; 275*7502Saruna@cs.umn.edu num[this->conn_id] = 0; 276*7502Saruna@cs.umn.edu first[this->conn_id] = 0; 277*7502Saruna@cs.umn.edu 278*7502Saruna@cs.umn.edu laddr[this->conn_id] = 0; 279*7502Saruna@cs.umn.edu faddr[this->conn_id] = 0; 280*7502Saruna@cs.umn.edu lport[this->conn_id] = 0; 281*7502Saruna@cs.umn.edu fport[this->conn_id] = 0; 282*7502Saruna@cs.umn.edu iss[this->conn_id] = 0; 283*7502Saruna@cs.umn.edu irs[this->conn_id] = 0; 284*7502Saruna@cs.umn.edu } 285