jolly has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41189?usp=email )
Change subject: MME-Tests: Add test for emergency bearer setup ......................................................................
MME-Tests: Add test for emergency bearer setup
When the UE makes an emergency call, it requests emergency bearer to be established. The configured emergency bearer will be established.
The test checks if the emergency bearer is established and the APN name matches the configured APN name.
Related: SYS#7635 Change-Id: I2a81defc96bcebdf1a4ec765278ca502800cbe46 --- M mme/ConnHdlr.ttcn M mme/MME_Tests_emergency.ttcn M mme/expected-results.xml 3 files changed, 83 insertions(+), 3 deletions(-)
Approvals: laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, approved Jenkins Builder: Verified
diff --git a/mme/ConnHdlr.ttcn b/mme/ConnHdlr.ttcn index 9d259c5..86dc1f3 100644 --- a/mme/ConnHdlr.ttcn +++ b/mme/ConnHdlr.ttcn @@ -372,6 +372,37 @@ } }
+private altstep as_s1ap_handle_ERABSetupRequest_Attach_Accept() runs on ConnHdlr { + var S1AP_PDU rx_msg; + var PDU_NAS_EPS rx_nas; + [] S1AP.receive(tr_S1AP_RABSetupReq(g_pars.ue_pars.mme_ue_id, + g_pars.ue_pars.enb_ue_id)) -> value rx_msg { + var template (value) E_RABSetupItemCtxtSURes rab_setup_it; + var template (value) E_RABSetupListCtxtSURes rab_setup_items; + var template (value) PDU_NAS_EPS nas; + var PDU_NAS_EPS_ActDefEPSBearerContextRequest act_bearer; + var octetstring apn := f_enc_dns_hostname("test.sos"); + + S1AP.receive(tr_NAS_ActDefEpsBearCtxReq()) -> value rx_nas; + act_bearer := rx_nas.ePS_messages.ePS_SessionManagement.pDU_NAS_EPS_ActDefEPSBearerContextRequest; + if (act_bearer.accessPointName.accessPointNameValue != apn) { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected APN: ", + oct2char(act_bearer.accessPointName.accessPointNameValue))); + } + + rab_setup_it := ts_S1AP_RABSetupItemCtxtSURes(rab_id := 6, + tla := oct2bit(f_inet_addr(g_pars.enb_pars[g_pars.mme_idx].gtp1u_local_ip)), + gtp_teid := '00000003'O); + rab_setup_items := ts_S1AP_RABSetupListCtxtSURes(rab_setup_it); + S1AP.send(ts_S1AP_InitialCtxSetupResp(g_pars.ue_pars.mme_ue_id, + g_pars.ue_pars.enb_ue_id, + rab_setup_items)); + } + [] S1AP.receive(PDU_NAS_EPS:?) -> value rx_nas { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Rx Unexpected NAS PDU msg: ", rx_nas)); + } +} + altstep as_s1ap_handle_IntialCtxSetupReq_TAU_Accept() runs on ConnHdlr { var S1AP_PDU rx_msg; var PDU_NAS_EPS rx_nas; @@ -539,7 +570,8 @@ ts_AVP_3GPP_ApnConfigProfile({ ts_AVP_3GPP_ContextId(1), ts_AVP_3GPP_AllApnConfigsIncl, - ts_AVP_3GPP_ApnConfig(1, IPv4, "*") + ts_AVP_3GPP_ApnConfig(1, IPv4, "*"), + ts_AVP_3GPP_ApnConfig(1, IPv4, "test.sos") }) };
@@ -887,6 +919,38 @@ } }
+function f_emergency_bearer() runs on ConnHdlr { + var template (value) EPS_MobileIdentityV mi := ts_NAS_MobileId_IMSI(g_pars.ue_pars.imsi); + var template (value) PDU_NAS_EPS nas_esm; + timer T1 := 5.0; + timer T2 := 5.0; + + nas_esm := ts_NAS_PdnConnReq(bearer_id := '0000'B, proc_tid := int2bit(1,8), + pdn_type := NAS_PDN_T_IPv4, req_type := '100'B); + + var template (value) S1AP_PDU tx; + tx := ts_S1AP_UlNasTransport(mme_id := g_pars.ue_pars.mme_ue_id, + enb_id := g_pars.ue_pars.enb_ue_id, + p_nasPdu := enc_PDU_NAS_EPS(valueof(nas_esm)), + p_eUTRAN_CGI := ts_enb_S1AP_CGI(g_pars.enb_pars[g_pars.mme_idx]), + p_tAI := ts_enb_S1AP_TAI(g_pars.enb_pars[g_pars.mme_idx])); + S1AP.send(tx); + + /* We now expect the MME to send a Create Session Request to the SGW-C */ + f_gtp2_register_udmsg('20'O); + T1.start; + alt { + [] as_GTP2C_CreateSession_success(); + [] T1.timeout { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "No message from MME"); } + } + + T2.start; + alt { + [] as_s1ap_handle_ERABSetupRequest_Attach_Accept(); + [] T2.timeout { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "No message from MME"); } + } +} + function f_tau(BIT3 typeOfUpdate := c_EPS_UPD_TYPE_TA_UPD, boolean exp_sgsap_lu := false) runs on ConnHdlr { var template (value) EPS_MobileIdentityV mi := ts_NAS_MobileId_IMSI(g_pars.ue_pars.imsi); var template (value) S1AP_PDU tx; diff --git a/mme/MME_Tests_emergency.ttcn b/mme/MME_Tests_emergency.ttcn index 4340a58..ff7d2cc 100644 --- a/mme/MME_Tests_emergency.ttcn +++ b/mme/MME_Tests_emergency.ttcn @@ -26,7 +26,7 @@ f_attach(); } testcase TC_emergency_supported() runs on MTC_CT { - f_init(4, init_diameter := true, init_gtpv2c_s11 := true); + f_init(2001, init_diameter := true, init_gtpv2c_s11 := true); f_s1ap_setup(0);
var ConnHdlrPars pars := f_init_pars(ue_idx := 0); @@ -41,7 +41,7 @@ f_attach(); } testcase TC_emergency_number_included() runs on MTC_CT { - f_init(4, init_diameter := true, init_gtpv2c_s11 := true); + f_init(2002, init_diameter := true, init_gtpv2c_s11 := true); f_s1ap_setup(0);
var ConnHdlrPars pars := f_init_pars(ue_idx := 0); @@ -58,9 +58,24 @@ vc_conn.done; }
+private function f_TC_emergency_bearer() runs on ConnHdlr { + f_attach(); + f_emergency_bearer(); +} +testcase TC_emergency_bearer() runs on MTC_CT { + f_init(2003, init_diameter := true, init_gtpv2c_s11 := true); + f_s1ap_setup(0); + + var ConnHdlrPars pars := f_init_pars(ue_idx := 0); + var ConnHdlr vc_conn; + vc_conn := f_start_handler_with_pars(refers(f_TC_emergency_bearer), pars); + vc_conn.done; +} + control { execute( TC_emergency_supported() ); execute( TC_emergency_number_included() ); + execute( TC_emergency_bearer() ); }
} diff --git a/mme/expected-results.xml b/mme/expected-results.xml index c420315..ae2dd4e 100644 --- a/mme/expected-results.xml +++ b/mme/expected-results.xml @@ -20,4 +20,5 @@ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_alert_rej' time='MASKED'/> <testcase classname='MME_Tests_emergency' name='TC_emergency_supported' time='MASKED'/> <testcase classname='MME_Tests_emergency' name='TC_emergency_number_included' time='MASKED'/> + <testcase classname='MME_Tests_emergency' name='TC_emergency_bearer' time='MASKED'/> </testsuite>