osmo-ttcn3-hacks/msc_tests/MSC_Tests.ttcn

322 lines
6.8 KiB
Plaintext

module MSC_Tests {
import from General_Types all;
import from Osmocom_Types all;
import from M3UA_Types all;
import from M3UA_Emulation 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;
import from SCTPasp_Types all;
import from SCTPasp_PortType all;
import from BSSAP_Types all;
type component MTC_CT {
/* M3UA emulation component */
var M3UA_CT vc_M3UA;
/* SCCP emulation component */
var SCCP_CT vc_SCCP;
/* test port to SCCP emulation */
port SCCPasp_PT SCCP;
var octetstring g_sio;
var MSC_SCCP_MTP3_parameters g_sccp_pars;
var SCCP_PAR_Address g_sccp_addr_own, g_sccp_addr_peer;
var boolean g_initialized := false;
}
modulepar {
charstring mp_sccp_service_type := "mtp3_itu";
SCTP_Association_Address mp_sctp_addr := { 22905, "127.0.0.1", 2905, "127.0.0.1" };
integer mp_own_pc := 196;
integer mp_own_ssn := 254;
integer mp_peer_pc := 185; /* 0.23.1 */
integer mp_peer_ssn := 254;
}
/* construct a SCCP_PAR_Address with just PC + SSN and no GT */
template (value) SCCP_PAR_Address ts_SccpAddr_PC_SSN(integer pc, integer ssn) := {
addressIndicator := {
pointCodeIndic := '1'B,
ssnIndicator := '1'B,
globalTitleIndic := '0000'B,
routingIndicator := '1'B
},
signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, '83'O),
//signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, g_sio),
subsystemNumber := ssn,
globalTitle := omit
}
function init_pars() runs on MTC_CT {
g_sio := '83'O;
g_sccp_pars := {
sio := {
ni := substr(oct2bit(g_sio),0,2),
prio := substr(oct2bit(g_sio),2,2),
si := substr(oct2bit(g_sio),4,4)
},
opc := mp_own_pc,
dpc := mp_peer_pc,
sls := 0,
sccp_serviceType := mp_sccp_service_type,
ssn := mp_own_ssn
};
g_sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(mp_own_pc, mp_own_ssn));
g_sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(mp_peer_pc, mp_peer_ssn));
}
function init() runs on MTC_CT {
if (g_initialized == true) {
return;
}
g_initialized := true;
init_pars();
/* Create components */
vc_M3UA := M3UA_CT.create;
vc_SCCP := SCCP_CT.create;
/* connect system SCTP port to M3UA lower side */
map(vc_M3UA:SCTP_PORT, system:sctp);
/* connect MTP3 service provider to SCCP MTP3 port */
connect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
/* connect test suite to SCCP service provider port */
connect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
vc_M3UA.start(f_M3UA_Emulation(mp_sctp_addr));
vc_SCCP.start(SCCPStart(g_sccp_pars));
}
function terminate() runs on MTC_CT {
disconnect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
disconnect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
unmap(vc_M3UA:SCTP_PORT, system:sctp);
all component.stop;
self.stop;
}
testcase TC_nothing() runs on MTC_CT {
init();
timer T := 30.0;
T.start;
T.timeout;
}
template PDU_BSSAP ts_BSSAP_BSSMAP := {
discriminator := '0'B,
spare := '0000000'B,
dlci := omit,
lengthIndicator := 0, /* overwritten by codec */
pdu := ?
}
template PDU_BSSAP tr_BSSAP_BSSMAP := {
discriminator := '0'B,
spare := '0000000'B,
dlci := omit,
lengthIndicator := ?,
pdu := {
bssmap := ?
}
}
type integer BssmapCause;
template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := {
elementIdentifier := '04'O,
lengthIndicator := 0,
causeValue := int2bit(val, 7),
extensionCauseValue := '0'B,
spare1 := omit
}
template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
pdu := {
bssmap := {
reset := {
messageType := '30'O,
cause := ts_BSSMAP_IE_Cause(cause),
a_InterfaceSelectorForReset := omit
}
}
}
}
template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
pdu := {
bssmap := {
resetAck := {
messageType := '31'O,
a_InterfaceSelectorForReset := omit
}
}
}
}
template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
resetAck := {
messageType := '31'O,
a_InterfaceSelectorForReset := *
}
}
}
}
template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := {
elementIdentifier := '05'O,
lengthIndicator := 0,
cellIdentifierDiscriminator := '0000'B,
spare1_4 := '0000'B,
cellIdentification := ?
}
type uint16_t BssmapLAC;
type uint16_t BssmapCI;
/*
template BSSMAP_IE_CellIdentifier ts_CellId_CGI(mcc, mnc, lac, ci)
modifies ts_BSSMAP_IE_CellID := {
cellIdentification := {
cI_LAC_CGI := {
mnc_mcc := FIXME,
lac := int2oct(lac, 2),
ci := int2oct(ci, 2)
}
}
}
*/
template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci)
modifies ts_BSSMAP_IE_CellID := {
cellIdentification := {
cI_LAC_CI := {
lac := int2oct(lac, 2),
ci := int2oct(ci, 2)
}
}
}
template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci)
modifies ts_BSSMAP_IE_CellID := {
cellIdentification := {
cI_CI := int2oct(ci, 2)
}
}
template BSSMAP_IE_CellIdentifier ts_CellId_none
modifies ts_BSSMAP_IE_CellID := {
cellIdentification := {
cI_noCell := ''O
}
}
template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
elementIdentifier := '17'O,
lengthIndicator := 0,
layer3info := l3info
}
template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info)
modifies ts_BSSAP_BSSMAP := {
pdu := {
bssmap := {
completeLayer3Information := {
messageType := '57'O,
cellIdentifier := cell_id,
layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
chosenChannel := omit,
lSAIdentifier := omit,
aPDU := omit,
codecList := omit,
redirectAttemptFlag := omit,
sendSequenceNumber := omit,
iMSI := omit
}
}
}
}
template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, BSSMAP_IE_CellIdentifierList cid_list)
modifies ts_BSSAP_BSSMAP := {
pdu := {
bssmap := {
handoverRequired := {
messageType := '11'O,
cause := ts_BSSMAP_IE_Cause(cause),
responseRequest := omit,
cellIdentifierList := cid_list,
circuitPoolList := omit,
currentChannelType1 := omit,
speechVersion := omit,
queueingIndicator := omit,
oldToNewBSSInfo := omit,
sourceToTargetRNCTransparentInfo := omit,
sourceToTargetRNCTransparentInfoCDMA := omit,
gERANClassmark := omit,
talkerPriority := omit,
speechCodec := omit,
cSG_Identifier := omit
}
}
}
}
// enc_PDU_BSSAP
function f_send_BSSAP_UNITDATA(template PDU_BSSAP bssap) runs on MTC_CT {
SCCP.send(t_ASP_N_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, '00000001'B, '00000001'B,
enc_PDU_BSSAP(valueof(bssap)), omit))
}
testcase TC_reset() runs on MTC_CT {
init();
timer T := 2.0;
T.start;
T.timeout;
f_send_BSSAP_UNITDATA(ts_BSSMAP_Reset(0));
T.start;
alt {
//[] SCCP.receive(tr_BSSMAP_ResetAck) { }
[] T.timeout { setverdict(fail); }
}
terminate();
}
control {
execute( TC_reset() );
execute( TC_nothing() );
}
}