110e6dadfSbrendan#!/usr/bin/ksh
210e6dadfSbrendan#
310e6dadfSbrendan# CDDL HEADER START
410e6dadfSbrendan#
510e6dadfSbrendan# The contents of this file are subject to the terms of the
610e6dadfSbrendan# Common Development and Distribution License (the "License").
710e6dadfSbrendan# You may not use this file except in compliance with the License.
810e6dadfSbrendan#
910e6dadfSbrendan# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1010e6dadfSbrendan# or http://www.opensolaris.org/os/licensing.
1110e6dadfSbrendan# See the License for the specific language governing permissions
1210e6dadfSbrendan# and limitations under the License.
1310e6dadfSbrendan#
1410e6dadfSbrendan# When distributing Covered Code, include this CDDL HEADER in each
1510e6dadfSbrendan# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1610e6dadfSbrendan# If applicable, add the following below this CDDL HEADER, with the
1710e6dadfSbrendan# fields enclosed by brackets "[]" replaced with your own identifying
1810e6dadfSbrendan# information: Portions Copyright [yyyy] [name of copyright owner]
1910e6dadfSbrendan#
2010e6dadfSbrendan# CDDL HEADER END
2110e6dadfSbrendan#
2210e6dadfSbrendan
2310e6dadfSbrendan#
249cd928feSAlan Maguire# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
2510e6dadfSbrendan#
2610e6dadfSbrendan
2710e6dadfSbrendan#
289cd928feSAlan Maguire# Test {ip,tcp}:::{send,receive} of IPv4 TCP to local host.
2910e6dadfSbrendan#
3010e6dadfSbrendan# This may fail due to:
3110e6dadfSbrendan#
3210e6dadfSbrendan# 1. A change to the ip stack breaking expected probe behavior,
3310e6dadfSbrendan#    which is the reason we are testing.
3410e6dadfSbrendan# 2. The lo0 interface missing or not up.
3510e6dadfSbrendan# 3. The local ssh service is not online.
3610e6dadfSbrendan# 4. An unlikely race causes the unlocked global send/receive
3710e6dadfSbrendan#    variables to be corrupted.
3810e6dadfSbrendan#
3910e6dadfSbrendan# This test performs a TCP connection and checks that at least the
4010e6dadfSbrendan# following packet counts were traced:
4110e6dadfSbrendan#
4210e6dadfSbrendan# 3 x ip:::send (2 during the TCP handshake, then a FIN)
439cd928feSAlan Maguire# 3 x tcp:::send (2 during the TCP handshake, then a FIN)
4410e6dadfSbrendan# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK)
459cd928feSAlan Maguire# 2 x tcp:::receive (1 during the TCP handshake, then the FIN ACK)
469cd928feSAlan Maguire
4710e6dadfSbrendan# The actual count tested is 5 each way, since we are tracing both
4810e6dadfSbrendan# source and destination events.
4910e6dadfSbrendan#
5010e6dadfSbrendan# For this test to work, we are assuming that the TCP handshake and
5110e6dadfSbrendan# TCP close will enter the IP code path and not use tcp fusion.
5210e6dadfSbrendan#
5310e6dadfSbrendan
5410e6dadfSbrendanif (( $# != 1 )); then
5510e6dadfSbrendan	print -u2 "expected one argument: <dtrace-path>"
5610e6dadfSbrendan	exit 2
5710e6dadfSbrendanfi
5810e6dadfSbrendan
5910e6dadfSbrendandtrace=$1
6010e6dadfSbrendanlocal=127.0.0.1
6110e6dadfSbrendantcpport=22
6210e6dadfSbrendanDIR=/var/tmp/dtest.$$
6310e6dadfSbrendan
6410e6dadfSbrendanmkdir $DIR
6510e6dadfSbrendancd $DIR
6610e6dadfSbrendan
6710e6dadfSbrendancat > test.pl <<-EOPERL
6810e6dadfSbrendan	use IO::Socket;
6910e6dadfSbrendan	my \$s = IO::Socket::INET->new(
7010e6dadfSbrendan	    Proto => "tcp",
7110e6dadfSbrendan	    PeerAddr => "$local",
7210e6dadfSbrendan	    PeerPort => $tcpport,
7310e6dadfSbrendan	    Timeout => 3);
7410e6dadfSbrendan	die "Could not connect to host $local port $tcpport" unless \$s;
7510e6dadfSbrendan	close \$s;
76*fe73c3d8SBryan Cantrill	#
77*fe73c3d8SBryan Cantrill	# Sleep for one second to assure that our D script has ample time to
78*fe73c3d8SBryan Cantrill	# see all events induced by the close
79*fe73c3d8SBryan Cantrill	#
80*fe73c3d8SBryan Cantrill	sleep 1;
8110e6dadfSbrendanEOPERL
8210e6dadfSbrendan
83c090e5dfSBryan Cantrill$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE
8410e6dadfSbrendanBEGIN
8510e6dadfSbrendan{
869cd928feSAlan Maguire	ipsend = tcpsend = ipreceive = tcpreceive = 0;
8710e6dadfSbrendan}
8810e6dadfSbrendan
8910e6dadfSbrendanip:::send
9010e6dadfSbrendan/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
9110e6dadfSbrendan    args[4]->ipv4_protocol == IPPROTO_TCP/
9210e6dadfSbrendan{
939cd928feSAlan Maguire	ipsend++;
949cd928feSAlan Maguire}
959cd928feSAlan Maguire
969cd928feSAlan Maguiretcp:::send
979cd928feSAlan Maguire/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/
989cd928feSAlan Maguire{
999cd928feSAlan Maguire	tcpsend++;
10010e6dadfSbrendan}
10110e6dadfSbrendan
10210e6dadfSbrendanip:::receive
10310e6dadfSbrendan/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
10410e6dadfSbrendan    args[4]->ipv4_protocol == IPPROTO_TCP/
10510e6dadfSbrendan{
1069cd928feSAlan Maguire	ipreceive++;
1079cd928feSAlan Maguire}
1089cd928feSAlan Maguire
1099cd928feSAlan Maguiretcp:::receive
1109cd928feSAlan Maguire/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/
1119cd928feSAlan Maguire{
1129cd928feSAlan Maguire	tcpreceive++;
11310e6dadfSbrendan}
11410e6dadfSbrendan
11510e6dadfSbrendanEND
11610e6dadfSbrendan{
11710e6dadfSbrendan	printf("Minimum TCP events seen\n\n");
1189cd928feSAlan Maguire	printf("ip:::send - %s\n", ipsend >= 5 ? "yes" : "no");
1199cd928feSAlan Maguire	printf("ip:::receive - %s\n", ipreceive >= 5 ? "yes" : "no");
1209cd928feSAlan Maguire	printf("tcp:::send - %s\n", tcpsend >= 5 ? "yes" : "no");
1219cd928feSAlan Maguire	printf("tcp:::receive - %s\n", tcpreceive >= 5 ? "yes" : "no");
12210e6dadfSbrendan}
12310e6dadfSbrendanEODTRACE
12410e6dadfSbrendan
12510e6dadfSbrendanstatus=$?
12610e6dadfSbrendan
12710e6dadfSbrendancd /
12810e6dadfSbrendan/usr/bin/rm -rf $DIR
12910e6dadfSbrendan
13010e6dadfSbrendanexit $status
131