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