pespin submitted this change.
mme: Initial working state for MME_Tests_SGsAP.ttcn tests
MME_Tests_SGsAP.ttcn tests were introduced to the repository many years
ago (~2019), but they were mostly WIP and were never run as part of the
regular testsuite.
This commit reworks and extends previous work to get them up to date
with current MME_Tests and makes most of them passing.
TC_sgsap_alert_* tests are still in WIP and will be fixed in follow-up
work.
Related: OS#6850
Change-Id: If07f1a67eb4213985da82afec94adb08786a0980
---
M library/SGsAP_Templates.ttcn
M mme/ConnHdlr.ttcn
M mme/MME_Tests.cfg
M mme/MME_Tests.ttcn
M mme/MME_Tests_SGsAP.ttcn
M mme/expected-results.xml
M mme/open5gs-mme.yaml
7 files changed, 296 insertions(+), 129 deletions(-)
diff --git a/library/SGsAP_Templates.ttcn b/library/SGsAP_Templates.ttcn
index 21fff9e..fe1c9f1 100644
--- a/library/SGsAP_Templates.ttcn
+++ b/library/SGsAP_Templates.ttcn
@@ -208,7 +208,7 @@
lengthIndicator := lengthof(valueof(name)),
name := name
};
-template MME_Name tr_SGsAP_IE_MmeName(template octetstring name) := {
+template (present) MME_Name tr_SGsAP_IE_MmeName(template (present) octetstring name) := {
iEI := '00001001'B,
lengthIndicator := ?,
name := name
@@ -337,7 +337,7 @@
lengthIndicator := lengthof(name),
name := name
}
-template VLR_Name tr_SGsAP_IE_VlrName(template octetstring name) := {
+template VLR_Name tr_SGsAP_IE_VlrName(template (present) octetstring name) := {
iEI := '00000010'B,
lengthIndicator := ?,
name := name
@@ -663,10 +663,17 @@
vLR_Name := ts_SGsAP_IE_VlrName(vlr_name)
}
}
-template PDU_SGsAP tr_SGsAP_RESET_ACK(template octetstring mme_name, template octetstring vlr_name) := {
+template PDU_SGsAP tr_SGsAP_RESET_ACK_MME(template (present) octetstring mme_name) := {
sGsAP_RESET_ACK := {
messageType := '00010110'B,
mME_Name := tr_SGsAP_IE_MmeName(mme_name),
+ vLR_Name := omit
+ }
+}
+template PDU_SGsAP tr_SGsAP_RESET_ACK_VLR(template (present) octetstring vlr_name) := {
+ sGsAP_RESET_ACK := {
+ messageType := '00010110'B,
+ mME_Name := omit,
vLR_Name := tr_SGsAP_IE_VlrName(vlr_name)
}
}
diff --git a/mme/ConnHdlr.ttcn b/mme/ConnHdlr.ttcn
index d4a33ae..8f4d972 100644
--- a/mme/ConnHdlr.ttcn
+++ b/mme/ConnHdlr.ttcn
@@ -15,6 +15,8 @@
import from Native_Functions all;
import from IPL4asp_Types all;
import from Misc_Helpers all;
+import from GSM_Types all;
+
import from S1AP_Types all;
import from S1AP_Templates all;
import from S1AP_Functions all;
@@ -72,6 +74,12 @@
charstring s5c_pgw_ip
};
+type record SGsAPPars {
+ octetstring vlr_name,
+ octetstring mme_name,
+ LocationAreaIdValue lai
+};
+
/* parameters of emulated ENB */
type record EnbParams {
charstring gtp1u_local_ip,
@@ -109,7 +117,8 @@
/* TEI (Control) remote side, S5c (PGW) */
OCT4 s5c_teic_remote optional,
- BearerConfig bearer optional
+ BearerConfig bearer optional,
+ OCT4 tmsi optional
}
type record ConnHdlrPars {
@@ -117,6 +126,7 @@
EnbParams enb_pars[NUM_ENB],
DiameterParams hss_pars,
SGWParams sgw_pars,
+ SGsAPPars sgsap_pars,
/* copied over from MTC_CT on start of component */
UeParams ue_pars,
/* currently used MME (index into enb_pars, S1AP, ...) */
@@ -355,6 +365,35 @@
}
}
+private function f_SGsAP_LAI_to_S1AP_LAI(SGsAP_Types.LocationAreaIdValue inp) return S1AP_IEs.LAI
+{
+ var template (value) S1AP_IEs.LAI s1ap_lai;
+ s1ap_lai := ts_S1AP_LAI(enc_BcdMccMnc(inp.mccDigit1 & inp.mccDigit2 & inp.mccDigit3 &
+ inp.mncDigit3 & inp.mncDigit1 & inp.mncDigit2),
+ inp.lac);
+ return valueof(s1ap_lai);
+}
+
+/* 3GPP TS 23.272 7.3 steps 1.d + 1.e */
+altstep as_s1ap_handle_UeContextModificationReq(template CSFallbackIndicator csfb_ind := omit) runs on ConnHdlr {
+ var S1AP_PDU rx_msg;
+ var PDU_NAS_EPS rx_nas;
+ [] S1AP.receive(tr_S1AP_UeContextModificationReq(?, ?,
+ csfb_ind := cs_fallback_required,
+ registered_lai := f_SGsAP_LAI_to_S1AP_LAI(g_pars.sgsap_pars.lai))) -> value rx_msg {
+ var template MME_UE_S1AP_ID mme_ue_id;
+ var template ENB_UE_S1AP_ID enb_ue_id;
+
+ mme_ue_id := f_S1AP_get_MME_UE_S1AP_ID(rx_msg);
+ enb_ue_id := f_S1AP_get_ENB_UE_S1AP_ID(rx_msg);
+
+ S1AP.send(ts_S1AP_UeContextModificationResp(mme_ue_id, enb_ue_id));
+ }
+ [] 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_UeContextReleaseCmd(template S1AP_IEs.Cause cause := ?) runs on ConnHdlr {
var S1AP_PDU rx_msg;
var PDU_NAS_EPS rx_nas;
@@ -691,7 +730,7 @@
}
}
-function f_attach(BIT3 att_type := '001'B) runs on ConnHdlr {
+function f_attach(BIT3 att_type := '001'B, 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) PDU_NAS_EPS nas_esm, nas_emm;
timer T := 5.0;
@@ -737,12 +776,28 @@
[] T.timeout { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("No message from MME")); }
}
+ if (exp_sgsap_lu) {
+ T.start;
+ alt {
+ [] as_sgsap_handle_lu_req(IMSI_attach);
+ [] T.timeout { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("No SGsAP message from MME")); }
+ }
+ }
+
T.start;
alt {
[] as_s1ap_handle_IntialCtxSetupReq_Attach_Accept();
[] T.timeout { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("No message from MME")); }
}
+ if (exp_sgsap_lu) {
+ T.start;
+ alt {
+ [] SGsAP.receive(tr_SGsAP_TMSI_REALL_CMPL(g_pars.ue_pars.imsi));
+ [] T.timeout { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("No SGsAP-TMSI-REALLOCATION-COMPLETE message from MME")); }
+ }
+ }
+
/* We now expect the MME to send a Modify Bearer Request to the SGW-C */
f_gtp2_register_udmsg('22'O);
T.start;
@@ -752,6 +807,10 @@
}
}
+/******************************
+ * RIM
+ ******************************/
+
external function enc_PDU_GTPC_RAN_INF_REQ(in PDU_BSSGP_RAN_INFORMATION_REQUEST_GTPC gtpc_pdu) return octetstring
with { extension "prototype(convert)"
extension "encode(RAW)"
@@ -924,4 +983,140 @@
return msg;
}
+/*****************************
+ * SGsAP
+ *****************************/
+
+private altstep as_sgsap_handle_lu_req(template (present) EPS_location_update_type exp_eps_lu_type := ?) runs on ConnHdlr {
+ var PDU_SGsAP rx_sgsap;
+ var template (present) NAS_KeySetIdentifierV kset_id := f_tr_ConnHdlr_kset_id();
+ [] SGsAP.receive(tr_SGsAP_LU_REQ(g_pars.ue_pars.imsi,
+ g_pars.sgsap_pars.mme_name,
+ exp_eps_lu_type,
+ g_pars.sgsap_pars.lai)) -> value rx_sgsap {
+ SGsAP.send(ts_SGsAP_LU_ACCEPT(g_pars.ue_pars.imsi,
+ g_pars.sgsap_pars.lai,
+ ts_MI_TMSI_LV(g_pars.ue_pars.tmsi)));
+ }
+}
+
+/* perform a SGs paging procedure */
+function f_sgsap_page_sms(template (omit) OCT4 tmsi,
+ template (omit) SGs_Cause exp_cause) runs on ConnHdlr {
+ var Service_Indicator serv_ind := SMS_indicator;
+ var boolean exp_success := true;
+ var PDU_SGsAP rx;
+ if (not istemplatekind(exp_cause, "omit")) {
+ exp_success := false;
+ }
+ SGsAP.send(ts_SGsAP_PAGING_REQ(g_pars.ue_pars.imsi,
+ g_pars.sgsap_pars.vlr_name,
+ serv_ind,
+ tmsi));
+ alt {
+ /* we expect success */
+ [exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.ue_pars.imsi, serv_ind, ?)) {
+ setverdict(pass);
+ }
+ [exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, ?)) {
+ setverdict(fail, "Received unexpected PAGING REJECT");
+ }
+ /* we expect failure */
+ [not exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.ue_pars.imsi, serv_ind, ?)) {
+ setverdict(fail, "Received SERVICE REQ waiting for PAGING REJECT");
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, exp_cause)) {
+ setverdict(pass);
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, ?)) {
+ setverdict(fail, "Received unexpected PAGING REJECT cause");
+ }
+ [] SGsAP.receive {
+ setverdict(fail, "Received unexpected SGsAP");
+ }
+ }
+}
+
+/* perform a SGs paging procedure. 3GPP TS 23.272 7.3 */
+function f_sgsap_page_cs(template (omit) OCT4 tmsi,
+ template (omit) SGs_Cause exp_cause) runs on ConnHdlr {
+ var Service_Indicator serv_ind := CS_call_indicator;
+ var boolean exp_success := true;
+ var PDU_SGsAP rx;
+ if (not istemplatekind(exp_cause, "omit")) {
+ exp_success := false;
+ }
+
+ SGsAP.send(ts_SGsAP_PAGING_REQ(g_pars.ue_pars.imsi,
+ g_pars.sgsap_pars.vlr_name,
+ serv_ind,
+ tmsi));
+
+ if (exp_success) {
+ S1AP.receive(tr_NAS_CS_ServiceNotification(ts_PagingIdentityV_TMSI));
+ S1AP.send(ts_NAS_CS_ExtendedServiceRequest('0001'B /*mobile terminating CS fallback or 1xCS fallback*/,
+ g_pars.kset_id,
+ ts_NAS_MobileIdentityV_TMSI(g_pars.ue_pars.tmsi),
+ '001'B /* CS fallback accepted by the UE */));
+ }
+
+ alt {
+ /* we expect success */
+ [exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.ue_pars.imsi, serv_ind, ?)) {
+ setverdict(pass);
+ }
+ [exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, ?)) {
+ setverdict(fail, "Received unexpected PAGING REJECT");
+ }
+ /* we expect failure */
+ [not exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.ue_pars.imsi, serv_ind, ?)) {
+ setverdict(fail, "Received SERVICE REQ waiting for PAGING REJECT");
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, exp_cause)) {
+ setverdict(pass);
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, ?)) {
+ setverdict(fail, "Received unexpected PAGING REJECT cause");
+ }
+ [] SGsAP.receive {
+ setverdict(fail, "Received unexpected SGsAP");
+ }
+ }
+
+ if (exp_success) {
+ /* 3GPP TS 23.272 7.3 steps 1.d + 1.e */
+ as_s1ap_handle_UeContextModificationReq(cs_fallback_required);
+ }
+}
+
+/* perform a SGs alert procedure */
+function f_sgsap_alert(template (omit) SGs_Cause exp_cause) runs on ConnHdlr{
+ var boolean exp_success := true;
+ var PDU_SGsAP rx;
+ if (not istemplatekind(exp_cause, "omit")) {
+ exp_success := false;
+ }
+ SGsAP.send(ts_SGsAP_ALERT_REQ(g_pars.ue_pars.imsi));
+ alt {
+ [exp_success] SGsAP.receive(tr_SGsAP_ALERT_ACK(g_pars.ue_pars.imsi)) {
+ setverdict(pass);
+ }
+ [exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.ue_pars.imsi, ?)) -> value rx {
+ setverdict(fail, "Received unexpected ALERT REJECT ", rx);
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_ACK(g_pars.ue_pars.imsi)) {
+ setverdict(fail, "Received unexpected ALERT ACK");
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.ue_pars.imsi, exp_cause)) {
+ setverdict(pass)
+ }
+ [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.ue_pars.imsi, ?)) -> value rx {
+ setverdict(fail, "Received ALERT REJECT with unexpected cause ", rx);
+ }
+ [] SGsAP.receive {
+ setverdict(fail, "Received unexpected SGsAP");
+ }
+ }
+}
+
}
diff --git a/mme/MME_Tests.cfg b/mme/MME_Tests.cfg
index d0f5807..696a7be 100644
--- a/mme/MME_Tests.cfg
+++ b/mme/MME_Tests.cfg
@@ -25,7 +25,7 @@
mp_sgs_local_ip := "127.0.0.202";
mp_sgs_local_port := 29118;
mp_vlr_name := "vlr.example.net";
-mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";
+mp_mme_name := "mmec01.mmegi0002.mme.epc.mnc001.mcc001.3gppnetwork.org";
# Gn interface
mp_gn_local_ip := "127.0.0.202";
@@ -43,3 +43,4 @@
[EXECUTE]
MME_Tests.control
+MME_Tests_SGsAP.control
diff --git a/mme/MME_Tests.ttcn b/mme/MME_Tests.ttcn
index 885b727..834c411 100644
--- a/mme/MME_Tests.ttcn
+++ b/mme/MME_Tests.ttcn
@@ -105,7 +105,7 @@
charstring mp_sgs_local_ip := "127.0.0.1";
integer mp_sgs_local_port := 29118;
charstring mp_vlr_name := "vlr.example.net";
- charstring mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";
+ charstring mp_mme_name := "mmec01.mmegi0002.mme.epc.mnc001.mcc001.3gppnetwork.org";
/* Gn interface (GTPv1C) */
charstring mp_gn_local_ip := "127.0.0.22";
@@ -222,7 +222,8 @@
s11_teid_remote := omit,
s5c_teid_local := omit,
s5c_teid_remote := omit
- }
+ },
+ tmsi := f_gen_tmsi(imsi_suffix)
}
}
friend function f_init_s1ap(charstring id, integer imsi_suffix) runs on MTC_CT {
@@ -296,12 +297,12 @@
vc_GTP2.start(GTPv2_Emulation.main(cfg));
}
-private function f_init(integer imsi_suffix := 0,
- boolean init_diameter := false,
- boolean init_gtpv2c_s11 := false,
- boolean init_gtpv1c_gn := false,
- boolean init_sgsap := false,
- float t_guard := 45.0) runs on MTC_CT {
+friend function f_init(integer imsi_suffix := 0,
+ boolean init_diameter := false,
+ boolean init_gtpv2c_s11 := false,
+ boolean init_gtpv1c_gn := false,
+ boolean init_sgsap := false,
+ float t_guard := 45.0) runs on MTC_CT {
var charstring id := testcasename();
/* start guard timer and activate it as default */
@@ -347,6 +348,11 @@
remote_port := mp_s11_remote_port,
s5c_pgw_ip := mp_s5c_pgw_ip
},
+ sgsap_pars := {
+ vlr_name := f_enc_dns_hostname(mp_vlr_name),
+ mme_name := f_enc_dns_hostname(mp_mme_name),
+ lai := valueof(ts_SGsAP_LAI('001'H, '01'H, 43691))
+ },
ue_pars := g_ue_pars[ue_idx],
mme_idx := 0,
kset_id := valueof(ts_NAS_KeySetIdentifierV('000'B, c_NAS_TSC_NATIVE_SEC_CTX))
diff --git a/mme/MME_Tests_SGsAP.ttcn b/mme/MME_Tests_SGsAP.ttcn
index 73ef90e..a662c13 100644
--- a/mme/MME_Tests_SGsAP.ttcn
+++ b/mme/MME_Tests_SGsAP.ttcn
@@ -1,6 +1,6 @@
module MME_Tests_SGsAP {
-/* Osmocom MME test suite in in TTCN-3
+/* Osmocom MME test suite in in TTCN-3, SGsAP related procedures (3GPP TS 23.272)
* (C) 2019 Harald Welte <laforge@gnumonks.org>
* All rights reserved.
*
@@ -23,140 +23,75 @@
import from ConnHdlr all;
/* performa SGs reset procedure */
-function f_sgsap_vlr_reset() runs on ConnHdlr {
+function f_sgsap_vlr_reset() runs on MTC_CT {
var octetstring vlr_name := f_enc_dns_hostname(mp_vlr_name);
var octetstring mme_name := f_enc_dns_hostname(mp_mme_name);
+ var PDU_SGsAP rx_msg;
- SGsAP.send(ts_SGsAP_RESET_IND_VLR(vlr_name));
+ SGsAP_UNIT.send(ts_SGsAP_RESET_IND_VLR(vlr_name));
alt {
- [] SGsAP.receive(tr_SGsAP_RESET_ACK(mme_name, vlr_name)) {
+ [] SGsAP_UNIT.receive(tr_SGsAP_RESET_ACK_MME(mme_name)) {
setverdict(pass);
}
- [] SGsAP.receive(tr_SGsAP_RESET_ACK(?, ?)) {
- setverdict(fail, "Received unexpected VLR/MME name in SGsAP RESET ACK");
+ [] SGsAP_UNIT.receive(tr_SGsAP_RESET_ACK_MME(?)) -> value rx_msg {
+ setverdict(fail, "Received unexpected MME name in SGsAP RESET ACK ", rx_msg, " vs exp ", tr_SGsAP_RESET_ACK_MME(mme_name));
}
- [] SGsAP.receive {
- setverdict(fail, "Received unexpected response to SGsAP RESET");
+ [] SGsAP_UNIT.receive(PDU_SGsAP:?) -> value rx_msg {
+ setverdict(fail, "Received unexpected response to SGsAP RESET ", rx_msg, " vs exp ", tr_SGsAP_RESET_ACK_MME(mme_name));
}
- }
-}
-
-/* perform a SGs paging procedure */
-function f_sgsap_page(Service_Indicator serv_ind, template (omit) OCT4 tmsi,
- template (omit) SGs_Cause exp_cause) runs on ConnHdlr {
- var octetstring vlr_name := f_enc_dns_hostname(mp_vlr_name);
- var boolean exp_success := true;
- var PDU_SGsAP rx;
- if (not istemplatekind(exp_cause, "omit")) {
- exp_success := false;
- }
- SGsAP.send(ts_SGsAP_PAGING_REQ(g_pars.ue_pars.imsi, vlr_name, serv_ind, tmsi));
- alt {
- /* we expect success */
- [exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.ue_pars.imsi, serv_ind, ?)) {
- setverdict(pass);
- }
- [exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, ?)) {
- setverdict(fail, "Received unexpected PAGING REJECT");
- }
- /* we expect failure */
- [not exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.ue_pars.imsi, serv_ind, ?)) {
- setverdict(fail, "Received SERVICE REQ waiting for PAGING REJECT");
- }
- [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, exp_cause)) {
- setverdict(pass);
- }
- [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.ue_pars.imsi, ?)) {
- setverdict(fail, "Received unexpected PAGING REJECT cause");
- }
- [] SGsAP.receive {
- setverdict(fail, "Received unexpected SgSAP");
- }
- }
-}
-
-/* perform a SGs alert procedure */
-function f_sgsap_alert(template (omit) SGs_Cause exp_cause) runs on ConnHdlr{
- var boolean exp_success := true;
- var PDU_SGsAP rx;
- if (not istemplatekind(exp_cause, "omit")) {
- exp_success := false;
- }
- SGsAP.send(ts_SGsAP_ALERT_REQ(g_pars.ue_pars.imsi));
- alt {
- [exp_success] SGsAP.receive(tr_SGsAP_ALERT_ACK(g_pars.ue_pars.imsi)) {
- setverdict(pass);
- }
- [exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.ue_pars.imsi, ?)) -> value rx {
- setverdict(fail, "Received unexpected ALERT REJECT ", rx);
- }
- [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_ACK(g_pars.ue_pars.imsi)) {
- setverdict(fail, "Received unexpected ALERT ACK");
- }
- [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.ue_pars.imsi, exp_cause)) {
- setverdict(pass)
- }
- [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.ue_pars.imsi, ?)) -> value rx {
- setverdict(fail, "Received ALERT REJECT with unexpected cause ", rx);
- }
- [] SGsAP.receive {
- setverdict(fail, "Received unexpected SGsAP");
+ [] SGsAP_UNIT.receive(SGsAPEM_Event:?) {
+ setverdict(fail, "Received unexpected event while waiting for response to SGsAP RESET");
}
}
}
/* Test if MME responds to VLR-originated RESET procedure as expected */
-private function f_TC_sgsap_vlr_reset() runs on ConnHdlr {
+testcase TC_sgsap_vlr_reset() runs on MTC_CT {
+ f_init(1001, init_sgsap := true);
f_sgsap_vlr_reset();
}
-testcase TC_sgsap_vlr_reset() runs on MTC_CT {
- var ConnHdlrPars pars;
- var ConnHdlr vc_conn;
- f_init_sgsap(testcasename());
- pars := f_init_pars(1);
- vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_vlr_reset), pars);
- vc_conn.done;
-}
-/* Page known subscriber for SMS */
+/* Page known subscriber for SMS
+ * 3GPP TS 23.272 8.2.4 Mobile terminating SMS in idle mode */
private function f_TC_sgsap_paging_sms() runs on ConnHdlr {
- /* TODO: register subscriber on S1 */
- f_sgsap_page(SMS_indicator, omit, omit);
+ f_attach('010'B /*= Combined EPS IMSI Attach*/, exp_sgsap_lu := true);
+ f_sgsap_page_sms(omit, omit);
}
testcase TC_sgsap_paging_sms() runs on MTC_CT {
- var ConnHdlrPars pars;
- var ConnHdlr vc_conn;
- f_init_sgsap(testcasename());
- pars := f_init_pars(2);
- vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_sms), pars);
+ f_init(1002, init_diameter := true, init_gtpv2c_s11 := true, init_sgsap := true);
+ f_s1ap_setup(0);
+
+ var ConnHdlrPars pars := f_init_pars(ue_idx := 0);
+ var ConnHdlr vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_sms), pars);
vc_conn.done;
}
-/* Page known subscriber for CS call */
+/* Page known subscriber for CS call
+ * 3GPP TS 23.272 7.3 Mobile Terminating call in Active Mode */
private function f_TC_sgsap_paging_cs() runs on ConnHdlr {
- /* TODO: register subscriber on S1 */
- f_sgsap_page(CS_call_indicator, omit, omit);
+ f_attach('010'B /*= Combined EPS IMSI Attach*/, exp_sgsap_lu := true);
+ f_sgsap_page_cs(omit, omit);
}
testcase TC_sgsap_paging_cs() runs on MTC_CT {
- var ConnHdlrPars pars;
- var ConnHdlr vc_conn;
- f_init_sgsap(testcasename());
- pars := f_init_pars(3);
- vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_cs), pars);
+ f_init(1003, init_diameter := true, init_gtpv2c_s11 := true, init_sgsap := true);
+ f_s1ap_setup(0);
+
+ var ConnHdlrPars pars := f_init_pars(ue_idx := 0);
+ var ConnHdlr vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_cs), pars);
vc_conn.done;
}
/* Page unknown subscriber; expect PAGING REJECT from MME */
private function f_TC_sgsap_paging_reject() runs on ConnHdlr {
- f_sgsap_page(SMS_indicator, omit, IMSI_unknown);
+ f_sgsap_page_sms(omit, IMSI_unknown);
}
testcase TC_sgsap_paging_reject() runs on MTC_CT {
- var ConnHdlrPars pars;
- var ConnHdlr vc_conn;
- f_init_sgsap(testcasename());
- pars := f_init_pars(4);
- vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_reject), pars);
+ f_init(1004, init_sgsap := true);
+ f_s1ap_setup(0);
+
+ var ConnHdlrPars pars := f_init_pars(ue_idx := 0);
+ var ConnHdlr vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_reject), pars);
vc_conn.done;
}
@@ -170,8 +105,8 @@
testcase TC_sgsap_alert() runs on MTC_CT {
var ConnHdlrPars pars;
var ConnHdlr vc_conn;
- f_init_sgsap(testcasename());
- pars := f_init_pars(5);
+ f_init(1005, init_sgsap := true);
+ pars := f_init_pars(ue_idx := 0);
vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_alert), pars);
vc_conn.done;
}
@@ -184,12 +119,13 @@
testcase TC_sgsap_alert_rej() runs on MTC_CT {
var ConnHdlrPars pars;
var ConnHdlr vc_conn;
- f_init_sgsap(testcasename());
- pars := f_init_pars(6);
+ f_init(1006, init_sgsap := true);
+ pars := f_init_pars(ue_idx := 0);
vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_alert_rej), pars);
vc_conn.done;
}
+/* TODO: check for scenarios in sequence charts of 3GPP TS 23.272 */
/* Test SGsAP-DOWNLINK-UNITDATA (SGs -> S1) */
/* Test SGsAP-UPLINK-UNITDATA (S1 -> SGs)*/
@@ -203,4 +139,13 @@
/* Test EPS DETACH */
/* Test IMSI DETACH */
+control {
+ execute( TC_sgsap_vlr_reset() );
+ execute( TC_sgsap_paging_sms() );
+ execute( TC_sgsap_paging_cs() );
+ execute( TC_sgsap_paging_reject() );
+ execute( TC_sgsap_alert() );
+ execute( TC_sgsap_alert_rej() );
+}
+
}
diff --git a/mme/expected-results.xml b/mme/expected-results.xml
index 6826995..2e733c4 100644
--- a/mme/expected-results.xml
+++ b/mme/expected-results.xml
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
-<testsuite name='Titan' tests='10' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
+<testsuite name='Titan' tests='16' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='MME_Tests' name='TC_s1ap_setup_unknown_global_enb_id_plmn' time='MASKED'/>
<testcase classname='MME_Tests' name='TC_s1ap_setup_wrong_tac' time='MASKED'/>
<testcase classname='MME_Tests' name='TC_s1ap_setup' time='MASKED'/>
@@ -10,4 +10,10 @@
<testcase classname='MME_Tests' name='TC_s1ap_reset' time='MASKED'/>
<testcase classname='MME_Tests' name='TC_ue_cell_reselect_eutran_to_geran' time='MASKED'/>
<testcase classname='MME_Tests' name='TC_ue_cell_reselect_geran_to_eutran' time='MASKED'/>
+ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_vlr_reset' time='MASKED'/>
+ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_paging_sms' time='MASKED'/>
+ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_paging_cs' time='MASKED'/>
+ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_paging_reject' time='MASKED'/>
+ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_alert' time='MASKED'/>
+ <testcase classname='MME_Tests_SGsAP' name='TC_sgsap_alert_rej' time='MASKED'/>
</testsuite>
diff --git a/mme/open5gs-mme.yaml b/mme/open5gs-mme.yaml
index 61c038d..3799e3d 100644
--- a/mme/open5gs-mme.yaml
+++ b/mme/open5gs-mme.yaml
@@ -55,11 +55,18 @@
network_name:
full: Open5GS
mme_name: open5gs-mme0
-
-parameter:
-
-max:
-
-usrsctp:
-
-time:
+ sgsap:
+ client:
+ - address: 127.0.0.202 # SCTP server address configured on the MSC/VLR
+ local_address: 127.0.0.201 # SCTP local IP addresses to be bound in the MME
+ map:
+ tai:
+ plmn_id:
+ mcc: 001
+ mnc: 01
+ tac: 12345
+ lai:
+ plmn_id:
+ mcc: 001
+ mnc: 01
+ lac: 43691
To view, visit change 41046. To unsubscribe, or for help writing mail filters, visit settings.