1# 2# CDDL HEADER START 3# 4# The contents of this file are subject to the terms of the 5# Common Development and Distribution License (the "License"). 6# You may not use this file except in compliance with the License. 7# 8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9# or http://www.opensolaris.org/os/licensing. 10# See the License for the specific language governing permissions 11# and limitations under the License. 12# 13# When distributing Covered Code, include this CDDL HEADER in each 14# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15# If applicable, add the following below this CDDL HEADER, with the 16# fields enclosed by brackets "[]" replaced with your own identifying 17# information: Portions Copyright [yyyy] [name of copyright owner] 18# 19# CDDL HEADER END 20# 21 22# 23# Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24# Use is subject to license terms. 25# 26# ident "%Z%%M% %I% %E% SMI" 27 28# 29# This script tests that several of the the mib:::tcp* probes fire and fire 30# with a valid args[0]. 31# 32 33if [ $# != 1 ]; then 34 echo expected one argument: '<'dtrace-path'>' 35 exit 2 36fi 37 38dtrace=$1 39dtraceout=/tmp/dtrace.out.$$ 40timeout=15 41port=2000 42 43if [ -f $dtraceout ]; then 44 rm -f $dtraceout 45fi 46 47script() 48{ 49 $dtrace -o $dtraceout -s /dev/stdin <<EOF 50 mib:::tcpActiveOpens 51 { 52 opens = args[0]; 53 } 54 55 mib:::tcpOutDataBytes 56 { 57 bytes = args[0]; 58 } 59 60 mib:::tcpOutDataSegs 61 { 62 segs = args[0]; 63 } 64 65 profile:::tick-10msec 66 /opens && bytes && segs/ 67 { 68 exit(0); 69 } 70 71 profile:::tick-1s 72 /n++ >= 10/ 73 { 74 exit(1); 75 } 76EOF 77} 78 79server() 80{ 81 perl /dev/stdin /dev/stdout << EOF 82 use strict; 83 use Socket; 84 85 socket(S, AF_INET, SOCK_STREAM, getprotobyname('tcp')) 86 or die "socket() failed: \$!"; 87 88 setsockopt(S, SOL_SOCKET, SO_REUSEADDR, 1) 89 or die "setsockopt() failed: \$!"; 90 91 my \$addr = sockaddr_in($port, INADDR_ANY); 92 bind(S, \$addr) or die "bind() failed: \$!"; 93 listen(S, SOMAXCONN) or die "listen() failed: \$!"; 94 95 while (1) { 96 next unless my \$raddr = accept(SESSION, S); 97 98 while (<SESSION>) { 99 } 100 101 close SESSION; 102 } 103EOF 104} 105 106client() 107{ 108 perl /dev/stdin /dev/stdout <<EOF 109 use strict; 110 use Socket; 111 112 my \$peer = sockaddr_in($port, INADDR_ANY); 113 114 socket(S, AF_INET, SOCK_STREAM, getprotobyname('tcp')) 115 or die "socket() failed: \$!"; 116 117 connect(S, \$peer) or die "connect failed: \$!"; 118 119 for (my \$i = 0; \$i < 10; \$i++) { 120 send(S, "There!", 0) or die "send() failed: \$!"; 121 sleep (1); 122 } 123EOF 124} 125 126script & 127dtrace_pid=$! 128 129# 130# Sleep while the above script fires into life. To guard against dtrace dying 131# and us sleeping forever we allow 15 secs for this to happen. This should be 132# enough for even the slowest systems. 133# 134while [ ! -f $dtraceout ]; do 135 sleep 1 136 timeout=$(($timeout-1)) 137 if [ $timeout -eq 0 ]; then 138 echo "dtrace failed to start. Exiting." 139 exit 1 140 fi 141done 142 143server & 144server_pid=$! 145sleep 2 146client & 147client_pid=$! 148 149wait $dtrace_pid 150status=$? 151 152kill $server_pid 153kill $client_pid 154 155exit $status 156