<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20373">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: implement initial LCS tests for OsmoBSC<br><br>Change-Id: Id3df9439752c088cff5618d21254af42365690ca<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/MSC_ConnectionHandler.ttcn<br>2 files changed, 573 insertions(+), 31 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/73/20373/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index a42b33d..3d96df1 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -30,6 +30,8 @@</span><br><span> import from RAN_Adapter all;</span><br><span> import from BSSAP_LE_Adapter all;</span><br><span> import from BSSAP_LE_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_LE_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSLAP_Types all;</span><br><span> import from BSSAP_CodecPort all;</span><br><span> import from BSSMAP_Templates all;</span><br><span> import from IPA_Emulation all;</span><br><span>@@ -63,6 +65,7 @@</span><br><span> </span><br><span> import from SCCP_Templates all;</span><br><span> import from BSSMAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSMAP_LE_Templates all;</span><br><span> </span><br><span> import from SCCPasp_Types all;</span><br><span> </span><br><span>@@ -4490,12 +4493,12 @@</span><br><span>    f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_verify_active_layer3() runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_verify_active_layer3(RSL_DCHAN_PT rsl := RSL) runs on MSC_ConnHdlr</span><br><span> {</span><br><span>      /* The old lchan and conn should still be active. See that arbitrary L3</span><br><span>       * is still going through. */</span><br><span>        var octetstring l3 := '0123456789'O;</span><br><span style="color: hsl(0, 100%, 40%);">-    RSL.send(ts_RSL_DATA_IND(g_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));</span><br><span style="color: hsl(120, 100%, 40%);">+      rsl.send(ts_RSL_DATA_IND(g_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));</span><br><span>     var template PDU_BSSAP exp_data := {</span><br><span>                     discriminator := '1'B,</span><br><span>               spare := '0000000'B,</span><br><span>@@ -6108,6 +6111,22 @@</span><br><span> template MobileIdentityLV ts_MI_TMSI_NRI_LV(integer nri_v, integer nri_bitlen := 10) :=</span><br><span>         ts_MI_TMSI_LV(tmsi := f_tmsi_nri(nri_v, nri_bitlen := nri_bitlen));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_expect_lchan_rel(RSL_DCHAN_PT rsl) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] rsl.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_RELEASE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_logp(BSCVTY, "Got RSL RR Release");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] rsl.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_logp(BSCVTY, "Got RSL Deact SACCH");</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] rsl.receive(tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_logp(BSCVTY, "Got RSL RF Chan Rel, sending Rel Ack");</span><br><span style="color: hsl(120, 100%, 40%);">+                     rsl.send(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr));</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_perform_clear(RSL_DCHAN_PT rsl) runs on MSC_ConnHdlr {</span><br><span>  f_logp(BSCVTY, "MSC instructs BSC to clear channel");</span><br><span>      BSSAP.send(ts_BSSMAP_ClearCommand(0));</span><br><span>@@ -6130,7 +6149,7 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_perform_compl_l3(RSL_DCHAN_PT rsl, template PDU_ML3_MS_NW l3_info, boolean do_clear := true)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_perform_compl_l3(RSL_DCHAN_PT rsl, template PDU_ML3_MS_NW l3_info, boolean do_clear := true, boolean expect_bssmap_l3 := true)</span><br><span> runs on MSC_ConnHdlr {</span><br><span>       timer T := 10.0;</span><br><span>     var octetstring l3_enc := enc_PDU_ML3_MS_NW(valueof(l3_info));</span><br><span>@@ -6173,34 +6192,36 @@</span><br><span>     rsl.send(ts_RSL_EST_IND(g_chan_nr, valueof(g_pars.link_id), l3_enc));</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   f_logp(BSCVTY, "expect BSSAP Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(0, 100%, 40%);">-  var template PDU_BSSAP exp_l3_compl;</span><br><span style="color: hsl(0, 100%, 40%);">-    exp_l3_compl := tr_BSSMAP_ComplL3()</span><br><span style="color: hsl(0, 100%, 40%);">-     if (g_pars.aoip == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-             exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := omit;</span><br><span style="color: hsl(0, 100%, 40%);">-    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := ?;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (expect_bssmap_l3) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_logp(BSCVTY, "expect BSSAP Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+                var template PDU_BSSAP exp_l3_compl;</span><br><span style="color: hsl(120, 100%, 40%);">+          exp_l3_compl := tr_BSSMAP_ComplL3()</span><br><span style="color: hsl(120, 100%, 40%);">+           if (g_pars.aoip == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+          } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      exp_l3_compl.pdu.bssmap.completeLayer3Information.codecList := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   var PDU_BSSAP bssap;</span><br><span style="color: hsl(0, 100%, 40%);">-    T.start;</span><br><span style="color: hsl(0, 100%, 40%);">-        alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(exp_l3_compl) -> value bssap {</span><br><span style="color: hsl(0, 100%, 40%);">-              f_logp(BSCVTY, "received expected Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(0, 100%, 40%);">-             log("rx exp_l3_compl = ", bssap);</span><br><span style="color: hsl(120, 100%, 40%);">+           var PDU_BSSAP bssap;</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%);">+         [] BSSAP.receive(exp_l3_compl) -> value bssap {</span><br><span style="color: hsl(120, 100%, 40%);">+                    f_logp(BSCVTY, "received expected Complete Layer 3 Info at MSC");</span><br><span style="color: hsl(120, 100%, 40%);">+                   log("rx exp_l3_compl = ", bssap);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] BSSAP.receive(tr_BSSMAP_ComplL3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received non-matching COMPLETE LAYER 3 INFORMATION");</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%);">+                        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BSSAP.receive(tr_BSSMAP_ComplL3) {</span><br><span style="color: hsl(0, 100%, 40%);">-           Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received non-matching COMPLETE LAYER 3 INFORMATION");</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* start ciphering, if requested */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (ispresent(g_pars.encr)) {</span><br><span style="color: hsl(0, 100%, 40%);">-           f_logp(BSCVTY, "start ciphering");</span><br><span style="color: hsl(0, 100%, 40%);">-            f_cipher_mode(g_pars.encr.enc_alg, g_pars.encr.enc_key);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* start ciphering, if requested */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ispresent(g_pars.encr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_logp(BSCVTY, "start ciphering");</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_cipher_mode(g_pars.encr.enc_alg, g_pars.encr.enc_key);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>    }</span><br><span> </span><br><span>        if (do_clear) {</span><br><span>@@ -7510,6 +7531,514 @@</span><br><span>    f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_BSSAP_LE ts_BSSMAP_LE_BSSLAP(template (value) BSSLAP_PDU bsslap)</span><br><span style="color: hsl(120, 100%, 40%);">+  := ts_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_match_bsslap(PDU_BSSAP_LE got_bsslap_msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template (present) BSSLAP_PDU expect_bsslap)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSLAP_PDU bsslap := dec_BSSLAP_PDU(got_bsslap_msg.pdu.bssmap.co_info.bsslap_apdu.data);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (not match(bsslap, expect_bsslap)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               log("EXPECTING BSSLAP: ", expect_bsslap);</span><br><span style="color: hsl(120, 100%, 40%);">+           log("GOT BSSLAP: ", bsslap);</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "BSSLAP is not as expected");</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%);">+     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%);">+/* GAD: this is an Ellipsoid point with uncertainty circle, encoded as in 3GPP TS 23.032 ยง7.3.2. */</span><br><span style="color: hsl(120, 100%, 40%);">+const octetstring gad_ell_point_unc_circle := '10b0646d0d5f6627'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_expect_bsslap(template (present) BSSLAP_PDU expect_rx_bsslap) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   var PDU_BSSAP_LE rx_bsslap;</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.receive(tr_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, ?)) -> value(rx_bsslap);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_match_bsslap(rx_bsslap, expect_rx_bsslap);</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_lcs_loc_req_for_active_ms(boolean do_ta_request := false) runs on MSC_ConnHdlr {</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%);">+       f_establish_fully(omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_logp(BSCVTY, "f_tc_lcs_loc_req_for_active_ms start");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP.send(valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_CellId_CGI('262'H, '42'H, 23, 42))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_BSSAP_LE plr;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?)) -> value(plr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not do_ta_request) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* verify TA Layer 3 in APDU. First the APDU type (BSSLAP), then the BSSLAP data contents. */</span><br><span style="color: hsl(120, 100%, 40%);">+         var template BSSMAP_LE_IE_APDU expect_apdu := tr_BSSMAP_LE_APDU(BSSMAP_LE_PROT_BSSLAP, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not match(plr.pdu.bssmap.perf_loc_req.bsslap_apdu, expect_apdu)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        log("EXPECTING BSSMAP-LE APDU IE ", expect_apdu);</span><br><span style="color: hsl(120, 100%, 40%);">+                   log("GOT BSSMAP-LE APDU IE ", plr.pdu.bssmap.perf_loc_req.bsslap_apdu);</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "BSSMAP-LE APDU IE is not as expected");</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%);">+             var template BSSLAP_PDU expect_ta_layer3 := tr_BSSLAP_TA_Layer3(tr_BSSLAP_IE_TA(0));</span><br><span style="color: hsl(120, 100%, 40%);">+          var BSSLAP_PDU bsslap := dec_BSSLAP_PDU(plr.pdu.bssmap.perf_loc_req.bsslap_apdu.data);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (not match(bsslap, expect_ta_layer3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("EXPECTING BSSLAP TA Layer 3: ", expect_ta_layer3);</span><br><span style="color: hsl(120, 100%, 40%);">+                     log("GOT BSSLAP: ", bsslap);</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "BSSLAP is not as expected");</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%);">+             /* OsmoBSC directly sent the TA as BSSLAP APDU in the BSSMAP-LE Perform Location Request to the SMLC. The SMLC</span><br><span style="color: hsl(120, 100%, 40%);">+                 * has no need to request the TA from the BSC and directly responds. */</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* SMLC wants to ask the TA from the BSC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+         BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_expect_bsslap(tr_BSSLAP_TA_Resp(?, ?));</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%);">+   /* SMLC got the TA from the BSC, now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.send(ts_BSSMAP_LE_PerfLocResp(gad_ell_point_unc_circle, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP.receive(tr_BSSMAP_Perform_Location_Response(tr_BSSMAP_IE_LocationEstimate(gad_ell_point_unc_circle)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The LCS was using an active A-interface conn. It should still remain active after this. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_verify_active_layer3();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_clear(RSL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_lcs_loc_req_for_active_ms done");</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_tc_lcs_loc_req_for_active_ms(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_lcs_loc_req_for_active_ms(false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_lcs_loc_req_for_active_ms() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_tc_lcs_loc_req_for_active_ms), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_lcs_loc_req_for_active_ms_ta_req(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_lcs_loc_req_for_active_ms(true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_lcs_loc_req_for_active_ms_ta_req() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_tc_lcs_loc_req_for_active_ms_ta_req), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_clear_A_conn() runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssmapCause cause := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP.send(ts_BSSMAP_ClearCommand(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   timer no_more_bssap := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+   no_more_bssap.start;</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] no_more_bssap.timeout { break; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_BSSAP_BSSMAP) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Expected no more BSSAP after Clear Complete");</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%);">+     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_verify_active_A_conn_and_clear() runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   f_logp(BSCVTY, "f_verify_active_A_conn_and_clear: test A link, then clear");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* When an lchan is active, we can send some L3 data from the BTS side and verify that it shows up on the other</span><br><span style="color: hsl(120, 100%, 40%);">+        * side towards the MSC. When there is no lchan, this is not possible. To probe whether the A-interface</span><br><span style="color: hsl(120, 100%, 40%);">+        * connection is still up, we need something that echos back on the A-interface. Another LCS request! */</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP.send(valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_CellId_CGI('262'H, '42'H, 23, 42))));</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Right, the Perform Location Request showed up on Lb, now we can clear the A conn. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_clear_A_conn();</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocAbort(BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED));</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_logp(BSCVTY, "f_verify_active_A_conn_and_clear: 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_lcs_loc_req_for_idle_ms(charstring id) runs on MSC_ConnHdlr {</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%);">+       f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Register to receive the Paging Command */</span><br><span style="color: hsl(120, 100%, 40%);">+  var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));</span><br><span style="color: hsl(120, 100%, 40%);">+        g_chan_nr := new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rslem_register(0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_logp(BSCVTY, "f_tc_lcs_loc_req_for_idle_ms start");</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                          ts_CellId_CGI('001'H, '01'H, 1, 0)))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_BSSAP_LE plr;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?)) -> value(plr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* SMLC wants to ask the TA from the BSC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* OsmoBSC needs to Page */</span><br><span style="color: hsl(120, 100%, 40%);">+   RSL.receive(tr_RSL_PAGING_CMD(tr_MI_IMSI(g_pars.imsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_logp(BSCVTY, "got Paging Command");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* MS requests channel. Since the Paging was for LCS, the Paging Response does not trigger a Complete Layer 3 to</span><br><span style="color: hsl(120, 100%, 40%);">+       * the MSC, and releases the lchan directly. */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_perform_compl_l3(RSL, ts_PAG_RESP(valueof(ts_MI_IMSI_LV(g_pars.imsi))), do_clear := false, expect_bssmap_l3 := false);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_expect_lchan_rel(RSL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* From the Paging Response, the TA is now known to the BSC, and it responds to the SMLC. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_expect_bsslap(tr_BSSLAP_TA_Resp(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* SMLC got the TA from the BSC, now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.send(ts_BSSMAP_LE_PerfLocResp(gad_ell_point_unc_circle, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP.receive(tr_BSSMAP_Perform_Location_Response(tr_BSSMAP_IE_LocationEstimate(gad_ell_point_unc_circle)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The lchan is gone, the A-interface conn was created for the LCS only.</span><br><span style="color: hsl(120, 100%, 40%);">+       * Still it is clearly the MSC's job to decide whether to tear down the conn or not. */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_verify_active_A_conn_and_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_lcs_loc_req_for_idle_ms done");</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_lcs_loc_req_for_idle_ms() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</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%);">+       pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;</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_lcs_loc_req_for_idle_ms), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_lcs_loc_req_no_subscriber(charstring id) runs on MSC_ConnHdlr {</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%);">+       f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_logp(BSCVTY, "f_tc_lcs_loc_req_no_subscriber start");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* provoke an abort by omitting both IMSI and IMEI */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                              valueof(ts_BSSMAP_Perform_Location_Request(omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      ts_CellId_CGI('262'H, '42'H, 23, 42)))));</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* BSC tells MSC about failure */</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_Perform_Location_Response(</span><br><span style="color: hsl(120, 100%, 40%);">+                    locationEstimate := omit, positioningData := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                    lCS_Cause := tr_BSSMAP_LcsCause(BSSMAP_LE_LCS_CAUSE_DATA_MISSING_IN_REQ)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* There is no lchan. Still the MSC's job to decide whether to tear down the conn or not. */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_verify_active_A_conn_and_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_lcs_loc_req_no_subscriber done");</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_lcs_loc_req_no_subscriber() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</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%);">+       pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;</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_lcs_loc_req_no_subscriber), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_lcs_loc_req_for_active_ms_le_timeout(boolean do_ta) runs on MSC_ConnHdlr {</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%);">+       f_establish_fully(omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_logp(BSCVTY, "f_tc_lcs_loc_req_for_active_ms_le_timeout start");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSAP.send(valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_CellId_CGI('262'H, '42'H, 23, 42))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_BSSAP_LE plr;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?)) -> value(plr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (do_ta) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* SMLC wants to ask the TA from the BSC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+         BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_expect_bsslap(tr_BSSLAP_TA_Resp(?, ?));</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%);">+   /* SMLC fails to respond, BSC runs into timeout */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocAbort(BSSMAP_LE_LCS_CAUSE_SYSTEM_FAILURE));</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP.receive(tr_BSSMAP_Perform_Location_Response(</span><br><span style="color: hsl(120, 100%, 40%);">+                    locationEstimate := omit, positioningData := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                    lCS_Cause := tr_BSSMAP_LcsCause(BSSMAP_LE_LCS_CAUSE_SYSTEM_FAILURE)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* There is no lchan. Still the MSC's job to decide whether to tear down the conn or not. */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_verify_active_A_conn_and_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_lcs_loc_req_for_active_ms_le_timeout done");</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_tc_lcs_loc_req_for_active_ms_le_timeout(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_lcs_loc_req_for_active_ms_le_timeout(false);</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_lcs_loc_req_for_active_ms_le_timeout() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_tc_lcs_loc_req_for_active_ms_le_timeout), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_lcs_loc_req_for_active_ms_le_timeout2(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_lcs_loc_req_for_active_ms_le_timeout(true);</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_lcs_loc_req_for_active_ms_le_timeout2() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_tc_lcs_loc_req_for_active_ms_le_timeout2), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_lcs_loc_req_for_idle_ms_no_pag_resp(charstring id) runs on MSC_ConnHdlr {</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%);">+       f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Register to receive the Paging Command */</span><br><span style="color: hsl(120, 100%, 40%);">+  var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));</span><br><span style="color: hsl(120, 100%, 40%);">+        g_chan_nr := new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rslem_register(0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_logp(BSCVTY, "f_tc_lcs_loc_req_for_idle_ms_no_pag_resp start");</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                          ts_CellId_CGI('001'H, '01'H, 1, 0)))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_BSSAP_LE plr;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?)) -> value(plr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* SMLC wants to ask the TA from the BSC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* OsmoBSC needs to Page */</span><br><span style="color: hsl(120, 100%, 40%);">+   var PDU_BSSAP_LE rx_bsslap;</span><br><span style="color: hsl(120, 100%, 40%);">+   alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSL.receive(tr_RSL_PAGING_CMD(tr_MI_IMSI(g_pars.imsi))) {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_logp(BSCVTY, "got Paging Command");</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%);">+     [] BSSAP_LE.receive(tr_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, ?)) -> value(rx_bsslap) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* MS does not respond to Paging, TA Req runs into timeout. */</span><br><span style="color: hsl(120, 100%, 40%);">+                f_match_bsslap(rx_bsslap, tr_BSSLAP_Abort(?));</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%);">+   /* SMLC responds with failure */</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.send(ts_BSSMAP_LE_PerfLocResp(omit, BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED));</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BSC tells MSC about failure */</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_Perform_Location_Response(</span><br><span style="color: hsl(120, 100%, 40%);">+                    locationEstimate := omit, positioningData := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                    lCS_Cause := tr_BSSMAP_LcsCause(BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* There is no lchan. Still the MSC's job to decide whether to tear down the conn or not. */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_verify_active_A_conn_and_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_lcs_loc_req_for_idle_ms_no_pag_resp done");</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_lcs_loc_req_for_idle_ms_no_pag_resp() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</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%);">+       pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;</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_lcs_loc_req_for_idle_ms_no_pag_resp), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_cm_service_during_lcs_loc_req(charstring id) runs on MSC_ConnHdlr {</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%);">+       f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Register to receive the Paging Command */</span><br><span style="color: hsl(120, 100%, 40%);">+  var RslChannelNr new_chan_nr := valueof(t_RslChanNr0(1, RSL_CHAN_NR_Bm_ACCH));</span><br><span style="color: hsl(120, 100%, 40%);">+        g_chan_nr := new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rslem_register(0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_logp(BSCVTY, "f_tc_cm_service_during_lcs_loc_req start");</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_bsc, g_pars.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                          ts_CellId_CGI('001'H, '01'H, 1, 0)))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_BSSAP_LE plr;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?)) -> value(plr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* As the A-interface conn was established for LCS, the MS coincidentally decides to issue a CM Service Request</span><br><span style="color: hsl(120, 100%, 40%);">+        * and establish Layer 3. It should use the existing A-interface conn. */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_perform_compl_l3(RSL, valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV(g_pars.imsi)))),</span><br><span style="color: hsl(120, 100%, 40%);">+                        do_clear := false, expect_bssmap_l3 := true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* SMLC wants to ask the TA from the BSC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* OsmoBSC already has an lchan, no need to Page, just returns the TA */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_expect_bsslap(tr_BSSLAP_TA_Resp(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* SMLC got the TA from the BSC, now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.send(ts_BSSMAP_LE_PerfLocResp(gad_ell_point_unc_circle, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP.receive(tr_BSSMAP_Perform_Location_Response(tr_BSSMAP_IE_LocationEstimate(gad_ell_point_unc_circle)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The lchan should still exist, it was from a CM Service Request. */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_verify_active_layer3();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_perform_clear(RSL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_cm_service_during_lcs_loc_req done");</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_cm_service_during_lcs_loc_req() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1, true);</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%);">+       pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;</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_cm_service_during_lcs_loc_req), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_during_lcs_loc_req(charstring id) runs on MSC_ConnHdlr {</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%);">+       f_establish_fully(omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_logp(BSCVTY, "f_tc_ho_during_lcs_loc_req start");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ts_CellId_CGI('262'H, '42'H, 23, 42))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_BSSAP_LE plr;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?)) -> value(plr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* SMLC ponders the Location Request, in the meantime the BSC decides to handover */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bts_0_cfg(BSCVTY, {"neighbor bts 1"});</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var HandoverState hs := {</span><br><span style="color: hsl(120, 100%, 40%);">+             rr_ho_cmpl_seen := false,</span><br><span style="color: hsl(120, 100%, 40%);">+             handover_done := false,</span><br><span style="color: hsl(120, 100%, 40%);">+               old_chan_nr := -</span><br><span style="color: hsl(120, 100%, 40%);">+      };</span><br><span style="color: hsl(120, 100%, 40%);">+    /* issue hand-over command on VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_handover(BSCVTY, 0, 0, g_chan_nr, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* temporarily suspend DChan processing on BTS1 to avoid race with RSLEM_register */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rslem_suspend(RSL1_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* From the MGW perspective, a handover is is characterized by</span><br><span style="color: hsl(120, 100%, 40%);">+         * performing one MDCX operation with the MGW. So we expect to see</span><br><span style="color: hsl(120, 100%, 40%);">+     * one more MDCX during handover. */</span><br><span style="color: hsl(120, 100%, 40%);">+  g_media.mgcp_conn[0].mdcx_seen_exp := g_media.mgcp_conn[0].crcx_seen_exp + 1;</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%);">+ [] as_handover(hs);</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%);">+   var PDU_BSSAP_LE rx_bsslap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expect the BSC to inform the MSC about the handover */</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_HandoverPerformed);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expect the BSC to inform the SMLC about the handover */</span><br><span style="color: hsl(120, 100%, 40%);">+    [] BSSAP_LE.receive(tr_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, ?)) -> value(rx_bsslap) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_match_bsslap(rx_bsslap, tr_BSSLAP_Reset(BSSLAP_CAUSE_INTRA_BSS_HO));</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%);">+   /* SMLC now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP_LE.send(ts_BSSMAP_LE_PerfLocResp(gad_ell_point_unc_circle, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP.receive(tr_BSSMAP_Perform_Location_Response(tr_BSSMAP_IE_LocationEstimate(gad_ell_point_unc_circle)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* lchan still active */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_verify_active_layer3(RSL1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* MSC decides it is done now. */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_perform_clear(RSL1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_ho_during_lcs_loc_req done");</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_ho_during_lcs_loc_req() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(2, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_tc_ho_during_lcs_loc_req), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Dyn PDCH todo:</span><br><span>    * activate OSMO as TCH/F</span><br><span>    * activate OSMO as TCH/H</span><br><span>@@ -7750,6 +8279,17 @@</span><br><span>       execute( TC_fh_params_assignment_cmd() );</span><br><span>    execute( TC_fh_params_handover_cmd() );</span><br><span>      execute( TC_fh_params_si4_cbch() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_lcs_loc_req_for_active_ms() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_lcs_loc_req_for_active_ms_ta_req() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_lcs_loc_req_for_idle_ms() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_lcs_loc_req_no_subscriber() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_lcs_loc_req_for_active_ms_le_timeout() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_lcs_loc_req_for_active_ms_le_timeout2() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_lcs_loc_req_for_idle_ms_no_pag_resp() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_cm_service_during_lcs_loc_req() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_ho_during_lcs_loc_req() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 3e58f5a..5460e2c 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -1323,9 +1323,11 @@</span><br><span>                  * time. When we receive the RSL_RF_CHAN_REL command the media negotiation on</span><br><span>                 * IPACC or MGCP level may be still in progress. In order to make sure that</span><br><span>           * we do only stop when we have seen an MDCX on MGCP level and another a CRCX</span><br><span style="color: hsl(0, 100%, 40%);">-            * as well as an MDCX on IPACC level. */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (g_media.mgcp_conn[0].mdcx_seen <= st.mdcx_seen_before_ho or</span><br><span style="color: hsl(0, 100%, 40%);">-                  g_media.bts1.ipa_mdcx_seen == false or g_media.bts1.ipa_crcx_seen == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+              * as well as an MDCX on IPACC level.</span><br><span style="color: hsl(120, 100%, 40%);">+          * If ipa_crcx_seen is false, this is not a voice channel and we need not check MGCP at all.. */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (g_media.bts.ipa_crcx_seen</span><br><span style="color: hsl(120, 100%, 40%);">+             and (g_media.mgcp_conn[0].mdcx_seen <= st.mdcx_seen_before_ho or</span><br><span style="color: hsl(120, 100%, 40%);">+                        g_media.bts1.ipa_mdcx_seen == false or g_media.bts1.ipa_crcx_seen == false)) {</span><br><span>                      repeat;</span><br><span>              } else {</span><br><span>                     st.handover_done := true;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20373">change 20373</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20373"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id3df9439752c088cff5618d21254af42365690ca </div>
<div style="display:none"> Gerrit-Change-Number: 20373 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>