/////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2023 Ericsson Telecom AB // // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v2.0 // which accompanies this distribution, and is available at // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html /////////////////////////////////////////////////////////////////////////////// // // File: SCCP_TestCases.ttcn // Description: SS7 SCCP basic SEA test // according to specification ITU-T SS7 SCCP, ANSI ..., TCC ... // References: ITU-T: Recommendation Q.711-Q.714, // ANSI T1.112-2001, // TCC // Rev: R7A // Updated: 2007.04.12 // Contact: http://ttcn.ericsson.se // module SCCP_Testcases {//startmodule modulepar { hexstring tsp_own_GT := '0614377760'H; hexstring tsp_remote_GT := '0614375760'H; integer tsp_SSN := 2; //8:MSC 5:MAP see 3.4.2.2/Q.713 octetstring tsp_SIO := '83'O;//SCCP national integer tsp_own_SPC := 461087; // =0x07091E integer tsp_remote_SPC := 461086; // =0x07091D integer tsp_SLS := 0; charstring tsp_sccp_serviceType := "mtp3_itu"; octetstring MTP3_UserPart_SIO; integer MTP3_UserPart_OPC, MTP3_UserPart_DPC, MTP3_UserPart_SLS }//modulepar import from General_Types all; import from MTP3asp_Types all; import from MTP3asp_PortType all; import from SCCPasp_Types all; import from SCCP_Types all; import from SCCP_Emulation all; /************************************* * Components **************************************/ // Model of MSC: type component MSC_ST { port MTP3asp_SP_PT CMGW6; //port MTP3asp_PT CMGW6; }; // Main test component with behaviour SCCPuserA andSCCPuserB type component MTC_CT { var SCCP_PAR_Address v_CalledAddress, v_CallingAddress; var integer v_testvalue; var SCCP_CT vc_SCCP_A ; var MSC_SCCP_MTP3_parameters v_BootA; var SCCP_PAR_Connection_Id v_cid_A ; port SCCPasp_PT A_PORT; //SCCPuserA } function initBootParams() runs on MTC_CT { v_BootA := { sio:= { ni:= substr(oct2bit(tsp_SIO),0,2), prio:= substr(oct2bit(tsp_SIO),2,2), si:= substr(oct2bit(tsp_SIO),4,4) }, opc:=tsp_own_SPC, dpc:=tsp_remote_SPC, sls:=tsp_SLS, sccp_serviceType:=tsp_sccp_serviceType, ssn:= tsp_SSN }; return; } //initBootParams function init() runs on MTC_CT //system MSC_ST { initBootParams(); log("v_BootA:",v_BootA); // Protocol Stack A creation & connections: vc_SCCP_A:=SCCP_CT.create; map(vc_SCCP_A:MTP3_SCCP_PORT,system:CMGW6); connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters log( "init() is done"); }// init function terminate( ) runs on MTC_CT //system MSC_ST { log( "termitate() started"); /*while( all component.running != true ) { //waits }*/ all component.stop; unmap(vc_SCCP_A:MTP3_SCCP_PORT,system:CMGW6); disconnect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); log(" all components stopped"); self.stop; } //terminate // function getOddEven returns '0' // if even number of dec digit can be found in GT see Q.713 function getOddEven( in hexstring pl_GT) return bitstring { return int2bit( (lengthof(pl_GT) mod 2) ,1); } function getOddEven_ansi( in hexstring pl_GT) return bitstring { if( (lengthof(pl_GT) mod 2) == 0 ) { return '0010'B;} //even else { return '0001'B;} //odd } //****************************************************************** //function setAddresses_gti0001() runs on MTC_CT // Sets CalledAddress and CallingAddress as a gti001-type address // according to the cfg file. //****************************************************************** function setAddresses_gti0001() runs on MTC_CT { if( (tsp_sccp_serviceType == "mtp3_itu") or (tsp_sccp_serviceType == "mtp3b_itu") or (tsp_sccp_serviceType == "mtp3_ttc") or (tsp_sccp_serviceType == "mtp3b_ttc") ) { v_CalledAddress :={ addressIndicator := { pointCodeIndic := '1'B, ssnIndicator := '1'B, globalTitleIndic := '0001'B, routingIndicator := '0'B },//addressIndicator signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn subsystemNumber := tsp_SSN, globalTitle := { gti0001:= { natureOfAddress := '0000011'B, oddeven := getOddEven( tsp_remote_GT ), globalTitleAddress := tsp_remote_GT } }//globalTitle } // v_CalledAddress v_CallingAddress :={ addressIndicator := { pointCodeIndic := '1'B, ssnIndicator := '1'B, globalTitleIndic := '0001'B, routingIndicator := '0'B },//addressIndicator signPointCode := SCCP_SPC_int2bit(tsp_own_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn subsystemNumber := tsp_SSN, globalTitle:= { gti0001 := { natureOfAddress := '0000011'B, oddeven := getOddEven( tsp_own_GT ), globalTitleAddress := tsp_own_GT } }//globalTitle } // v_CallingAddress } else if( (tsp_sccp_serviceType == "mtp3_ansi") or (tsp_sccp_serviceType == "mtp3b_ansi") ) { v_CalledAddress :={ addressIndicator := { pointCodeIndic := '1'B, ssnIndicator := '1'B, globalTitleIndic := '0001'B, routingIndicator := '0'B },//addressIndicator signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn subsystemNumber := tsp_SSN, globalTitle := { gti0011:= { translationType := int2oct(7,1), encodingScheme := getOddEven_ansi( tsp_remote_GT ), numberingPlan := '0111'B, //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1 globalTitleAddress:= tsp_remote_GT } }//globalTitle } // v_CalledAddress v_CallingAddress :={ addressIndicator := { pointCodeIndic := '1'B, ssnIndicator := '1'B, globalTitleIndic := '0001'B, routingIndicator := '0'B },//addressIndicator signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn subsystemNumber := tsp_SSN, globalTitle := { gti0011:= { translationType := int2oct(7,1), encodingScheme := getOddEven_ansi( tsp_own_GT ), numberingPlan := '0111'B, //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1 globalTitleAddress:= tsp_own_GT } }//globalTitle } // v_CallingAddress }//if }//setAddresses_gti001 function f_SendAndReceive1N_UNITDATA(in octetstring pl_userdata) runs on MTC_CT { var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; timer TL_timer:= 120.0; TL_timer.start; A_PORT.send( t_ASP_N_UNITDATA_req( v_CalledAddress, v_CallingAddress, '00000001'B, //sequence control '00000001'B, //return option pl_userdata, omit ) ); alt { [] A_PORT.receive( tr_ASP_N_UNITDATA_ind ) -> value vl_N_UNITDATA_ind { if( (vl_N_UNITDATA_ind.calledAddress == v_CalledAddress ) and (vl_N_UNITDATA_ind.callingAddress == v_CallingAddress) and (vl_N_UNITDATA_ind.userData == pl_userdata) ) { log("Correct CalledAddress, CallingAddress and userData received, data are correct"); setverdict(pass); } else { log("Some data corrupted"); setverdict( fail ); } }; [] TL_timer.timeout { setverdict( fail ); log("Timeout...."); }; } //alt TL_timer.stop; }//f_SendAndReceive1N_UNITDATA /**************************************************** Connection Oriented Part ****************************************************/ /**************************************************** function f_connect Establishes a connection (Sends an ASP_SCCP_N_CONNECT_req on A_PORT and waits for N_CONNECT_ind on B_PORT. If it is received, it sends back an ASP_SCCP_N_CONNECT_res on B_PORT and waits for N_CONNECT_cfm on A_PORT) ****************************************************/ function f_connect() runs on MTC_CT return boolean { var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind; var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm; setverdict(none); v_cid_A := 13; timer TL_timer:= 120.0; TL_timer.start; A_PORT.send( t_ASP_N_CONNECT_req( v_CalledAddress, v_CallingAddress, omit, //expeditedDataSel omit, //QoS omit, //userData v_cid_A, omit //importance ) ); alt { [] A_PORT.receive( tr_ASP_N_CONNECT_cfm ) -> value vl_N_CONNECT_cfm { setverdict( pass ); log("f_connect finished successfully"); return true; } [] TL_timer.timeout { setverdict( fail ); log("Timeout...."); return false; } }// alt log("f_connect finished"); return false; }//f_connect /**************************************************** function f_send Sends an ASP_SCCP_N_DATA_req on A_PORT and waits for answer in A_PORT ****************************************************/ function f_send(in octetstring pl_userdata) runs on MTC_CT { timer TL_timer:= 120.0; TL_timer.start; A_PORT.send( t_ASP_N_DATA_req ( pl_userdata, v_cid_A, omit) ) ; alt { [] A_PORT.receive { setverdict( pass ); log("f_connect finished successfully"); } [] TL_timer.timeout { setverdict( fail ); log("Timeout...."); } } //alt }//f_send //f_disconnect with timeout function f_disconnect( ) runs on MTC_CT { var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; timer TL_timer:= 25.0; TL_timer.start; A_PORT.send( t_ASP_N_DISCONNECT_req( omit, // respondingAddress 0, //reason : end user originated, see 3.11/Q.713 omit, //userData v_cid_A, omit )) alt { [] A_PORT.receive { repeat; } [] TL_timer.timeout { setverdict( pass ); log("Timeout...."); }; }//alt }//f_disconnect //=================================================== // Testcases //=================================================== /**************************************************** tc_ConnlessSendingShortASP Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req and receives it in one ASP_SCCP_N_UNITDATA_req. SCCP transfers information in udp or (forced) xudp packets. ****************************************************/ testcase tc_ConnlessSendingShortASP() runs on MTC_CT { var octetstring vl_userdata; init(); setAddresses_gti0001(); vl_userdata :='12345678901234567890'O; f_SendAndReceive1N_UNITDATA( vl_userdata ); terminate(); } //tc_ConnlessSendingShortASP /**************************************************** tc_ConnlessSendingLongASP Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req and receives it in one ASP_SCCP_N_UNITDATA_req. It is used for segmentation and reassembly. SCCP transfers information in xudp packets ****************************************************/ testcase tc_ConnlessSendingLongASP() runs on MTC_CT system MSC_ST { var octetstring vl_userdata; var integer vl_i; init(); setAddresses_gti0001(); vl_userdata := ''O; for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) { vl_userdata := vl_userdata &'12345678901234567890'O; } f_SendAndReceive1N_UNITDATA( vl_userdata ); terminate(); }//tc_ConnlessSendingLongASP /**************************************************** tc_ConnOrientedShortASPSending ****************************************************/ testcase tc_ConnOrientedShortASPSending() runs on MTC_CT system MSC_ST { var octetstring vl_userdata; init(); setAddresses_gti0001(); vl_userdata := '12345678901234567890'O; if(f_connect()) { f_send(vl_userdata); f_disconnect(); } terminate(); } /**************************************************** tc_ConnOrientedLongASPSending ****************************************************/ testcase tc_ConnOrientedLongASPSending() runs on MTC_CT { var octetstring vl_userdata; var integer vl_i; init(); setAddresses_gti0001(); vl_userdata := ''O; for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) { vl_userdata := vl_userdata &'12345678901234567890'O; } if(f_connect()) { f_send(vl_userdata); //f_SendAndReceive1N_UNITDATA( vl_userdata ); f_disconnect(); } terminate(); } /**************************************************** CONTROL ****************************************************/ control { execute( tc_ConnlessSendingShortASP() ); execute( tc_ConnlessSendingLongASP() ); execute( tc_ConnOrientedShortASPSending()); execute( tc_ConnOrientedLongASPSending()); } }//module