<p>neels <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14765">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, but someone else must approve
  neels: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: add TC_ho_neighbor_config_1 thru _7<br><br>Add tests to play through various neighbor configurations.<br>Tests will pass as soon as osmo-bsc I29bca59ab232eddc74e0d4698efb9c9992443983<br>is merged.<br><br>Add RSL2 to allow triggering handover to BTS 2.<br><br>Adjust osmo-bsc.cfg to match the new tests. Also applied in docker-playground<br>I1c57a04747f5ec004ccf4657954dcb0b003c24fc.<br>    - Actually enable handover.<br>    - Add bts 3<br><br>Depends: osmo-bsc I8623ab581639e9f8af6a9ff1eca990518d1b1211 ('no neighbors')<br>Related: OS#4056<br>Change-Id: Ia4ba0e75abd3d45a3422b2525e5f938cdc5a04cc<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/osmo-bsc.cfg<br>M library/RSL_Emulation.ttcn<br>3 files changed, 396 insertions(+), 1 deletion(-)<br><br></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 44a9172..4497a2e 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -1719,6 +1719,10 @@</span><br><span>           connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);</span><br><span>          connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isvalue(bts[2])) {</span><br><span style="color: hsl(120, 100%, 40%);">+                connect(vc_conn:RSL2, bts[2].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+           connect(vc_conn:RSL2_PROC, bts[2].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    connect(vc_conn:BSSAP, g_bssap.vc_RAN:CLIENT);</span><br><span>       connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);</span><br><span>  connect(vc_conn:MGCP_MULTI, vc_MGCP:MGCP_CLIENT_MULTI);</span><br><span>@@ -2837,6 +2841,11 @@</span><br><span>     f_vty_transceive(BSCVTY, cmd & suffix);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Even though the VTY command to trigger handover takes a new BTS number as argument, behind the scenes osmo-bsc always</span><br><span style="color: hsl(120, 100%, 40%);">+ * translates that to a target ARFCN+BSIC first. See bsc_vty.c trigger_ho_or_as(), which puts the selected BTS' neighbor</span><br><span style="color: hsl(120, 100%, 40%);">+ * ident key (ARFCN + BSIC) in the struct passed on to handover_request(). handover_start() then resolves that to a</span><br><span style="color: hsl(120, 100%, 40%);">+ * viable actual neighbor cell. So from the internal osmo-bsc perspective, we always request handover to an ARFCN + BSIC</span><br><span style="color: hsl(120, 100%, 40%);">+ * pair, not really to a specific BTS number. */</span><br><span> private function f_vty_handover(integer bts_nr, integer trx_nr, RslChannelNr chan_nr,</span><br><span>                               integer new_bts_nr)</span><br><span> runs on MSC_ConnHdlr {</span><br><span>@@ -3587,6 +3596,353 @@</span><br><span>      vc_conn.done;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+type record of charstring Commands;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_bts_0_cfg(Commands cmds := {}) runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_enter_cfg_bts(BSCVTY, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer i := 0; i < sizeof(cmds); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_vty_transceive(BSCVTY, cmds[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(BSCVTY, "end");</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_probe_for_handover(charstring log_label,</span><br><span style="color: hsl(120, 100%, 40%);">+                                charstring log_descr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 charstring handover_vty_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  boolean expect_handover,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      boolean is_inter_bsc_handover := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring log_msg := " (expecting handover)"</span><br><span style="color: hsl(120, 100%, 40%);">+   if (not expect_handover) {</span><br><span style="color: hsl(120, 100%, 40%);">+            log_msg := " (expecting NO handover)";</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("f_probe_for_handover starting: " & log_label & ": " & log_descr & log_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_transceive(BSCVTY, handover_vty_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We're going to thwart any and all handover attempts, just be ready to handle (and ignore) handover target</span><br><span style="color: hsl(120, 100%, 40%);">+       * lchans to be established on bts 1 or bts 2. */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rslem_suspend(RSL1_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rslem_suspend(RSL2_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T := 2.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       T.start;</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%);">+ [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+          var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[2].body.l3_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+           log("Rx L3 from net: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ischosen(l3.msgs.rrm.handoverCommand)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  var RslChannelNr new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+                 var GsmArfcn arfcn;</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_ChDesc2RslChanNr(l3.msgs.rrm.handoverCommand.channelDescription2,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      new_chan_nr, arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+                       log("Handover to new chan ", new_chan_nr, " on ARFCN ", arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+                   log(l3.msgs.rrm.handoverCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* Need to register for new lchan on new BTS -- it's either bts 1 or bts 2.  It doesn't really</span><br><span style="color: hsl(120, 100%, 40%);">+                         * matter on which BTS it really is, we're not going to follow through an entire handover</span><br><span style="color: hsl(120, 100%, 40%);">+                  * anyway. */</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_rslem_register(0, new_chan_nr, RSL1_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_rslem_resume(RSL1_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+                    f_rslem_register(0, new_chan_nr, RSL2_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_rslem_resume(RSL2_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (expect_handover and not is_inter_bsc_handover) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                             log("f_probe_for_handover(" & log_label & "): Got RSL Handover Command as expected.");</span><br><span style="color: hsl(120, 100%, 40%);">+                    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, "f_probe_for_handover(" & log_label & "): Expected none, but got RSL Handover Command. "</span><br><span style="color: hsl(120, 100%, 40%);">+                                          & log_label & ": " & log_descr);</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%);">+                   log("f_probe_for_handover(" & log_label & "): Ending the test: Handover Failure stops the procedure.");</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* osmo-bsc has triggered Handover. That's all we need to know for this test, reply with</span><br><span style="color: hsl(120, 100%, 40%);">+                   * Handover Failure. */</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_rsl_send_l3(ts_RRM_HandoverFailure('00'O));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* target BTS is told to release lchan again; don't care which BTS nor what messages. */</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+                 RSL1.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+                   RSL2.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+                   log("f_probe_for_handover(" & log_label & "): done (got RSL Handover Command)");</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSMAP_HandoverRequired) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (expect_handover and is_inter_bsc_handover) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                             log("f_probe_for_handover(" & log_label & "): Got BSSMAP Handover Required as expected.");</span><br><span style="color: hsl(120, 100%, 40%);">+                        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, "f_probe_for_handover(" & log_label & "): Expected none, but got BSSMAP Handover Required. "</span><br><span style="color: hsl(120, 100%, 40%);">+                                              & log_label & ": " & log_descr);</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%);">+                   log("f_probe_for_handover(" & log_label & "): done (got BSSMAP Handover Required)");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* Note: f_tc_ho_neighbor_config_start() sets T7, the timeout for BSSMAP Handover Required, to</span><br><span style="color: hsl(120, 100%, 40%);">+                         * 1 second. There is no legal way to quickly abort a handover after a BSSMAP Handover Required,</span><br><span style="color: hsl(120, 100%, 40%);">+                       * setting a short timeout and waiting is the only way. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("f_probe_for_handover(" & log_label & "): waiting for inter-BSC HO to time out...");</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_sleep(1.5);</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("f_probe_for_handover(" & log_label & "): ...done");</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (expect_handover) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "f_probe_for_handover(" & log_label & "): Expected Handover, but got none. "</span><br><span style="color: hsl(120, 100%, 40%);">+                                      & log_label & ": " & log_descr);</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                     log("f_probe_for_handover(" & log_label & "): Got no Handover, as expected.");</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             log("f_probe_for_handover(" & log_label & "): done (got no Handover)");</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%);">+   f_rslem_resume(RSL1_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rslem_resume(RSL2_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  log("f_probe_for_handover(" & log_label & "): done clearing");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the effect of various neighbor configuration scenarios:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * To avoid complexity, block off any actual handover operation, and always remain on the lchan at bts 0.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Reconfigure the neighbors for bts 0, trigger a Handover, and probe whether osmo-bsc does or doesn't start HO.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_start() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   g_pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template PDU_BSSAP exp_compl := f_gen_exp_compl();</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span style="color: hsl(120, 100%, 40%);">+     const OCT8 kc := '0001020304050607'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);</span><br><span style="color: hsl(120, 100%, 40%);">+        ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Establish lchan at bts 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Shorten the inter-BSC Handover timeout, to not wait so long for inter-BSC Handovers */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_enter_cfg_network(BSCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_transceive(BSCVTY, "timer T7 1");</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(BSCVTY, "end");</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_neighbor_config_1(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 1. No 'neighbor' config");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bts_0_cfg({"no neighbors"});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_probe_for_handover("1.a", "HO to bts 1 works, implicitly listed as neighbor (legacy behavior when none are configured)",</span><br><span style="color: hsl(120, 100%, 40%);">+                        "handover any to arfcn 871 bsic 11",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_probe_for_handover("1.b", "HO to unknown cell does not start",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "handover any to arfcn 13 bsic 39",</span><br><span style="color: hsl(120, 100%, 40%);">+                 false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_probe_for_handover("1.c", "HO to 871-12 is ambiguous = error",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_probe_for_handover("1.d", "HO to 871-11 still works (verify that this test properly cleans up)",</span><br><span style="color: hsl(120, 100%, 40%);">+                        "handover any to arfcn 871 bsic 11",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_2(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 2. explicit local neighbor: 'neighbor bts 1'");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_bts_0_cfg({"neighbor bts 1"});</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("2.a", "HO to bts 1 works, explicitly listed as neighbor",</span><br><span style="color: hsl(120, 100%, 40%);">+                   "handover any to arfcn 871 bsic 11",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_probe_for_handover("2.b", "HO to bts 2 doesn't work, not listed as neighbor",</span><br><span style="color: hsl(120, 100%, 40%);">+                       "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_3(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 3. explicit local neighbor: 'neighbor bts 2'");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_bts_0_cfg({"no neighbors", "neighbor bts 2"});</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("3.a", "HO to bts 1 doesn't work, not listed as neighbor",</span><br><span style="color: hsl(120, 100%, 40%);">+                       "handover any to arfcn 871 bsic 11",</span><br><span style="color: hsl(120, 100%, 40%);">+                        false);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("3.b", "HO to bts 2 works, explicitly listed as neighbor; no ambiguity because bts 3 is not listed as neighbor",</span><br><span style="color: hsl(120, 100%, 40%);">+                     "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_4(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 4. explicit remote neighbor: 'neighbor lac 99 arfcn 123 bsic 45'");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bts_0_cfg({"no neighbors", "neighbor lac 99 arfcn 123 bsic 45"});</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("4.a", "HO to bts 1 doesn't work, not listed as neighbor",</span><br><span style="color: hsl(120, 100%, 40%);">+                       "handover any to arfcn 871 bsic 11",</span><br><span style="color: hsl(120, 100%, 40%);">+                        false);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("4.b", "HO to bts 2 doesn't work, not listed as neighbor",</span><br><span style="color: hsl(120, 100%, 40%);">+                       "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        false);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("4.c", "HO to 123-45 triggers inter-BSC HO",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "handover any to arfcn 123 bsic 45",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_5(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 5. explicit remote neighbor re-using ARFCN+BSIC: 'neighbor lac 99 arfcn 871 bsic 12'");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_bts_0_cfg({"no neighbors", "neighbor lac 99 arfcn 871 bsic 12"});</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("5.a", "HO to 871-12 triggers inter-BSC HO (ignoring local cells with same ARFCN+BSIC)",</span><br><span style="color: hsl(120, 100%, 40%);">+                     "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_6(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 6. config error: explicit local and remote neighbors with ambiguous ARFCN+BSIC:"</span><br><span style="color: hsl(120, 100%, 40%);">+          & " 'neighbor bts 2; neighbor lac 99 arfcn 871 bsic 12'");</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bts_0_cfg({"no neighbors", "neighbor bts 2", "neighbor lac 99 arfcn 871 bsic 12"});</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("6.a", "HO to 871-12 is ambiguous = error",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_ho_neighbor_config_7(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_tc_ho_neighbor_config_start();</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%);">+     * bts 0 ARFCN 871 BSIC 10</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 1 ARFCN 871 BSIC 11</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 2 ARFCN 871 BSIC 12</span><br><span style="color: hsl(120, 100%, 40%);">+     * bts 3 ARFCN 871 BSIC 12  serves as ambiguity for bts 2, re-using the ARFCN+BSIC</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%);">+ log("f_tc_ho_neighbor_config: 7. explicit local and remote neighbors:"</span><br><span style="color: hsl(120, 100%, 40%);">+          & " 'neighbor bts 2; neighbor lac 99 arfcn 123 bsic 45'");</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bts_0_cfg({"no neighbors", "neighbor bts 2", "neighbor lac 99 arfcn 123 bsic 45"});</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(0.5);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_probe_for_handover("7.a", "HO to 871-12 does HO to bts 2",</span><br><span style="color: hsl(120, 100%, 40%);">+                      "handover any to arfcn 871 bsic 12",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_probe_for_handover("7.b", "HO to 123-45 triggers inter-BSC HO",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "handover any to arfcn 123 bsic 45",</span><br><span style="color: hsl(120, 100%, 40%);">+                        true, 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_ho_neighbor_config_1() 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%);">+     f_init(3, 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_neighbor_config_1));</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%);">+testcase TC_ho_neighbor_config_2() 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%);">+     f_init(3, 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_neighbor_config_2));</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%);">+testcase TC_ho_neighbor_config_3() 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%);">+     f_init(3, 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_neighbor_config_3));</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ho_neighbor_config_4() 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%);">+     f_init(3, 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_neighbor_config_4));</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%);">+testcase TC_ho_neighbor_config_5() 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%);">+     f_init(3, 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_neighbor_config_5));</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%);">+testcase TC_ho_neighbor_config_6() 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%);">+     f_init(3, 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_neighbor_config_6));</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%);">+testcase TC_ho_neighbor_config_7() 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%);">+     f_init(3, 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_neighbor_config_7));</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> /* 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> testcase TC_bssap_rlsd_does_not_cause_bssmap_reset() runs on test_CT {</span><br><span>@@ -4140,6 +4496,14 @@</span><br><span>     execute( TC_ho_in_fail_no_detect() );</span><br><span>        execute( TC_ho_in_fail_no_detect2() );</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_ho_neighbor_config_1() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_neighbor_config_2() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_neighbor_config_3() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_neighbor_config_4() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_neighbor_config_5() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_neighbor_config_6() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ho_neighbor_config_7() );</span><br><span style="color: hsl(120, 100%, 40%);">+</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>    execute( TC_ms_rel_ind_does_not_cause_bssmap_reset() );</span><br><span>diff --git a/bsc/osmo-bsc.cfg b/bsc/osmo-bsc.cfg</span><br><span>index bca5b20..9384491 100644</span><br><span>--- a/bsc/osmo-bsc.cfg</span><br><span>+++ b/bsc/osmo-bsc.cfg</span><br><span>@@ -57,7 +57,7 @@</span><br><span>  encryption a5 0 1 3</span><br><span>  neci 1</span><br><span>  paging any use tch 0</span><br><span style="color: hsl(0, 100%, 40%);">- handover 0</span><br><span style="color: hsl(120, 100%, 40%);">+ handover 1</span><br><span>  handover window rxlev averaging 10</span><br><span>  handover window rxqual averaging 1</span><br><span>  handover window rxlev neighbor averaging 10</span><br><span>@@ -339,6 +339,35 @@</span><br><span>    timeslot 7</span><br><span>     phys_chan_config PDCH</span><br><span>     hopping enabled 0</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 3</span><br><span style="color: hsl(120, 100%, 40%);">+  type sysmobts</span><br><span style="color: hsl(120, 100%, 40%);">+  band DCS1800</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_identity 3</span><br><span style="color: hsl(120, 100%, 40%);">+  location_area_code 3</span><br><span style="color: hsl(120, 100%, 40%);">+  # re-use bts 2's ARFCN 871 and BSIC 12 (to test handover config)</span><br><span style="color: hsl(120, 100%, 40%);">+  base_station_id_code 12</span><br><span style="color: hsl(120, 100%, 40%);">+  trx 0</span><br><span style="color: hsl(120, 100%, 40%);">+   rf_locked 0</span><br><span style="color: hsl(120, 100%, 40%);">+   arfcn 871</span><br><span style="color: hsl(120, 100%, 40%);">+   nominal power 23</span><br><span style="color: hsl(120, 100%, 40%);">+   max_power_red 20</span><br><span style="color: hsl(120, 100%, 40%);">+   rsl e1 tei 0</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 0</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config CCCH+SDCCH4</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 1</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 2</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 3</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 4</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 5</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config TCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 6</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config PDCH</span><br><span style="color: hsl(120, 100%, 40%);">+   timeslot 7</span><br><span style="color: hsl(120, 100%, 40%);">+    phys_chan_config PDCH</span><br><span> msc 0</span><br><span>  ip.access rtp-base 4000</span><br><span>  no bsc-welcome-text</span><br><span>diff --git a/library/RSL_Emulation.ttcn b/library/RSL_Emulation.ttcn</span><br><span>index 790dd7a..309ec13 100644</span><br><span>--- a/library/RSL_Emulation.ttcn</span><br><span>+++ b/library/RSL_Emulation.ttcn</span><br><span>@@ -45,6 +45,8 @@</span><br><span>  /* second BTS / DChan during hand-over */</span><br><span>    port RSL_DCHAN_PT RSL1;</span><br><span>      port RSLEM_PROC_PT RSL1_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+ port RSL_DCHAN_PT RSL2;</span><br><span style="color: hsl(120, 100%, 40%);">+       port RSLEM_PROC_PT RSL2_PROC;</span><br><span> };</span><br><span> </span><br><span> type record RSLDC_ChanRqd {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14765">change 14765</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/+/14765"/><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: Ia4ba0e75abd3d45a3422b2525e5f938cdc5a04cc </div>
<div style="display:none"> Gerrit-Change-Number: 14765 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>