WIP: MSC_Tests: Add SGs testcases

This extens MSC_Tests.ttcn with an initial set of SGs interface test
cases for RESET, LU, DETACH, PAGING, SMS and CSFB procedures

In particular the following testcases are added:

- TC_sgsap_reset: isolated reset procedure test
- TC_sgsap_lu: isolated location update with TMSI realloc
- TC_sgsap_lu_imsi_reject: location update, reject case
- TC_sgsap_lu_and_nothing: location update with failed TMSI realloc
- TC_sgsap_expl_imsi_det_eps: detach from EPS serveces
- TC_sgsap_expl_imsi_det_noneps: detach from non-EPS services
- TC_sgsap_paging_rej: isolated paging, reject case
- TC_sgsap_paging_subscr_rej: isolated paging, subscr rejects call
- TC_sgsap_paging_ue_unr: isolated paging, ue is unreachable
- TC_sgsap_paging_and_nothing: page, but don't respond
- TC_sgsap_paging_and_lu: check paging followed by an LU
- TC_sgsap_mt_sms: mobile terminated SMS through SGs Interface
- TC_sgsap_mo_sms: mobile originated SMS through SGs Interface
- TC_sgsap_mt_sms_and_nothing: trigger SMS, but don't respond to paging
- TC_sgsap_mt_sms_and_reject: trigger SMS, but reject paging
- TC_sgsap_unexp_ud: Send unexpected unitdata (SGs Association: NULL)
- TC_sgsap_unsol_ud: Send unsolicited unitdata (subscriber not in VLR)
- TC_bssap_lu_sgsap_lu_and_mt_call: LU on 2G, LU on SGs and CSFB call
- TC_sgsap_lu_and_mt_call: LU on SGs, and CSFB call

Change-Id: I38543c35a9e74cea276e58d1d7ef01ef07ffe858
Depends: osmo-msc I73359925fc1ca72b33a1466e6ac41307f2f0b11d
Related: OS#3645
This commit is contained in:
Harald Welte 2018-12-06 11:56:27 +01:00
parent 9cc019a7ac
commit 4263c52bd4
7 changed files with 1116 additions and 14 deletions

View File

