diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn index 73d28181b..4398ceadf 100644 --- a/library/L3_Templates.ttcn +++ b/library/L3_Templates.ttcn @@ -1766,6 +1766,22 @@ template PDU_L3_SGSN_MS tr_GMM_DET_ACCEPT_MT := { } } +template PDU_L3_SGSN_MS tr_GMM_DET_REQ_MT(template BIT3 dtt := ?, template boolean power_off := ?) := { + discriminator := '1000'B, + tiOrSkip := { + skipIndicator := '0000'B + }, + msgs := { + gprs_mm := { + detachRequest_SGSN_MS := { + messageType := '00000101'B, + detachType := { dtt, bool2bit_tmpl(power_off) }, + forceToStandby := ?, + gmmCause := * + } + } + } +} function ts_ApnTLV(template (omit) octetstring apn) return template (omit) AccessPointNameTLV { if (istemplatekind(apn, "omit")) { diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn index 138b63b6f..988ece1b7 100644 --- a/sgsn/SGSN_Tests.ttcn +++ b/sgsn/SGSN_Tests.ttcn @@ -895,6 +895,33 @@ testcase TC_attach_pdp_act() runs on test_CT { vc_conn.done; } +/* 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); + BSSGP.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(?, ?))) { + setverdict(pass); + } + [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) { + setverdict(fail, "Unexpected GTP PDP CTX ACT"); + } + [] BSSGP.receive(tr_BD_L3_MT(tr_SM_ACT_PDP_ACCEPT(?, ?))) { + setverdict(fail, "Unexpected SM PDP CTX ACT ACK"); + } + [] BSSGP.receive { repeat; } + } +} +testcase TC_pdp_act_unattached() runs on test_CT { + var BSSGP_ConnHdlr vc_conn; + f_init(); + vc_conn := f_start_handler(refers(f_TC_pdp_act_unattached), testcasename(), g_gb[0], 18); + vc_conn.done; +} + + control { execute( TC_attach() ); @@ -913,6 +940,7 @@ control { execute( TC_detach_nopoweroff() ); execute( TC_detach_poweroff() ); execute( TC_attach_pdp_act() ); + execute( TC_pdp_act_unattached() ); }