<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11488">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: MSC_Tests: Add SGs testcases<br><br>This extens MSC_Tests.ttcn with an initial set of SGs interface test<br>cases for RESET, LU, DETACH, PAGING, SMS and CSFB procedures<br><br>In particular the following testcases are added:<br><br>- TC_sgsap_reset: isolated reset procedure test<br>- TC_sgsap_lu: isolated location update with TMSI realloc<br>- TC_sgsap_lu_imsi_reject: location update, reject case<br>- TC_sgsap_lu_and_nothing: location update with failed TMSI realloc<br>- TC_sgsap_expl_imsi_det_eps: detach from EPS serveces<br>- TC_sgsap_expl_imsi_det_noneps: detach from non-EPS services<br>- TC_sgsap_paging_rej: isolated paging, reject case<br>- TC_sgsap_paging_subscr_rej: isolated paging, subscr rejects call<br>- TC_sgsap_paging_ue_unr: isolated paging, ue is unreachable<br>- TC_sgsap_paging_and_nothing: page, but don't respond<br>- TC_sgsap_paging_and_lu: check paging followed by an LU<br>- TC_sgsap_mt_sms: mobile terminated SMS through SGs Interface<br>- TC_sgsap_mo_sms: mobile originated SMS through SGs Interface<br>- TC_sgsap_mt_sms_and_nothing: trigger SMS, but don't respond to paging<br>- TC_sgsap_mt_sms_and_reject: trigger SMS, but reject paging<br>- TC_sgsap_unexp_ud: Send unexpected unitdata (SGs Association: NULL)<br>- TC_sgsap_unsol_ud: Send unsolicited unitdata (subscriber not in VLR)<br>- TC_bssap_lu_sgsap_lu_and_mt_call: LU on 2G, LU on SGs and CSFB call<br>- TC_sgsap_lu_and_mt_call: LU on SGs, and CSFB call<br><br>Change-Id: I38543c35a9e74cea276e58d1d7ef01ef07ffe858<br>Depends: osmo-msc I73359925fc1ca72b33a1466e6ac41307f2f0b11d<br>Related: OS#3645<br>---<br>M library/SGsAP_Emulation.ttcn<br>M library/SGsAP_Templates.ttcn<br>M msc/BSC_ConnectionHandler.ttcn<br>M msc/MSC_Tests.ttcn<br>M msc/expected-results.xml<br>M msc/gen_links.sh<br>M msc/regen_makefile.sh<br>7 files changed, 1,116 insertions(+), 14 deletions(-)<br><br></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 968bcdd..442cc7c 100644</span><br><span>--- a/library/SGsAP_Emulation.ttcn</span><br><span>+++ b/library/SGsAP_Emulation.ttcn</span><br><span>@@ -32,6 +32,7 @@</span><br><span> import from Osmocom_Types all;</span><br><span> import from IPL4asp_Types all;</span><br><span> import from DNS_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_Types all;</span><br><span> </span><br><span> type component SGsAP_ConnHdlr {</span><br><span>  port SGsAP_Conn_PT SGsAP;</span><br><span>@@ -41,7 +42,7 @@</span><br><span> </span><br><span> /* port between individual per-connection components and this dispatcher */</span><br><span> type port SGsAP_Conn_PT message {</span><br><span style="color: hsl(0, 100%, 40%);">-   inout PDU_SGsAP;</span><br><span style="color: hsl(120, 100%, 40%);">+      inout PDU_SGsAP, PDU_ML3_MS_NW, PDU_ML3_NW_MS;</span><br><span> } with { extension "internal" };</span><br><span> </span><br><span> /* represents a single SGsAP Association */</span><br><span>@@ -292,6 +293,8 @@</span><br><span> </span><br><span>    while (true) {</span><br><span>               var SGsAP_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+           var PDU_ML3_MS_NW l3_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+              var PDU_ML3_NW_MS l3_mt;</span><br><span>             var template IMSI imsi_t;</span><br><span>            var hexstring imsi;</span><br><span>          var SGsAP_RecvFrom mrf;</span><br><span>@@ -305,6 +308,38 @@</span><br><span>                       /* TODO: check which ConnectionID client has allocated + store in table? */</span><br><span>                  SGsAP.send(t_SGsAP_Send(g_sgsap_conn_id, msg));</span><br><span>                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* DTAP/MobileL3 from client (emulated MS): wrap in SGsAP-UL-UD and send */</span><br><span style="color: hsl(120, 100%, 40%);">+           [] SGsAP_CLIENT.receive(PDU_ML3_MS_NW:?) -> value l3_mo sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+                   var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+                   imsi := f_imsi_by_comp(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg := valueof(ts_SGsAP_UL_UD(imsi, l3_enc));</span><br><span style="color: hsl(120, 100%, 40%);">+                 SGsAP.send(t_SGsAP_Send(g_sgsap_conn_id, msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] SGsAP_CLIENT.receive(PDU_ML3_NW_MS:?) -> value l3_mt sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+                   var octetstring l3_enc := enc_PDU_ML3_NW_MS(l3_mt);</span><br><span style="color: hsl(120, 100%, 40%);">+                   imsi := f_imsi_by_comp(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg := valueof(ts_SGsAP_DL_UD(imsi, l3_enc));</span><br><span style="color: hsl(120, 100%, 40%);">+                 SGsAP.send(t_SGsAP_Send(g_sgsap_conn_id, msg));</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%);">+           /* DTAP/MobileL3 from MSC/VLR to MS wrapped in SGsAP-DL-UD: Extract, decode, forward */</span><br><span style="color: hsl(120, 100%, 40%);">+               [] SGsAP.receive(tr_SGsAP_RecvFrom_R(tr_SGsAP_DL_UD(?,?))) -> value mrf {</span><br><span style="color: hsl(120, 100%, 40%);">+                  var octetstring l3_enc := mrf.msg.sGsAP_DOWNLINK_UNITDATA.nAS_MessageContainer.nAS_MessageContainer;</span><br><span style="color: hsl(120, 100%, 40%);">+                  imsi := mrf.msg.sGsAP_DOWNLINK_UNITDATA.iMSI.iMSI.digits;</span><br><span style="color: hsl(120, 100%, 40%);">+                     vc_conn := f_comp_by_imsi(imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                      l3_mt := dec_PDU_ML3_NW_MS(l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+                   SGsAP_CLIENT.send(l3_mt) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] SGsAP.receive(tr_SGsAP_RecvFrom_R(tr_SGsAP_UL_UD(?,?))) -> value mrf {</span><br><span style="color: hsl(120, 100%, 40%);">+                  var octetstring l3_enc := mrf.msg.sGsAP_UPLINK_UNITDATA.nAS_MessageContainer.nAS_MessageContainer;</span><br><span style="color: hsl(120, 100%, 40%);">+                    imsi := mrf.msg.sGsAP_UPLINK_UNITDATA.iMSI.iMSI.digits;</span><br><span style="color: hsl(120, 100%, 40%);">+                       l3_mo := dec_PDU_ML3_MS_NW(l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+                   vc_conn := f_comp_by_imsi(imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+                      SGsAP_CLIENT.send(l3_mo) to 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* any other SGsAP from MSC/VLR */</span><br><span>           [] SGsAP.receive(tr_SGsAP_RecvFrom_R(?)) -> value mrf {</span><br><span>                   imsi_t := f_SGsAP_get_imsi(mrf.msg);</span><br><span>                         if (isvalue(imsi_t)) {</span><br><span>diff --git a/library/SGsAP_Templates.ttcn b/library/SGsAP_Templates.ttcn</span><br><span>index 9526080..457481e 100644</span><br><span>--- a/library/SGsAP_Templates.ttcn</span><br><span>+++ b/library/SGsAP_Templates.ttcn</span><br><span>@@ -69,7 +69,10 @@</span><br><span>             return omit;</span><br><span>         } else if (istemplatekind(digits, "*")) {</span><br><span>          return *;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (istemplatekind(digits, "?")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return ?;</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("tr_SGsAP_IMSI: ", digits);</span><br><span>    var template IMSI imsi := {</span><br><span>          iEI := '00000001'B,</span><br><span>          lengthIndicator := lengthof(digits)/2 + 1,</span><br><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index 43a1190..735cd21 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -39,8 +39,10 @@</span><br><span> import from TELNETasp_PortType all;</span><br><span> import from Osmocom_VTY_Functions all;</span><br><span> </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> /* this component represents a single subscriber connection */</span><br><span style="color: hsl(0, 100%, 40%);">-type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr, MGCP_ConnHdlr, SMPP_ConnHdlr, CTRL_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr, MGCP_ConnHdlr, SMPP_ConnHdlr, CTRL_Adapter_CT, SGsAP_ConnHdlr {</span><br><span>  var BSC_ConnHdlrPars g_pars;</span><br><span>         timer g_Tguard := 60.0;</span><br><span>      port TELNETasp_PT MSCVTY;</span><br><span>@@ -135,6 +137,8 @@</span><br><span>      activate(as_Tguard());</span><br><span>       /* Route all SMPP messages for our MSISDN to us */</span><br><span>   f_create_smpp_expect(hex2str(pars.msisdn));</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Route all SGs message for our IMSI to us */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_create_sgsap_expect(pars.imsi);</span><br><span> </span><br><span>        if (g_pars.ipa_ctrl_enable == true) {</span><br><span>                f_ipa_ctrl_start(g_pars.ipa_ctrl_ip, g_pars.ipa_ctrl_port);</span><br><span>@@ -452,21 +456,22 @@</span><br><span>  mgcp_connection_id_mss := '0'H //</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_mt_call_establish(inout CallParameters cpars)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Allocate a call reference and send SETUP via MNCC to MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_mt_call_initate(inout CallParameters cpars)</span><br><span> runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ cpars.mncc_callref := f_rnd_int(2147483648);</span><br><span style="color: hsl(120, 100%, 40%);">+  MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       hex2str(cpars.called_party), hex2str(g_pars.imsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Complete call, begin with a paging response message via BSSAP */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_mt_call_complete(inout CallParameters cpars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span>    var MNCC_PDU mncc;</span><br><span>   var MgcpCommand mgcp_cmd;</span><br><span> </span><br><span>        f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Allocate a call reference and send SETUP via MNCC to MSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  cpars.mncc_callref := f_rnd_int(2147483648);</span><br><span style="color: hsl(0, 100%, 40%);">-    MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),</span><br><span style="color: hsl(0, 100%, 40%);">-                                 hex2str(cpars.called_party), hex2str(g_pars.imsi)));</span><br><span style="color: hsl(0, 100%, 40%);">-    /* BSC <- MSC: Expect paging. FIXME: By TMSI or not? */</span><br><span style="color: hsl(0, 100%, 40%);">-      BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        f_establish_fully(EST_TYPE_PAG_RESP);</span><br><span> </span><br><span>    /* MS <- MSC: Expect CC SETUP */</span><br><span>@@ -476,7 +481,6 @@</span><br><span>    BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_ALERTING(cpars.transaction_id)));</span><br><span>     MNCC.receive(tr_MNCC_ALERT_ind(cpars.mncc_callref));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     /* Create MGCP expect */</span><br><span>     f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});</span><br><span>       /* Ask MSC via MNCC to create the RTP socket on the MSC/MGW side */</span><br><span>@@ -531,6 +535,20 @@</span><br><span>   /* MS -> MSC: ALERTING */</span><br><span>         BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT(cpars.transaction_id)));</span><br><span>      MNCC.receive(tr_MNCC_SETUP_cnf(cpars.mncc_callref));</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%);">+function f_mt_call_establish(inout CallParameters cpars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initiate the call via MNCC */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_mt_call_initate(cpars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* BSC <- MSC: Expect paging. FIXME: By TMSI or not? */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_Paging(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Complete the call via BSSAP */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_mt_call_complete(cpars);</span><br><span> </span><br><span>       setverdict(pass);</span><br><span> }</span><br><span>@@ -1008,7 +1026,6 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn</span><br><span>index ef626bf..bf703e6 100644</span><br><span>--- a/msc/MSC_Tests.ttcn</span><br><span>+++ b/msc/MSC_Tests.ttcn</span><br><span>@@ -42,6 +42,10 @@</span><br><span> import from BSSMAP_Emulation all;</span><br><span> import from BSC_ConnectionHandler all;</span><br><span> </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_Types 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> import from MobileL3_Types all;</span><br><span> import from MobileL3_CommonIE_Types all;</span><br><span> import from MobileL3_SMS_Types all;</span><br><span>@@ -57,10 +61,14 @@</span><br><span> import from SS_Types all;</span><br><span> import from SS_Templates all;</span><br><span> import from USSD_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DNS_Helpers all;</span><br><span> </span><br><span> const integer NUM_BSC := 2;</span><br><span> type record of BSSAP_Configuration BSSAP_Configurations;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Needed for SGsAP SMS */</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_SMS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type component MTC_CT extends CTRL_Adapter_CT {</span><br><span>  var boolean g_initialized := false;</span><br><span> </span><br><span>@@ -72,6 +80,7 @@</span><br><span>  var GSUP_Emulation_CT vc_GSUP;</span><br><span>       var IPA_Emulation_CT vc_GSUP_IPA;</span><br><span>    var SMPP_Emulation_CT vc_SMPP;</span><br><span style="color: hsl(120, 100%, 40%);">+        var SGsAP_Emulation_CT vc_SGsAP;</span><br><span> </span><br><span>         /* only to get events from IPA underneath GSUP */</span><br><span>    port IPA_CTRL_PT GSUP_IPA_EVENT;</span><br><span>@@ -107,6 +116,8 @@</span><br><span>       integer mp_msc_smpp_port := 2775;</span><br><span>    charstring mp_smpp_system_id := "msc_tester";</span><br><span>      charstring mp_smpp_password := "osmocom1";</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%);">+ charstring mp_vlr_name := "vlr.example.net";</span><br><span> </span><br><span>   BSSAP_Configurations mp_bssap_cfg := {</span><br><span>               {</span><br><span>@@ -193,6 +204,25 @@</span><br><span>     vc_MGCP.start(MGCP_Emulation.main(ops, pars, id));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+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(SGsAP_Emulation.DummyUnitdataCallback)</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 := mp_msc_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+               remote_sctp_port := 29118,</span><br><span style="color: hsl(120, 100%, 40%);">+            local_ip := "",</span><br><span style="color: hsl(120, 100%, 40%);">+             local_sctp_port := -1</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%);">+   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%);">+</span><br><span> function f_init_gsup(charstring id) runs on MTC_CT {</span><br><span>  id := id & "-GSUP";</span><br><span>    var GsupOps ops := {</span><br><span>@@ -247,6 +277,7 @@</span><br><span>   f_init_mgcp("MSC_Test");</span><br><span>   f_init_gsup("MSC_Test");</span><br><span>   f_init_smpp("MSC_Test");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_sgsap("MSC_Test");</span><br><span> </span><br><span>      map(self:MSCVTY, system:MSCVTY);</span><br><span>     f_vty_set_prompts(MSCVTY);</span><br><span>@@ -485,6 +516,9 @@</span><br><span>     /* SMPP part */</span><br><span>      connect(vc_conn:SMPP, vc_SMPP:SMPP_CLIENT);</span><br><span>  connect(vc_conn:SMPP_PROC, vc_SMPP:SMPP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* SGs 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> </span><br><span>        /* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have</span><br><span>       * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */</span><br><span>@@ -2985,6 +3019,980 @@</span><br><span>    * too long / short TLV values</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Perform a location updatye at the A-Interface and run some checks to confirm</span><br><span style="color: hsl(120, 100%, 40%);">+ * that everything is back to normal. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_sgsap_bssmap_screening()  runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       var SmsParameters spars := valueof(t_SmsPars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Perform a location update, the SGs association is expected to fall</span><br><span style="color: hsl(120, 100%, 40%);">+  * back to NULL */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Trigger a paging request and expect the paging on BSSMAP, this is</span><br><span style="color: hsl(120, 100%, 40%);">+   * to make sure that pagings are sent throught the A-Interface again</span><br><span style="color: hsl(120, 100%, 40%);">+   * and not throught the SGs interface.*/</span><br><span style="color: hsl(120, 100%, 40%);">+      f_bssmap_register_imsi(g_pars.imsi, g_pars.tmsi);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_Paging(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%);">+     [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   /* Send an SMS to make sure that also payload messages are routed</span><br><span style="color: hsl(120, 100%, 40%);">+      * throught the A-Interface again */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_establish_fully(EST_TYPE_MO_SMS);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_mo_sms(spars);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_expect_clear();</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%);">+private function f_tc_sgsap_reset(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring vlr_name;</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       vlr_name := f_sgsap_reset_mme(mp_mme_name);</span><br><span style="color: hsl(120, 100%, 40%);">+   log("VLR 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_reset() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_reset), 10);</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%);">+/* like f_mm_auth() but for SGs */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_mm_auth_sgs() runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (g_pars.net.expect_auth) {</span><br><span style="color: hsl(120, 100%, 40%);">+         g_pars.vec := f_gen_auth_vec_3g();</span><br><span style="color: hsl(120, 100%, 40%);">+            var GSUP_IE auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G3G(g_pars.vec.rand,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      g_pars.vec.sres,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      g_pars.vec.kc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        g_pars.vec.ik,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        g_pars.vec.ck,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        g_pars.vec.autn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      g_pars.vec.res));</span><br><span style="color: hsl(120, 100%, 40%);">+          GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+           GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));</span><br><span style="color: hsl(120, 100%, 40%);">+          SGsAP.receive(tr_ML3_MT_MM_AUTH_REQ_3G(g_pars.vec.rand, g_pars.vec.autn));</span><br><span style="color: hsl(120, 100%, 40%);">+            SGsAP.send(ts_ML3_MT_MM_AUTH_RESP_3G(g_pars.vec.sres, g_pars.vec.res));</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%);">+/* like f_perform_lu(), but on SGs rather than BSSAP */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sgs_perform_lu() runs on BSC_ConnHdlr {</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%);">+  var PDU_SGsAP lur;</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_SGsAP lua;</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_SGsAP mm_info;</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring mm_info_dtap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* tell GSUP dispatcher to send this IMSI to us */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_create_gsup_expect(hex2str(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lur := valueof(ts_SGsAP_LU_REQ(g_pars.imsi, mme_name, IMSI_attach,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Old LAI, if MS sends it */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TMSI status, if MS has no valid TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* IMEISV, if it supports "automatic device detection" */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TAI, if available in MME */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* E-CGI, if available in MME */</span><br><span style="color: hsl(120, 100%, 40%);">+      SGsAP.send(lur);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: is this really done over SGs?  The Ue is already authenticated</span><br><span style="color: hsl(120, 100%, 40%);">+       * via the MME ... */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_mm_auth_sgs();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Expect MSC to perform LU with HLR */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+   GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_LU_ACCEPT(g_pars.imsi, ?)) -> value lua {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (isvalue(lua.sGsAP_LOCATION_UPDATE_ACCEPT.newTMSIorIMSI.iD.iD.tmsi_ptmsi.octets)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        g_pars.tmsi :=lua.sGsAP_LOCATION_UPDATE_ACCEPT.newTMSIorIMSI.iD.iD.tmsi_ptmsi.octets</span><br><span style="color: hsl(120, 100%, 40%);">+                  SGsAP.send(ts_SGsAP_TMSI_REALL_CMPL(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</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_LU_REJECT(g_pars.imsi, ?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Received LU-REJECT instead of ACCEPT");</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 message on SGs");</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%);">+   /* Check MM information */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mp_mm_info == true) {</span><br><span style="color: hsl(120, 100%, 40%);">+             SGsAP.receive(tr_SGsAP_MM_INFO_REQ(g_pars.imsi, ?)) -> value mm_info;</span><br><span style="color: hsl(120, 100%, 40%);">+              mm_info_dtap := '0532'O & mm_info.sGsAP_MM_INFORMATION_REQUEST.mM_Information.information;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (not match(dec_PDU_ML3_NW_MS(mm_info_dtap), tr_ML3_MT_MM_Info)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "Unexpected MM Information");</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%);">+   f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</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%);">+private function f_tc_sgsap_lu(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_lu() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_lu), 10);</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%);">+/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_SGsAP lur;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_create_gsup_expect(hex2str(g_pars.imsi));</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%);">+  lur := valueof(ts_SGsAP_LU_REQ(g_pars.imsi, mme_name, IMSI_attach,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  SGsAP.send(lur);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));</span><br><span style="color: hsl(120, 100%, 40%);">+   alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_LU_REJECT(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%);">+     [] SGsAP.receive(tr_SGsAP_LU_ACCEPT(g_pars.imsi, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Expecting LU REJ, but got ACCEPT");</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%);">+     [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_lu_imsi_reject() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_tc_sgsap_lu_imsi_reject), 3);</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%);">+/* Do LU by IMSI, but then remain silent so that Ts6-1 times out */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_lu_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</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%);">+  var PDU_SGsAP lur;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* tell GSUP dispatcher to send this IMSI to us */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_create_gsup_expect(hex2str(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lur := valueof(ts_SGsAP_LU_REQ(g_pars.imsi, mme_name, IMSI_attach,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Old LAI, if MS sends it */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TMSI status, if MS has no valid TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+    /* IMEISV, if it supports "automatic device detection" */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TAI, if available in MME */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* E-CGI, if available in MME */</span><br><span style="color: hsl(120, 100%, 40%);">+      SGsAP.send(lur);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: is this really done over SGs?  The Ue is already authenticated</span><br><span style="color: hsl(120, 100%, 40%);">+       * via the MME ... */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_mm_auth_sgs();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Expect MSC to perform LU with HLR */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+    GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));</span><br><span style="color: hsl(120, 100%, 40%);">+       GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+   GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_LU_ACCEPT(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%);">+     [] SGsAP.receive(tr_SGsAP_LU_REJECT(g_pars.imsi, ?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Received LU-REJECT instead of ACCEPT");</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 message on SGs");</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%);">+   f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Wait until the VLR has abort the TMSI reallocation procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(45.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* The outcome does not change the SGs state, see also 5.2.3.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_lu_and_nothing() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_tc_sgsap_lu_and_nothing), 3);</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%);">+private function f_tc_sgsap_expl_imsi_det_eps(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+  SGsAP.send(ts_SGsAP_EPS_DETACH_IND(g_pars.imsi, mme_name, UE_initiated));</span><br><span style="color: hsl(120, 100%, 40%);">+     SGsAP.receive(tr_SGsAP_EPS_DETACH_ACK(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_expl_imsi_det_eps() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_expl_imsi_det_eps), 10);</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%);">+private function f_tc_sgsap_expl_imsi_det_noneps(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+  SGsAP.send(ts_SGsAP_IMSI_DETACH_IND(g_pars.imsi, mme_name, combined_UE_initiated));</span><br><span style="color: hsl(120, 100%, 40%);">+   SGsAP.receive(tr_SGsAP_IMSI_DETACH_ACK(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: How to verify that VLR has removed MM context? */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_expl_imsi_det_noneps() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_expl_imsi_det_noneps), 1081);</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%);">+/* Trigger a paging request via VTY and send a paging reject in response */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_paging_rej(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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 template PDU_SGsAP exp_resp := tr_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, CS_call_indicator, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template  LocationAreaId exp_lai := ts_SGsAP_IE_Lai(valueof(ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_resp.sGsAP_PAGING_REQUEST.locationAreaId := exp_lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Initiate paging via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(exp_resp) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   /* Now reject the paging */</span><br><span style="color: hsl(120, 100%, 40%);">+   SGsAP.send(ts_SGsAP_PAGING_REJ(g_pars.imsi, IMSI_unknown));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Wait for the states inside the MSC to settle and check the state</span><br><span style="color: hsl(120, 100%, 40%);">+    * of the SGs Association */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: At the moment we send an IMSI_unknown as cause code, which is fine,</span><br><span style="color: hsl(120, 100%, 40%);">+  * but we also need to cover tha case where the cause code indicates an</span><br><span style="color: hsl(120, 100%, 40%);">+        * "IMSI detached for EPS services". In those cases the VLR is expected to</span><br><span style="color: hsl(120, 100%, 40%);">+   * try paging on tha A/Iu interface. This will be another testcase similar to</span><br><span style="color: hsl(120, 100%, 40%);">+  * this one, but extended with checks for the presence of the A/Iu paging</span><br><span style="color: hsl(120, 100%, 40%);">+      * messages. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_paging_rej() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_paging_rej), 1082);</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%);">+/* Trigger a paging request via VTY and send a paging reject that indicates</span><br><span style="color: hsl(120, 100%, 40%);">+ * that the subscriber intentionally rejected the call. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_paging_subscr_rej(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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 template PDU_SGsAP exp_resp := tr_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, CS_call_indicator, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template  LocationAreaId exp_lai := ts_SGsAP_IE_Lai(valueof(ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_resp.sGsAP_PAGING_REQUEST.locationAreaId := exp_lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Initiate paging via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(exp_resp) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   /* Now reject the paging */</span><br><span style="color: hsl(120, 100%, 40%);">+   SGsAP.send(ts_SGsAP_PAGING_REJ(g_pars.imsi, user_rejected_mobile_terminating_CS_fallback_call));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Wait for the states inside the MSC to settle and check the state</span><br><span style="color: hsl(120, 100%, 40%);">+    * of the SGs Association */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: The VLR is supposed to trigger an User Determined User Busy (UDUB) as specified</span><br><span style="color: hsl(120, 100%, 40%);">+      * in 3GPP TS 24.082, this is not yet implemented in the MSC or in this tests, we need</span><br><span style="color: hsl(120, 100%, 40%);">+         * to check back how this works and how it can be tested */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_paging_subscr_rej() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_paging_subscr_rej), 1083);</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%);">+/* Trigger a paging request via VTY and send an UE unreacable messge in response */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_paging_ue_unr(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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 template PDU_SGsAP exp_resp := tr_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, CS_call_indicator, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template  LocationAreaId exp_lai := ts_SGsAP_IE_Lai(valueof(ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_resp.sGsAP_PAGING_REQUEST.locationAreaId := exp_lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Initiate paging via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(exp_resp) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   /* Now pretend that the UE is unreachable */</span><br><span style="color: hsl(120, 100%, 40%);">+  SGsAP.send(ts_SGsAP_UE_UNREACHABLE(g_pars.imsi, UE_unreachable));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Wait for the states inside the MSC to settle and check the state</span><br><span style="color: hsl(120, 100%, 40%);">+    * of the SGs Association. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_paging_ue_unr() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_paging_ue_unr), 10);</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%);">+/* Trigger a paging request via VTY but don't respond to it */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_paging_and_nothing(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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 template PDU_SGsAP exp_resp := tr_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, CS_call_indicator, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template  LocationAreaId exp_lai := ts_SGsAP_IE_Lai(valueof(ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+  exp_resp.sGsAP_PAGING_REQUEST.locationAreaId := exp_lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Initiate paging via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(exp_resp) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   /* Now do nothing, the MSC/VLR should fail silently to page after a</span><br><span style="color: hsl(120, 100%, 40%);">+    * few seconds, The SGs association must remain unchanged. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(15.0);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_paging_and_nothing() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_paging_and_nothing), 92);</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%);">+/* Trigger a paging request via VTY and slip in an LU */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_paging_and_lu(charstring id, BSC_ConnHdlrPars pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_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%);">+  f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* First we prepar the situation, where the SGs association is in state</span><br><span style="color: hsl(120, 100%, 40%);">+        * NULL and the confirmed by radio contact indicator is set to false</span><br><span style="color: hsl(120, 100%, 40%);">+   * as well. This can be archived by performing an SGs LU and then</span><br><span style="color: hsl(120, 100%, 40%);">+      * resetting the VLR */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sgsap_reset_mme(mp_mme_name);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Perform a paging, expect the paging messages on the SGs interface */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_PAGING_REQ(pars.imsi, vlr_name, CS_call_indicator, omit)) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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 the LU as normal */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expect a new paging request right after the LU */</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_PAGING_REQ(pars.imsi, vlr_name, CS_call_indicator, omit)) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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 is done now, lets round everything up by rejecting the paging</span><br><span style="color: hsl(120, 100%, 40%);">+  * cleanly. */</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.send(ts_SGsAP_PAGING_REJ(g_pars.imsi, user_rejected_mobile_terminating_CS_fallback_call));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_paging_and_lu() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_paging_and_lu), 9792);</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 unexpected unit-data through the SGs interface */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_unexp_ud(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* This simulates what happens when a subscriber without SGs</span><br><span style="color: hsl(120, 100%, 40%);">+   * association gets unitdata via the SGs interface. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Make sure the subscriber exists and the SGs association</span><br><span style="color: hsl(120, 100%, 40%);">+     * is in NULL state */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Send some random unit data, the MSC/VLR should send a release</span><br><span style="color: hsl(120, 100%, 40%);">+       * immediately. */</span><br><span style="color: hsl(120, 100%, 40%);">+    SGsAP.send(ts_SGsAP_UL_UD(pars.imsi,'1234'O));</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.receive(tr_SGsAP_RELEASE_REQ(pars.imsi, IMSI_detached_for_EPS_nonEPS_services));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_unexp_ud() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_unexp_ud), 2145);</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 unsolicited unit-data through the SGs interface */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_unsol_ud(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* This simulates what happens when the MME attempts to send unitdata</span><br><span style="color: hsl(120, 100%, 40%);">+  * to a subscriber that is completely unknown to the VLR */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send some random unit data, the MSC/VLR should send a release</span><br><span style="color: hsl(120, 100%, 40%);">+       * immediately. */</span><br><span style="color: hsl(120, 100%, 40%);">+    SGsAP.send(ts_SGsAP_UL_UD(pars.imsi,'1234'O));</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.receive(tr_SGsAP_RELEASE_REQ(pars.imsi, IMSI_unknown));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_unsol_ud() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_unsol_ud), 146);</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%);">+private altstep as_other_sms_sgs() runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: Match an actual payload (second questionmark), the type is</span><br><span style="color: hsl(120, 100%, 40%);">+   * octetstring, how do we use a tr_PDU_DTAP_MT here? */</span><br><span style="color: hsl(120, 100%, 40%);">+       [] SGsAP.receive(tr_SGsAP_DL_UD(?,?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Unexpected SMS related PDU from MSC");</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%);">+/* receive a MT-SMS delivered from the MSC/SMSC over an already existing SGsAP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_mt_sms_sgs(inout SmsParameters spars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (value) TPDU_RP_DATA_MS_SGSN tp_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) RPDU_MS_SGSN rp_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) PDU_ML3_MS_NW l3_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var template TPDU_RP_DATA_SGSN_MS tp_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template RPDU_SGSN_MS rp_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template PDU_ML3_NW_MS l3_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var PDU_ML3_NW_MS sgsap_l3_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var default d := activate(as_other_sms_sgs());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expect CP-DATA(RP-DATA(SMS-DELIVER)) */</span><br><span style="color: hsl(120, 100%, 40%);">+    tp_mt := tr_SMS_DELIVER(?, spars.tp.ud, spars.tp.pid, spars.tp.dcs, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+       rp_mt := tr_RP_DATA_MT(?, ?, omit, tp_mt);</span><br><span style="color: hsl(120, 100%, 40%);">+    l3_mt := tr_ML3_MT_SMS(?, c_TIF_ORIG, tr_CP_DATA_MT(rp_mt));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.receive(l3_mt) -> value sgsap_l3_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Extract relevant identifiers */</span><br><span style="color: hsl(120, 100%, 40%);">+    spars.tid := bit2int(sgsap_l3_mt.tiOrSkip.transactionId.tio);</span><br><span style="color: hsl(120, 100%, 40%);">+ spars.rp.msg_ref := sgsap_l3_mt.msgs.sms.cP_DATA.cP_User_Data.cP_RPDU.rP_DATA_SGSN_MS.rP_MessageReference;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* send CP-ACK for CP-DATA just received */</span><br><span style="color: hsl(120, 100%, 40%);">+   l3_mo := ts_ML3_MO_SMS(spars.tid, c_TIF_REPL, ts_CP_ACK_MO);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.send(l3_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* send RP-ACK for RP-DATA */</span><br><span style="color: hsl(120, 100%, 40%);">+ rp_mo := ts_RP_ACK_MO(spars.rp.msg_ref);</span><br><span style="color: hsl(120, 100%, 40%);">+      l3_mo := ts_ML3_MO_SMS(spars.tid, c_TIF_REPL, ts_CP_DATA_MO(rp_mo));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.send(l3_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* expect CP-ACK for CP-DATA(RP-ACK) just sent */</span><br><span style="color: hsl(120, 100%, 40%);">+     l3_mt := tr_ML3_MT_SMS(spars.tid, c_TIF_ORIG, tr_CP_ACK_MT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.receive(l3_mt);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       deactivate(d);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* submit a MO-SMS to MSC/SMSC over an already existing SGsAP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_mo_sms_sgs(inout SmsParameters spars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) TPDU_RP_DATA_MS_SGSN tp_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) RPDU_MS_SGSN rp_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (value) PDU_ML3_MS_NW l3_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var template TPDU_RP_DATA_SGSN_MS tp_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template RPDU_SGSN_MS rp_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+      var template PDU_ML3_NW_MS l3_mt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var default d := activate(as_other_sms_sgs());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* just in case this is routed to SMPP.. */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_create_smpp_expect(hex2str(spars.tp.da.tP_DA_NoPad.tP_DAValue));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  tp_mo := ts_SMS_SUBMIT(spars.tp.msg_ref, spars.tp.da, spars.tp.pid, spars.tp.dcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                              spars.tp.udl, spars.tp.ud);</span><br><span style="color: hsl(120, 100%, 40%);">+  rp_mo := ts_RP_DATA_MO(spars.rp.msg_ref, spars.rp.orig, spars.rp.dest, tp_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+        l3_mo := ts_ML3_MO_SMS(spars.tid, c_TIF_ORIG, ts_CP_DATA_MO(rp_mo));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.send(l3_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* receive CP-ACK for CP-DATA above */</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.receive(tr_ML3_MT_SMS(spars.tid, c_TIF_REPL, tr_CP_ACK_MT));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ispresent(spars.exp_rp_err)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* expect an RP-ERROR message from MSC with given cause */</span><br><span style="color: hsl(120, 100%, 40%);">+            rp_mt := tr_RP_ERROR_MT(spars.rp.msg_ref, spars.exp_rp_err);</span><br><span style="color: hsl(120, 100%, 40%);">+          l3_mt := tr_ML3_MT_SMS(spars.tid, c_TIF_REPL, tr_CP_DATA_MT(rp_mt));</span><br><span style="color: hsl(120, 100%, 40%);">+          SGsAP.receive(l3_mt);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* send CP-ACK for CP-DATA just received */</span><br><span style="color: hsl(120, 100%, 40%);">+           l3_mo := ts_ML3_MO_SMS(spars.tid, c_TIF_ORIG, ts_CP_ACK_MO);</span><br><span style="color: hsl(120, 100%, 40%);">+          SGsAP.send(l3_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* expect RP-ACK for RP-DATA */</span><br><span style="color: hsl(120, 100%, 40%);">+               rp_mt := tr_RP_ACK_MT(spars.rp.msg_ref);</span><br><span style="color: hsl(120, 100%, 40%);">+              l3_mt := tr_ML3_MT_SMS(spars.tid, c_TIF_REPL, tr_CP_DATA_MT(rp_mt));</span><br><span style="color: hsl(120, 100%, 40%);">+          SGsAP.receive(l3_mt);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* send CP-ACO for CP-DATA just received */</span><br><span style="color: hsl(120, 100%, 40%);">+           l3_mo := ts_ML3_MO_SMS(spars.tid, c_TIF_ORIG, ts_CP_ACK_MO);</span><br><span style="color: hsl(120, 100%, 40%);">+          SGsAP.send(l3_mo);</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%);">+   deactivate(d);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_vty_sms_send_conn_hdlr(charstring imsi, charstring msisdn, charstring text)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_vty_transceive(MSCVTY, "subscriber imsi "&imsi&" sms sender msisdn "&msisdn&" send "&text);</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 a MT SMS via SGs interface */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_mt_sms(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ var SmsParameters spars := valueof(t_SmsPars);</span><br><span style="color: hsl(120, 100%, 40%);">+        spars.tp.ud := 'C8329BFD064D9B53'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Trigger SMS via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_sms_send_conn_hdlr(hex2str(pars.imsi), "2342", "Hello SMS");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Expect a paging request and respond accordingly with a service request */</span><br><span style="color: hsl(120, 100%, 40%);">+  SGsAP.receive(tr_SGsAP_PAGING_REQ(pars.imsi, vlr_name, SMS_indicator, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+ SGsAP.send(ts_SGsAP_SERVICE_REQ(pars.imsi, SMS_indicator, EMM_CONNECTED));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Connection is now live, receive the MT-SMS */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_mt_sms_sgs(spars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Expect a concluding release from the MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+        SGsAP.receive(tr_SGsAP_RELEASE_REQ(pars.imsi, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Make sure that subscriber is still present and the SGs association is in tact (ref-counting) */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_mt_sms() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_mt_sms), 1145);</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 a MO SMS via SGs interface */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_mo_sms(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ var SmsParameters spars := valueof(t_SmsPars);</span><br><span style="color: hsl(120, 100%, 40%);">+        spars.tp.ud := 'C8329BFD064D9B53'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send the MO-SMS */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_mo_sms_sgs(spars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Expect a concluding release from the MSC/VLR */</span><br><span style="color: hsl(120, 100%, 40%);">+    SGsAP.receive(tr_SGsAP_RELEASE_REQ(pars.imsi, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Make sure that subscriber is still present and the SGs association is in tact (ref-counting) */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+   f_sgsap_bssmap_screening()</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_mo_sms() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_mo_sms), 3145);</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%);">+/* Trigger sending of an MT sms via VTY but never respond to anything  */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_mt_sms_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_handler(pars, 170.0);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var SmsParameters spars := valueof(t_SmsPars);</span><br><span style="color: hsl(120, 100%, 40%);">+        spars.tp.ud := 'C8329BFD064D9B53'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer page_count := 0;</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 template PDU_SGsAP exp_pag_req := tr_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, SMS_indicator, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+        var template LocationAreaId exp_lai := ts_SGsAP_IE_Lai(valueof(ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+   exp_pag_req.sGsAP_PAGING_REQUEST.locationAreaId := exp_lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Trigger SMS via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_sms_send_conn_hdlr(hex2str(pars.imsi), "2342", "Hello SMS");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expect the MSC/VLR to page exactly 10 times before giving up */</span><br><span style="color: hsl(120, 100%, 40%);">+    alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] SGsAP.receive(exp_pag_req)</span><br><span style="color: hsl(120, 100%, 40%);">+         {</span><br><span style="color: hsl(120, 100%, 40%);">+                     page_count := page_count + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (page_count < 10) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             repeat;</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%);">+             [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "unexpected SGsAP message received");</span><br><span style="color: hsl(120, 100%, 40%);">+                      self.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%);">+   /* Wait some time to make sure the MSC is not delivering any further</span><br><span style="color: hsl(120, 100%, 40%);">+   * paging messages or anything else that could be unexpected. */</span><br><span style="color: hsl(120, 100%, 40%);">+      timer T := 20.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] SGsAP.receive(exp_pag_req)</span><br><span style="color: hsl(120, 100%, 40%);">+         {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "paging seems not to stop!");</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%);">+             [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "unexpected SGsAP message received");</span><br><span style="color: hsl(120, 100%, 40%);">+                      self.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] T.timeout {</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%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Even on a failed paging the SGs Association should stay intact */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Note: We do not execute f_sgsap_bssmap_screening() here since the</span><br><span style="color: hsl(120, 100%, 40%);">+   * MSC/VLR would re-try to deliver the test SMS trigered above and</span><br><span style="color: hsl(120, 100%, 40%);">+     * so the screening would fail. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expire the subscriber now to avoid that the MSC will try the SMS</span><br><span style="color: hsl(120, 100%, 40%);">+    * delivery at some later point. */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " expire");</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_mt_sms_and_nothing() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_mt_sms_and_nothing), 4581);</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%);">+/* Trigger sending of an MT sms via VTY but reject the paging immediately */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_mt_sms_and_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_handler(pars, 150.0);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var SmsParameters spars := valueof(t_SmsPars);</span><br><span style="color: hsl(120, 100%, 40%);">+        spars.tp.ud := 'C8329BFD064D9B53'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer page_count := 0;</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 template PDU_SGsAP exp_pag_req := tr_SGsAP_PAGING_REQ(g_pars.imsi, vlr_name, SMS_indicator, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+        var template LocationAreaId exp_lai := ts_SGsAP_IE_Lai(valueof(ts_SGsAP_LAI('901'H, '70'H, 2342)));</span><br><span style="color: hsl(120, 100%, 40%);">+   exp_pag_req.sGsAP_PAGING_REQUEST.locationAreaId := exp_lai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Trigger SMS via VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_sms_send_conn_hdlr(hex2str(pars.imsi), "2342", "Hello SMS");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expect a paging request and reject it immediately */</span><br><span style="color: hsl(120, 100%, 40%);">+       SGsAP.receive(exp_pag_req);</span><br><span style="color: hsl(120, 100%, 40%);">+   SGsAP.send(ts_SGsAP_PAGING_REJ(g_pars.imsi, IMSI_unknown));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The MSC/VLR should no longer try to page once the paging has been</span><br><span style="color: hsl(120, 100%, 40%);">+   * rejected. Wait some time and check if there are no unexpected</span><br><span style="color: hsl(120, 100%, 40%);">+       * messages on the SGs interface. */</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T := 20.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] SGsAP.receive(exp_pag_req)</span><br><span style="color: hsl(120, 100%, 40%);">+         {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "paging seems not to stop!");</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%);">+             [] SGsAP.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "unexpected SGsAP message received");</span><br><span style="color: hsl(120, 100%, 40%);">+                      self.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] T.timeout {</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%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* A rejected paging with IMSI_unknown (see above) should always send</span><br><span style="color: hsl(120, 100%, 40%);">+  * the SGs association to NULL. */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Expire the subscriber now to avoid that the MSC will try the SMS</span><br><span style="color: hsl(120, 100%, 40%);">+    * delivery at some later point. */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " expire");</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+testcase TC_sgsap_mt_sms_and_reject() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := f_start_handler(refers(f_tc_sgsap_mt_sms_and_reject), 4145);</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%);">+/* Perform an MT CSDB call including LU */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_mt_lu_and_csfb_call(charstring id, BSC_ConnHdlrPars pars, boolean bssmap_lu) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_handler(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Be sure that the BSSMAP reset is done before we begin. */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Testcase variation: See what happens when we do a regular BSSMAP</span><br><span style="color: hsl(120, 100%, 40%);">+    * LU first (this should not hurt in any way!) */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (bssmap_lu) {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_perform_lu();</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%);">+   f_sgs_perform_lu();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</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 CallParameters cpars := valueof(t_CallParams('12345'H, 0));</span><br><span style="color: hsl(120, 100%, 40%);">+       cpars.bss_rtp_port := 1110;</span><br><span style="color: hsl(120, 100%, 40%);">+   cpars.mgcp_connection_id_bss := '10004'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     cpars.mgcp_connection_id_mss := '10005'H;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Note: This is an optional parameter. When the call-agent (MSC) does</span><br><span style="color: hsl(120, 100%, 40%);">+         * supply a full endpoint name this setting will be overwritten. */</span><br><span style="color: hsl(120, 100%, 40%);">+   cpars.mgcp_ep := "rtpbridge/1@mgw";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Initiate a call via MNCC interface */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_mt_call_initate(cpars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Expect a paging request and respond accordingly with a service request */</span><br><span style="color: hsl(120, 100%, 40%);">+  SGsAP.receive(tr_SGsAP_PAGING_REQ(pars.imsi, vlr_name, CS_call_indicator, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+     SGsAP.send(ts_SGsAP_SERVICE_REQ(pars.imsi, CS_call_indicator, EMM_CONNECTED));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Complete the call, hold it for some time and then tear it down */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_mt_call_complete(cpars);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_call_hangup(cpars, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure that subscriber is still present and the SGs association is in tact (ref-counting) */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrl_get_exp(IPA_CTRL, "fsm.SGs-UE.id.imsi:" & hex2str(g_pars.imsi) & ".state", "SGs-ASSOCIATED");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Finally simulate the return of the UE to the 4G network */</span><br><span style="color: hsl(120, 100%, 40%);">+ SGsAP.send(ts_SGsAP_MO_CSFB_IND(pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Test for successful return by triggering a paging, when the paging</span><br><span style="color: hsl(120, 100%, 40%);">+  * request is received via SGs, we can be sure that the MSC/VLR has</span><br><span style="color: hsl(120, 100%, 40%);">+    * recognized that the UE is now back on 4G */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(MSCVTY, "subscriber imsi " & hex2str(g_pars.imsi) & " paging");</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] SGsAP.receive(tr_SGsAP_PAGING_REQ(pars.imsi, vlr_name, CS_call_indicator, omit)) {</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 {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Received unexpected message on SGs");</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%);">+   f_sgsap_bssmap_screening();</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Perform a regular BSSAP LU first, do a SGSAP LU and then make a CSFB call */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_bssap_lu_sgsap_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_mt_lu_and_csfb_call(id, pars, true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_bssap_lu_sgsap_lu_and_mt_call() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_tc_bssap_lu_sgsap_lu_and_mt_call), 139);</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%);">+/* Perform a SGSAP LU and then make a CSFB call */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_sgsap_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_mt_lu_and_csfb_call(id, pars, false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sgsap_lu_and_mt_call() runs on MTC_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := f_start_handler(refers(f_tc_sgsap_lu_and_mt_call), 239);</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%);">+/* SGs TODO:</span><br><span style="color: hsl(120, 100%, 40%);">+   * LU attempt for IMSI without NAM_PS in HLR</span><br><span style="color: hsl(120, 100%, 40%);">+   * LU attempt with AUTH FAIL due to invalid RES/SRES</span><br><span style="color: hsl(120, 100%, 40%);">+   * LU attempt with no response from HLR (VLR should timeout + LU REJ)</span><br><span style="color: hsl(120, 100%, 40%);">+   * LU attempt with new TMSI but without TMSI REALL CMPL baco to VLR</span><br><span style="color: hsl(120, 100%, 40%);">+   * implicit IMSI detach from EPS</span><br><span style="color: hsl(120, 100%, 40%);">+   * implicit IMSI detach from non-EPS</span><br><span style="color: hsl(120, 100%, 40%);">+   * MM INFO</span><br><span style="color: hsl(120, 100%, 40%);">+   *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> </span><br><span> control {</span><br><span>       execute( TC_cr_before_reset() );</span><br><span>@@ -3051,6 +4059,26 @@</span><br><span> </span><br><span>        execute( TC_cipher_complete_with_invalid_cipher() );</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_sgsap_reset() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_sgsap_lu() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sgsap_lu_imsi_reject() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_sgsap_lu_and_nothing() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_sgsap_expl_imsi_det_eps() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_sgsap_expl_imsi_det_noneps() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_sgsap_paging_rej() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sgsap_paging_subscr_rej() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_sgsap_paging_ue_unr() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_sgsap_paging_and_nothing() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sgsap_paging_and_lu() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_sgsap_mt_sms() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_sgsap_mo_sms() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_sgsap_mt_sms_and_nothing() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sgsap_mt_sms_and_reject() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_sgsap_unexp_ud() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_sgsap_unsol_ud() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_bssap_lu_sgsap_lu_and_mt_call() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_sgsap_lu_and_mt_call() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* Run this last: at the time of writing this test crashes the MSC */</span><br><span>        execute( TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug() );</span><br><span>    execute( TC_mo_cc_bssmap_clear() );</span><br><span>diff --git a/msc/expected-results.xml b/msc/expected-results.xml</span><br><span>index b9c60c0..8a5822d 100644</span><br><span>--- a/msc/expected-results.xml</span><br><span>+++ b/msc/expected-results.xml</span><br><span>@@ -74,4 +74,23 @@</span><br><span>   <testcase classname='MSC_Tests' name='TC_cipher_complete_with_invalid_cipher' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_lu_imsi_auth_tmsi_encr_3_1_log_msc_debug' time='MASKED'/></span><br><span>   <testcase classname='MSC_Tests' name='TC_mo_cc_bssmap_clear' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_reset' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_lu' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_lu_imsi_reject' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_lu_and_nothing' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_expl_imsi_det_eps' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_expl_imsi_det_noneps' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_paging_rej' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_paging_subscr_rej' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_paging_ue_unr' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_paging_and_nothing' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_paging_and_lu' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_unexp_ud' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_unsol_ud' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_mt_sms' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_mo_sms' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_mt_sms_and_nothing' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_mt_sms_and_reject' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_bssap_lu_sgsap_lu_and_mt_call' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MSC_Tests' name='TC_sgsap_lu_and_mt_call' time='MASKED'/></span><br><span> </testsuite></span><br><span>diff --git a/msc/gen_links.sh b/msc/gen_links.sh</span><br><span>index 5d73fea..117564e 100755</span><br><span>--- a/msc/gen_links.sh</span><br><span>+++ b/msc/gen_links.sh</span><br><span>@@ -94,7 +94,7 @@</span><br><span> FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "</span><br><span> FILES+="SMPP_CodecPort.ttcn SMPP_CodecPort_CtrlFunct.ttcn SMPP_CodecPort_CtrlFunctDef.cc SMPP_Emulation.ttcn SMPP_Templates.ttcn "</span><br><span> FILES+="SS_Templates.ttcn SCCP_Templates.ttcn USSD_Helpers.ttcn "</span><br><span style="color: hsl(0, 100%, 40%);">-FILES+="SGsAP_Templates.ttcn "</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> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/msc/regen_makefile.sh b/msc/regen_makefile.sh</span><br><span>index 556d69e..5645fdd 100755</span><br><span>--- a/msc/regen_makefile.sh</span><br><span>+++ b/msc/regen_makefile.sh</span><br><span>@@ -1,6 +1,6 @@</span><br><span> #!/bin/sh</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc  SCTPasp_PT.cc  TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc SMPP_EncDec.cc SMPP_CodecPort_CtrlFunctDef.cc MAP_EncDec.cc SS_EncDec.cc TCCEncoding.cc *.c *.asn"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc  SCTPasp_PT.cc  TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc SMPP_EncDec.cc SMPP_CodecPort_CtrlFunctDef.cc MAP_EncDec.cc SS_EncDec.cc TCCEncoding.cc SGsAP_CodecPort_CtrlFunctDef.cc *.c *.asn"</span><br><span> </span><br><span> export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP -DIPA_EMULATION_SCCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11488">change 11488</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/11488"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I38543c35a9e74cea276e58d1d7ef01ef07ffe858 </div>
<div style="display:none"> Gerrit-Change-Number: 11488 </div>
<div style="display:none"> Gerrit-PatchSet: 20 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-CC: dexter <pmaier@sysmocom.de> </div>