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