@ -32,6 +32,7 @@ import from SGsAP_Templates all;
import from Osmocom_Types all;
import from IPL4asp_Types all;
import from DNS_Helpers all;
import from MobileL3_Types all;
type component SGsAP_ConnHdlr {
port SGsAP_Conn_PT SGsAP;
@ -41,7 +42,7 @@ type component SGsAP_ConnHdlr {
/* port between individual per-connection components and this dispatcher */
type port SGsAP_Conn_PT message {
inout PDU_SGsAP;
inout PDU_SGsAP, PDU_ML3_MS_NW, PDU_ML3_NW_MS;
} with { extension "internal" };
/* represents a single SGsAP Association */
@ -292,6 +293,8 @@ function main(SGsAPOps ops, SGsAP_conn_parameters p, charstring id) runs on SGsA
while (true) {
var SGsAP_ConnHdlr vc_conn;
var PDU_ML3_MS_NW l3_mo;
var PDU_ML3_NW_MS l3_mt;
var template IMSI imsi_t;
var hexstring imsi;
var SGsAP_RecvFrom mrf;
@ -305,6 +308,38 @@ function main(SGsAPOps ops, SGsAP_conn_parameters p, charstring id) runs on SGsA
/* TODO: check which ConnectionID client has allocated + store in table? */
SGsAP.send(t_SGsAP_Send(g_sgsap_conn_id, msg));
}
/* DTAP/MobileL3 from client (emulated MS): wrap in SGsAP-UL-UD and send */
[] SGsAP_CLIENT.receive(PDU_ML3_MS_NW:?) -> value l3_mo sender vc_conn {
var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_mo);
imsi := f_imsi_by_comp(vc_conn);
msg := valueof(ts_SGsAP_UL_UD(imsi, l3_enc));
SGsAP.send(t_SGsAP_Send(g_sgsap_conn_id, msg));
}
[] SGsAP_CLIENT.receive(PDU_ML3_NW_MS:?) -> value l3_mt sender vc_conn {
var octetstring l3_enc := enc_PDU_ML3_NW_MS(l3_mt);
imsi := f_imsi_by_comp(vc_conn);
msg := valueof(ts_SGsAP_DL_UD(imsi, l3_enc));
SGsAP.send(t_SGsAP_Send(g_sgsap_conn_id, msg));
}
/* DTAP/MobileL3 from MSC/VLR to MS wrapped in SGsAP-DL-UD: Extract, decode, forward */
[] SGsAP.receive(tr_SGsAP_RecvFrom_R(tr_SGsAP_DL_UD(?,?))) -> value mrf {
var octetstring l3_enc := mrf.msg.sGsAP_DOWNLINK_UNITDATA.nAS_MessageContainer.nAS_MessageContainer;
imsi := mrf.msg.sGsAP_DOWNLINK_UNITDATA.iMSI.iMSI.digits;
vc_conn := f_comp_by_imsi(imsi);
l3_mt := dec_PDU_ML3_NW_MS(l3_enc);
SGsAP_CLIENT.send(l3_mt) to vc_conn;
}
[] SGsAP.receive(tr_SGsAP_RecvFrom_R(tr_SGsAP_UL_UD(?,?))) -> value mrf {
var octetstring l3_enc := mrf.msg.sGsAP_UPLINK_UNITDATA.nAS_MessageContainer.nAS_MessageContainer;
imsi := mrf.msg.sGsAP_UPLINK_UNITDATA.iMSI.iMSI.digits;
l3_mo := dec_PDU_ML3_MS_NW(l3_enc);
vc_conn := f_comp_by_imsi(imsi);
SGsAP_CLIENT.send(l3_mo) to vc_conn;
}
/* any other SGsAP from MSC/VLR */
[] SGsAP.receive(tr_SGsAP_RecvFrom_R(?)) -> value mrf {
imsi_t := f_SGsAP_get_imsi(mrf.msg);
if (isvalue(imsi_t)) {

View File

@ -69,7 +69,10 @@ private function tr_SGsAP_IMSI(template hexstring digits) return template IMSI {
return omit;
} else if (istemplatekind(digits, "*")) {
return *;
} else if (istemplatekind(digits, "?")) {
return ?;
}
log("tr_SGsAP_IMSI: ", digits);
var template IMSI imsi := {
iEI := '00000001'B,
lengthIndicator := lengthof(digits)/2 + 1,

View File

@ -39,8 +39,10 @@ import from Osmocom_CTRL_Adapter all;
import from TELNETasp_PortType all;
import from Osmocom_VTY_Functions all;
import from SGsAP_Emulation all;
/* this component represents a single subscriber connection */
type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr, MGCP_ConnHdlr, SMPP_ConnHdlr, CTRL_Adapter_CT {
type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr, MGCP_ConnHdlr, SMPP_ConnHdlr, CTRL_Adapter_CT, SGsAP_ConnHdlr {
var BSC_ConnHdlrPars g_pars;
timer g_Tguard := 60.0;
port TELNETasp_PT MSCVTY;
@ -135,6 +137,8 @@ function f_init_handler(BSC_ConnHdlrPars pars, float t_guard := 60.0) runs on BS
activate(as_Tguard());
/* Route all SMPP messages for our MSISDN to us */
f_create_smpp_expect(hex2str(pars.msisdn));
/* Route all SGs message for our IMSI to us */
f_create_sgsap_expect(pars.imsi);
if (g_pars.ipa_ctrl_enable == true) {
f_ipa_ctrl_start(g_pars.ipa_ctrl_ip, g_pars.ipa_ctrl_port);
@ -452,21 +456,22 @@ template (value) CallParameters t_CallParams(hexstring called, integer tid) := {
mgcp_connection_id_mss := '0'H //
};
function f_mt_call_establish(inout CallParameters cpars)
/* Allocate a call reference and send SETUP via MNCC to MSC */
function f_mt_call_initate(inout CallParameters cpars)
runs on BSC_ConnHdlr {
cpars.mncc_callref := f_rnd_int(2147483648);
MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),
hex2str(cpars.called_party), hex2str(g_pars.imsi)));
}
/* Complete call, begin with a paging response message via BSSAP */
function f_mt_call_complete(inout CallParameters cpars)
runs on BSC_ConnHdlr {
var MNCC_PDU mncc;
var MgcpCommand mgcp_cmd;
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
/* Allocate a call reference and send SETUP via MNCC to MSC */
cpars.mncc_callref := f_rnd_int(2147483648);
MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),
hex2str(cpars.called_party), hex2str(g_pars.imsi)));
/* BSC <- MSC: Expect paging. FIXME: By TMSI or not? */
BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
f_establish_fully(EST_TYPE_PAG_RESP);
/* MS <- MSC: Expect CC SETUP */
@ -476,7 +481,6 @@ runs on BSC_ConnHdlr {
BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_ALERTING(cpars.transaction_id)));
MNCC.receive(tr_MNCC_ALERT_ind(cpars.mncc_callref));
/* Create MGCP expect */
f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
/* Ask MSC via MNCC to create the RTP socket on the MSC/MGW side */
@ -531,6 +535,20 @@ runs on BSC_ConnHdlr {
/* MS -> MSC: ALERTING */
BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT(cpars.transaction_id)));
MNCC.receive(tr_MNCC_SETUP_cnf(cpars.mncc_callref));
}
function f_mt_call_establish(inout CallParameters cpars)
runs on BSC_ConnHdlr {
/* Initiate the call via MNCC */
f_mt_call_initate(cpars);
/* BSC <- MSC: Expect paging. FIXME: By TMSI or not? */
f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);
BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));
/* Complete the call via BSSAP */
f_mt_call_complete(cpars);
setverdict(pass);
}
@ -1008,7 +1026,6 @@ runs on BSC_ConnHdlr {
}
}

