#!/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 = ( sctp_chunk_shut_and_sack_gap_rcv => "Recv SCTP CHUNK_SACK (Bundled with CHUNK_SHUTDOWN)", sctp_chunk_shut_and_sack_rcv => "Recv SCTP CHUNK_SACK (Bundled with CHUNK_SHUTDOWN)", sctp_chunk_sack_gap_rcv => "Recv SCTP CHUNK_SACK", ); $IF0 = Link0; vCapture($IF0); sctpCheckEnv($IF0); sctpStartClient($IF0); vListen($IF0); vAccept($IF0); vRecvMsg($IF0); vLogHTML('================ Main Test ================='); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_shutdown_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_shutdown_rcv) { vLogHTML('Cannot receive SCTP CHUNK_SHUTDOWN
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } sctpUpdateSendTSN(2); vSend($IF0, sctp_chunk_data_snd); sctpUpdateSendTSN(-2); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_shutdown_rcv, sctp_chunk_sack_gap_rcv, sctp_chunk_shut_and_sack_gap_rcv); if($ret{status} != 0 || ($ret{recvFrame} ne sctp_chunk_shutdown_rcv && $ret{recvFrame} ne sctp_chunk_sack_gap_rcv && $ret{recvFrame} ne sctp_chunk_shut_and_sack_gap_rcv)) { vLogHTML('Cannot receive SCTP CHUNK_SHUTDOWN
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } if($ret{status} == 0 && $ret{recvFrame} eq sctp_chunk_sack_gap_rcv) { %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_shutdown_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_shutdown_rcv) { vLogHTML('Cannot receive SCTP CHUNK_SHUTDOWN
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } } if($ret{status} == 0 && $ret{recvFrame} eq sctp_chunk_shutdown_rcv) { %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_sack_gap_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_sack_gap_rcv) { vLogHTML('Cannot receive SCTP CHUNK_SACK
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } } sctpUpdateSendTSN(); vSend($IF0, sctp_chunk_data_snd); sctpUpdateSendTSN(); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_shutdown_rcv, sctp_chunk_sack_rcv, sctp_chunk_shut_and_sack_rcv); if($ret{status} != 0 || ($ret{recvFrame} ne sctp_chunk_shutdown_rcv && $ret{recvFrame} ne sctp_chunk_sack_rcv && $ret{recvFrame} ne sctp_chunk_shut_and_sack_rcv)) { vLogHTML('Cannot receive SCTP CHUNK_SHUTDOWN
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } if($ret{status} == 0 && $ret{recvFrame} eq sctp_chunk_sack_rcv) { %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_shutdown_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_shutdown_rcv) { vLogHTML('Cannot receive SCTP CHUNK_SHUTDOWN
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } } vSend($IF0, sctp_chunk_shutdown_ack_snd); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_shutdown_complete_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_shutdown_complete_rcv) { vLogHTML('Cannot receive SCTP CHUNK_SHUTDOWN_COMPLETE
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } vLogHTML(OK); exit $V6evalTool::exitPass; ###################################################################### __END__ =head1 NAME DataWithGapInShutSend.seq - DATA chunk is received with gaps exist in SHUTDOWN-SENT State =head1 PURPOSE To check that if an endpoint is in the SHUTDOWN-SENT state and receives a DATA chunk with TSN gaps from its peer, the endpoint should respond immediately with a SHUTDOWN chunk and restart the T2-shutdown timer, SACK chunk MUST also be sent. =head1 SYNOPSIS =begin html
  ./DataWithGapInShutSend.seq [-tooloption ...] -pkt ./DataWithGapInShutSend.def
    -tooloption : v6eval tool option
  See Also: ../common/STD_PKT_COMMON.def
            ../common/SCTP_COMMON.def
=end html =head1 PRE-TEST CONDITION Association is established between endpoint A and B. Arrange the data in endpoint B such that terminate primitive is received from ULP to terminate the association. Arrange data in endpoint A such that DATA message with duplicate TSN gaps is sent to endpoint B. =head1 TEST PROCEDURE Endpoint A Endpoint B ULP (ESTABLISHED) (ESTABLISHED) <-------- Terminate <---------------- SHUTDOWN DATA -----------------> (with TSN gaps) <---------------- SHUTDOWN <---------------- SACK DATA -----------------> (lost data) <---------------- SHUTDOWN SHUTDOWN-ACK -----------------> <---------------- SHUTDOWN-COMPLETE TEST DESCRIPTION: 1. Try to terminate the association between endpoint A and B by sending terminate primitive from ULP. While endpoint B is in SHUTDOWN-SENT state, send DATA message from endpoint A. 2. Check A: SHUTDOWN message is sent in response to the DATA message. 3. Check B: SACK message is also sent in response to the DATA message. =head1 NOTE None =head1 REFERENCE RFC 4960 9.2. Shutdown of an Association =begin html
    While in the SHUTDOWN-SENT state, the SHUTDOWN sender MUST
    immediately respond to each received packet containing one or more
    DATA chunks with a SHUTDOWN chunk and restart the T2-shutdown timer.
    If a SHUTDOWN chunk by itself cannot acknowledge all of the received
    DATA chunks (i.e., there are TSNs that can be acknowledged that are
    larger than the cumulative TSN, and thus gaps exist in the TSN
    sequence), or if duplicate TSNs have been received, then a SACK chunk
    MUST also be sent.
=end html