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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 25# 26 27# 28# Test {ip,tcp}:::{send,receive} of IPv4 TCP to local host. 29# 30# This may fail due to: 31# 32# 1. A change to the ip stack breaking expected probe behavior, 33# which is the reason we are testing. 34# 2. The lo0 interface missing or not up. 35# 3. The local ssh service is not online. 36# 4. An unlikely race causes the unlocked global send/receive 37# variables to be corrupted. 38# 39# This test performs a TCP connection and checks that at least the 40# following packet counts were traced: 41# 42# 3 x ip:::send (2 during the TCP handshake, then a FIN) 43# 3 x tcp:::send (2 during the TCP handshake, then a FIN) 44# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK) 45# 2 x tcp:::receive (1 during the TCP handshake, then the FIN ACK) 46 47# The actual count tested is 5 each way, since we are tracing both 48# source and destination events. 49# 50# For this test to work, we are assuming that the TCP handshake and 51# TCP close will enter the IP code path and not use tcp fusion. 52# 53 54if (( $# != 1 )); then 55 print -u2 "expected one argument: <dtrace-path>" 56 exit 2 57fi 58 59dtrace=$1 60local=127.0.0.1 61tcpport=22 62DIR=/var/tmp/dtest.$$ 63 64mkdir $DIR 65cd $DIR 66 67cat > test.pl <<-EOPERL 68 use IO::Socket; 69 my \$s = IO::Socket::INET->new( 70 Proto => "tcp", 71 PeerAddr => "$local", 72 PeerPort => $tcpport, 73 Timeout => 3); 74 die "Could not connect to host $local port $tcpport" unless \$s; 75 close \$s; 76 # 77 # Sleep for one second to assure that our D script has ample time to 78 # see all events induced by the close 79 # 80 sleep 1; 81EOPERL 82 83$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE 84BEGIN 85{ 86 ipsend = tcpsend = ipreceive = tcpreceive = 0; 87} 88 89ip:::send 90/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" && 91 args[4]->ipv4_protocol == IPPROTO_TCP/ 92{ 93 ipsend++; 94} 95 96tcp:::send 97/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/ 98{ 99 tcpsend++; 100} 101 102ip:::receive 103/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" && 104 args[4]->ipv4_protocol == IPPROTO_TCP/ 105{ 106 ipreceive++; 107} 108 109tcp:::receive 110/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local"/ 111{ 112 tcpreceive++; 113} 114 115END 116{ 117 printf("Minimum TCP events seen\n\n"); 118 printf("ip:::send - %s\n", ipsend >= 5 ? "yes" : "no"); 119 printf("ip:::receive - %s\n", ipreceive >= 5 ? "yes" : "no"); 120 printf("tcp:::send - %s\n", tcpsend >= 5 ? "yes" : "no"); 121 printf("tcp:::receive - %s\n", tcpreceive >= 5 ? "yes" : "no"); 122} 123EODTRACE 124 125status=$? 126 127cd / 128/usr/bin/rm -rf $DIR 129 130exit $status 131