#!/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_init_ack_addr => "Send SCTP CHUNK_INIT", sctp_chunk_data_rcv_link1 => "Recv SCTP CHUNK_DATA (On Link1)", sctp_chunk_heartbeat_link1 => "Recv SCTP CHUNK_HEARTBEAT (On Link1)", sctp_chunk_heartbeat_ack_link1 => "Send SCTP CHUNK_HEARTBEAT_ACK (On Link1)", ); $IF0 = Link0; $IF1 = Link1; vCapture($IF0); vCapture($IF1); sctpCheckEnv($IF0, $IF1); vRegisterExtNS("ns_on_link0_to_link1", "na_on_link1_to_link0"); vRegisterExtNS("arp_request_link0_to_link1", "arp_reply_link1_to_link0"); sctpStartClient($IF0); vListen($IF0, sctp_chunk_init_rcv, sctp_chunk_init_ack_addr); 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($IF1, 10, 0, 0, sctp_chunk_data_rcv_link1, sctp_chunk_heartbeat_link1); if ($ret{status} == 0 && $ret{recvFrame} eq sctp_chunk_heartbeat_link1) { $HBINFO = $ret{sctpGetFieldName("CHUNK_HEARTBEAT.HeartbeatInfo.Data")}; vWarpCPP("-DHBINFO=\\\"$HBINFO\\\""); vSend($IF1, sctp_chunk_heartbeat_ack_link1); %ret = vWarpRecv($IF1, 10, 0, 0, sctp_chunk_data_rcv_link1); } if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_data_rcv_link1) { vSend($IF0, sctp_chunk_abort_snd); vLogHTML('Cannot receive SCTP CHUNK_DATA
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } %ret = vWarpRecv($IF0, 10, 0, 0, sctp_chunk_data_rcv); if($ret{status} != 0 || $ret{recvFrame} ne sctp_chunk_data_rcv) { vSend($IF0, sctp_chunk_abort_snd); vLogHTML('Cannot receive SCTP CHUNK_DATA
'); vLogHTML('NG'); exit $V6evalTool::exitFail; } vSend($IF0, sctp_chunk_sack_snd); vShutdown($IF0); vLogHTML(OK); exit $V6evalTool::exitPass; ###################################################################### __END__ =head1 NAME InitAckWithMoreAddr.seq - INIT-ACK chunk is received with more than one address parameters =head1 PURPOSE To check that if there are one or more transport addresses are received in INIT-ACK message then one of these IP address plus the IP address from where INIT-ACK comes combined with the SCTP source port number is used as the destination transport address. =head1 SYNOPSIS =begin html
  ./InitAckWithMoreAddr.seq [-tooloption ...] -pkt ./InitAckWithMoreAddr.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 INIT-ACK message with more than one transport addresses is sent to endpoint B. =head1 TEST PROCEDURE Endpoint A Endpoint B ULP (CLOSED) (CLOSED) <----- Associate <----------------- INIT INIT-ACK -----------------> (Transport Address = x, y) <----------------- COOKIE-ECHO COOKIE-ACK -----------------> <----------------- DATA (Address = x) <----------------- DATA (Address = y) <----------------- DATA (Address = x) SACK -----------------> (Address = x) TEST DESCRIPTION: 1. Attempt to make an association from endpoint B to endpoint A. Send INIT-ACK Message containing two IPv4/IPv6 addresses. Record the message sequence using a signal emulator. 2. Check A: INIT-ACK message is accepted. 3. Check B: COOKIE-ECHO is sent at one of the transport addresses received in INIT-ACK plus the address from where INIT-ACK was received. 4. Check C: Was the message sequence as above. =head1 NOTE None =head1 REFERENCE RFC 4960 5.1.2. Handle Address Parameters =begin html
    C) If there are only IPv4/IPv6 addresses present in the received INIT
       or INIT ACK chunk, the receiver MUST derive and record all the
       transport addresses from the received chunk AND the source IP
       address that sent the INIT or INIT ACK.  The transport addresses
       are derived by the combination of SCTP source port (from the
       common header) and the IP Address parameter(s) carried in the INIT
       or INIT ACK chunk and the source IP address of the IP datagram.
       The receiver should use only these transport addresses as
       destination transport addresses when sending subsequent packets to
       its peer.
=end html D) An INIT or INIT ACK chunk MUST be treated as belonging to an already established association (or one in the process of being established) if the use of any of the valid address parameters contained within the chunk would identify an existing TCB.