osmo-ttcn3-hacks/SCCP_CNL113341/demo/SCCP_selftest.ttcn

608 lines
18 KiB
Plaintext

///////////////////////////////////////////////////////////////////////////////
//
//
// Copyright Test Competence Center (TCC) ETH 2007
//
//
//
// The copyright to the computer program(s) herein is the property of TCC. //
// The program(s) may be used and/or copied only with the written permission //
// of TCC or in accordance with the terms and conditions stipulated in the //
// agreement/contract under which the program(s) have been supplied
//
//
//
///////////////////////////////////////////////////////////////////////////////
//
// File: SCCP_selftest.ttcn
// Description: SS7 SCCP basic test
// according to specification ITU-T SS7 SCCP, ANSI ..., TCC ...
// References: ITU-T: Recommendation Q.711-Q.714,
// ANSI ,
// TCC
// Rev: <RnXnn>
// Updated: 2007-04.12
// Contact: http://ttcn.ericsson.se
//
module SCCP_selftest
{//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"
}//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;
//==================================================================
// MTPsim component
// Description: Simulates two MTP stacks for two MTP3-User
// to implement this configuration:
// MTPsim includes MTP3/1 and MTP3/2
// MTPsim only receives TRANSFER_req and sends TRANSFER_ind
// with the same content
// +----------+ +----------+
// |SCCP-userA| <--->|SCCP-userB| = MTC
// +----------+ +----------+
// | A | B
// +----------+ +----------+
// | SCCP A | <--->| SCCP B |
// +----------+ +----------+
// | A | B
// +-----------------------------+
// | MTP3 1. | MTP3 2.| = MTP3sim
// +----------------------------+
//
//==================================================================
group MTPsim
{
type component MTPsim_CT {
port MTP3asp_SP_PT MTP_A_PORT
port MTP3asp_SP_PT MTP_B_PORT
}
function MTPsim_EventHandler( ) runs on MTPsim_CT
{
var ASP_MTP3_TRANSFERreq vl_MTP3_TRANSFERreq;
var ASP_MTP3_TRANSFERind vl_MTP3_TRANSFERind
alt{
[] MTP_A_PORT.receive( ASP_MTP3_TRANSFERreq:? ) -> value vl_MTP3_TRANSFERreq
{
MTP_B_PORT.send( t_ASP_MTP3_TRANSFERind(
vl_MTP3_TRANSFERreq.sio,
vl_MTP3_TRANSFERreq.opc,
vl_MTP3_TRANSFERreq.dpc,
vl_MTP3_TRANSFERreq.sls,
vl_MTP3_TRANSFERreq.data ) ) ;
repeat;
}//A.receive
[] MTP_B_PORT.receive( ASP_MTP3_TRANSFERreq:? ) -> value vl_MTP3_TRANSFERreq
{
MTP_A_PORT.send( t_ASP_MTP3_TRANSFERind (
vl_MTP3_TRANSFERreq.sio,
vl_MTP3_TRANSFERreq.opc,
vl_MTP3_TRANSFERreq.dpc,
vl_MTP3_TRANSFERreq.sls,
vl_MTP3_TRANSFERreq.data ));
repeat;
}//B.receive
}//alt
} //MTPsim_EventHandler
}//group MTPsim
// Main test component with behaviour SCCPuserA andSCCPuserB
type component MTC_CT {
var SCCP_PAR_Address v_CalledAddress, v_CallingAddress;
var integer v_testvalue;
var MTPsim_CT vc_MTPsim;
var SCCP_CT vc_SCCP_A, vc_SCCP_B;
var MSC_SCCP_MTP3_parameters v_BootA;
var MSC_SCCP_MTP3_parameters v_BootB;
var SCCP_PAR_Connection_Id v_cid_A, v_cid_B;
port SCCPasp_PT A_PORT; //SCCPuserA
port SCCPasp_PT B_PORT //SCCPuserB
}
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
};
v_BootB :=
{ sio:=
{ ni:= substr(oct2bit(tsp_SIO),0,2),
prio:= substr(oct2bit(tsp_SIO),2,2),
si:= substr(oct2bit(tsp_SIO),4,4)
},
opc:=tsp_remote_SPC,
dpc:=tsp_own_SPC,
sls:=tsp_SLS,
sccp_serviceType:=tsp_sccp_serviceType,
ssn:= tsp_SSN
};
return;
} //initBootParams
function init() runs on MTC_CT
{
initBootParams();
log("v_BootA:",v_BootA);
log("v_BootB: ",v_BootB);
vc_MTPsim:= MTPsim_CT.create;
// Protocol Stack A creation & connections:
vc_SCCP_A:=SCCP_CT.create;
connect(vc_SCCP_A:MTP3_SCCP_PORT,vc_MTPsim:MTP_A_PORT);
connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT);
// Protocol Stack B creation & connections:
vc_SCCP_B:=SCCP_CT.create;
connect(vc_SCCP_B:MTP3_SCCP_PORT,vc_MTPsim:MTP_B_PORT);
connect(self:B_PORT,vc_SCCP_B:SCCP_SP_PORT);
// Start stacks:
vc_MTPsim.start( MTPsim_EventHandler() );
vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters !!! cont here!!!
vc_SCCP_B.start( SCCPStart(v_BootB));
log( "init() is done");
}// init
function terminate( ) runs on MTC_CT
{
log( "termitate() started");
/*while( all component.running != true )
{
//waits
}*/
all component.stop;
disconnect(vc_SCCP_A:MTP3_SCCP_PORT, vc_MTPsim:MTP_A_PORT);
disconnect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT);
disconnect(vc_SCCP_B:MTP3_SCCP_PORT,vc_MTPsim:MTP_B_PORT);
disconnect(self:B_PORT,vc_SCCP_B: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 getOddEvenEnc( 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_Emulation.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_Emulation.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_Emulation.ttcn
subsystemNumber := tsp_SSN,
globalTitle := {
gti0011:= {
translationType := int2oct(7,1),
encodingScheme := getOddEvenEnc( 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_Emulation.ttcn
subsystemNumber := tsp_SSN,
globalTitle := {
gti0011:= {
translationType := int2oct(7,1),
encodingScheme := getOddEvenEnc( 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
else
{
log( "wrong tsp_sccp_serviceType ->exit ");
setverdict( fail );
}
}//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:= 40.0;
TL_timer.start;
log("A_PORT.send follows");
log("Addresses:",v_CalledAddress, v_CallingAddress);
A_PORT.send( t_ASP_N_UNITDATA_req( v_CalledAddress,
v_CallingAddress,
'00000001'B, //sequence control
'00000001'B, //return option
pl_userdata,
omit ) );
log("A_PORT.send executed");
alt {
[] B_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");
log("Original data:", v_CalledAddress, v_CallingAddress, pl_userdata);
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:= 40.0;
TL_timer.start;
// A Sends ASP_SCCP_N_CONNECT_req , receives
A_PORT.send( t_ASP_N_CONNECT_req( v_CalledAddress,
v_CallingAddress,
omit, //expeditedDataSel
omit, //QoS
omit, //userData
v_cid_A,
omit //importance
) );
alt {
[] B_PORT.receive( tr_ASP_N_CONNECT_ind ) -> value vl_N_CONNECT_ind
{
v_cid_B := vl_N_CONNECT_ind.connectionId;
B_PORT.send( t_ASP_N_CONNECT_res( omit,// respondingAddress
omit,//expeditedDataSel
omit,//qualityOfService
omit, //userData
v_cid_B,
omit //importance
));
}
[] B_PORT.receive
{
log( "unexpected asp received for ASP_SCCP_N_CONNECT_req, failed");
setverdict( fail );
return false;
}
[] TL_timer.timeout
{
setverdict( pass );
log("Timeout....");
return false;
}
}
// receives ASP_SCCP_N_CONNECT_cfm
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( pass );
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
B_PORT
****************************************************/
function f_send(in octetstring pl_userdata) runs on MTC_CT
{
var ASP_SCCP_N_DATA_ind vl_N_DATA_ind;
timer TL_timer:= 120.0;
TL_timer.start;
A_PORT.send( t_ASP_N_DATA_req ( pl_userdata, v_cid_A, omit) ) ;
alt {
[] B_PORT.receive( tr_ASP_N_DATA_ind ) -> value vl_N_DATA_ind
{
if( vl_N_DATA_ind.userData == pl_userdata )
{
log( "userData received correctly" );
setverdict( pass );
}
else
{
log("user data mismatch error in f_send()")
setverdict(fail);
}
}//B_PORT.receive( tr_ASP_N_DATA_ind )
[] B_PORT.receive
{
log( "unexpected asp received for ASP_SCCP_N_DATA_req, failed");
setverdict( fail );
}
[] TL_timer.timeout
{
setverdict( pass );
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:= 5.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 {
[] B_PORT.receive(tr_ASP_N_DISCONNECT_ind) -> value vl_N_DISCONNECT_ind
{
setverdict( pass );
}
[] B_PORT.receive
{
log("unexpected asp received on B_PORT instead of ASP_SCCP_N_DISCONNECT_ind");
//repeat;
setverdict(fail);
}
[] TL_timer.timeout
{
setverdict( fail );
log("Timeout....");
};
}//alt
//give time for inner release complete (rlc):
alt {
[] TL_timer.timeout
{
setverdict( pass );
log("Stopped with expected timeout");
};
}
}//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
{
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
{
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