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