1#!/usr/bin/env ksh93 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 {sctp,ip}:::{send,receive} of IPv4 SCTP to a remote 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. No physical network interface is plumbed and up. 35# 3. No other hosts on this subnet are reachable and listening on ssh. 36# 4. An unlikely race causes the unlocked global send/receive 37# variables to be corrupted. 38# 39# This test performs an SCTP association and checks that at least the 40# following packet counts were traced: 41# 42# 4 x ip:::send (2 during setup, 2 during teardown) 43# 4 x sctp:::send (2 during connection setup, 2 during connection teardown) 44# 3 x ip:::receive (2 during setup, 1 during teardown) 45# 3 x sctp:::receive (2 during setup, 1 during teardown) 46 47if (( $# != 1 )); then 48 print -u2 "expected one argument: <dtrace-path>" 49 exit 2 50fi 51 52dtrace=$1 53getaddr=./get.ipv4remote.pl 54sctpport=80 55DIR=/var/tmp/dtest.$$ 56 57if [[ ! -x $getaddr ]]; then 58 print -u2 "could not find or execute sub program: $getaddr" 59 exit 3 60fi 61$getaddr $sctpport sctp | read source dest 62if (( $? != 0 )); then 63 exit 4 64fi 65 66mkdir $DIR 67cd $DIR 68 69cat > test.pl <<-EOPERL 70 use IO::Socket; 71 my \$s = IO::Socket::INET->new( 72 Type => SOCK_STREAM, 73 Proto => "sctp", 74 LocalAddr => "$source", 75 PeerAddr => "$dest", 76 PeerPort => $sctpport, 77 Timeout => 3); 78 die "Could not connect to host $dest port $sctpport \$@" unless \$s; 79 close \$s; 80 sleep(2); 81EOPERL 82 83$dtrace -c 'perl test.pl' -qs /dev/stdin <<EODTRACE 84BEGIN 85{ 86 ipsend = sctpsend = ipreceive = sctpreceive = 0; 87} 88 89ip:::send 90/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest" && 91 args[4]->ipv4_protocol == IPPROTO_SCTP/ 92{ 93 ipsend++; 94} 95 96sctp:::send 97/args[2]->ip_saddr == "$source" && args[2]->ip_daddr == "$dest"/ 98{ 99 sctpsend++; 100} 101 102ip:::receive 103/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source" && 104 args[4]->ipv4_protocol == IPPROTO_SCTP/ 105{ 106 ipreceive++; 107} 108 109sctp:::receive 110/args[2]->ip_saddr == "$dest" && args[2]->ip_daddr == "$source"/ 111{ 112 sctpreceive++; 113} 114 115END 116{ 117 printf("Minimum SCTP events seen\n\n"); 118 printf("ip:::send - %s\n", ipsend >= 4 ? "yes" : "no"); 119 printf("ip:::receive - %s\n", ipreceive >= 3 ? "yes" : "no"); 120 printf("sctp:::send - %s\n", sctpsend >= 4 ? "yes" : "no"); 121 printf("sctp:::receive - %s\n", sctpreceive >= 3 ? "yes" : "no"); 122} 123EODTRACE 124 125status=$? 126 127cd / 128/bin/rm -rf $DIR 129 130exit $status 131