#!/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); sctpStartClient($IF0); vListen($IF0); vAccept($IF0); vLogHTML('================ Main Test ================='); sctpUpdateRecvACK(); %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_data_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_data_rcv) { vLogHTML('Cannot receive SCTP CHUNK_DATA
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_data_rcv, sctp_chunk_shutdown_rcv); if($ret{status} == 0 && $ret{recvFrame} eq sctp_chunk_shutdown_rcv) { vSend($IF0, sctp_chunk_abort_snd); vLogHTML('SHUTDOWN is sent with not all outstanding DATA has been acknowledged
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_data_rcv) { vLogHTML('Cannot receive SCTP CHUNK_DATA
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } vSend($IF0, sctp_chunk_sack_snd); # Check whether Terminate primitive is sent vShutdown($IF0); vLogHTML(OK); exit $V6evalTool::exitPass; ###################################################################### __END__ =head1 NAME ShutdownFromULP.seq - Termination of an association by receiving Terminate primitive from upper layers =head1 PURPOSE To check that receiving Terminate primitive will cause the endpoint to send a SHUTDOWN message to its peer only when all the outstanding DATA has been acknowledged. =head1 SYNOPSIS =begin html
  ./ShutdownFromULP.seq [-tooloption ...] -pkt ./ShutdownFromULP.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 upper layers. =head1 TEST PROCEDURE Endpoint A Endpoint B ULP (ESTABLISHED) (ESTABLISHED) <--------- Send Don't send SACK <--------------- DATA <--------- Terminate <--------------- DATA (retransmission) SACK ----------------> <--------------- SHUTDOWN SHUTDOWN ACK ---------------> <--------------- SHUTDOWN COMPLETE TEST DESCRIPTION: 1. Try to terminate an association between endpoint A and endpoint B by sending Terminate primitive to endpoint B from ULP. Before sending Terminate, send some data to endpoint A and don't send SACK for them from A. 2. Check A: SHUTDOWN message is sent to endpoint A. 3. Check B: SHUTDOWN is sent only when any data queued up at B has been sent to A and acknowledged by A. =head1 NOTE None =head1 REFERENCE RFC 4960 9.2. Shutdown of an Association Using the SHUTDOWN primitive (see Section 10.1), the upper layer of an endpoint in an association can gracefully close the association. This will allow all outstanding DATA chunks from the peer of the shutdown initiator to be delivered before the association terminates. Upon receipt of the SHUTDOWN primitive from its upper layer, the endpoint enters the SHUTDOWN-PENDING state and remains there until all outstanding data has been acknowledged by its peer. The endpoint accepts no new data from its upper layer, but retransmits data to the far end if necessary to fill gaps. =begin html
    Once all its outstanding data has been acknowledged, the endpoint
    shall send a SHUTDOWN chunk to its peer including in the Cumulative
    TSN Ack field the last sequential TSN it has received from the peer.
    It shall then start the T2-shutdown timer and enter the SHUTDOWN-SENT
    state.  If the timer expires, the endpoint must resend the SHUTDOWN
    with the updated last sequential TSN received from its peer.
=end html