#!/usr/bin/perl # # SCTP Conformance Test Suite Implementation # (C) Copyright Fujitsu Ltd. 2008, 2009 # # This file is part of the SCTP Conformance Test Suite implementation. # # The SCTP Conformance Test Suite implementation is free software; # you can redistribute it and/or modify it under the terms of # the GNU General Public License version 2 as published by # the Free Software Foundation. # # The SCTP Conformance Test Suite implementation is distributed in the # hope that it will be useful, but WITHOUT ANY WARRANTY; without even # the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU CC; see the file COPYING. If not, write to # the Free Software Foundation, 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # Please send any bug reports or fixes you make to the # email address(es): # networktest sctp # # Or submit a bug report through the following website: # http://networktest.sourceforge.net/ # # Written or modified by: # Hiroaki Kago # Wei Yongjun # # Any bugs reported given to us we will try to fix... any fixes shared will # be incorporated into the next SCTP release. # ############################################################################## BEGIN { $V6evalTool::TestVersion = '$Name: REL_1_0_0 $'; } use lib "../common"; use V6evalTool; use SCTP; %pktdesc = (); $IF0 = Link0; vCapture($IF0); sctpCheckEnv($IF0); $RTO = $SCTP::CONF{"RTO_INITIAL"}; $RTO_MAX = $SCTP::CONF{"RTO_MAX"}; $MAX_INIT_RETRANS = $SCTP::CONF{"MAX_INIT_RETRANS"}; sctpStartClient($IF0); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_init_rcv); if($ret{status} != 0 || $ret{recvFrame} ne 'sctp_chunk_init_rcv') { vLogHTML('Cannot receive SCTP CHUNK_INIT
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } vListen($IF0); vLogHTML('================ Main Test ================='); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_cookie_echo_rcv); if($ret{status} != 0 || $ret{recvFrame} ne 'sctp_chunk_cookie_echo_rcv') { vLogHTML('Cannot receive SCTP CHUNK_COOKIE_ECHO
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } $stime = $ret{"recvTime".$ret{"recvCount"}}; $count = 0; while ($count < $MAX_INIT_RETRANS) { # Don't send COOKIE-ACK, COOKIE-ECHO will be retransmitted after RTO %ret = vWarpRecv($IF0, $RTO + 5, 0, 0, sctp_chunk_cookie_echo_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_cookie_echo_rcv) { vLogHTML('Cannot receive SCTP CHUNK_COOKIE_ECHO
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } $etime = $ret{"recvTime".$ret{"recvCount"}}; $gap = $etime - $stime; if (!sctpTimeFuzzyEqual($gap, $RTO, $SCTP::CONF{"TIME_PREC"})) { # We got a bad time vSend($IF0, sctp_chunk_abort_snd); vLogHTML("ERROR: The retransmit T1-cookie time received:$gap, but expected: $RTO
"); vLogHTML('NG'); exit $V6evalTool::exitFail; } vLogHTML("OK: The retransmit T1-cookie time received:$gap, expected: $RTO
"); last if ($RTO == $RTO_MAX); $stime = $etime; $RTO = $RTO * 2; # back off the timer $RTO = $RTO_MAX if ($RTO > $RTO_MAX); $count++; } vLogHTML(OK); exit $V6evalTool::exitPass; ###################################################################### __END__ =head1 NAME T1CookieExpires.seq - RTO is updated correctly if T1-cookie timer expires for a INIT message =head1 PURPOSE To check that if T1-cookie expires on a destination address then the value of RTO is updated correctly for that address. =head1 SYNOPSIS =begin html
  ./T1CookieExpires.seq [-tooloption ...] -pkt ./T1CookieExpires.def
    -tooloption : v6eval tool option
  See Also: ../common/STD_PKT_COMMON.def
            ../common/SCTP_COMMON.def
=end html =head1 PRE-TEST CONDITION Association is not established between endpoint A and B. Arrange the data in Endpoint A such that COOKIE-ACK is not sent in response to COOKIE-ECHO message. =head1 TEST PROCEDURE Endpoint A Endpoint B ULP (CLOSED) (COOKIE-ECHOED) <---------------- COOKIE-ECHO Don't send Start T1-cookie timer COOKIE-ACK message | | T1-cookie timer expires | <---------------- COOKIE-ECHO Restart T1-cookie Timer TEST DESCRIPTION: 1. Attempt to make an association from endpoint B to endpoint A by Sending COOKIE-ECHO message from endpoint B. Record the message sequence using a signal emulator. 2. Let the timer T1-cookie expire. COOKIE-ECHO message will be retransmitted. Note the timer. Don't send COOKIE-ACK for the retransmitted COOKIE-ECHO message. T1-cookie will be expired again and again COOKIE-ECHO message will be retransmitted. Record the message sequence using a signal emulator. 3. Check A: Value of the T1-cookie RTO is updated correctly. =head1 NOTE 1. If configure of MAX_INIT_RETRANS is not lager enough, test will exit even if RTO is not up to RTO.MAX. 2. If the retransmit time is 0.5s less or greater than RTO, do accept it because we can not exactly calculate it. =head1 REFERENCE RFC 4960 4. SCTP Association State Diagram Notes: 3) If the T1-cookie timer expires, the endpoint MUST retransmit COOKIE ECHO and restart the T1-cookie timer without changing state. This MUST be repeated up to 'Max.Init.Retransmits' times. After that, the endpoint MUST abort the initialization process and report the error to the SCTP user.