Home | History | Annotate | Download | only in mib
      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 
     33 if [ $# != 1 ]; then
     34 	echo expected one argument: '<'dtrace-path'>'
     35 	exit 2
     36 fi
     37 
     38 dtrace=$1
     39 dtraceout=/tmp/dtrace.out.$$
     40 timeout=15
     41 port=2000
     42 
     43 if [ -f $dtraceout ]; then
     44 	rm -f $dtraceout
     45 fi
     46 
     47 script()
     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 	}
     76 EOF
     77 }
     78 
     79 server()
     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 	}
    103 EOF
    104 }
    105 
    106 client()
    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 	}
    123 EOF
    124 }
    125 
    126 script &
    127 dtrace_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 #
    134 while [ ! -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
    141 done
    142 
    143 server &
    144 server_pid=$!
    145 sleep 2
    146 client &
    147 client_pid=$!
    148 
    149 wait $dtrace_pid
    150 status=$?
    151 
    152 kill $server_pid
    153 kill $client_pid
    154 
    155 exit $status
    156