<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15193">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mme: initial skeleton for MME / SGsAP tetss<br><br>Change-Id: Idbd54838daaf12acccc3253dc4278de75eaaaf31<br>---<br>M library/SGsAP_Emulation.ttcn<br>A mme/MME_Tests.ttcn<br>A mme/MME_Tests_SGsAP.ttcn<br>A mme/gen_links.sh<br>A mme/regen_makefile.sh<br>5 files changed, 385 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/93/15193/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/SGsAP_Emulation.ttcn b/library/SGsAP_Emulation.ttcn</span><br><span>index f91e076..6cd1052 100644</span><br><span>--- a/library/SGsAP_Emulation.ttcn</span><br><span>+++ b/library/SGsAP_Emulation.ttcn</span><br><span>@@ -47,6 +47,12 @@</span><br><span>     inout PDU_SGsAP, PDU_ML3_MS_NW, PDU_ML3_NW_MS;</span><br><span> } with { extension "internal" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* global test port e.g. for non-imsi/conn specific messages */</span><br><span style="color: hsl(120, 100%, 40%);">+type port SGsAP_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+       inout PDU_SGsAP;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* represents a single SGsAP Association */</span><br><span> type record AssociationData {</span><br><span>     SGsAP_ConnHdlr  comp_ref,</span><br><span>@@ -66,6 +72,8 @@</span><br><span>        var ExpectData SgsapExpectTable[8];</span><br><span>  /* procedure based port to register for incoming connections */</span><br><span>      port SGsAPEM_PROC_PT SGsAP_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* test port for unit data messages */</span><br><span style="color: hsl(120, 100%, 40%);">+        port SGsAP_PT SGsAP_UNIT;</span><br><span> </span><br><span>        var charstring g_sgsap_id;</span><br><span>   var integer g_sgsap_conn_id := -1;</span><br><span>diff --git a/mme/MME_Tests.ttcn b/mme/MME_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..3ba0677</span><br><span>--- /dev/null</span><br><span>+++ b/mme/MME_Tests.ttcn</span><br><span>@@ -0,0 +1,118 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* MME (Mobility Management Engine) test suite in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+module MME_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGsAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGsAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGsAP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from L3_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DNS_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend module MME_Tests_SGsAP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var SGsAP_Emulation_CT vc_SGsAP;</span><br><span style="color: hsl(120, 100%, 40%);">+      port SGsAP_PT SGsAP_UNIT;</span><br><span style="color: hsl(120, 100%, 40%);">+     port SGsAPEM_PROC_PT SGsAP_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component ConnHdlr extends SGsAP_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars g_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+      timer g_Tguard := 30.0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record ConnHdlrPars {</span><br><span style="color: hsl(120, 100%, 40%);">+      hexstring imsi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring mp_sgs_local_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+  integer mp_sgs_local_port := 29118;</span><br><span style="color: hsl(120, 100%, 40%);">+   charstring mp_vlr_name := "vlr.example.net";</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* send incoming unit data messages (like reset) to global SGsAP_UNIT port */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function ForwardUnitdataCallback(PDU_SGsAP msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on SGsAP_Emulation_CT return template PDU_SGsAP {</span><br><span style="color: hsl(120, 100%, 40%);">+     SGsAP_UNIT.send(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_sgsap(charstring id) runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       id := id & "-SGsAP";</span><br><span style="color: hsl(120, 100%, 40%);">+    var SGsAPOps ops := {</span><br><span style="color: hsl(120, 100%, 40%);">+         create_cb := refers(SGsAP_Emulation.ExpectedCreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+          unitdata_cb := refers(ForwardUnitdataCallback)</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     var SGsAP_conn_parameters pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+           remote_ip := "",</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_sctp_port := -1,</span><br><span style="color: hsl(120, 100%, 40%);">+               local_ip := mp_sgs_local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+          local_sctp_port := mp_sgs_local_port</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_SGsAP := SGsAP_Emulation_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+    map(vc_SGsAP:SGsAP, system:SGsAP_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(vc_SGsAP:SGsAP_PROC, self:SGsAP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(vc_SGsAP:SGsAP_UNIT, self:SGsAP_UNIT);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_SGsAP.start(SGsAP_Emulation.main(ops, pars, id));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* generate parameters for a connection handler */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_pars(integer imsi_suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MTC_CT return ConnHdlrPars {</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlrPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            imsi := f_gen_imsi(imsi_suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    return pars;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type function void_fn(ConnHdlrPars pars) runs on ConnHdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* start a connection handler with given parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_start_handler_with_pars(void_fn fn, ConnHdlrPars pars, integer s1ap_idx := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MTC_CT return ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var charstring id := testcasename() & int2str(s1ap_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := ConnHdlr.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* SGsAP part */</span><br><span style="color: hsl(120, 100%, 40%);">+      connect(vc_conn:SGsAP, vc_SGsAP:SGsAP_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(vc_conn:SGsAP_PROC, vc_SGsAP:SGsAP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have</span><br><span style="color: hsl(120, 100%, 40%);">+        * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn.start(derefers(fn)(pars));</span><br><span style="color: hsl(120, 100%, 40%);">+    return vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* altstep for the global guard timer */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_Tguard()runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] g_Tguard.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Tguard timeout");</span><br><span style="color: hsl(120, 100%, 40%);">+         mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_handler(ConnHdlrPars pars, float t_guard := 30.0) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* make parameters available via component variable */</span><br><span style="color: hsl(120, 100%, 40%);">+        g_pars := pars;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* start guard timre and activate it as default */</span><br><span style="color: hsl(120, 100%, 40%);">+    g_Tguard.start(t_guard);</span><br><span style="color: hsl(120, 100%, 40%);">+      activate(as_Tguard());</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Route all SGsAP mesages for our IMSIto us */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_create_sgsap_expect(pars.imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/mme/MME_Tests_SGsAP.ttcn b/mme/MME_Tests_SGsAP.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..935a59e</span><br><span>--- /dev/null</span><br><span>+++ b/mme/MME_Tests_SGsAP.ttcn</span><br><span>@@ -0,0 +1,210 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module MME_Tests_SGsAP {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom MME test suite in in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGsAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGsAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGsAP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from L3_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DNS_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MME_Tests all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* performa SGs reset procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sgsap_vlr_reset() runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring vlr_name := f_enc_dns_hostname(mp_vlr_name);</span><br><span style="color: hsl(120, 100%, 40%);">+  var octetstring mme_name := f_enc_dns_hostname(mp_mme_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.send(ts_SGsAP_RESET_IND_VLR(vlr_name));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_RESET_ACK(mme_name, vlr_name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] SGsAP.receive(tr_SGsAP_RESET_ACK(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Received unexpected VLR/MME name in SGsAP RESET ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected response to SGsAP RESET");</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform a SGs paging procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sgsap_page(Service_Indicator serv_ind, template (omit) OCT4 tmsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                    template (omit) SGs_Cause exp_cause) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring vlr_name := f_enc_dns_hostname(mp_vlr_name);</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean exp_success := true;</span><br><span style="color: hsl(120, 100%, 40%);">+      var PDU_SGsAP rx;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not istemplatekind(exp_cause, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                exp_success := false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     SGsAP.send(ts_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, serv_ind, tmsi));</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we expect success */</span><br><span style="color: hsl(120, 100%, 40%);">+       [exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.imsi, serv_ind, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.imsi, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected PAGING REJECT");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* we expect failure */</span><br><span style="color: hsl(120, 100%, 40%);">+       [not exp_success] SGsAP.receive(tr_SGsAP_SERVICE_REQ(g_pars.imsi, serv_ind, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Received SERVICE REQ waiting for PAGING REJECT");</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.imsi, exp_cause)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_success] SGsAP.receive(tr_SGsAP_PAGING_REJ(g_pars.imsi, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Received unexpected PAGING REJECT cause");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected SgSAP");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform a SGs alert procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sgsap_alert(template (omit) SGs_Cause exp_cause) runs on ConnHdlr{</span><br><span style="color: hsl(120, 100%, 40%);">+    var boolean exp_success := true;</span><br><span style="color: hsl(120, 100%, 40%);">+      var PDU_SGsAP rx;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not istemplatekind(exp_cause, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                exp_success := false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     SGsAP.send(ts_SGsAP_ALERT_REQ(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [exp_success] SGsAP.receive(tr_SGsAP_ALERT_ACK(g_pars.imsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.imsi, ?)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Received unexpected ALERT REJECT ", rx);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_ACK(g_pars.imsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected ALERT ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.imsi, exp_cause)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass)</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [not exp_success] SGsAP.receive(tr_SGsAP_ALERT_REJECT(g_pars.imsi, ?)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Received ALERT REJECT with unexpected cause ", rx);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected SGsAP");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test if MME responds to VLR-originated RESET procedure as expected */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sgsap_vlr_reset(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_vlr_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_vlr_reset() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_sgsap(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+ pars := f_init_pars(1);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_vlr_reset), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Page known subscriber for SMS */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sgsap_paging_sms(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: register subscriber on S1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_page(SMS_indicator, omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_paging_sms() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_sgsap(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+ pars := f_init_pars(2);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_sms), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Page known subscriber for CS call */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sgsap_paging_cs(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: register subscriber on S1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_page(CS_call_indicator, omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_paging_cs() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_sgsap(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+ pars := f_init_pars(3);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_cs), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Page unknown subscriber; expect PAGING REJECT from MME */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sgsap_paging_reject(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_page(SMS_indicator, omit, IMSI_unknown);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_paging_reject() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_sgsap(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+ pars := f_init_pars(4);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_paging_reject), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send ALERT-REQ to MME; perform S1AP activity; expect ALERT-ACK on SGs */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sgsap_alert(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: register subscriber on S1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_alert(omit);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TOOD: do something on S1 triggering UE ACT IND */</span><br><span style="color: hsl(120, 100%, 40%);">+  SGsAP.receive(tr_SGsAP_UE_ACT_IND(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_alert() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_sgsap(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+ pars := f_init_pars(5);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_alert), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send ALERT-REQ to MME for unidentified IMSI; expect ALERT-REJ on SGs */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_sgsap_alert_rej(ConnHdlrPars pars) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* IMSI doesn't register and is hence unknown */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_alert(IMSI_unknown);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_alert_rej() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_sgsap(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+ pars := f_init_pars(6);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn := f_start_handler_with_pars(refers(f_TC_sgsap_alert_rej), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SGsAP-DOWNLINK-UNITDATA (SGs -> S1) */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SGsAP-UPLINK-UNITDATA (S1 -> SGs)*/</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SGSAP-DETACH-IND; detach on S1; expect DETACH-IND on SGs; send DETACH-ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SGsAP-LU-REQ; perform combined attach on S1; expect LU-REQ; acknowlege it */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SGsAP-LU-REQ; perform combined attach on S1; expect LU-REQ; reject it */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SGsAP-MMINFO-REQ; establish SGs association; send it on SGs; expect on S1 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test MT SERVICE ABORT; send PAGING; expect SERVICE REQ; send SERVICE ABORT */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test EPS DETACH */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test IMSI DETACH */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/mme/gen_links.sh b/mme/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..2a98c70</span><br><span>--- /dev/null</span><br><span>+++ b/mme/gen_links.sh</span><br><span>@@ -0,0 +1,40 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BASEDIR=../deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+. ../gen_links.sh.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Socket_API_Definitions.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Required by MGCP and IPA</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="IPL4asp_Functions.ttcn  IPL4asp_PT.cc  IPL4asp_PT.hh IPL4asp_PortType.ttcn  IPL4asp_Types.ttcn  IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.TELNETasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TELNETasp_PT.cc  TELNETasp_PT.hh  TELNETasp_PortType.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.MobileL3_v13.4.0/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="MobileL3_CC_Types.ttcn MobileL3_CommonIE_Types.ttcn MobileL3_GMM_SM_Types.ttcn MobileL3_MM_Types.ttcn MobileL3_RRM_Types.ttcn MobileL3_SMS_Types.ttcn MobileL3_SS_Types.ttcn MobileL3_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+#FILES+="SS_DataTypes.asn SS_Errors.asn SS_Operations.asn SS_PDU_Defs.asn SS_Protocol.asn SS_Types.ttcn SS_EncDec.cc"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.SGsAP_13.2.0/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SGsAP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="SGsAP_Templates.ttcn SGsAP_CodecPort.ttcn SGsAP_CodecPort_CtrlFunct.ttcn SGsAP_CodecPort_CtrlFunctDef.cc SGsAP_Emulation.ttcn DNS_Helpers.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="L3_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ignore_pp_results</span><br><span>diff --git a/mme/regen_makefile.sh b/mme/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..4d6d7c6</span><br><span>--- /dev/null</span><br><span>+++ b/mme/regen_makefile.sh</span><br><span>@@ -0,0 +1,9 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn IPL4asp_PT.cc  IPL4asp_discovery.cc  Native_FunctionDefs.cc SGsAP_CodecPort_CtrlFunctDef.cc  TCCConversion.cc  TCCEncoding.cc  TCCInterface.cc  TELNETasp_PT.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3=""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+../regen-makefile.sh MME_Tests.ttcn $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sed -i -e 's/^LINUX_LIBS = -lxml2/LINUX_LIBS = -lxml2 -lfftranscode/' Makefile</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15193">change 15193</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15193"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Idbd54838daaf12acccc3253dc4278de75eaaaf31 </div>
<div style="display:none"> Gerrit-Change-Number: 15193 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>