Home | History | Annotate | Line # | Download | only in Bin
      1  1.1  christos #!/usr/bin/ksh
      2  1.1  christos #
      3  1.1  christos # tcptop_snv - display top TCP network packets by process. 
      4  1.1  christos #              Written using DTrace (Solaris Nevada)
      5  1.1  christos #
      6  1.1  christos # This analyses TCP network packets and prints the responsible PID and UID,
      7  1.1  christos # plus standard details such as IP address and port. This captures traffic
      8  1.1  christos # of newly created TCP connections that were established while this program
      9  1.1  christos # was running. It can help identify which processes is causing TCP traffic.
     10  1.1  christos #
     11  1.1  christos # WARNING: This script may only work on Solaris Nevada and OpenSolaris
     12  1.1  christos # of the late 2007 vintage, since it uses the fbt provider to trace the raw
     13  1.1  christos # operation of a specific version of the kernel. In the future, a 'stable'
     14  1.1  christos # network provider should exist which will allow this to be written for that
     15  1.1  christos # and subsequent versions of the kernel. In the meantime, check for other
     16  1.1  christos # versions of this script in the /Net directory, and read the
     17  1.1  christos # Notes/ALLfbt_notes.txt for more background on fbt.
     18  1.1  christos #
     19  1.1  christos # $Id: tcptop_snv,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $
     20  1.1  christos #
     21  1.1  christos # USAGE:	tcptop [-Ch] [-j|-Z] [interval [count]]
     22  1.1  christos #
     23  1.1  christos #		-C		# don't clear the screen
     24  1.1  christos #		-j		# print project IDs
     25  1.1  christos #		-Z		# print zone IDs
     26  1.1  christos #
     27  1.1  christos # FIELDS:
     28  1.1  christos #		UID     	user ID
     29  1.1  christos #		PID     	process ID
     30  1.1  christos #		CMD     	command
     31  1.1  christos #		LADDR		local IP address
     32  1.1  christos #		RADDR		remote IP address
     33  1.1  christos #		LPORT		local port number
     34  1.1  christos #		RPORT		remote port number
     35  1.1  christos #		SIZE    	packet size, bytes
     36  1.1  christos #		load		1 min load average
     37  1.1  christos #		TCPin		TCP inbound payload data
     38  1.1  christos #		TCPout		TCP outbound payload data
     39  1.1  christos #		ZONE    	zone ID
     40  1.1  christos #		PROJ    	project ID
     41  1.1  christos #
     42  1.1  christos # SEE ALSO:	tcpsnoop
     43  1.1  christos #
     44  1.1  christos # COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg.
     45  1.1  christos #
     46  1.1  christos # CDDL HEADER START
     47  1.1  christos #
     48  1.1  christos #  The contents of this file are subject to the terms of the
     49  1.1  christos #  Common Development and Distribution License, Version 1.0 only
     50  1.1  christos #  (the "License").  You may not use this file except in compliance
     51  1.1  christos #  with the License.
     52  1.1  christos #
     53  1.1  christos #  You can obtain a copy of the license at Docs/cddl1.txt
     54  1.1  christos #  or http://www.opensolaris.org/os/licensing.
     55  1.1  christos #  See the License for the specific language governing permissions
     56  1.1  christos #  and limitations under the License.
     57  1.1  christos #
     58  1.1  christos # CDDL HEADER END
     59  1.1  christos #
     60  1.1  christos # Author: Brendan Gregg  [Sydney, Australia]
     61  1.1  christos #
     62  1.1  christos # ToDo: IPv6
     63  1.1  christos #
     64  1.1  christos # 05-Jul-2005  Brendan Gregg	Created this.
     65  1.1  christos # 03-Dec-2005	  "	 "	Fixed tcp_accept_finish bug, now 100% correct
     66  1.1  christos #				execname. Thanks Kias Belgaied for expertise.
     67  1.1  christos # 20-Apr-2006     "      "      Fixed SS_TCP_FAST_ACCEPT bug in build 31+.
     68  1.1  christos # 20-Apr-2006     "      "      Last update.
     69  1.1  christos # 30-Sep-2007	   "	  "	Bumped this for recent OpenSolaris/Nevada.
     70  1.1  christos #
     71  1.1  christos 
     72  1.1  christos ##############################
     73  1.1  christos # --- Process Arguments ---
     74  1.1  christos #
     75  1.1  christos 
     76  1.1  christos ### default variables
     77  1.1  christos opt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1
     78  1.1  christos 
     79  1.1  christos ### process options
     80  1.1  christos while getopts ChjZ name
     81  1.1  christos do
     82  1.1  christos 	case $name in
     83  1.1  christos 	C)      opt_clear=0 ;;
     84  1.1  christos 	j)      opt_proj=1; opt_def=0 ;;
     85  1.1  christos 	Z)      opt_zone=1; opt_def=0 ;;
     86  1.1  christos 	h|?)    cat <<-END >&2
     87  1.1  christos 		USAGE: tcptop [-h] [-j|-Z] [interval [count]]
     88  1.1  christos 		       tcptop                  # default output
     89  1.1  christos 		                -C             # don't clear the screen
     90  1.1  christos 		                -j             # print project ID
     91  1.1  christos 		                -Z             # print zonename
     92  1.1  christos 		  eg,
     93  1.1  christos 		      tcptop                   # default is 5 sec interval
     94  1.1  christos 		      tcptop 2                 # 2 second interval
     95  1.1  christos 		      tcptop -C 1 10           # 10 x 1 sec samples, no clear
     96  1.1  christos 		END
     97  1.1  christos 		exit 1
     98  1.1  christos 	esac
     99  1.1  christos done
    100  1.1  christos shift $(( $OPTIND - 1 ))
    101  1.1  christos 
    102  1.1  christos ### option logic
    103  1.1  christos if [[ "$1" > 0 ]]; then
    104  1.1  christos         interval=$1; shift
    105  1.1  christos fi
    106  1.1  christos if [[ "$1" > 0 ]]; then
    107  1.1  christos         count=$1; shift
    108  1.1  christos fi
    109  1.1  christos if (( opt_proj && opt_zone )); then
    110  1.1  christos 	opt_proj=0
    111  1.1  christos fi
    112  1.1  christos if (( opt_clear )); then
    113  1.1  christos 	clearstr=`clear`
    114  1.1  christos else
    115  1.1  christos 	clearstr=.
    116  1.1  christos fi
    117  1.1  christos 
    118  1.1  christos #################################
    119  1.1  christos # --- Main Program, DTrace ---
    120  1.1  christos #
    121  1.1  christos /usr/sbin/dtrace -Cs <( print -r '
    122  1.1  christos  /*
    123  1.1  christos   * Command line arguments
    124  1.1  christos   */
    125  1.1  christos  inline int OPT_def   = '$opt_def';
    126  1.1  christos  inline int OPT_zone  = '$opt_zone';
    127  1.1  christos  inline int OPT_proj  = '$opt_proj';
    128  1.1  christos  inline int OPT_clear = '$opt_clear';
    129  1.1  christos  inline int INTERVAL  = '$interval';
    130  1.1  christos  inline int COUNTER   = '$count';
    131  1.1  christos  inline string CLEAR  = "'$clearstr'";
    132  1.1  christos 
    133  1.1  christos #pragma D option quiet
    134  1.1  christos #pragma D option switchrate=10hz
    135  1.1  christos 
    136  1.1  christos #include <sys/file.h>
    137  1.1  christos #include <inet/common.h>
    138  1.1  christos #include <sys/byteorder.h>
    139  1.1  christos #include <sys/socket.h>
    140  1.1  christos #include <sys/socketvar.h>
    141  1.1  christos 
    142  1.1  christos /*
    143  1.1  christos  * Print header
    144  1.1  christos  */
    145  1.1  christos dtrace:::BEGIN
    146  1.1  christos {
    147  1.1  christos 	/* starting values */
    148  1.1  christos         counts = COUNTER;
    149  1.1  christos         secs = INTERVAL;
    150  1.1  christos 	TCP_out = 0;
    151  1.1  christos 	TCP_in = 0;
    152  1.1  christos 
    153  1.1  christos 	printf("Tracing... Please wait.\n");
    154  1.1  christos }
    155  1.1  christos 
    156  1.1  christos /*
    157  1.1  christos  * TCP Process inbound connections
    158  1.1  christos  *
    159  1.1  christos  * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was
    160  1.1  christos  * renamed to SS_DIRECT around build 31.
    161  1.1  christos  */
    162  1.1  christos fbt:sockfs:sotpi_accept:entry
    163  1.1  christos /(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/
    164  1.1  christos {
    165  1.1  christos 	self->sop = args[0];
    166  1.1  christos }
    167  1.1  christos 
    168  1.1  christos fbt:sockfs:sotpi_create:return
    169  1.1  christos /self->sop/
    170  1.1  christos {
    171  1.1  christos 	self->nsop = (struct sonode *)arg1;
    172  1.1  christos }
    173  1.1  christos 
    174  1.1  christos fbt:sockfs:sotpi_accept:return
    175  1.1  christos /self->nsop/
    176  1.1  christos {
    177  1.1  christos 	this->tcpp = (tcp_t *)self->nsop->so_priv;
    178  1.1  christos 	self->connp = (conn_t *)this->tcpp->tcp_connp;
    179  1.1  christos 	tname[(int)self->connp] = execname;
    180  1.1  christos 	tpid[(int)self->connp] = pid;
    181  1.1  christos 	tuid[(int)self->connp] = uid;
    182  1.1  christos }
    183  1.1  christos 
    184  1.1  christos fbt:sockfs:sotpi_accept:return
    185  1.1  christos {
    186  1.1  christos 	self->nsop = 0;
    187  1.1  christos 	self->sop = 0;
    188  1.1  christos }
    189  1.1  christos 
    190  1.1  christos /*
    191  1.1  christos  * TCP Process outbound connections
    192  1.1  christos  */
    193  1.1  christos fbt:ip:tcp_connect:entry
    194  1.1  christos {
    195  1.1  christos 	this->tcpp = (tcp_t *)arg0;
    196  1.1  christos 	self->connp = (conn_t *)this->tcpp->tcp_connp;
    197  1.1  christos 	tname[(int)self->connp] = execname;
    198  1.1  christos 	tpid[(int)self->connp] = pid;
    199  1.1  christos 	tuid[(int)self->connp] = uid;
    200  1.1  christos 	OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1;
    201  1.1  christos }
    202  1.1  christos 
    203  1.1  christos /*
    204  1.1  christos  * TCP Data translations
    205  1.1  christos  */
    206  1.1  christos fbt:sockfs:sotpi_accept:return,
    207  1.1  christos fbt:ip:tcp_connect:return
    208  1.1  christos /self->connp/
    209  1.1  christos {
    210  1.1  christos 	/* fetch ports */
    211  1.1  christos #if defined(_BIG_ENDIAN)
    212  1.1  christos 	self->lport = self->connp->u_port.tcpu_ports.tcpu_lport;
    213  1.1  christos 	self->fport = self->connp->u_port.tcpu_ports.tcpu_fport;
    214  1.1  christos #else
    215  1.1  christos 	self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport);
    216  1.1  christos 	self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport);
    217  1.1  christos #endif
    218  1.1  christos 
    219  1.1  christos 	/* fetch IPv4 addresses */
    220  1.1  christos 	this->fad12 =
    221  1.1  christos 	    (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12];
    222  1.1  christos 	this->fad13 =
    223  1.1  christos 	    (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13];
    224  1.1  christos 	this->fad14 =
    225  1.1  christos 	    (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14];
    226  1.1  christos 	this->fad15 =
    227  1.1  christos 	    (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15];
    228  1.1  christos 	this->lad12 =
    229  1.1  christos 	    (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12];
    230  1.1  christos 	this->lad13 =
    231  1.1  christos 	    (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13];
    232  1.1  christos 	this->lad14 =
    233  1.1  christos 	    (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14];
    234  1.1  christos 	this->lad15 =
    235  1.1  christos 	    (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15];
    236  1.1  christos 
    237  1.1  christos 	/* convert type for use with lltostr() */
    238  1.1  christos 	this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12;
    239  1.1  christos 	this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13;
    240  1.1  christos 	this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14;
    241  1.1  christos 	this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15;
    242  1.1  christos 	this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12;
    243  1.1  christos 	this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13;
    244  1.1  christos 	this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14;
    245  1.1  christos 	this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15;
    246  1.1  christos 
    247  1.1  christos 	/* stringify addresses */
    248  1.1  christos 	self->faddr = strjoin(lltostr(this->fad12), ".");
    249  1.1  christos 	self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
    250  1.1  christos 	self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
    251  1.1  christos 	self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
    252  1.1  christos 	self->laddr = strjoin(lltostr(this->lad12), ".");
    253  1.1  christos 	self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
    254  1.1  christos 	self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
    255  1.1  christos 	self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
    256  1.1  christos 
    257  1.1  christos 	/* fix direction and save values */
    258  1.1  christos 	tladdr[(int)self->connp] = self->laddr;
    259  1.1  christos 	tfaddr[(int)self->connp] = self->faddr;
    260  1.1  christos 	tlport[(int)self->connp] = self->lport;
    261  1.1  christos 	tfport[(int)self->connp] = self->fport;
    262  1.1  christos 
    263  1.1  christos 	/* all systems go */
    264  1.1  christos 	tok[(int)self->connp] = 1;
    265  1.1  christos }
    266  1.1  christos 
    267  1.1  christos /*
    268  1.1  christos  * TCP Clear connp
    269  1.1  christos  */
    270  1.1  christos fbt:ip:tcp_get_conn:return
    271  1.1  christos {
    272  1.1  christos 	/* Q_TO_CONN */
    273  1.1  christos 	this->connp = (conn_t *)arg1;
    274  1.1  christos 	tok[(int)this->connp] = 0;
    275  1.1  christos 	tpid[(int)this->connp] = 0;
    276  1.1  christos 	tuid[(int)this->connp] = 0;
    277  1.1  christos 	tname[(int)this->connp] = 0;
    278  1.1  christos 	tproj[(int)this->connp] = 0;
    279  1.1  christos }
    280  1.1  christos 
    281  1.1  christos /*
    282  1.1  christos  * TCP Process "port closed"
    283  1.1  christos  */
    284  1.1  christos fbt:ip:tcp_xmit_early_reset:entry
    285  1.1  christos {
    286  1.1  christos 	this->queuep = args[7]->tcps_g_q;
    287  1.1  christos 	this->connp = (conn_t *)this->queuep->q_ptr;
    288  1.1  christos 	this->tcpp = (tcp_t *)this->connp->conn_tcp;
    289  1.1  christos 	self->zoneid = this->connp->conn_zoneid;
    290  1.1  christos 
    291  1.1  christos 	/* split addresses */
    292  1.1  christos 	this->ipha = (ipha_t *)args[1]->b_rptr;
    293  1.1  christos 	this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24;
    294  1.1  christos 	this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16;
    295  1.1  christos 	this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8;
    296  1.1  christos 	this->fad12 = (this->ipha->ipha_src & 0x000000ff);
    297  1.1  christos 	this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24;
    298  1.1  christos 	this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16;
    299  1.1  christos 	this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8;
    300  1.1  christos 	this->lad12 = (this->ipha->ipha_dst & 0x000000ff);
    301  1.1  christos 
    302  1.1  christos 	/* stringify addresses */
    303  1.1  christos 	self->faddr = strjoin(lltostr(this->fad12), ".");
    304  1.1  christos 	self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), "."));
    305  1.1  christos 	self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), "."));
    306  1.1  christos 	self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0));
    307  1.1  christos 	self->laddr = strjoin(lltostr(this->lad12), ".");
    308  1.1  christos 	self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), "."));
    309  1.1  christos 	self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), "."));
    310  1.1  christos 	self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0));
    311  1.1  christos 
    312  1.1  christos 	self->reset = 1;
    313  1.1  christos }
    314  1.1  christos 
    315  1.1  christos /*
    316  1.1  christos  * TCP Fetch "port closed" ports
    317  1.1  christos  */
    318  1.1  christos fbt:ip:tcp_xchg:entry
    319  1.1  christos /self->reset/
    320  1.1  christos {
    321  1.1  christos #if defined(_BIG_ENDIAN)
    322  1.1  christos 	self->lport = (uint16_t)arg0;
    323  1.1  christos 	self->fport = (uint16_t)arg1;
    324  1.1  christos #else
    325  1.1  christos 	self->lport = BSWAP_16((uint16_t)arg0);
    326  1.1  christos 	self->fport = BSWAP_16((uint16_t)arg1);
    327  1.1  christos #endif
    328  1.1  christos 	self->lport = BE16_TO_U16(arg0);
    329  1.1  christos 	self->fport = BE16_TO_U16(arg1);
    330  1.1  christos }
    331  1.1  christos 
    332  1.1  christos /*
    333  1.1  christos  * TCP Print "port closed"
    334  1.1  christos  */
    335  1.1  christos fbt:ip:tcp_xmit_early_reset:return
    336  1.1  christos {
    337  1.1  christos 	self->name = "<closed>";
    338  1.1  christos 	self->pid = 0;
    339  1.1  christos 	self->uid = 0;
    340  1.1  christos 	self->proj = 0;
    341  1.1  christos 	self->size = 54 * 2;	/* should check trailers */
    342  1.1  christos 	OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
    343  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    344  1.1  christos 	OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
    345  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    346  1.1  christos 	OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
    347  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    348  1.1  christos 	self->reset = 0;
    349  1.1  christos 	self->size = 0;
    350  1.1  christos 	self->name = 0;
    351  1.1  christos }
    352  1.1  christos 
    353  1.1  christos /*
    354  1.1  christos  * TCP Process Write
    355  1.1  christos  */
    356  1.1  christos fbt:ip:tcp_send_data:entry
    357  1.1  christos {
    358  1.1  christos 	self->conn_p = (conn_t *)args[0]->tcp_connp;
    359  1.1  christos }
    360  1.1  christos 
    361  1.1  christos fbt:ip:tcp_send_data:entry
    362  1.1  christos /tok[(int)self->conn_p]/
    363  1.1  christos {
    364  1.1  christos         self->size = msgdsize(args[2]) + 14;	/* should check trailers */
    365  1.1  christos 	self->uid = tuid[(int)self->conn_p];
    366  1.1  christos 	self->laddr = tladdr[(int)self->conn_p];
    367  1.1  christos 	self->faddr = tfaddr[(int)self->conn_p];
    368  1.1  christos 	self->lport = tlport[(int)self->conn_p];
    369  1.1  christos 	self->fport = tfport[(int)self->conn_p];
    370  1.1  christos 	OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
    371  1.1  christos 	self->zoneid = self->conn_p->conn_zoneid;
    372  1.1  christos         self->ok = 2;
    373  1.1  christos 
    374  1.1  christos 	/* follow inetd -> in.* transitions */
    375  1.1  christos 	self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
    376  1.1  christos 	    execname : tname[(int)self->conn_p];
    377  1.1  christos 	self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
    378  1.1  christos 	    pid : tpid[(int)self->conn_p];
    379  1.1  christos 	tname[(int)self->conn_p] = self->name;
    380  1.1  christos 	tpid[(int)self->conn_p] = self->pid;
    381  1.1  christos }
    382  1.1  christos 
    383  1.1  christos /*
    384  1.1  christos  * TCP Process Read
    385  1.1  christos  */
    386  1.1  christos fbt:ip:tcp_rput_data:entry
    387  1.1  christos {
    388  1.1  christos 	self->conn_p = (conn_t *)arg0;
    389  1.1  christos         self->size = msgdsize(args[1]) + 14;	/* should check trailers */
    390  1.1  christos }
    391  1.1  christos 
    392  1.1  christos fbt:ip:tcp_rput_data:entry
    393  1.1  christos /tok[(int)self->conn_p]/
    394  1.1  christos {
    395  1.1  christos 	self->uid = tuid[(int)self->conn_p];
    396  1.1  christos 	self->laddr = tladdr[(int)self->conn_p];
    397  1.1  christos 	self->faddr = tfaddr[(int)self->conn_p];
    398  1.1  christos 	self->lport = tlport[(int)self->conn_p];
    399  1.1  christos 	self->fport = tfport[(int)self->conn_p];
    400  1.1  christos 	OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1;
    401  1.1  christos 	self->zoneid = self->conn_p->conn_zoneid;
    402  1.1  christos 	self->ok = 2;
    403  1.1  christos 
    404  1.1  christos 	/* follow inetd -> in.* transitions */
    405  1.1  christos 	self->name = pid && (tname[(int)self->conn_p] == "inetd") ?
    406  1.1  christos 	    execname : tname[(int)self->conn_p];
    407  1.1  christos 	self->pid = pid && (tname[(int)self->conn_p] == "inetd") ?
    408  1.1  christos 	    pid : tpid[(int)self->conn_p];
    409  1.1  christos 	tname[(int)self->conn_p] = self->name;
    410  1.1  christos 	tpid[(int)self->conn_p] = self->pid;
    411  1.1  christos }
    412  1.1  christos 
    413  1.1  christos /*
    414  1.1  christos  * TCP Complete printing outbound handshake
    415  1.1  christos  */
    416  1.1  christos fbt:ip:tcp_connect:return
    417  1.1  christos /self->connp/
    418  1.1  christos {
    419  1.1  christos 	self->name = tname[(int)self->connp];
    420  1.1  christos 	self->pid = tpid[(int)self->connp];
    421  1.1  christos 	self->uid = tuid[(int)self->connp];
    422  1.1  christos 	self->zoneid = self->connp->conn_zoneid;
    423  1.1  christos 	OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
    424  1.1  christos 	self->size = 54;	/* should check trailers */
    425  1.1  christos 
    426  1.1  christos 	/* this packet occured before connp was fully established */
    427  1.1  christos 	OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
    428  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    429  1.1  christos 	OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
    430  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    431  1.1  christos 	OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
    432  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    433  1.1  christos }
    434  1.1  christos 
    435  1.1  christos /*
    436  1.1  christos  * TCP Complete printing inbound handshake
    437  1.1  christos  */
    438  1.1  christos fbt:sockfs:sotpi_accept:return
    439  1.1  christos /self->connp/
    440  1.1  christos {
    441  1.1  christos 	self->name = tname[(int)self->connp];
    442  1.1  christos 	self->pid = tpid[(int)self->connp];
    443  1.1  christos 	self->uid = tuid[(int)self->connp];
    444  1.1  christos 	self->zoneid = self->connp->conn_zoneid;
    445  1.1  christos 	OPT_proj ? self->proj = tproj[(int)self->connp] : 1;
    446  1.1  christos 	self->size = 54 * 3;	/* should check trailers */
    447  1.1  christos 
    448  1.1  christos 	/* these packets occured before connp was fully established */
    449  1.1  christos 	OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
    450  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    451  1.1  christos 	OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
    452  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    453  1.1  christos 	OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
    454  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    455  1.1  christos }
    456  1.1  christos 
    457  1.1  christos /*
    458  1.1  christos  * TCP Save data
    459  1.1  christos  */
    460  1.1  christos fbt:ip:tcp_send_data:entry,
    461  1.1  christos fbt:ip:tcp_rput_data:entry
    462  1.1  christos /self->ok == 2/ 
    463  1.1  christos {
    464  1.1  christos 	/* save r+w data*/
    465  1.1  christos 	OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport,
    466  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    467  1.1  christos 	OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport,
    468  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    469  1.1  christos 	OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport,
    470  1.1  christos 	    self->faddr, self->fport, self->name] = sum(self->size) : 1;
    471  1.1  christos }
    472  1.1  christos 
    473  1.1  christos /* 
    474  1.1  christos  * TCP Clear connect variables
    475  1.1  christos  */
    476  1.1  christos fbt:sockfs:sotpi_accept:return,
    477  1.1  christos fbt:ip:tcp_connect:return
    478  1.1  christos /self->connp/
    479  1.1  christos {
    480  1.1  christos 	self->faddr = 0;
    481  1.1  christos 	self->laddr = 0;
    482  1.1  christos 	self->fport = 0;
    483  1.1  christos 	self->lport = 0;
    484  1.1  christos 	self->connp = 0;
    485  1.1  christos 	self->name = 0;
    486  1.1  christos 	self->pid = 0;
    487  1.1  christos 	self->uid = 0;
    488  1.1  christos }
    489  1.1  christos 
    490  1.1  christos /* 
    491  1.1  christos  * TCP Clear r/w variables
    492  1.1  christos  */
    493  1.1  christos fbt:ip:tcp_send_data:entry,
    494  1.1  christos fbt:ip:tcp_rput_data:entry
    495  1.1  christos {
    496  1.1  christos 	self->ok = 0;
    497  1.1  christos 	self->uid = 0;
    498  1.1  christos 	self->pid = 0;
    499  1.1  christos 	self->size = 0;
    500  1.1  christos 	self->name = 0;
    501  1.1  christos 	self->lport = 0;
    502  1.1  christos 	self->fport = 0;
    503  1.1  christos 	self->laddr = 0;
    504  1.1  christos 	self->faddr = 0;
    505  1.1  christos 	self->conn_p = 0;
    506  1.1  christos 	self->zoneid = 0;
    507  1.1  christos 	self->proj = 0;
    508  1.1  christos }
    509  1.1  christos 
    510  1.1  christos /*
    511  1.1  christos  * TCP Systemwide Stats
    512  1.1  christos  */
    513  1.1  christos mib:::tcpOutDataBytes       { TCP_out += args[0]; }
    514  1.1  christos mib:::tcpRetransBytes       { TCP_out += args[0]; }
    515  1.1  christos mib:::tcpInDataInorderBytes { TCP_in  += args[0]; }
    516  1.1  christos mib:::tcpInDataDupBytes     { TCP_in  += args[0]; }
    517  1.1  christos mib:::tcpInDataUnorderBytes { TCP_in  += args[0]; }
    518  1.1  christos 
    519  1.1  christos /*
    520  1.1  christos  * Timer
    521  1.1  christos  */
    522  1.1  christos profile:::tick-1sec
    523  1.1  christos {
    524  1.1  christos         secs--;
    525  1.1  christos }
    526  1.1  christos 
    527  1.1  christos /*
    528  1.1  christos  * Print Report
    529  1.1  christos  */
    530  1.1  christos profile:::tick-1sec
    531  1.1  christos /secs == 0/
    532  1.1  christos {
    533  1.1  christos         /* fetch 1 min load average */
    534  1.1  christos         this->load1a  = `hp_avenrun[0] / 65536;
    535  1.1  christos         this->load1b  = ((`hp_avenrun[0] % 65536) * 100) / 65536;
    536  1.1  christos 
    537  1.1  christos 	/* convert TCP counters to Kbytes */
    538  1.1  christos 	TCP_out /= 1024;
    539  1.1  christos 	TCP_in  /= 1024;
    540  1.1  christos 
    541  1.1  christos 	/* print status */
    542  1.1  christos 	OPT_clear ? printf("%s", CLEAR) : 1;
    543  1.1  christos         printf("%Y,  load: %d.%02d,  TCPin: %6d KB,  TCPout: %6d KB\n\n",
    544  1.1  christos             walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out);
    545  1.1  christos 
    546  1.1  christos 	/* print headers */
    547  1.1  christos 	OPT_def  ? printf(" UID ") : 1;
    548  1.1  christos 	OPT_proj ? printf("PROJ ") : 1;
    549  1.1  christos 	OPT_zone ? printf("ZONE ") : 1;
    550  1.1  christos         printf("%6s %-15s %5s %-15s %5s %9s %s\n",
    551  1.1  christos 	    "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME");
    552  1.1  christos 
    553  1.1  christos 	/* print data */
    554  1.1  christos         printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out);
    555  1.1  christos 	printf("\n");
    556  1.1  christos 
    557  1.1  christos 	/* clear data */
    558  1.1  christos         trunc(@out);
    559  1.1  christos 	TCP_in = 0;
    560  1.1  christos 	TCP_out = 0;
    561  1.1  christos         secs = INTERVAL;
    562  1.1  christos         counts--;
    563  1.1  christos }
    564  1.1  christos 
    565  1.1  christos /*
    566  1.1  christos  * End of program
    567  1.1  christos  */
    568  1.1  christos profile:::tick-1sec
    569  1.1  christos /counts == 0/
    570  1.1  christos {
    571  1.1  christos         exit(0);
    572  1.1  christos }
    573  1.1  christos 
    574  1.1  christos /*
    575  1.1  christos  * Cleanup for Ctrl-C
    576  1.1  christos  */
    577  1.1  christos dtrace:::END
    578  1.1  christos {
    579  1.1  christos         trunc(@out);
    580  1.1  christos }
    581  1.1  christos ')
    582