<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11699">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: add inter-bsc ho incoming failure tests<br><br>Change-Id: I849e4c0a14cc091195d948adb8df7a0b7414ecfe<br>---<br>M bsc/BSC_Tests.ttcn<br>1 file changed, 348 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/99/11699/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 e06f496..6bc6258 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -2578,6 +2578,348 @@</span><br><span>        vc_conn.done;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_in_fail_msc_clears(charstring id) runs on MSC_ConnHdlr {</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%);">+        f_rslem_register(0, new_chan_nr);</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_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});</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%);">+    activate(as_Media());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 f_gen_handover_req()));</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP.receive(BSSAP_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%);">+      /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring ho_command_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_HandoverRequestAcknowledge(?)) -> value rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+      ho_command_str := rx_bssap.pdu.bssmap.handoverRequestAck.layer3Information.layer3info;</span><br><span style="color: hsl(120, 100%, 40%);">+        log("Received L3 Info in HO Request Ack: ", ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_ML3_NW_MS ho_command := dec_PDU_ML3_NW_MS(ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("L3 Info in HO Request Ack is ", ho_command);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmArfcn arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var RslChannelNr actual_new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ChDesc2RslChanNr(ho_command.msgs.rrm.handoverCommand.channelDescription2,</span><br><span style="color: hsl(120, 100%, 40%);">+                   actual_new_chan_nr, arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (actual_new_chan_nr != new_chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("ERROR: osmo-bsc assigned a different lchan than we assumed above -- this test will fail now.",</span><br><span style="color: hsl(120, 100%, 40%);">+             " Assumed: ", new_chan_nr, " Assigned: ", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Handover Command chan_nr is", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Now the MSC forwards the RR Handover Command to the other BSC, which</span><br><span style="color: hsl(120, 100%, 40%);">+        * tells the MS to handover to the new lchan. In this case, the MS</span><br><span style="color: hsl(120, 100%, 40%);">+     * reports a Handover Failure to the old BSS, which forwards a BSSMAP</span><br><span style="color: hsl(120, 100%, 40%);">+  * Handover Failure to the MSC. The procedure according to 3GPP TS</span><br><span style="color: hsl(120, 100%, 40%);">+     * 48.008 3.1.5.3.2 "Handover Failure" is then that the MSC sends a</span><br><span style="color: hsl(120, 100%, 40%);">+  * BSSMAP Clear Command: */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var myBSSMAP_Cause cause_val := GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION;</span><br><span style="color: hsl(120, 100%, 40%);">+      var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_ClearCommand(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MgcpCommand mgcp;</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got first DLCX: ", mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got second DLCX: ", mgcp);</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%);">+     f_sleep(1.0);</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_ho_in_fail_msc_clears() 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.handover.sccp_addr_msc := g_bssap.sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.handover.sccp_addr_bsc := g_bssap.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_ho_in_fail_msc_clears), 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_in_fail_msc_clears_after_ho_detect(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Hack: the proper way would be to wait for the BSSMAP Handover Request ACK and extract the</span><br><span style="color: hsl(120, 100%, 40%);">+   * actual assigned chan_nr from its L3 (RR Handover Command) message. But osmo-bsc starts acting</span><br><span style="color: hsl(120, 100%, 40%);">+       * on the lchan even before we get a chance to evaluate the BSSMAP Handover Request ACK. So we</span><br><span style="color: hsl(120, 100%, 40%);">+         * need to assume that osmo-bsc will activate TS 1 and already set up this lchan's RSL emulation</span><br><span style="color: hsl(120, 100%, 40%);">+   * before we get started. */</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%);">+        f_rslem_register(0, new_chan_nr);</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_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});</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%);">+    activate(as_Media());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 f_gen_handover_req()));</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP.receive(BSSAP_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%);">+      /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring ho_command_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_HandoverRequestAcknowledge(?)) -> value rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+      ho_command_str := rx_bssap.pdu.bssmap.handoverRequestAck.layer3Information.layer3info;</span><br><span style="color: hsl(120, 100%, 40%);">+        log("Received L3 Info in HO Request Ack: ", ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_ML3_NW_MS ho_command := dec_PDU_ML3_NW_MS(ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("L3 Info in HO Request Ack is ", ho_command);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmArfcn arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var RslChannelNr actual_new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ChDesc2RslChanNr(ho_command.msgs.rrm.handoverCommand.channelDescription2,</span><br><span style="color: hsl(120, 100%, 40%);">+                   actual_new_chan_nr, arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (actual_new_chan_nr != new_chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("ERROR: osmo-bsc assigned a different lchan than we assumed above -- this test will fail now.",</span><br><span style="color: hsl(120, 100%, 40%);">+             " Assumed: ", new_chan_nr, " Assigned: ", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Handover Command chan_nr is", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Now the MSC forwards the RR Handover Command to the other BSC, which</span><br><span style="color: hsl(120, 100%, 40%);">+        * tells the MS to handover to the new lchan. Here comes the new MS on</span><br><span style="color: hsl(120, 100%, 40%);">+         * the new lchan with a Handover RACH: */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* send handover detect */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  RSL.send(ts_RSL_HANDO_DET(new_chan_nr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP.receive(tr_BSSMAP_HandoverDetect);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* The MSC chooses to clear the connection now, maybe we got the</span><br><span style="color: hsl(120, 100%, 40%);">+       * Handover RACH on the new cell but the MS still signaled Handover</span><br><span style="color: hsl(120, 100%, 40%);">+    * Failure to the old BSS? */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var myBSSMAP_Cause cause_val := GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION;</span><br><span style="color: hsl(120, 100%, 40%);">+      var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_ClearCommand(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MgcpCommand mgcp;</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got first DLCX: ", mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got second DLCX: ", mgcp);</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%);">+     f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ho_in_fail_msc_clears_after_ho_detect() 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.handover.sccp_addr_msc := g_bssap.sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.handover.sccp_addr_bsc := g_bssap.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_ho_in_fail_msc_clears_after_ho_detect), 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%);">+/* The new BSS's lchan times out before the MSC decides that handover failed. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_in_fail_no_detect(charstring id) runs on MSC_ConnHdlr {</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%);">+        f_rslem_register(0, new_chan_nr);</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_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});</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%);">+    activate(as_Media());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 f_gen_handover_req()));</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP.receive(BSSAP_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%);">+      /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring ho_command_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_HandoverRequestAcknowledge(?)) -> value rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+      ho_command_str := rx_bssap.pdu.bssmap.handoverRequestAck.layer3Information.layer3info;</span><br><span style="color: hsl(120, 100%, 40%);">+        log("Received L3 Info in HO Request Ack: ", ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_ML3_NW_MS ho_command := dec_PDU_ML3_NW_MS(ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("L3 Info in HO Request Ack is ", ho_command);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmArfcn arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var RslChannelNr actual_new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ChDesc2RslChanNr(ho_command.msgs.rrm.handoverCommand.channelDescription2,</span><br><span style="color: hsl(120, 100%, 40%);">+                   actual_new_chan_nr, arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (actual_new_chan_nr != new_chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("ERROR: osmo-bsc assigned a different lchan than we assumed above -- this test will fail now.",</span><br><span style="color: hsl(120, 100%, 40%);">+             " Assumed: ", new_chan_nr, " Assigned: ", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Handover Command chan_nr is", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Now the MSC forwards the RR Handover Command to the other BSC, which</span><br><span style="color: hsl(120, 100%, 40%);">+        * tells the MS to handover to the new lchan. But the MS never shows up</span><br><span style="color: hsl(120, 100%, 40%);">+        * on the new lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_HandoverFailure);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Did osmo-bsc also send a Clear Request? */</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T := 0.5;</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(tr_BSSMAP_ClearRequest);</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout { }</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%);">+   /* MSC plays along with a Clear Command (no matter whether osmo-bsc</span><br><span style="color: hsl(120, 100%, 40%);">+    * asked for it, this is a Handover Failure after all). */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var myBSSMAP_Cause cause_val := GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION;</span><br><span style="color: hsl(120, 100%, 40%);">+      var BssmapCause cause := enum2int(cause_val);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSMAP_ClearCommand(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var MgcpCommand mgcp;</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got first DLCX: ", mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got second DLCX: ", mgcp);</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%);">+     f_sleep(1.0);</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_ho_in_fail_no_detect() 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.handover.sccp_addr_msc := g_bssap.sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.handover.sccp_addr_bsc := g_bssap.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_ho_in_fail_no_detect), 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%);">+/* Same as f_tc_ho_in_fail_no_detect, but MSC fails to send a Clear Command */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_in_fail_no_detect2(charstring id) runs on MSC_ConnHdlr {</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%);">+        f_rslem_register(0, new_chan_nr);</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_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});</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%);">+    activate(as_Media());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSAP_Conn_Req(g_pars.handover.sccp_addr_bsc, g_pars.handover.sccp_addr_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 f_gen_handover_req()));</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP.receive(BSSAP_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%);">+      /* The RSL Emulation magically accepts the Chan Activ behind the scenes. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring ho_command_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_HandoverRequestAcknowledge(?)) -> value rx_bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+      ho_command_str := rx_bssap.pdu.bssmap.handoverRequestAck.layer3Information.layer3info;</span><br><span style="color: hsl(120, 100%, 40%);">+        log("Received L3 Info in HO Request Ack: ", ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_ML3_NW_MS ho_command := dec_PDU_ML3_NW_MS(ho_command_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("L3 Info in HO Request Ack is ", ho_command);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmArfcn arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var RslChannelNr actual_new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ChDesc2RslChanNr(ho_command.msgs.rrm.handoverCommand.channelDescription2,</span><br><span style="color: hsl(120, 100%, 40%);">+                   actual_new_chan_nr, arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (actual_new_chan_nr != new_chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("ERROR: osmo-bsc assigned a different lchan than we assumed above -- this test will fail now.",</span><br><span style="color: hsl(120, 100%, 40%);">+             " Assumed: ", new_chan_nr, " Assigned: ", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("Handover Command chan_nr is", actual_new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Now the MSC forwards the RR Handover Command to the other BSC, which</span><br><span style="color: hsl(120, 100%, 40%);">+        * tells the MS to handover to the new lchan. But the MS never shows up</span><br><span style="color: hsl(120, 100%, 40%);">+        * on the new lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.receive(tr_BSSMAP_HandoverFailure);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* MSC plays dumb and sends no Clear Command */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Expecting MGCP to DLCX the endpoint's two connections: towards BTS and towards MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+  var PDU_BSSAP rx_clear_request;</span><br><span style="color: hsl(120, 100%, 40%);">+       var MgcpCommand mgcp;</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSMAP_ClearRequest) -> value rx_clear_request {</span><br><span style="color: hsl(120, 100%, 40%);">+               var BssmapCause cause := bit2int(rx_clear_request.pdu.bssmap.clearRequest.cause.causeValue);</span><br><span style="color: hsl(120, 100%, 40%);">+          BSSAP.send(ts_BSSMAP_ClearCommand(cause));</span><br><span style="color: hsl(120, 100%, 40%);">+    };</span><br><span style="color: hsl(120, 100%, 40%);">+    [] BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got first DLCX: ", mgcp);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] MGCP.receive(tr_DLCX()) -> value mgcp {</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("Got second DLCX: ", mgcp);</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%);">+     f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ho_in_fail_no_detect2() 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.handover.sccp_addr_msc := g_bssap.sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.handover.sccp_addr_bsc := g_bssap.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_ho_in_fail_no_detect2), 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> </span><br><span> /* OS#3041: Open and close N connections in a normal fashion, and expect no</span><br><span>  * BSSMAP Reset just because of that. */</span><br><span>@@ -3080,11 +3422,17 @@</span><br><span>    execute( TC_err_84_unknown_msg() );</span><br><span> </span><br><span>      execute( TC_ho_int() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    execute( TC_ho_out_of_this_bsc() );</span><br><span>  execute( TC_ho_out_fail_no_msc_response() );</span><br><span>         execute( TC_ho_out_fail_rr_ho_failure() );</span><br><span>   execute( TC_ho_out_fail_no_ho_detect() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  execute( TC_ho_into_this_bsc() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_ho_in_fail_msc_clears() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_ho_in_fail_msc_clears_after_ho_detect() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_ho_in_fail_no_detect() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_in_fail_no_detect2() );</span><br><span> </span><br><span>   execute( TC_bssap_rlsd_does_not_cause_bssmap_reset() );</span><br><span>      execute( TC_bssmap_clear_does_not_cause_bssmap_reset() );</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11699">change 11699</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/11699"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I849e4c0a14cc091195d948adb8df7a0b7414ecfe </div>
<div style="display:none"> Gerrit-Change-Number: 11699 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>