1235368Sgnn#!/usr/bin/ksh 2235368Sgnn# 3235368Sgnn# tcptop_snv - display top TCP network packets by process. 4235368Sgnn# Written using DTrace (Solaris Nevada) 5235368Sgnn# 6235368Sgnn# This analyses TCP network packets and prints the responsible PID and UID, 7235368Sgnn# plus standard details such as IP address and port. This captures traffic 8235368Sgnn# of newly created TCP connections that were established while this program 9235368Sgnn# was running. It can help identify which processes is causing TCP traffic. 10235368Sgnn# 11235368Sgnn# WARNING: This script may only work on Solaris Nevada and OpenSolaris 12235368Sgnn# of the late 2007 vintage, since it uses the fbt provider to trace the raw 13235368Sgnn# operation of a specific version of the kernel. In the future, a 'stable' 14235368Sgnn# network provider should exist which will allow this to be written for that 15235368Sgnn# and subsequent versions of the kernel. In the meantime, check for other 16235368Sgnn# versions of this script in the /Net directory, and read the 17235368Sgnn# Notes/ALLfbt_notes.txt for more background on fbt. 18235368Sgnn# 19235368Sgnn# $Id: tcptop_snv 69 2007-10-04 13:40:00Z brendan $ 20235368Sgnn# 21235368Sgnn# USAGE: tcptop [-Ch] [-j|-Z] [interval [count]] 22235368Sgnn# 23235368Sgnn# -C # don't clear the screen 24235368Sgnn# -j # print project IDs 25235368Sgnn# -Z # print zone IDs 26235368Sgnn# 27235368Sgnn# FIELDS: 28235368Sgnn# UID user ID 29235368Sgnn# PID process ID 30235368Sgnn# CMD command 31235368Sgnn# LADDR local IP address 32235368Sgnn# RADDR remote IP address 33235368Sgnn# LPORT local port number 34235368Sgnn# RPORT remote port number 35235368Sgnn# SIZE packet size, bytes 36235368Sgnn# load 1 min load average 37235368Sgnn# TCPin TCP inbound payload data 38235368Sgnn# TCPout TCP outbound payload data 39235368Sgnn# ZONE zone ID 40235368Sgnn# PROJ project ID 41235368Sgnn# 42235368Sgnn# SEE ALSO: tcpsnoop 43235368Sgnn# 44235368Sgnn# COPYRIGHT: Copyright (c) 2005, 2006 Brendan Gregg. 45235368Sgnn# 46235368Sgnn# CDDL HEADER START 47235368Sgnn# 48235368Sgnn# The contents of this file are subject to the terms of the 49235368Sgnn# Common Development and Distribution License, Version 1.0 only 50235368Sgnn# (the "License"). You may not use this file except in compliance 51235368Sgnn# with the License. 52235368Sgnn# 53235368Sgnn# You can obtain a copy of the license at Docs/cddl1.txt 54235368Sgnn# or http://www.opensolaris.org/os/licensing. 55235368Sgnn# See the License for the specific language governing permissions 56235368Sgnn# and limitations under the License. 57235368Sgnn# 58235368Sgnn# CDDL HEADER END 59235368Sgnn# 60235368Sgnn# Author: Brendan Gregg [Sydney, Australia] 61235368Sgnn# 62235368Sgnn# ToDo: IPv6 63235368Sgnn# 64235368Sgnn# 05-Jul-2005 Brendan Gregg Created this. 65235368Sgnn# 03-Dec-2005 " " Fixed tcp_accept_finish bug, now 100% correct 66235368Sgnn# execname. Thanks Kias Belgaied for expertise. 67235368Sgnn# 20-Apr-2006 " " Fixed SS_TCP_FAST_ACCEPT bug in build 31+. 68235368Sgnn# 20-Apr-2006 " " Last update. 69235368Sgnn# 30-Sep-2007 " " Bumped this for recent OpenSolaris/Nevada. 70235368Sgnn# 71235368Sgnn 72235368Sgnn############################## 73235368Sgnn# --- Process Arguments --- 74235368Sgnn# 75235368Sgnn 76235368Sgnn### default variables 77235368Sgnnopt_def=1; opt_clear=1; opt_zone=0; opt_proj=0; interval=5; count=-1 78235368Sgnn 79235368Sgnn### process options 80235368Sgnnwhile getopts ChjZ name 81235368Sgnndo 82235368Sgnn case $name in 83235368Sgnn C) opt_clear=0 ;; 84235368Sgnn j) opt_proj=1; opt_def=0 ;; 85235368Sgnn Z) opt_zone=1; opt_def=0 ;; 86235368Sgnn h|?) cat <<-END >&2 87235368Sgnn USAGE: tcptop [-h] [-j|-Z] [interval [count]] 88235368Sgnn tcptop # default output 89235368Sgnn -C # don't clear the screen 90235368Sgnn -j # print project ID 91235368Sgnn -Z # print zonename 92235368Sgnn eg, 93235368Sgnn tcptop # default is 5 sec interval 94235368Sgnn tcptop 2 # 2 second interval 95235368Sgnn tcptop -C 1 10 # 10 x 1 sec samples, no clear 96235368Sgnn END 97235368Sgnn exit 1 98235368Sgnn esac 99235368Sgnndone 100235368Sgnnshift $(( $OPTIND - 1 )) 101235368Sgnn 102235368Sgnn### option logic 103235368Sgnnif [[ "$1" > 0 ]]; then 104235368Sgnn interval=$1; shift 105235368Sgnnfi 106235368Sgnnif [[ "$1" > 0 ]]; then 107235368Sgnn count=$1; shift 108235368Sgnnfi 109235368Sgnnif (( opt_proj && opt_zone )); then 110235368Sgnn opt_proj=0 111235368Sgnnfi 112235368Sgnnif (( opt_clear )); then 113235368Sgnn clearstr=`clear` 114235368Sgnnelse 115235368Sgnn clearstr=. 116235368Sgnnfi 117235368Sgnn 118235368Sgnn################################# 119235368Sgnn# --- Main Program, DTrace --- 120235368Sgnn# 121235368Sgnn/usr/sbin/dtrace -Cs <( print -r ' 122235368Sgnn /* 123235368Sgnn * Command line arguments 124235368Sgnn */ 125235368Sgnn inline int OPT_def = '$opt_def'; 126235368Sgnn inline int OPT_zone = '$opt_zone'; 127235368Sgnn inline int OPT_proj = '$opt_proj'; 128235368Sgnn inline int OPT_clear = '$opt_clear'; 129235368Sgnn inline int INTERVAL = '$interval'; 130235368Sgnn inline int COUNTER = '$count'; 131235368Sgnn inline string CLEAR = "'$clearstr'"; 132235368Sgnn 133235368Sgnn#pragma D option quiet 134235368Sgnn#pragma D option switchrate=10hz 135235368Sgnn 136235368Sgnn#include <sys/file.h> 137235368Sgnn#include <inet/common.h> 138235368Sgnn#include <sys/byteorder.h> 139235368Sgnn#include <sys/socket.h> 140235368Sgnn#include <sys/socketvar.h> 141235368Sgnn 142235368Sgnn/* 143235368Sgnn * Print header 144235368Sgnn */ 145235368Sgnndtrace:::BEGIN 146235368Sgnn{ 147235368Sgnn /* starting values */ 148235368Sgnn counts = COUNTER; 149235368Sgnn secs = INTERVAL; 150235368Sgnn TCP_out = 0; 151235368Sgnn TCP_in = 0; 152235368Sgnn 153235368Sgnn printf("Tracing... Please wait.\n"); 154235368Sgnn} 155235368Sgnn 156235368Sgnn/* 157235368Sgnn * TCP Process inbound connections 158235368Sgnn * 159235368Sgnn * 0x00200000 has been hardcoded. It was SS_TCP_FAST_ACCEPT, but was 160235368Sgnn * renamed to SS_DIRECT around build 31. 161235368Sgnn */ 162235368Sgnnfbt:sockfs:sotpi_accept:entry 163235368Sgnn/(arg1 & FREAD) && (arg1 & FWRITE) && (args[0]->so_state & 0x00200000)/ 164235368Sgnn{ 165235368Sgnn self->sop = args[0]; 166235368Sgnn} 167235368Sgnn 168235368Sgnnfbt:sockfs:sotpi_create:return 169235368Sgnn/self->sop/ 170235368Sgnn{ 171235368Sgnn self->nsop = (struct sonode *)arg1; 172235368Sgnn} 173235368Sgnn 174235368Sgnnfbt:sockfs:sotpi_accept:return 175235368Sgnn/self->nsop/ 176235368Sgnn{ 177235368Sgnn this->tcpp = (tcp_t *)self->nsop->so_priv; 178235368Sgnn self->connp = (conn_t *)this->tcpp->tcp_connp; 179235368Sgnn tname[(int)self->connp] = execname; 180235368Sgnn tpid[(int)self->connp] = pid; 181235368Sgnn tuid[(int)self->connp] = uid; 182235368Sgnn} 183235368Sgnn 184235368Sgnnfbt:sockfs:sotpi_accept:return 185235368Sgnn{ 186235368Sgnn self->nsop = 0; 187235368Sgnn self->sop = 0; 188235368Sgnn} 189235368Sgnn 190235368Sgnn/* 191235368Sgnn * TCP Process outbound connections 192235368Sgnn */ 193235368Sgnnfbt:ip:tcp_connect:entry 194235368Sgnn{ 195235368Sgnn this->tcpp = (tcp_t *)arg0; 196235368Sgnn self->connp = (conn_t *)this->tcpp->tcp_connp; 197235368Sgnn tname[(int)self->connp] = execname; 198235368Sgnn tpid[(int)self->connp] = pid; 199235368Sgnn tuid[(int)self->connp] = uid; 200235368Sgnn OPT_proj ? tproj[(int)self->connp] = curpsinfo->pr_projid : 1; 201235368Sgnn} 202235368Sgnn 203235368Sgnn/* 204235368Sgnn * TCP Data translations 205235368Sgnn */ 206235368Sgnnfbt:sockfs:sotpi_accept:return, 207235368Sgnnfbt:ip:tcp_connect:return 208235368Sgnn/self->connp/ 209235368Sgnn{ 210235368Sgnn /* fetch ports */ 211235368Sgnn#if defined(_BIG_ENDIAN) 212235368Sgnn self->lport = self->connp->u_port.tcpu_ports.tcpu_lport; 213235368Sgnn self->fport = self->connp->u_port.tcpu_ports.tcpu_fport; 214235368Sgnn#else 215235368Sgnn self->lport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_lport); 216235368Sgnn self->fport = BSWAP_16(self->connp->u_port.tcpu_ports.tcpu_fport); 217235368Sgnn#endif 218235368Sgnn 219235368Sgnn /* fetch IPv4 addresses */ 220235368Sgnn this->fad12 = 221235368Sgnn (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[12]; 222235368Sgnn this->fad13 = 223235368Sgnn (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[13]; 224235368Sgnn this->fad14 = 225235368Sgnn (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[14]; 226235368Sgnn this->fad15 = 227235368Sgnn (int)self->connp->connua_v6addr.connua_faddr._S6_un._S6_u8[15]; 228235368Sgnn this->lad12 = 229235368Sgnn (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[12]; 230235368Sgnn this->lad13 = 231235368Sgnn (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[13]; 232235368Sgnn this->lad14 = 233235368Sgnn (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[14]; 234235368Sgnn this->lad15 = 235235368Sgnn (int)self->connp->connua_v6addr.connua_laddr._S6_un._S6_u8[15]; 236235368Sgnn 237235368Sgnn /* convert type for use with lltostr() */ 238235368Sgnn this->fad12 = this->fad12 < 0 ? 256 + this->fad12 : this->fad12; 239235368Sgnn this->fad13 = this->fad13 < 0 ? 256 + this->fad13 : this->fad13; 240235368Sgnn this->fad14 = this->fad14 < 0 ? 256 + this->fad14 : this->fad14; 241235368Sgnn this->fad15 = this->fad15 < 0 ? 256 + this->fad15 : this->fad15; 242235368Sgnn this->lad12 = this->lad12 < 0 ? 256 + this->lad12 : this->lad12; 243235368Sgnn this->lad13 = this->lad13 < 0 ? 256 + this->lad13 : this->lad13; 244235368Sgnn this->lad14 = this->lad14 < 0 ? 256 + this->lad14 : this->lad14; 245235368Sgnn this->lad15 = this->lad15 < 0 ? 256 + this->lad15 : this->lad15; 246235368Sgnn 247235368Sgnn /* stringify addresses */ 248235368Sgnn self->faddr = strjoin(lltostr(this->fad12), "."); 249235368Sgnn self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); 250235368Sgnn self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); 251235368Sgnn self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); 252235368Sgnn self->laddr = strjoin(lltostr(this->lad12), "."); 253235368Sgnn self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); 254235368Sgnn self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); 255235368Sgnn self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); 256235368Sgnn 257235368Sgnn /* fix direction and save values */ 258235368Sgnn tladdr[(int)self->connp] = self->laddr; 259235368Sgnn tfaddr[(int)self->connp] = self->faddr; 260235368Sgnn tlport[(int)self->connp] = self->lport; 261235368Sgnn tfport[(int)self->connp] = self->fport; 262235368Sgnn 263235368Sgnn /* all systems go */ 264235368Sgnn tok[(int)self->connp] = 1; 265235368Sgnn} 266235368Sgnn 267235368Sgnn/* 268235368Sgnn * TCP Clear connp 269235368Sgnn */ 270235368Sgnnfbt:ip:tcp_get_conn:return 271235368Sgnn{ 272235368Sgnn /* Q_TO_CONN */ 273235368Sgnn this->connp = (conn_t *)arg1; 274235368Sgnn tok[(int)this->connp] = 0; 275235368Sgnn tpid[(int)this->connp] = 0; 276235368Sgnn tuid[(int)this->connp] = 0; 277235368Sgnn tname[(int)this->connp] = 0; 278235368Sgnn tproj[(int)this->connp] = 0; 279235368Sgnn} 280235368Sgnn 281235368Sgnn/* 282235368Sgnn * TCP Process "port closed" 283235368Sgnn */ 284235368Sgnnfbt:ip:tcp_xmit_early_reset:entry 285235368Sgnn{ 286235368Sgnn this->queuep = args[7]->tcps_g_q; 287235368Sgnn this->connp = (conn_t *)this->queuep->q_ptr; 288235368Sgnn this->tcpp = (tcp_t *)this->connp->conn_tcp; 289235368Sgnn self->zoneid = this->connp->conn_zoneid; 290235368Sgnn 291235368Sgnn /* split addresses */ 292235368Sgnn this->ipha = (ipha_t *)args[1]->b_rptr; 293235368Sgnn this->fad15 = (this->ipha->ipha_src & 0xff000000) >> 24; 294235368Sgnn this->fad14 = (this->ipha->ipha_src & 0x00ff0000) >> 16; 295235368Sgnn this->fad13 = (this->ipha->ipha_src & 0x0000ff00) >> 8; 296235368Sgnn this->fad12 = (this->ipha->ipha_src & 0x000000ff); 297235368Sgnn this->lad15 = (this->ipha->ipha_dst & 0xff000000) >> 24; 298235368Sgnn this->lad14 = (this->ipha->ipha_dst & 0x00ff0000) >> 16; 299235368Sgnn this->lad13 = (this->ipha->ipha_dst & 0x0000ff00) >> 8; 300235368Sgnn this->lad12 = (this->ipha->ipha_dst & 0x000000ff); 301235368Sgnn 302235368Sgnn /* stringify addresses */ 303235368Sgnn self->faddr = strjoin(lltostr(this->fad12), "."); 304235368Sgnn self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad13), ".")); 305235368Sgnn self->faddr = strjoin(self->faddr, strjoin(lltostr(this->fad14), ".")); 306235368Sgnn self->faddr = strjoin(self->faddr, lltostr(this->fad15 + 0)); 307235368Sgnn self->laddr = strjoin(lltostr(this->lad12), "."); 308235368Sgnn self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad13), ".")); 309235368Sgnn self->laddr = strjoin(self->laddr, strjoin(lltostr(this->lad14), ".")); 310235368Sgnn self->laddr = strjoin(self->laddr, lltostr(this->lad15 + 0)); 311235368Sgnn 312235368Sgnn self->reset = 1; 313235368Sgnn} 314235368Sgnn 315235368Sgnn/* 316235368Sgnn * TCP Fetch "port closed" ports 317235368Sgnn */ 318235368Sgnnfbt:ip:tcp_xchg:entry 319235368Sgnn/self->reset/ 320235368Sgnn{ 321235368Sgnn#if defined(_BIG_ENDIAN) 322235368Sgnn self->lport = (uint16_t)arg0; 323235368Sgnn self->fport = (uint16_t)arg1; 324235368Sgnn#else 325235368Sgnn self->lport = BSWAP_16((uint16_t)arg0); 326235368Sgnn self->fport = BSWAP_16((uint16_t)arg1); 327235368Sgnn#endif 328235368Sgnn self->lport = BE16_TO_U16(arg0); 329235368Sgnn self->fport = BE16_TO_U16(arg1); 330235368Sgnn} 331235368Sgnn 332235368Sgnn/* 333235368Sgnn * TCP Print "port closed" 334235368Sgnn */ 335235368Sgnnfbt:ip:tcp_xmit_early_reset:return 336235368Sgnn{ 337235368Sgnn self->name = "<closed>"; 338235368Sgnn self->pid = 0; 339235368Sgnn self->uid = 0; 340235368Sgnn self->proj = 0; 341235368Sgnn self->size = 54 * 2; /* should check trailers */ 342235368Sgnn OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, 343235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 344235368Sgnn OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, 345235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 346235368Sgnn OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, 347235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 348235368Sgnn self->reset = 0; 349235368Sgnn self->size = 0; 350235368Sgnn self->name = 0; 351235368Sgnn} 352235368Sgnn 353235368Sgnn/* 354235368Sgnn * TCP Process Write 355235368Sgnn */ 356235368Sgnnfbt:ip:tcp_send_data:entry 357235368Sgnn{ 358235368Sgnn self->conn_p = (conn_t *)args[0]->tcp_connp; 359235368Sgnn} 360235368Sgnn 361235368Sgnnfbt:ip:tcp_send_data:entry 362235368Sgnn/tok[(int)self->conn_p]/ 363235368Sgnn{ 364235368Sgnn self->size = msgdsize(args[2]) + 14; /* should check trailers */ 365235368Sgnn self->uid = tuid[(int)self->conn_p]; 366235368Sgnn self->laddr = tladdr[(int)self->conn_p]; 367235368Sgnn self->faddr = tfaddr[(int)self->conn_p]; 368235368Sgnn self->lport = tlport[(int)self->conn_p]; 369235368Sgnn self->fport = tfport[(int)self->conn_p]; 370235368Sgnn OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; 371235368Sgnn self->zoneid = self->conn_p->conn_zoneid; 372235368Sgnn self->ok = 2; 373235368Sgnn 374235368Sgnn /* follow inetd -> in.* transitions */ 375235368Sgnn self->name = pid && (tname[(int)self->conn_p] == "inetd") ? 376235368Sgnn execname : tname[(int)self->conn_p]; 377235368Sgnn self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? 378235368Sgnn pid : tpid[(int)self->conn_p]; 379235368Sgnn tname[(int)self->conn_p] = self->name; 380235368Sgnn tpid[(int)self->conn_p] = self->pid; 381235368Sgnn} 382235368Sgnn 383235368Sgnn/* 384235368Sgnn * TCP Process Read 385235368Sgnn */ 386235368Sgnnfbt:ip:tcp_rput_data:entry 387235368Sgnn{ 388235368Sgnn self->conn_p = (conn_t *)arg0; 389235368Sgnn self->size = msgdsize(args[1]) + 14; /* should check trailers */ 390235368Sgnn} 391235368Sgnn 392235368Sgnnfbt:ip:tcp_rput_data:entry 393235368Sgnn/tok[(int)self->conn_p]/ 394235368Sgnn{ 395235368Sgnn self->uid = tuid[(int)self->conn_p]; 396235368Sgnn self->laddr = tladdr[(int)self->conn_p]; 397235368Sgnn self->faddr = tfaddr[(int)self->conn_p]; 398235368Sgnn self->lport = tlport[(int)self->conn_p]; 399235368Sgnn self->fport = tfport[(int)self->conn_p]; 400235368Sgnn OPT_proj ? self->proj = tproj[(int)self->conn_p] : 1; 401235368Sgnn self->zoneid = self->conn_p->conn_zoneid; 402235368Sgnn self->ok = 2; 403235368Sgnn 404235368Sgnn /* follow inetd -> in.* transitions */ 405235368Sgnn self->name = pid && (tname[(int)self->conn_p] == "inetd") ? 406235368Sgnn execname : tname[(int)self->conn_p]; 407235368Sgnn self->pid = pid && (tname[(int)self->conn_p] == "inetd") ? 408235368Sgnn pid : tpid[(int)self->conn_p]; 409235368Sgnn tname[(int)self->conn_p] = self->name; 410235368Sgnn tpid[(int)self->conn_p] = self->pid; 411235368Sgnn} 412235368Sgnn 413235368Sgnn/* 414235368Sgnn * TCP Complete printing outbound handshake 415235368Sgnn */ 416235368Sgnnfbt:ip:tcp_connect:return 417235368Sgnn/self->connp/ 418235368Sgnn{ 419235368Sgnn self->name = tname[(int)self->connp]; 420235368Sgnn self->pid = tpid[(int)self->connp]; 421235368Sgnn self->uid = tuid[(int)self->connp]; 422235368Sgnn self->zoneid = self->connp->conn_zoneid; 423235368Sgnn OPT_proj ? self->proj = tproj[(int)self->connp] : 1; 424235368Sgnn self->size = 54; /* should check trailers */ 425235368Sgnn 426235368Sgnn /* this packet occured before connp was fully established */ 427235368Sgnn OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, 428235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 429235368Sgnn OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, 430235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 431235368Sgnn OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, 432235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 433235368Sgnn} 434235368Sgnn 435235368Sgnn/* 436235368Sgnn * TCP Complete printing inbound handshake 437235368Sgnn */ 438235368Sgnnfbt:sockfs:sotpi_accept:return 439235368Sgnn/self->connp/ 440235368Sgnn{ 441235368Sgnn self->name = tname[(int)self->connp]; 442235368Sgnn self->pid = tpid[(int)self->connp]; 443235368Sgnn self->uid = tuid[(int)self->connp]; 444235368Sgnn self->zoneid = self->connp->conn_zoneid; 445235368Sgnn OPT_proj ? self->proj = tproj[(int)self->connp] : 1; 446235368Sgnn self->size = 54 * 3; /* should check trailers */ 447235368Sgnn 448235368Sgnn /* these packets occured before connp was fully established */ 449235368Sgnn OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, 450235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 451235368Sgnn OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, 452235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 453235368Sgnn OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, 454235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 455235368Sgnn} 456235368Sgnn 457235368Sgnn/* 458235368Sgnn * TCP Save data 459235368Sgnn */ 460235368Sgnnfbt:ip:tcp_send_data:entry, 461235368Sgnnfbt:ip:tcp_rput_data:entry 462235368Sgnn/self->ok == 2/ 463235368Sgnn{ 464235368Sgnn /* save r+w data*/ 465235368Sgnn OPT_def ? @out[self->uid, self->pid, self->laddr, self->lport, 466235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 467235368Sgnn OPT_zone ? @out[self->zoneid, self->pid, self->laddr, self->lport, 468235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 469235368Sgnn OPT_proj ? @out[self->proj, self->pid, self->laddr, self->lport, 470235368Sgnn self->faddr, self->fport, self->name] = sum(self->size) : 1; 471235368Sgnn} 472235368Sgnn 473235368Sgnn/* 474235368Sgnn * TCP Clear connect variables 475235368Sgnn */ 476235368Sgnnfbt:sockfs:sotpi_accept:return, 477235368Sgnnfbt:ip:tcp_connect:return 478235368Sgnn/self->connp/ 479235368Sgnn{ 480235368Sgnn self->faddr = 0; 481235368Sgnn self->laddr = 0; 482235368Sgnn self->fport = 0; 483235368Sgnn self->lport = 0; 484235368Sgnn self->connp = 0; 485235368Sgnn self->name = 0; 486235368Sgnn self->pid = 0; 487235368Sgnn self->uid = 0; 488235368Sgnn} 489235368Sgnn 490235368Sgnn/* 491235368Sgnn * TCP Clear r/w variables 492235368Sgnn */ 493235368Sgnnfbt:ip:tcp_send_data:entry, 494235368Sgnnfbt:ip:tcp_rput_data:entry 495235368Sgnn{ 496235368Sgnn self->ok = 0; 497235368Sgnn self->uid = 0; 498235368Sgnn self->pid = 0; 499235368Sgnn self->size = 0; 500235368Sgnn self->name = 0; 501235368Sgnn self->lport = 0; 502235368Sgnn self->fport = 0; 503235368Sgnn self->laddr = 0; 504235368Sgnn self->faddr = 0; 505235368Sgnn self->conn_p = 0; 506235368Sgnn self->zoneid = 0; 507235368Sgnn self->proj = 0; 508235368Sgnn} 509235368Sgnn 510235368Sgnn/* 511235368Sgnn * TCP Systemwide Stats 512235368Sgnn */ 513235368Sgnnmib:::tcpOutDataBytes { TCP_out += args[0]; } 514235368Sgnnmib:::tcpRetransBytes { TCP_out += args[0]; } 515235368Sgnnmib:::tcpInDataInorderBytes { TCP_in += args[0]; } 516235368Sgnnmib:::tcpInDataDupBytes { TCP_in += args[0]; } 517235368Sgnnmib:::tcpInDataUnorderBytes { TCP_in += args[0]; } 518235368Sgnn 519235368Sgnn/* 520235368Sgnn * Timer 521235368Sgnn */ 522235368Sgnnprofile:::tick-1sec 523235368Sgnn{ 524235368Sgnn secs--; 525235368Sgnn} 526235368Sgnn 527235368Sgnn/* 528235368Sgnn * Print Report 529235368Sgnn */ 530235368Sgnnprofile:::tick-1sec 531235368Sgnn/secs == 0/ 532235368Sgnn{ 533235368Sgnn /* fetch 1 min load average */ 534235368Sgnn this->load1a = `hp_avenrun[0] / 65536; 535235368Sgnn this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; 536235368Sgnn 537235368Sgnn /* convert TCP counters to Kbytes */ 538235368Sgnn TCP_out /= 1024; 539235368Sgnn TCP_in /= 1024; 540235368Sgnn 541235368Sgnn /* print status */ 542235368Sgnn OPT_clear ? printf("%s", CLEAR) : 1; 543235368Sgnn printf("%Y, load: %d.%02d, TCPin: %6d KB, TCPout: %6d KB\n\n", 544235368Sgnn walltimestamp, this->load1a, this->load1b, TCP_in, TCP_out); 545235368Sgnn 546235368Sgnn /* print headers */ 547235368Sgnn OPT_def ? printf(" UID ") : 1; 548235368Sgnn OPT_proj ? printf("PROJ ") : 1; 549235368Sgnn OPT_zone ? printf("ZONE ") : 1; 550235368Sgnn printf("%6s %-15s %5s %-15s %5s %9s %s\n", 551235368Sgnn "PID", "LADDR", "LPORT", "RADDR", "RPORT", "SIZE", "NAME"); 552235368Sgnn 553235368Sgnn /* print data */ 554235368Sgnn printa("%4d %6d %-15s %5d %-15s %5d %@9d %s\n", @out); 555235368Sgnn printf("\n"); 556235368Sgnn 557235368Sgnn /* clear data */ 558235368Sgnn trunc(@out); 559235368Sgnn TCP_in = 0; 560235368Sgnn TCP_out = 0; 561235368Sgnn secs = INTERVAL; 562235368Sgnn counts--; 563235368Sgnn} 564235368Sgnn 565235368Sgnn/* 566235368Sgnn * End of program 567235368Sgnn */ 568235368Sgnnprofile:::tick-1sec 569235368Sgnn/counts == 0/ 570235368Sgnn{ 571235368Sgnn exit(0); 572235368Sgnn} 573235368Sgnn 574235368Sgnn/* 575235368Sgnn * Cleanup for Ctrl-C 576235368Sgnn */ 577235368Sgnndtrace:::END 578235368Sgnn{ 579235368Sgnn trunc(@out); 580235368Sgnn} 581235368Sgnn') 582