1#!/usr/bin/ksh 2# 3# CDDL HEADER START 4# 5# The contents of this file are subject to the terms of the 6# Common Development and Distribution License (the "License"). 7# You may not use this file except in compliance with the License. 8# 9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10# or http://www.opensolaris.org/os/licensing. 11# See the License for the specific language governing permissions 12# and limitations under the License. 13# 14# When distributing Covered Code, include this CDDL HEADER in each 15# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16# If applicable, add the following below this CDDL HEADER, with the 17# fields enclosed by brackets "[]" replaced with your own identifying 18# information: Portions Copyright [yyyy] [name of copyright owner] 19# 20# CDDL HEADER END 21# 22 23# 24# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25# Use is subject to license terms. 26# 27#pragma ident "%Z%%M% %I% %E% SMI" 28 29# 30# Test ip:::{send,receive} of IPv4 TCP to a remote host. 31# 32# This may fail due to: 33# 34# 1. A change to the ip stack breaking expected probe behavior, 35# which is the reason we are testing. 36# 2. No physical network interface is plumbed and up. 37# 3. No other hosts on this subnet are reachable and listening on ssh. 38# 4. An unlikely race causes the unlocked global send/receive 39# variables to be corrupted. 40# 41# This test performs a TCP connection and checks that at least the 42# following packet counts were traced: 43# 44# 3 x ip:::send (2 during the TCP handshake, then a FIN) 45# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK) 46# 47 48if (( $# != 1 )); then 49 print -u2 "expected one argument: <dtrace-path>" 50 exit 2 51fi 52 53dtrace=$1 54getaddr=./get.ipv4remote.pl 55tcpport=22 56DIR=/var/tmp/dtest.$$ 57 58if [[ ! -x $getaddr ]]; then 59 print -u2 "could not find or execute sub program: $getaddr" 60 exit 3 61fi 62$getaddr $tcpport | read source dest 63if (( $? != 0 )); then 64 exit 4 65fi 66 67mkdir $DIR 68cd $DIR 69 70cat > test.pl <<-EOPERL 71 use IO::Socket; 72 my \$s = IO::Socket::INET->new( 73 Proto => "tcp", 74 PeerAddr => "$dest", 75 PeerPort => $tcpport, 76 Timeout => 3); 77 die "Could not connect to host $dest port $tcpport" unless \$s; 78 close \$s; 79EOPERL 80 81$dtrace -c '/usr/bin/perl test.pl' -qs /dev/stdin <<EODTRACE 82BEGIN 83{ 84 send = receive = 0; 85} 86 87ip:::send 88/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" && 89 args[4]->ipv4_protocol == IPPROTO_TCP/ 90{ 91 send++; 92} 93 94ip:::receive 95/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" && 96 args[4]->ipv4_protocol == IPPROTO_TCP/ 97{ 98 receive++; 99} 100 101END 102{ 103 printf("Minimum TCP events seen\n\n"); 104 printf("ip:::send - %s\n", send >= 3 ? "yes" : "no"); 105 printf("ip:::receive - %s\n", receive >= 2 ? "yes" : "no"); 106} 107EODTRACE 108 109status=$? 110 111cd / 112/usr/bin/rm -rf $DIR 113 114exit $? 115