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 {tcp,ip}:::{send,receive} of IPv4 TCP to a remote 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. No physical network interface is plumbed and up. 3510e6dadfSbrendan# 3. No other hosts on this subnet are reachable and listening on ssh. 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) 4610e6dadfSbrendan# 4710e6dadfSbrendan 4810e6dadfSbrendanif (( $# != 1 )); then 4910e6dadfSbrendan print -u2 "expected one argument: <dtrace-path>" 5010e6dadfSbrendan exit 2 5110e6dadfSbrendanfi 5210e6dadfSbrendan 5310e6dadfSbrendandtrace=$1 5410e6dadfSbrendangetaddr=./get.ipv4remote.pl 5510e6dadfSbrendantcpport=22 5610e6dadfSbrendanDIR=/var/tmp/dtest.$$ 5710e6dadfSbrendan 5810e6dadfSbrendanif [[ ! -x $getaddr ]]; then 5910e6dadfSbrendan print -u2 "could not find or execute sub program: $getaddr" 6010e6dadfSbrendan exit 3 6110e6dadfSbrendanfi 6210e6dadfSbrendan$getaddr $tcpport | read source dest 6310e6dadfSbrendanif (( $? != 0 )); then 6410e6dadfSbrendan exit 4 6510e6dadfSbrendanfi 6610e6dadfSbrendan 6710e6dadfSbrendanmkdir $DIR 6810e6dadfSbrendancd $DIR 6910e6dadfSbrendan 7010e6dadfSbrendancat > test.pl <<-EOPERL 7110e6dadfSbrendan use IO::Socket; 7210e6dadfSbrendan my \$s = IO::Socket::INET->new( 7310e6dadfSbrendan Proto => "tcp", 7410e6dadfSbrendan PeerAddr => "$dest", 7510e6dadfSbrendan PeerPort => $tcpport, 7610e6dadfSbrendan Timeout => 3); 7710e6dadfSbrendan die "Could not connect to host $dest port $tcpport" unless \$s; 7810e6dadfSbrendan close \$s; 7910e6dadfSbrendanEOPERL 8010e6dadfSbrendan 81*c090e5dfSBryan Cantrill$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE 8210e6dadfSbrendanBEGIN 8310e6dadfSbrendan{ 849cd928feSAlan Maguire ipsend = tcpsend = ipreceive = tcpreceive = 0; 8510e6dadfSbrendan} 8610e6dadfSbrendan 8710e6dadfSbrendanip:::send 8810e6dadfSbrendan/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" && 8910e6dadfSbrendan args[4]->ipv4_protocol == IPPROTO_TCP/ 9010e6dadfSbrendan{ 919cd928feSAlan Maguire ipsend++; 929cd928feSAlan Maguire} 939cd928feSAlan Maguire 949cd928feSAlan Maguiretcp:::send 959cd928feSAlan Maguire/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest"/ 969cd928feSAlan Maguire{ 979cd928feSAlan Maguire tcpsend++; 9810e6dadfSbrendan} 9910e6dadfSbrendan 10010e6dadfSbrendanip:::receive 10110e6dadfSbrendan/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" && 10210e6dadfSbrendan args[4]->ipv4_protocol == IPPROTO_TCP/ 10310e6dadfSbrendan{ 1049cd928feSAlan Maguire ipreceive++; 1059cd928feSAlan Maguire} 1069cd928feSAlan Maguire 1079cd928feSAlan Maguiretcp:::receive 1089cd928feSAlan Maguire/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source"/ 1099cd928feSAlan Maguire{ 1109cd928feSAlan Maguire tcpreceive++; 11110e6dadfSbrendan} 11210e6dadfSbrendan 11310e6dadfSbrendanEND 11410e6dadfSbrendan{ 11510e6dadfSbrendan printf("Minimum TCP events seen\n\n"); 1169cd928feSAlan Maguire printf("ip:::send - %s\n", ipsend >= 3 ? "yes" : "no"); 1179cd928feSAlan Maguire printf("ip:::receive - %s\n", ipreceive >= 2 ? "yes" : "no"); 1189cd928feSAlan Maguire printf("tcp:::send - %s\n", tcpsend >= 3 ? "yes" : "no"); 1199cd928feSAlan Maguire printf("tcp:::receive - %s\n", tcpreceive >= 2 ? "yes" : "no"); 12010e6dadfSbrendan} 12110e6dadfSbrendanEODTRACE 12210e6dadfSbrendan 12310e6dadfSbrendanstatus=$? 12410e6dadfSbrendan 12510e6dadfSbrendancd / 12610e6dadfSbrendan/usr/bin/rm -rf $DIR 12710e6dadfSbrendan 12810e6dadfSbrendanexit $? 129