BSSGP_Emulation.ttcn: extend BSSGP_Client_CT to hold 3 instances of BSSGP

Change-Id: Ibd7abba826a08b582361e9c255e9c44185e14067
This commit is contained in:
Alexander Couzens 2018-07-28 23:06:00 +02:00 committed by Harald Welte
parent 05e87f20c8
commit 0e510e693d
3 changed files with 112 additions and 112 deletions

View File

@ -79,9 +79,9 @@ type port BSSGP_PROC_PT procedure {
***********************************************************************/
type component BSSGP_Client_CT {
port BSSGP_PT BSSGP;
port BSSGP_PT BSSGP_SIG;
port BSSGP_PROC_PT BSSGP_PROC;
port BSSGP_PT BSSGP[3];
port BSSGP_PT BSSGP_SIG[3];
port BSSGP_PROC_PT BSSGP_PROC[3];
};
/***********************************************************************
@ -660,14 +660,14 @@ private function f_dec_bssgp(PDU_BSSGP bssgp) runs on BSSGP_CT return BssgpDecod
return dec;
}
function f_bssgp_client_register(hexstring imsi, OCT4 tlli, BssgpCellId cell_id, BSSGP_PROC_PT PT := BSSGP_PROC)
function f_bssgp_client_register(hexstring imsi, OCT4 tlli, BssgpCellId cell_id, BSSGP_PROC_PT PT := BSSGP_PROC[0])
runs on BSSGP_Client_CT {
PT.call(BSSGP_register_client:{imsi, tlli, cell_id}) {
[] PT.getreply(BSSGP_register_client:{imsi, tlli, cell_id}) {};
}
}
function f_bssgp_client_unregister(hexstring imsi, BSSGP_PROC_PT PT := BSSGP_PROC)
function f_bssgp_client_unregister(hexstring imsi, BSSGP_PROC_PT PT := BSSGP_PROC[0])
runs on BSSGP_Client_CT {
PT.call(BSSGP_unregister_client:{imsi}) {
[] PT.getreply(BSSGP_unregister_client:{imsi}) {};
@ -675,7 +675,7 @@ runs on BSSGP_Client_CT {
}
/* TS 44.064 7.2.1.1 LLGMM-ASSIGN */
function f_bssgp_client_llgmm_assign(OCT4 tlli_old, OCT4 tlli_new, BSSGP_PROC_PT PT := BSSGP_PROC)
function f_bssgp_client_llgmm_assign(OCT4 tlli_old, OCT4 tlli_new, BSSGP_PROC_PT PT := BSSGP_PROC[0])
runs on BSSGP_Client_CT {
PT.call(BSSGP_llgmm_assign:{tlli_old, tlli_new}) {
[] PT.getreply(BSSGP_llgmm_assign:{tlli_old, tlli_new}) {};

View File

@ -68,9 +68,9 @@ module PCU_Tests {
ns_component := NS_CT.create;
bssgp_component := BSSGP_CT.create;
/* connect our BSSGP port to the BSSGP Emulation */
connect(self:BSSGP, bssgp_component:BSSGP_SP);
connect(self:BSSGP_SIG, bssgp_component:BSSGP_SP_SIG);
connect(self:BSSGP_PROC, bssgp_component:BSSGP_PROC);
connect(self:BSSGP[0], bssgp_component:BSSGP_SP);
connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);
connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);
/* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/
connect(bssgp_component:BSCP, ns_component:NS_SP);
/* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */
@ -186,7 +186,7 @@ module PCU_Tests {
log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
BSSGP.send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
BSSGP[0].send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
}
/* Establish BSSGP connection to PCU */
@ -196,8 +196,8 @@ module PCU_Tests {
f_init();
T.start
alt {
[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }
[] BSSGP[0].receive { repeat; }
[] T.timeout {
setverdict(fail, "Timeout establishing BSSGP connection");
mtc.stop;
@ -215,17 +215,17 @@ module PCU_Tests {
f_init();
/* Send paging on signalling BVCI 0 since osmo-pcu does not support paging on PTP yet. */
BSSGP_SIG.send(ts_BSSGP_PS_PAGING_IMSI(0, g_mmctx.imsi));
BSSGP_SIG.send(ts_BSSGP_PS_PAGING_PTMSI(0, g_mmctx.imsi, tmsi));
BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_IMSI(0, g_mmctx.imsi));
BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_PTMSI(0, g_mmctx.imsi, tmsi));
while (true) {
var BssgpDecoded bd;
alt {
[] BSSGP.receive(tr_BD_L3_MT(?)) -> value bd {
[] BSSGP[0].receive(tr_BD_L3_MT(?)) -> value bd {
log("BSSGP Rx: ", bd);
}
[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
[] BSSGP[0].receive { repeat; }
}
}
}
@ -283,7 +283,7 @@ function f_bssgp_wait_ul_ud(template BssgpDecoded bd_exp) runs on dummy_CT {
timer T := 5.0;
T.start;
alt {
[] BSSGP.receive(bd_exp) {
[] BSSGP[0].receive(bd_exp) {
log("found matching BSSGP UL-UNITDATA PDU");
}
[] T.timeout {
@ -355,14 +355,14 @@ function f_ul_tbf(inout UlTbfState us) runs on dummy_CT {
while (true) {
var BssgpDecoded bd;
alt {
[] BSSGP.receive(tr_BD_BSSGP(?)) -> value bd {
[] BSSGP[0].receive(tr_BD_BSSGP(?)) -> value bd {
log("BSSGP Rx: ", bd);
//log("GMM Rx: ", dec_PDU_L3_MS_SGSN(pdu.payload));
g_mmctx.tlli := bd.bssgp.pDU_BSSGP_UL_UNITDATA.tLLI;
tx_gmm(LLC_CR_DL_CMD, gmm_auth_req);
}
[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
[] BSSGP[0].receive { repeat; }
}
}
}

View File

@ -259,8 +259,8 @@ runs on test_CT return BSSGP_ConnHdlr {
};
vc_conn := BSSGP_ConnHdlr.create(id);
connect(vc_conn:BSSGP, gb.vc_BSSGP:BSSGP_SP);
connect(vc_conn:BSSGP_PROC, gb.vc_BSSGP:BSSGP_PROC);
connect(vc_conn:BSSGP[0], gb.vc_BSSGP:BSSGP_SP);
connect(vc_conn:BSSGP_PROC[0], gb.vc_BSSGP:BSSGP_PROC);
connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
@ -321,14 +321,14 @@ testcase TC_wait_ns_up() runs on test_CT {
altstep as_mm_identity() runs on BSSGP_ConnHdlr {
var MobileL3_CommonIE_Types.MobileIdentityLV mi;
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
BSSGP.send(ts_GMM_ID_RESP(mi));
BSSGP[0].send(ts_GMM_ID_RESP(mi));
repeat;
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
BSSGP.send(ts_GMM_ID_RESP(mi));
BSSGP[0].send(ts_GMM_ID_RESP(mi));
repeat;
}
}
@ -374,7 +374,7 @@ function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres
var template PDU_L3_SGSN_MS auth_ciph_req := tr_GMM_AUTH_REQ(g_pars.vec.rand);
auth_ciph_req.msgs.gprs_mm.authenticationAndCipheringRequest.authenticationParameterAUTN := autn;
BSSGP.receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
BSSGP[0].receive(tr_BD_L3_MT(auth_ciph_req)) -> value bd;
l3_mt := bd.l3_mt;
var BIT4 ac_ref := l3_mt.msgs.gprs_mm.authenticationAndCipheringRequest.acReferenceNumber.valueField;
var template PDU_L3_MS_SGSN auth_ciph_resp := ts_GMM_AUTH_RESP_2G(ac_ref, g_pars.vec.sres);
@ -397,7 +397,7 @@ function f_gmm_auth (boolean umts_aka_challenge := false, boolean force_gsm_sres
l3_mo.msgs.gprs_mm.authenticationAndCipheringResponse.imeisv :=
valueof(ts_MI_IMEISV_TLV(g_pars.imei & '0'H));
}
BSSGP.send(l3_mo);
BSSGP[0].send(l3_mo);
} else {
/* wait for identity procedure */
f_sleep(1.0);
@ -503,16 +503,16 @@ private function f_gmm_attach(boolean umts_aka_challenge, boolean force_gsm_sres
* revisionLevelIndicatior is at the wrong place! */
attach_req.msgs.gprs_mm.attachRequest.msNetworkCapability.msNetworkCapabilityV.solSACapability := '0'B;
BSSGP.send(attach_req);
BSSGP[0].send(attach_req);
f_gmm_auth(umts_aka_challenge, force_gsm_sres);
/* Expect SGSN to perform LU with HLR */
f_gmm_gsup_lu_isd();
BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
}
/* FIXME: Extract P-TMSI, if any. Only send Complete if necessary */
BSSGP.send(ts_GMM_ATTACH_COMPL);
BSSGP[0].send(ts_GMM_ATTACH_COMPL);
}
private function f_TC_attach(charstring id) runs on BSSGP_ConnHdlr {
@ -564,16 +564,16 @@ testcase TC_attach_umts_aka_gsm_sres() runs on test_CT {
private function f_TC_attach_auth_id_timeout(charstring id) runs on BSSGP_ConnHdlr {
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ(?))) {
/* don't send ID Response */
repeat;
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('09'O))) {
setverdict(pass);
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
setverdict(fail, "Wrong Attach Reject Cause");
mtc.stop;
}
@ -590,13 +590,13 @@ testcase TC_attach_auth_id_timeout() runs on test_CT {
private function f_TC_attach_auth_sai_timeout(charstring id) runs on BSSGP_ConnHdlr {
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
alt {
[] as_mm_identity();
[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); { }
}
/* don't send SAI-response from HLR */
BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
setverdict(pass);
}
testcase TC_attach_auth_sai_timeout() runs on test_CT {
@ -610,14 +610,14 @@ testcase TC_attach_auth_sai_timeout() runs on test_CT {
private function f_TC_attach_auth_sai_reject(charstring id) runs on BSSGP_ConnHdlr {
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
alt {
[] as_mm_identity();
[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)); {
GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 23));
}
}
BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?)));
setverdict(pass);
}
testcase TC_attach_auth_sai_reject() runs on test_CT {
@ -632,16 +632,16 @@ private function f_TC_attach_gsup_lu_timeout(charstring id) runs on BSSGP_ConnHd
var BssgpDecoded bd;
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
f_gmm_auth();
/* Expect MSC to perform LU with HLR */
GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
/* Never follow-up with ISD_REQ or UL_RES */
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
setverdict(pass);
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
setverdict(fail);
mtc.stop;
@ -661,17 +661,17 @@ private function f_TC_attach_gsup_lu_reject(charstring id) runs on BSSGP_ConnHdl
var BssgpDecoded bd;
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
f_gmm_auth();
/* Expect MSC to perform LU with HLR */
GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 0));
}
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
setverdict(pass);
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
setverdict(fail);
mtc.stop;
@ -692,15 +692,15 @@ private function f_TC_attach_combined(charstring id) runs on BSSGP_ConnHdlr {
var BssgpDecoded bd;
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, true, false, omit, omit));
f_gmm_auth();
/* Expect MSC to perform LU with HLR */
f_gmm_gsup_lu_isd();
BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
}
BSSGP.send(ts_GMM_ATTACH_COMPL);
BSSGP[0].send(ts_GMM_ATTACH_COMPL);
setverdict(pass);
}
testcase TC_attach_combined() runs on test_CT {
@ -718,12 +718,12 @@ private function f_TC_attach_accept_all(charstring id) runs on BSSGP_ConnHdlr {
g_pars.net.expect_auth := false;
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
f_gmm_auth();
BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT('001'B, ?, ?))) -> value bd {
f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
}
BSSGP.send(ts_GMM_ATTACH_COMPL);
BSSGP[0].send(ts_GMM_ATTACH_COMPL);
setverdict(pass);
}
testcase TC_attach_accept_all() runs on test_CT {
@ -745,16 +745,16 @@ private function f_TC_attach_closed_foreign(charstring id) runs on BSSGP_ConnHdl
g_pars.net.expect_auth := false;
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
alt {
[] as_mm_identity();
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT('07'O))) {
setverdict(pass);
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
setverdict(pass);
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
setverdict(fail);
mtc.stop;
}
@ -777,13 +777,13 @@ testcase TC_attach_closed() runs on test_CT {
private function f_TC_rau_unknown(charstring id) runs on BSSGP_ConnHdlr {
var RoutingAreaIdentificationV old_ra := f_random_RAI();
BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, old_ra, false, omit, omit));
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT('0a'O))) {
setverdict(pass);
}
/* FIXME: Expect XID RESET? */
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive { repeat; }
}
}
testcase TC_rau_unknown() runs on test_CT {
@ -801,18 +801,18 @@ private function f_TC_attach_rau(charstring id) runs on BSSGP_ConnHdlr {
f_TC_attach(id);
/* then send RAU */
BSSGP.send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
BSSGP[0].send(ts_GMM_RAU_REQ(f_mi_get_lv(), GPRS_UPD_T_RA, g_pars.ra, false, omit, omit));
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_ACCEPT)) -> value bd {
f_process_rau_accept(bd.l3_mt.msgs.gprs_mm.routingAreaUpdateAccept);
BSSGP.send(ts_GMM_RAU_COMPL);
BSSGP[0].send(ts_GMM_RAU_COMPL);
setverdict(pass);
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_RAU_REJECT)) {
setverdict(fail, "Unexpected RAU Reject");
mtc.stop;
}
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive { repeat; }
}
}
testcase TC_attach_rau() runs on test_CT {
@ -827,7 +827,7 @@ testcase TC_attach_rau() runs on test_CT {
function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge) runs on BSSGP_ConnHdlr {
var BssgpDecoded bd;
timer T := 5.0;
BSSGP.send(ts_GMM_DET_REQ_MO(detach_type, power_off));
BSSGP[0].send(ts_GMM_DET_REQ_MO(detach_type, power_off));
if (expect_purge) {
GSUP.receive(tr_GSUP_PURGE_MS_REQ(g_pars.imsi, OSMO_GSUP_CN_DOMAIN_PS));
GSUP.send(ts_GSUP_PURGE_MS_RES(g_pars.imsi));
@ -838,7 +838,7 @@ function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge)
setverdict(fail, "Unexpected GSUP PURGE MS for unregistered TLLI");
mtc.stop;
}
[power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
[power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
g_pars.ra := omit;
setverdict(fail, "Unexpected ATTACH ACCEPT in no-power-off DETACH");
mtc.stop;
@ -847,12 +847,12 @@ function f_detach_mo(BIT3 detach_type, boolean power_off, boolean expect_purge)
[power_off] T.timeout {
setverdict(pass);
}
[not power_off] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
[not power_off] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_ACCEPT_MT)) -> value bd {
g_pars.ra := omit;
setverdict(pass);
/* TODO: check if any PDP contexts are deactivated on network side? */
}
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive { repeat; }
}
}
@ -954,7 +954,7 @@ function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) r
recovery := ts_Recovery(apars.ggsn_restart_ctr);
}
BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
apars.apn, apars.pco));
GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
@ -967,18 +967,18 @@ function f_pdp_ctx_act(inout PdpActPars apars, boolean send_recovery := false) r
omit, recovery));
}
alt {
[exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
[exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, apars.exp_rej_cause))) {
setverdict(pass);
}
[exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
[exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT)) {
setverdict(fail, "Unexpected PDP CTX ACT ACC");
mtc.stop;
}
[not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
[not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_REJ(apars.tid, ?))) {
setverdict(fail, "Unexpected PDP CTX ACT FAIL");
mtc.stop;
}
[not exp_rej] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
[not exp_rej] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(apars.tid, apars.sapi))) {
setverdict(pass);
}
[] as_xid(apars);
@ -989,14 +989,14 @@ function f_pdp_ctx_deact_mo(inout PdpActPars apars, OCT1 cause) runs on BSSGP_Co
var boolean exp_rej := ispresent(apars.exp_rej_cause);
var Gtp1cUnitdata g_ud;
BSSGP.send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
BSSGP[0].send(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit));
GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
BSSGP.clear;
BSSGP[0].clear;
GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
}
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid))) {
setverdict(pass);
}
[] as_xid(apars);
@ -1008,7 +1008,7 @@ function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false)
var integer seq_nr := 23;
var GtpPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
BSSGP.clear;
BSSGP[0].clear;
if (error_ind) {
GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
} else {
@ -1019,8 +1019,8 @@ function f_pdp_ctx_deact_mt(inout PdpActPars apars, boolean error_ind := false)
T.start;
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {
BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
}
[not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
repeat;
@ -1124,7 +1124,7 @@ private function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs o
}
private altstep as_xid(PdpActPars apars) runs on BSSGP_ConnHdlr {
[] BSSGP.receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
[] BSSGP[0].receive(tr_BD_LLC(tr_LLC_XID(?, apars.sapi))) {
repeat;
}
}
@ -1169,7 +1169,7 @@ private function f_gtpu_xceive_mt(inout PdpActPars apars, octetstring payload) r
/* Expect PDU via BSSGP/LLC on simulated PCU from SGSN */
alt {
[] as_xid(apars);
[] BSSGP.receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
[] BSSGP[0].receive(tr_BD_SNDCP(apars.sapi, tr_SN_UD(apars.nsapi, payload)));
}
}
@ -1178,7 +1178,7 @@ private function f_gtpu_xceive_mo(inout PdpActPars apars, octetstring payload) r
/* Send PDU via SNDCP/LLC/BSSGP/NS via simulated MS/PCU to the SGSN */
var GtpPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
var PDU_SN sndcp := valueof(ts_SN_UD(apars.nsapi, payload));
BSSGP.send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
BSSGP[0].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, 0));
/* Expect PDU via GTP from SGSN on simulated GGSN */
alt {
[] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
@ -1203,22 +1203,22 @@ testcase TC_attach_pdp_act() runs on test_CT {
/* PDP Context activation for not-attached subscriber; expect fail */
private function f_TC_pdp_act_unattached(charstring id) runs on BSSGP_ConnHdlr {
var PdpActPars apars := valueof(t_PdpActPars(mp_ggsn_ip));
BSSGP.send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
BSSGP[0].send(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
apars.apn, apars.pco));
alt {
/* We might want toalso actually expect a PDPC CTX ACT REJ? */
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(?, ?))) {
setverdict(pass);
}
[] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
setverdict(fail, "Unexpected GTP PDP CTX ACT");
mtc.stop;
}
[] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) {
setverdict(fail, "Unexpected SM PDP CTX ACT ACK");
mtc.stop;
}
[] BSSGP.receive { repeat; }
[] BSSGP[0].receive { repeat; }
}
}
testcase TC_pdp_act_unattached() runs on test_CT {
@ -1350,8 +1350,8 @@ private function f_TC_attach_restart_ctr_echo(charstring id) runs on BSSGP_ConnH
}
var OCT1 cause_network_failure := int2oct(38, 1)
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, cause_network_failure, true))) {
BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
setverdict(pass);
}
[] as_xid(apars);
@ -1419,20 +1419,20 @@ private function f_TC_attach_pdp_act_deact_mt_t3395_expire(charstring id) runs o
/* then activate PDP context */
f_pdp_ctx_act(apars);
BSSGP.clear;
BSSGP[0].clear;
peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
for (i := 0; i < 5; i := i+1) {
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
[] BSSGP[0].receive(tr_BD_L3_MT(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true))) {}
[] as_xid(apars);
}
}
GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
BSSGP.send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
BSSGP[0].send(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
setverdict(pass);
}
testcase TC_attach_pdp_act_deact_mt_t3395_expire() runs on test_CT {
@ -1455,7 +1455,7 @@ private function f_TC_hlr_location_cancel_request_update(charstring id) runs on
timer T := 5.0;
T.start;
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(*, *, *))) {
T.stop;
setverdict(fail, "Unexpected GMM Detach Request");
mtc.stop;
@ -1464,7 +1464,7 @@ private function f_TC_hlr_location_cancel_request_update(charstring id) runs on
setverdict(pass);
mtc.stop;
}
[] BSSGP.receive {
[] BSSGP[0].receive {
repeat;
}
}
@ -1514,8 +1514,8 @@ private function f_TC_hlr_location_cancel_request_withdraw(charstring id) runs o
GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
/* MS: receive a Detach Request */
BSSGP.receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
BSSGP.send(ts_GMM_DET_ACCEPT_MO);
BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_DET_REQ_MT(c_GMM_DTT_MT_IMSI_DETACH, ?, ?)));
BSSGP[0].send(ts_GMM_DET_ACCEPT_MO);
setverdict(pass);
}
@ -1606,18 +1606,18 @@ private function f_TC_attach_no_imei_response(charstring id) runs on BSSGP_ConnH
var integer count_req := 0;
var MobileL3_CommonIE_Types.MobileIdentityLV mi;
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
/* break */
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
BSSGP.send(ts_GMM_ID_RESP(mi));
BSSGP[0].send(ts_GMM_ID_RESP(mi));
repeat;
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
/* ignore ID REQ IMEI */
count_req := count_req + 1;
repeat;
@ -1654,20 +1654,20 @@ private function f_TC_attach_no_imsi_response(charstring id) runs on BSSGP_ConnH
/* set p_tmsi to use it in Attach Req via f_mi_get_lv() */
g_pars.p_tmsi := 'c0000035'O;
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
/* break */
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('001'B))) {
/* ignore ID REQ IMSI */
count_req := count_req + 1;
repeat;
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ID_REQ('010'B))) {
mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
BSSGP.send(ts_GMM_ID_RESP(mi));
BSSGP[0].send(ts_GMM_ID_RESP(mi));
repeat;
}
}
@ -1728,16 +1728,16 @@ private function f_TC_attach_closed_imsi_added(charstring id) runs on BSSGP_Conn
/* there is no auth */
g_pars.net.expect_auth := false;
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), old_ra, false, false, omit, omit));
f_gmm_auth();
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
setverdict(fail, "Received unexpected GMM Attach REJECT");
mtc.stop;
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) -> value bd {
f_process_attach_accept(bd.l3_mt.msgs.gprs_mm.attachAccept);
BSSGP.send(ts_GMM_ATTACH_COMPL);
BSSGP[0].send(ts_GMM_ATTACH_COMPL);
setverdict(pass);
}
}
@ -1774,14 +1774,14 @@ testcase TC_attach_closed_add_vty() runs on test_CT {
private function f_TC_attach_check_complete_resend(charstring id) runs on BSSGP_ConnHdlr {
var integer count_req := 0;
BSSGP.send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
BSSGP[0].send(ts_GMM_ATTACH_REQ(f_mi_get_lv(), f_random_RAI(), true, false, omit, omit));
f_gmm_auth();
alt {
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_REJECT(?))) {
/* break */
}
[] BSSGP.receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
[] BSSGP[0].receive(tr_BD_L3_MT(tr_GMM_ATTACH_ACCEPT(*, *, *))) {
/* ignore */
count_req := count_req + 1;
repeat;