File diff suppressed because it is too large Load Diff

View File

@ -74,4 +74,23 @@
<testcase classname='MSC_Tests' name='TC_cipher_complete_with_invalid_cipher' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_mo_cc_bssmap_clear' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_reset' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_lu' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_lu_imsi_reject' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_lu_and_nothing' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_expl_imsi_det_eps' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_expl_imsi_det_noneps' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_paging_rej' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_paging_subscr_rej' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_paging_ue_unr' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_paging_and_nothing' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_paging_and_lu' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_unexp_ud' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_unsol_ud' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_mt_sms' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_mo_sms' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_mt_sms_and_nothing' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_mt_sms_and_reject' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_bssap_lu_sgsap_lu_and_mt_call' time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_sgsap_lu_and_mt_call' time='MASKED'/>
</testsuite>

View File

@ -94,7 +94,7 @@ FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "
FILES+="SMPP_CodecPort.ttcn SMPP_CodecPort_CtrlFunct.ttcn SMPP_CodecPort_CtrlFunctDef.cc SMPP_Emulation.ttcn SMPP_Templates.ttcn "
FILES+="SS_Templates.ttcn SCCP_Templates.ttcn USSD_Helpers.ttcn "
FILES+="SGsAP_Templates.ttcn "
FILES+="SGsAP_Templates.ttcn SGsAP_CodecPort.ttcn SGsAP_CodecPort_CtrlFunct.ttcn SGsAP_CodecPort_CtrlFunctDef.cc SGsAP_Emulation.ttcn DNS_Helpers.ttcn "
gen_links $DIR $FILES
ignore_pp_results

View File

@ -1,6 +1,6 @@
#!/bin/sh
FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc SMPP_EncDec.cc SMPP_CodecPort_CtrlFunctDef.cc MAP_EncDec.cc SS_EncDec.cc TCCEncoding.cc *.c *.asn"
FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc SMPP_EncDec.cc SMPP_CodecPort_CtrlFunctDef.cc MAP_EncDec.cc SS_EncDec.cc TCCEncoding.cc SGsAP_CodecPort_CtrlFunctDef.cc *.c *.asn"
export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP -DIPA_EMULATION_SCCP -DUSE_MTP3_DISTRIBUTOR"