tst.localtcpstate.ksh revision 14ea49401f3c8c61422aefbda43809e275f60c6c
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#!/usr/bin/ksh
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# CDDL HEADER START
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# The contents of this file are subject to the terms of the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Common Development and Distribution License (the "License").
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# You may not use this file except in compliance with the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# or http://www.opensolaris.org/os/licensing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# See the License for the specific language governing permissions
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# and limitations under the License.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# When distributing Covered Code, include this CDDL HEADER in each
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# If applicable, add the following below this CDDL HEADER, with the
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# fields enclosed by brackets "[]" replaced with your own identifying
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# information: Portions Copyright [yyyy] [name of copyright owner]
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# CDDL HEADER END
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# Test tcp:::state-change and tcp:::{send,receive} by connecting to
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# the local ssh service and sending a test message. This should result
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# in a "Protocol mismatch" response and a close of the connection.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# A number of state transition events along with tcp fusion send and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# receive events for the message should result.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# This may fail due to:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 1. A change to the ip stack breaking expected probe behavior,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# which is the reason we are testing.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 2. The lo0 interface missing or not up.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 3. The local ssh service is not online.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 4. An unlikely race causes the unlocked global send/receive
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# variables to be corrupted.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# This test performs a TCP connection to the ssh service (port 22) and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# checks that at least the following packet counts were traced:
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 3 x ip:::send (2 during the TCP handshake, then a FIN)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 4 x tcp:::send (2 during the TCP handshake, 1 message then a FIN)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 2 x ip:::receive (1 during the TCP handshake, then the FIN ACK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# 3 x tcp:::receive (1 during the TCP handshake, 1 message then the FIN ACK)
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# The actual ip count tested is 5 each way, since we are tracing both
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# source and destination events. The actual tcp count tested is 7
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# each way, since the TCP fusion send/receive events will not reach IP.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# For this test to work, we are assuming that the TCP handshake and
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi# TCP close will enter the IP code path and not use tcp fusion.
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi#
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiif (( $# != 1 )); then
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print -u2 "expected one argument: <dtrace-path>"
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi exit 2
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchifi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchidtrace=$1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchilocal=127.0.0.1
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcpport=22
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiDIR=/var/tmp/dtest.$$
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchimkdir $DIR
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicd $DIR
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicat > test.pl <<-EOPERL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi use IO::Socket;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi my \$s = IO::Socket::INET->new(
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Proto => "tcp",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PeerAddr => "$local",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi PeerPort => $tcpport,
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi Timeout => 3);
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi die "Could not connect to host $local port $tcpport" unless \$s;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi print \$s "testing state machine transitions";
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi close \$s;
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiEOPERL
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi$dtrace -c '/usr/bin/perl test.pl' -qs /dev/stdin <<EODTRACE
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiBEGIN
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ipsend = tcpsend = ipreceive = tcpreceive = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connreq = connest = connaccept = 0;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiip:::send
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi args[4]->ipv4_protocol == IPPROTO_TCP/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ipsend++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcp:::send
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (args[4]->tcp_sport == $tcpport || args[4]->tcp_dport == $tcpport)/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcpsend++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiip:::receive
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi args[4]->ipv4_protocol == IPPROTO_TCP/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi ipreceive++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcp:::receive
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi (args[4]->tcp_sport == $tcpport || args[4]->tcp_dport == $tcpport)/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi tcpreceive++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcp:::state-change
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[args[3]->tcps_state]++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcp:::connect-request
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi args[4]->tcp_dport == $tcpport/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connreq++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcp:::connect-established
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi args[4]->tcp_sport == $tcpport/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connest++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchitcp:::accept-established
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/args[2]->ip_saddr == "$local" && args[2]->ip_daddr == "$local" &&
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi args[4]->tcp_dport == $tcpport/
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connaccept++;
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiEND
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi{
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("Minimum TCP events seen\n\n");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("ip:::send - %s\n", ipsend >= 5 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("ip:::receive - %s\n", ipreceive >= 5 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::send - %s\n", tcpsend >= 7 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::receive - %s\n", tcpreceive >= 7 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to syn-sent - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_SYN_SENT] >=1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to syn-received - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_SYN_RECEIVED] >=1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to established - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_ESTABLISHED] >= 2 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to fin-wait-1 - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_FIN_WAIT_1] >= 1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to close-wait - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_CLOSE_WAIT] >= 1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to fin-wait-2 - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_FIN_WAIT_2] >= 1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to last-ack - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_LAST_ACK] >= 1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::state-change to time-wait - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi state_event[TCP_STATE_TIME_WAIT] >= 1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::connect-request - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connreq >=1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::connect-established - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connest >=1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi printf("tcp:::accept-established - %s\n",
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi connaccept >=1 ? "yes" : "no");
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi}
d14abf155341d55053c76eeec58b787a456b753bRobert MustacchiEODTRACE
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchistatus=$?
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchicd /
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi/usr/bin/rm -rf $DIR
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchiexit $status
d14abf155341d55053c76eeec58b787a456b753bRobert Mustacchi