<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21642">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, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">handover_test: implement as VTY shell<br><br>Drop the string arrays, and move the 32 handover tests to separate<br>script files. Instead of the peculiar implementation and instead of<br>cryptic commands, implement the handover test scripts as a VTY.<br><br>handover_test.c now sets up a VTY with handover testing VTY commands. It<br>also features the complete and unabridged VTY configuration nodes of<br>osmo-bsc itself. That allows dropping various ho script commands.<br><br>Before:<br><br>  static char *test_case_14[] = {<br>      "Handover to congested cell, if RX level is below minimum\n\n"<br>      "The better neighbor cell is congested, so no handover is performed.\n"<br>      "If the RX level of the current cell drops below minimum acceptable\n"<br>      "level, the handover is performed.\n",<br><br>      "create-n-bts", "2",<br>      "create-ms", "0", "TCH/F", "AMR",<br>      "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",<br>      "set-min-free", "1", "TCH/F", "4",<br>      "set-min-free", "1", "TCH/H", "4",<br>      "meas-rep", "0","0","1","0", "10","0", "1","0","30",<br>      "expect-no-chan",<br>      "meas-rep", "0","0","1","0", "9","0", "1","0","30",<br>      "expect-chan", "1", "1",<br>      "ack-chan",<br>      "expect-ho", "0", "1",<br>      "ho-complete",<br>      "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",<br>      "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",<br>  }<br><br>After:<br><br>  # Handover to congested cell, if RX level is below minimum<br>  # The better neighbor cell is congested, so no handover is performed.<br>  # If the RX level of the current cell drops below minimum acceptable<br>  # level, the handover is performed.<br><br>  create-n-bts 2<br>  set-ts-use trx 0 0 states * TCH/F - - - - - -<br>  network<br>   bts 1<br>    handover2 min-free-slots tch/f 4<br>    handover2 min-free-slots tch/h 4<br>  meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 30<br>  expect-no-chan<br>  meas-rep lchan 0 0 1 0 rxlev 9 rxqual 0 ta 0 neighbors 30<br>  expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0<br>  expect-ts-use trx 0 0 states * - - - - - - -<br>  expect-ts-use trx 1 0 states * TCH/F - - - - - -<br><br>Note how osmo-bsc's stock vty config nodes seamlessly integrate in the<br>test steps: just enter a configuration node, modify some values, and<br>indenting trivially takes care of exiting nodes correctly.<br><br>Running a test manually:<br>  ./handover_test test_0123.ho_vty<br><br>Instead of calling each test separately in testsuite.at, have a<br>handover_tests.sh script that picks up new tests just by presence of<br>files named test*.ho_vty.<br><br>Rationale:<br><br>It was considered to move handover tests to the TTCN suite, but there is<br>an advantage in having these C tests: they run super fast and catch bugs<br>even in the gerrit verification job, potentially saving a lot of time.<br><br>It is a reality that I need more of these tests, for dynamic timeslots<br>and TCH/F <-> TCH/H switches. The way the handover tests are written, as<br>arrays of strings containing cryptic fixed-argument script commands, has<br>been a pain to work with from the start, and now I am no longer willing<br>to endure that pain.<br><br>Change-Id: Ie238ebe41039d3fa44c9699937589e000883e052<br>---<br>M tests/handover/Makefile.am<br>M tests/handover/handover_test.c<br>D tests/handover/handover_test.ok<br>A tests/handover/handover_tests.ok<br>A tests/handover/handover_tests.sh<br>A tests/handover/test0000.ho_vty<br>A tests/handover/test0001.ho_vty<br>A tests/handover/test0002.ho_vty<br>A tests/handover/test0003.ho_vty<br>A tests/handover/test0004.ho_vty<br>A tests/handover/test0005.ho_vty<br>A tests/handover/test0006.ho_vty<br>A tests/handover/test0007.ho_vty<br>A tests/handover/test0008.ho_vty<br>A tests/handover/test0009.ho_vty<br>A tests/handover/test0010.ho_vty<br>A tests/handover/test0011.ho_vty<br>A tests/handover/test0012.ho_vty<br>A tests/handover/test0013.ho_vty<br>A tests/handover/test0014.ho_vty<br>A tests/handover/test0015.ho_vty<br>A tests/handover/test0016.ho_vty<br>A tests/handover/test0017.ho_vty<br>A tests/handover/test0018.ho_vty<br>A tests/handover/test0019.ho_vty<br>A tests/handover/test0020.ho_vty<br>A tests/handover/test0021.ho_vty<br>A tests/handover/test0022.ho_vty<br>A tests/handover/test0023.ho_vty<br>A tests/handover/test0024.ho_vty<br>A tests/handover/test0025.ho_vty<br>A tests/handover/test0026.ho_vty<br>A tests/handover/test0027.ho_vty<br>A tests/handover/test0028.ho_vty<br>A tests/handover/test0029.ho_vty<br>A tests/handover/test0030.ho_vty<br>A tests/handover/test0031.ho_vty<br>A tests/handover/test0032.ho_vty<br>M tests/testsuite.at<br>39 files changed, 1,387 insertions(+), 1,714 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am</span><br><span>index eb2a26b..3951624 100644</span><br><span>--- a/tests/handover/Makefile.am</span><br><span>+++ b/tests/handover/Makefile.am</span><br><span>@@ -21,7 +21,9 @@</span><br><span>       $(NULL)</span><br><span> </span><br><span> EXTRA_DIST = \</span><br><span style="color: hsl(0, 100%, 40%);">-   handover_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+    handover_tests.sh \</span><br><span style="color: hsl(120, 100%, 40%);">+   handover_tests.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(srcdir)/test*.ho_vty \</span><br><span>     neighbor_ident_test.ok \</span><br><span>     neighbor_ident_test.err \</span><br><span>    $(NULL)</span><br><span>@@ -130,3 +132,4 @@</span><br><span> .PHONY: update_exp</span><br><span> update_exp:</span><br><span>   $(builddir)/neighbor_ident_test >$(srcdir)/neighbor_ident_test.ok 2>$(srcdir)/neighbor_ident_test.err</span><br><span style="color: hsl(120, 100%, 40%);">+   $(srcdir)/handover_tests.sh $(srcdir) $(builddir) -u</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 28d87db..33e5ff0 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -26,6 +26,7 @@</span><br><span> #include <osmocom/core/application.h></span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span> </span><br><span> #include <osmocom/mgcp_client/mgcp_client_endpoint_fsm.h></span><br><span> </span><br><span>@@ -49,6 +50,9 @@</span><br><span> #include <osmocom/bsc/bsc_msc_data.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/bsc/paging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "../../bscconfig.h"</span><br><span> </span><br><span> void *ctx;</span><br><span> </span><br><span>@@ -77,13 +81,21 @@</span><br><span> /* measurement report */</span><br><span> </span><br><span> uint8_t meas_rep_ba = 0, meas_rep_valid = 1, meas_valid = 1, meas_multi_rep = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t meas_dl_rxlev = 0, meas_dl_rxqual = 0;</span><br><span> uint8_t meas_ul_rxlev = 0, meas_ul_rxqual = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t meas_tx_power_ms = 0, meas_tx_power_bs = 0, meas_ta_ms = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t meas_tx_power_ms = 0, meas_tx_power_bs = 0;</span><br><span> uint8_t meas_dtx_ms = 0, meas_dtx_bs = 0, meas_nr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-uint8_t meas_num_nc = 0, meas_rxlev_nc[6], meas_bsic_nc[6], meas_bcch_f_nc[6];</span><br><span style="color: hsl(120, 100%, 40%);">+char *codec_tch_f = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+char *codec_tch_h = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void gen_meas_rep(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+struct neighbor_meas {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t bcch_f;</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%);">+static void gen_meas_rep(struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t rxlev, uint8_t rxqual, uint8_t ta,</span><br><span style="color: hsl(120, 100%, 40%);">+                    int neighbors_count, struct neighbor_meas *neighbors)</span><br><span> {</span><br><span>  struct msgb *msg = msgb_alloc_headroom(256, 64, "RSL");</span><br><span>    struct abis_rsl_dchan_hdr *dh;</span><br><span>@@ -108,7 +120,7 @@</span><br><span>         msgb_tv_put(msg, RSL_IE_BS_POWER, meas_tx_power_bs);</span><br><span> </span><br><span>     l1i[0] = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     l1i[1] = meas_ta_ms;</span><br><span style="color: hsl(120, 100%, 40%);">+  l1i[1] = ta;</span><br><span>         msgb_tv_fixed_put(msg, RSL_IE_L1_INFO, sizeof(l1i), l1i);</span><br><span> </span><br><span>        buf = msgb_put(msg, 3);</span><br><span>@@ -123,49 +135,44 @@</span><br><span>      gh->msg_type = GSM48_MT_RR_MEAS_REP;</span><br><span> </span><br><span>  /* measurement results */</span><br><span style="color: hsl(0, 100%, 40%);">-       mr->rxlev_full = meas_dl_rxlev;</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->rxlev_sub = meas_dl_rxlev;</span><br><span style="color: hsl(0, 100%, 40%);">-       mr->rxqual_full = meas_dl_rxqual;</span><br><span style="color: hsl(0, 100%, 40%);">-    mr->rxqual_sub = meas_dl_rxqual;</span><br><span style="color: hsl(120, 100%, 40%);">+   mr->rxlev_full = rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+    mr->rxlev_sub = rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+     mr->rxqual_full = rxqual;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->rxqual_sub = rxqual;</span><br><span>  mr->dtx_used = meas_dtx_ms;</span><br><span>       mr->ba_used = meas_rep_ba;</span><br><span style="color: hsl(0, 100%, 40%);">-   mr->meas_valid = !meas_valid; /* 0 = valid */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (meas_rep_valid) {</span><br><span style="color: hsl(0, 100%, 40%);">-           mr->no_nc_n_hi = meas_num_nc >> 2;</span><br><span style="color: hsl(0, 100%, 40%);">-             mr->no_nc_n_lo = meas_num_nc & 3;</span><br><span style="color: hsl(0, 100%, 40%);">-        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* no results for serving cells */</span><br><span style="color: hsl(0, 100%, 40%);">-              mr->no_nc_n_hi = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-          mr->no_nc_n_lo = 3;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-       mr->rxlev_nc1 = meas_rxlev_nc[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    mr->rxlev_nc2_hi = meas_rxlev_nc[1] >> 1;</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->rxlev_nc2_lo = meas_rxlev_nc[1] & 1;</span><br><span style="color: hsl(0, 100%, 40%);">- mr->rxlev_nc3_hi = meas_rxlev_nc[2] >> 2;</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->rxlev_nc3_lo = meas_rxlev_nc[2] & 3;</span><br><span style="color: hsl(0, 100%, 40%);">- mr->rxlev_nc4_hi = meas_rxlev_nc[3] >> 3;</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->rxlev_nc4_lo = meas_rxlev_nc[3] & 7;</span><br><span style="color: hsl(0, 100%, 40%);">- mr->rxlev_nc5_hi = meas_rxlev_nc[4] >> 4;</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->rxlev_nc5_lo = meas_rxlev_nc[4] & 15;</span><br><span style="color: hsl(0, 100%, 40%);">-        mr->rxlev_nc6_hi = meas_rxlev_nc[5] >> 5;</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->rxlev_nc6_lo = meas_rxlev_nc[5] & 31;</span><br><span style="color: hsl(0, 100%, 40%);">-        mr->bsic_nc1_hi = meas_bsic_nc[0] >> 3;</span><br><span style="color: hsl(0, 100%, 40%);">-        mr->bsic_nc1_lo = meas_bsic_nc[0] & 7;</span><br><span style="color: hsl(0, 100%, 40%);">-   mr->bsic_nc2_hi = meas_bsic_nc[1] >> 4;</span><br><span style="color: hsl(0, 100%, 40%);">-        mr->bsic_nc2_lo = meas_bsic_nc[1] & 15;</span><br><span style="color: hsl(0, 100%, 40%);">-  mr->bsic_nc3_hi = meas_bsic_nc[2] >> 5;</span><br><span style="color: hsl(0, 100%, 40%);">-        mr->bsic_nc3_lo = meas_bsic_nc[2] & 31;</span><br><span style="color: hsl(0, 100%, 40%);">-  mr->bsic_nc4 = meas_bsic_nc[3];</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->bsic_nc5 = meas_bsic_nc[4];</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->bsic_nc6 = meas_bsic_nc[5];</span><br><span style="color: hsl(0, 100%, 40%);">-      mr->bcch_f_nc1 = meas_bcch_f_nc[0];</span><br><span style="color: hsl(0, 100%, 40%);">-  mr->bcch_f_nc2 = meas_bcch_f_nc[1];</span><br><span style="color: hsl(0, 100%, 40%);">-  mr->bcch_f_nc3 = meas_bcch_f_nc[2];</span><br><span style="color: hsl(0, 100%, 40%);">-  mr->bcch_f_nc4 = meas_bcch_f_nc[3];</span><br><span style="color: hsl(0, 100%, 40%);">-  mr->bcch_f_nc5_hi = meas_bcch_f_nc[4] >> 1;</span><br><span style="color: hsl(0, 100%, 40%);">-    mr->bcch_f_nc5_lo = meas_bcch_f_nc[4] & 1;</span><br><span style="color: hsl(0, 100%, 40%);">-       mr->bcch_f_nc6_hi = meas_bcch_f_nc[5] >> 2;</span><br><span style="color: hsl(0, 100%, 40%);">-    mr->bcch_f_nc6_lo = meas_bcch_f_nc[5] & 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     mr->meas_valid = 0; /* 0 = valid */</span><br><span style="color: hsl(120, 100%, 40%);">+        mr->no_nc_n_hi = neighbors_count >> 2;</span><br><span style="color: hsl(120, 100%, 40%);">+       mr->no_nc_n_lo = neighbors_count & 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        mr->rxlev_nc1 = neighbors[0].rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+        mr->rxlev_nc2_hi = neighbors[1].rxlev >> 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->rxlev_nc2_lo = neighbors[1].rxlev & 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     mr->rxlev_nc3_hi = neighbors[2].rxlev >> 2;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->rxlev_nc3_lo = neighbors[2].rxlev & 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     mr->rxlev_nc4_hi = neighbors[3].rxlev >> 3;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->rxlev_nc4_lo = neighbors[3].rxlev & 7;</span><br><span style="color: hsl(120, 100%, 40%);">+     mr->rxlev_nc5_hi = neighbors[4].rxlev >> 4;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->rxlev_nc5_lo = neighbors[4].rxlev & 15;</span><br><span style="color: hsl(120, 100%, 40%);">+    mr->rxlev_nc6_hi = neighbors[5].rxlev >> 5;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->rxlev_nc6_lo = neighbors[5].rxlev & 31;</span><br><span style="color: hsl(120, 100%, 40%);">+    mr->bsic_nc1_hi = neighbors[0].bsic >> 3;</span><br><span style="color: hsl(120, 100%, 40%);">+    mr->bsic_nc1_lo = neighbors[0].bsic & 7;</span><br><span style="color: hsl(120, 100%, 40%);">+       mr->bsic_nc2_hi = neighbors[1].bsic >> 4;</span><br><span style="color: hsl(120, 100%, 40%);">+    mr->bsic_nc2_lo = neighbors[1].bsic & 15;</span><br><span style="color: hsl(120, 100%, 40%);">+      mr->bsic_nc3_hi = neighbors[2].bsic >> 5;</span><br><span style="color: hsl(120, 100%, 40%);">+    mr->bsic_nc3_lo = neighbors[2].bsic & 31;</span><br><span style="color: hsl(120, 100%, 40%);">+      mr->bsic_nc4 = neighbors[3].bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->bsic_nc5 = neighbors[4].bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->bsic_nc6 = neighbors[5].bsic;</span><br><span style="color: hsl(120, 100%, 40%);">+  mr->bcch_f_nc1 = neighbors[0].bcch_f;</span><br><span style="color: hsl(120, 100%, 40%);">+      mr->bcch_f_nc2 = neighbors[1].bcch_f;</span><br><span style="color: hsl(120, 100%, 40%);">+      mr->bcch_f_nc3 = neighbors[2].bcch_f;</span><br><span style="color: hsl(120, 100%, 40%);">+      mr->bcch_f_nc4 = neighbors[3].bcch_f;</span><br><span style="color: hsl(120, 100%, 40%);">+      mr->bcch_f_nc5_hi = neighbors[4].bcch_f >> 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        mr->bcch_f_nc5_lo = neighbors[4].bcch_f & 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   mr->bcch_f_nc6_hi = neighbors[5].bcch_f >> 2;</span><br><span style="color: hsl(120, 100%, 40%);">+        mr->bcch_f_nc6_lo = neighbors[5].bcch_f & 3;</span><br><span> </span><br><span>      msg->dst = lchan->ts->trx->bts->c0->rsl_link;</span><br><span>      msg->l2h = (unsigned char *)dh;</span><br><span>@@ -195,7 +202,7 @@</span><br><span>     "c+s4", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "TCH/H", "TCH/H", "-",</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct gsm_bts *create_bts(int num_trx, const char * const *ts_args)</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_bts *_create_bts(int num_trx, const char * const *ts_args, int ts_args_count)</span><br><span> {</span><br><span>        static int arfcn = 870;</span><br><span>      struct gsm_bts *bts;</span><br><span>@@ -205,15 +212,10 @@</span><br><span>         struct gsm_bts_trx *trx;</span><br><span> </span><br><span>         fprintf(stderr, "- Creating BTS %d, %d TRX\n", bsc_gsmnet->num_bts, num_trx);</span><br><span style="color: hsl(0, 100%, 40%);">-      for (trx_i = 0; trx_i < num_trx; trx_i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          for (i = 0; i < 8; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                      fprintf(stderr, "\t%s", ts_args[8*trx_i + i]);</span><br><span style="color: hsl(0, 100%, 40%);">-                fprintf(stderr, "\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span> </span><br><span>        bts = bsc_bts_alloc_register(bsc_gsmnet, GSM_BTS_TYPE_UNKNOWN, 0x3f);</span><br><span>        if (!bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("No resource for bts1\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(stderr, "No resource for bts1\n");</span><br><span>                 return NULL;</span><br><span>         }</span><br><span> </span><br><span>@@ -241,13 +243,21 @@</span><br><span> </span><br><span>            /* 4 full rate and 4 half rate channels */</span><br><span>           for (i = 0; i < 8; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    trx->ts[i].pchan_from_config = pchan_from_str(ts_args[trx_i * 8 + i]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     int arg_i = trx_i * 8 + i;</span><br><span style="color: hsl(120, 100%, 40%);">+                    const char *ts_arg;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (arg_i >= ts_args_count)</span><br><span style="color: hsl(120, 100%, 40%);">+                                ts_arg = bts_default_ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                   else</span><br><span style="color: hsl(120, 100%, 40%);">+                          ts_arg = ts_args[arg_i];</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "\t%s", ts_arg);</span><br><span style="color: hsl(120, 100%, 40%);">+                    trx->ts[i].pchan_from_config = pchan_from_str(ts_arg);</span><br><span>                    if (trx->ts[i].pchan_from_config == GSM_PCHAN_NONE)</span><br><span>                               continue;</span><br><span>                    trx->ts[i].mo.nm_state.operational = NM_OPSTATE_ENABLED;</span><br><span>                  trx->ts[i].mo.nm_state.availability = NM_AVSTATE_OK;</span><br><span>                      trx->ts[i].mo.nm_state.administrative = NM_STATE_UNLOCKED;</span><br><span>                }</span><br><span style="color: hsl(120, 100%, 40%);">+             fprintf(stderr, "\n");</span><br><span> </span><br><span>                 for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span>                    /* make sure ts->lchans[] get initialized */</span><br><span>@@ -303,22 +313,15 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool expect_ts_use(int bts_nr, int trx_nr, const char * const *ts_use)</span><br><span style="color: hsl(120, 100%, 40%);">+bool _expect_ts_use(struct gsm_bts *bts, struct gsm_bts_trx *trx, const char * const *ts_use)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_trx *trx;</span><br><span>     int i;</span><br><span>       int mismatching_ts = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        bts = gsm_bts_num(bsc_gsmnet, bts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-       trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(trx);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   fprintf(stderr, "Expect TS use:");</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr, "bts %d trx %d: expect:", bts->nr, trx->nr);</span><br><span>         for (i = 0; i < 8; i++)</span><br><span>           fprintf(stderr, "\t%s", ts_use[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-   fprintf(stderr, "\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        fprintf(stderr, "   Got TS use:");</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr, "\nbts %d trx %d:    got:", bts->nr, trx->nr);</span><br><span> </span><br><span>   for (i = 0; i < 8; i++) {</span><br><span>                 struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span>@@ -328,14 +331,14 @@</span><br><span> </span><br><span>          if (!strcmp(ts_use[i], "*"))</span><br><span>                       continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (strcmp(ts_use[i], use) && mismatching_ts < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          if (strcasecmp(ts_use[i], use) && mismatching_ts < 0)</span><br><span>                     mismatching_ts = i;</span><br><span>  }</span><br><span>    fprintf(stderr, "\n");</span><br><span> </span><br><span>         if (mismatching_ts >= 0) {</span><br><span>                fprintf(stderr, "Test failed: mismatching TS use in bts %d trx %d ts %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                  bts_nr, trx_nr, mismatching_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+                      bts->nr, trx->nr, mismatching_ts);</span><br><span>              return false;</span><br><span>        }</span><br><span>    return true;</span><br><span>@@ -399,7 +402,7 @@</span><br><span>           lchan->tch_mode = GSM48_CMODE_SPEECH_AMR;</span><br><span>                 lchan->activate.info.s15_s0 = 0x0002;</span><br><span>     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("Given codec unknown\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Given codec unknown\n");</span><br><span>          exit(EXIT_FAILURE);</span><br><span>  }</span><br><span> </span><br><span>@@ -423,7 +426,7 @@</span><br><span> </span><br><span>      lchan = lchan_select_by_type(bts, (full_rate) ? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H);</span><br><span>  if (!lchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-           printf("No resource for lchan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "No resource for lchan\n");</span><br><span>                exit(EXIT_FAILURE);</span><br><span>  }</span><br><span> </span><br><span>@@ -445,15 +448,9 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool set_ts_use(int bts_nr, int trx_nr, const char * const *ts_use)</span><br><span style="color: hsl(120, 100%, 40%);">+bool _set_ts_use(struct gsm_bts *bts, struct gsm_bts_trx *trx, const char * const *ts_use)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts_trx *trx;</span><br><span>     int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts = gsm_bts_num(bsc_gsmnet, bts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-       trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(trx);</span><br><span> </span><br><span>        fprintf(stderr, "Setting TS use:");</span><br><span>        for (i = 0; i < 8; i++)</span><br><span>@@ -469,44 +466,44 @@</span><br><span>                   continue;</span><br><span> </span><br><span>                /* If it is already as desired, don't change anything */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(want_use, is_use))</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!strcasecmp(want_use, is_use))</span><br><span>                   continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (!strcmp(want_use, "TCH/F")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (!strcasecmp(want_use, "tch/f")) {</span><br><span>                      if (!ts_is_capable_of_pchan(ts, GSM_PCHAN_TCH_F)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             printf("Error: bts %d trx %d ts %d cannot be used as TCH/F\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       bts_nr, trx_nr, i);</span><br><span style="color: hsl(120, 100%, 40%);">+                            fprintf(stderr, "Error: bts %d trx %d ts %d cannot be used as TCH/F\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    bts->nr, trx->nr, i);</span><br><span>                           return false;</span><br><span>                        }</span><br><span>                    ts_clear(ts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan_act(&ts->lchan[0], true, "AMR");</span><br><span style="color: hsl(0, 100%, 40%);">-         } else if (!strcmp(want_use, "TCH/H-")</span><br><span style="color: hsl(0, 100%, 40%);">-                           || !strcmp(want_use, "TCH/HH")</span><br><span style="color: hsl(0, 100%, 40%);">-                        || !strcmp(want_use, "TCH/-H")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        lchan_act(&ts->lchan[0], true, codec_tch_f ? : "AMR");</span><br><span style="color: hsl(120, 100%, 40%);">+               } else if (!strcasecmp(want_use, "tch/h-")</span><br><span style="color: hsl(120, 100%, 40%);">+                     || !strcasecmp(want_use, "tch/hh")</span><br><span style="color: hsl(120, 100%, 40%);">+                          || !strcasecmp(want_use, "tch/-h")) {</span><br><span>                   bool act[2];</span><br><span>                         int j;</span><br><span> </span><br><span>                   if (!ts_is_capable_of_pchan(ts, GSM_PCHAN_TCH_H)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             printf("Error: bts %d trx %d ts %d cannot be used as TCH/H\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       bts_nr, trx_nr, i);</span><br><span style="color: hsl(120, 100%, 40%);">+                            fprintf(stderr, "Error: bts %d trx %d ts %d cannot be used as TCH/H\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    bts->nr, trx->nr, i);</span><br><span>                           return false;</span><br><span>                        }</span><br><span> </span><br><span>                        if (ts->pchan_is != GSM_PCHAN_TCH_H)</span><br><span>                              ts_clear(ts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                       act[0] = want_use[4] == 'H';</span><br><span style="color: hsl(0, 100%, 40%);">-                    act[1] = want_use[5] == 'H';</span><br><span style="color: hsl(120, 100%, 40%);">+                  act[0] = (want_use[4] == 'h' || want_use[4] == 'H');</span><br><span style="color: hsl(120, 100%, 40%);">+                  act[1] = (want_use[5] == 'h' || want_use[5] == 'H');</span><br><span> </span><br><span>                     for (j = 0; j < 2; j++) {</span><br><span>                                 if (lchan_state_is(&ts->lchan[j], LCHAN_ST_UNUSED)) {</span><br><span>                                         if (act[j])</span><br><span style="color: hsl(0, 100%, 40%);">-                                             lchan_act(&ts->lchan[j], false, "AMR");</span><br><span style="color: hsl(120, 100%, 40%);">+                                              lchan_act(&ts->lchan[j], false, codec_tch_h ? : "AMR");</span><br><span>                             } else if (!act[j])</span><br><span>                                  lchan_clear(&ts->lchan[j]);</span><br><span>                   }</span><br><span style="color: hsl(0, 100%, 40%);">-               } else if (!strcmp(want_use, "-") || !strcmp(want_use, "PDCH")) {</span><br><span style="color: hsl(120, 100%, 40%);">+         } else if (!strcmp(want_use, "-") || !strcasecmp(want_use, "PDCH")) {</span><br><span>                    ts_clear(ts);</span><br><span>                }</span><br><span>    }</span><br><span>@@ -592,6 +589,8 @@</span><br><span>      struct abis_rsl_rll_hdr *rh;</span><br><span>         uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       fprintf(stderr, "- Send EST IND for %s\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh));</span><br><span>         rh->c.msg_discr = ABIS_RSL_MDISC_RLL;</span><br><span>     rh->c.msg_type = RSL_MT_EST_IND;</span><br><span>@@ -646,6 +645,16 @@</span><br><span>   abis_rsl_rcvmsg(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void lchan_release_ack(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lchan->fi && lchan->fi->state == LCHAN_ST_WAIT_BEFORE_RF_RELEASE) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* don't wait before release */</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_state_chg(lchan->fi, LCHAN_ST_WAIT_RF_RELEASE_ACK, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* ack the release */</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_fsm_inst_dispatch(lchan->fi, LCHAN_EV_RSL_RF_CHAN_REL_ACK, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* override, requires '-Wl,--wrap=abis_rsl_sendmsg'.</span><br><span>  * Catch RSL messages sent towards the BTS. */</span><br><span> int __real_abis_rsl_sendmsg(struct msgb *msg);</span><br><span>@@ -658,7 +667,7 @@</span><br><span>     struct gsm_lchan *other_lchan;</span><br><span> </span><br><span>   if (rc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("rsl_lchan_lookup() failed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "rsl_lchan_lookup() failed\n");</span><br><span>            exit(1);</span><br><span>     }</span><br><span> </span><br><span>@@ -707,1105 +716,381 @@</span><br><span>     case RSL_MT_DEACTIVATE_SACCH:</span><br><span>                break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("unknown rsl message=0x%x\n", dh->c.msg_type);</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "unknown rsl message=0x%x\n", dh->c.msg_type);</span><br><span>  }</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* test cases */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *bts_by_num_str(const char *num_str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = gsm_bts_num(bsc_gsmnet, atoi(num_str));</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     return bts;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_0[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        "2",</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx *trx_by_num_str(struct gsm_bts *bts, const char *num_str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx *trx = gsm_bts_trx_num(bts, atoi(num_str));</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+     return trx;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "Stay in better cell\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "There are many neighbor cells, but only the current cell is the best\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "cell, so no handover is performed\n",</span><br><span style="color: hsl(120, 100%, 40%);">+#define LCHAN_ARGS "lchan <0-255> <0-255> <0-7> <0-7>"</span><br><span style="color: hsl(120, 100%, 40%);">+#define LCHAN_ARGS_DOC "identify an lchan\nBTS nr\nTRX nr\nTimeslot nr\nSubslot nr\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- "create-n-bts", "7",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0",</span><br><span style="color: hsl(0, 100%, 40%);">-          "30","0",</span><br><span style="color: hsl(0, 100%, 40%);">-           "6", "0","20", "1","21", "2","18", "3","20", "4","23", "5","19",</span><br><span style="color: hsl(0, 100%, 40%);">-      "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_lchan *parse_lchan_args(const char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts = bts_by_num_str(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx = trx_by_num_str(bts, argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx_ts *ts = &trx->ts[atoi(argv[2])];</span><br><span style="color: hsl(120, 100%, 40%);">+   return &ts->lchan[atoi(argv[3])];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_1[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(120, 100%, 40%);">+#define TS_USE " (TCH/F|TCH/H-|TCH/-H|TCH/HH|PDCH" \</span><br><span style="color: hsl(120, 100%, 40%);">+               "|tch/f|tch/h-|tch/-h|tch/hh|pdch" \</span><br><span style="color: hsl(120, 100%, 40%);">+        "|-|*)"</span><br><span style="color: hsl(120, 100%, 40%);">+#define TS_USE_DOC "'TCH/F': one FR call\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "'TCH/H-': HR TS with first subslot used as TCH/H, other subslot unused\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "'TCH/HH': HR TS with both subslots used as TCH/H\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+              "'TCH/-H': HR TS with only second subslot used as TCH/H\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "'PDCH': TS used for PDCH (e.g. unused dynamic TS)\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+             "'tch/f': one FR call\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                  "'tch/h-': HR TS with first subslot used as TCH/H, other subslot unused\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "'tch/hh': HR TS with both subslots used as TCH/H\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+              "'tch/-h': HR TS with only second subslot used as TCH/H\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "'pdch': TS used for PDCH (e.g. unused dynamic TS)\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+             "'-': TS unused\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "'*': TS allowed to be in any state\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- "Handover to best better cell\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "The best neighbor cell is selected\n",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(create_n_bts, create_n_bts_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "create-n-bts <1-255>",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Create a number of BTS with four TCH/F and four TCH/H timeslots\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Number of BTS to create\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        int n = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < n; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            _create_bts(1, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "7",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0",</span><br><span style="color: hsl(0, 100%, 40%);">-          "10","0",</span><br><span style="color: hsl(0, 100%, 40%);">-           "6", "0","20", "1","21", "2","18", "3","20", "4","23", "5","19",</span><br><span style="color: hsl(0, 100%, 40%);">-      "expect-chan", "5", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "5", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(create_bts, create_bts_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "create-bts trx-count <1-255> timeslots .TS_CFG",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Create a new BTS with specific timeslot configuration\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Create N TRX in the new BTS\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "TRX count\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Timeslot config\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Timeslot types for 8 * trx-count, each being one of CCCH+SDCCH4|SDCCH8|TCH/F|TCH/H|TCH/F_TCH/H_PDCH|...;"</span><br><span style="color: hsl(120, 100%, 40%);">+      " shorthands: cs+4 = CCCH+SDCCH4; dyn = TCH/F_TCH/H_PDCH\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int num_trx = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  _create_bts(num_trx, argv + 1, argc - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_2[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        "2",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(create_ms, create_ms_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "create-ms bts <0-999> (TCH/F|TCH/H) (AMR|HR|EFR)",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Create an MS using the next free matching lchan on a given BTS\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "BTS index to subscribe on\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "lchan type to select\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "codec\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *bts_nr_str = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *tch_type = argv[1];</span><br><span style="color: hsl(120, 100%, 40%);">+       const char *codec = argv[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      fprintf(stderr, "- Creating mobile at BTS %s on "</span><br><span style="color: hsl(120, 100%, 40%);">+           "%s with %s codec\n", bts_nr_str, tch_type, codec);</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan = create_lchan(bts_by_num_str(bts_nr_str),</span><br><span style="color: hsl(120, 100%, 40%);">+                           !strcmp(tch_type, "TCH/F"), codec);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+         fprintf(stderr, "Failed to create lchan!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, " * New MS is at %s\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "Handover and Assignment must be enabled\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "This test will start with disabled assignment and handover.  A\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "better neighbor cell (assignment enabled) will not be selected and \n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "also no assignment from TCH/H to TCH/F to improve quality. There\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "will be no handover nor assignment. After enabling assignment on the\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "current cell, the MS will assign to TCH/F. After enabling handover\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "in the current cell, but disabling in the neighbor cell, handover\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "will not be performed, until it is enabled in the neighbor cell too.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(meas_rep, meas_rep_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "meas-rep " LCHAN_ARGS " rxlev <0-255> rxqual <0-7> ta <0-255>"</span><br><span style="color: hsl(120, 100%, 40%);">+       " [neighbors] [<0-255>] [<0-255>] [<0-255>] [<0-255>] [<0-255>] [<0-255>]",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Send measurement report\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_ARGS_DOC</span><br><span style="color: hsl(120, 100%, 40%);">+      "rxlev\nrxlev\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "rxqual\nrxqual\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "timing advance\ntiming advance\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbors list of rxlev reported by each neighbor cell\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbor 0 rxlev\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbor 1 rxlev\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbor 2 rxlev\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbor 3 rxlev\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbor 4 rxlev\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "neighbor 5 rxlev\n"</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%);">+     struct gsm_lchan *lc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t rxqual;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t ta;</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct neighbor_meas nm[6] = {};</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "afs-rxlev-improve", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-    "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "as-enable", "0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-enable", "0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","5","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "as-enable", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","5","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-enable", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-enable", "1", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "ho-enable", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+        lc = parse_lchan_args(argv);</span><br><span style="color: hsl(120, 100%, 40%);">+  argv += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+    argc -= 4;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_3[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-    "2",</span><br><span style="color: hsl(120, 100%, 40%);">+        rxlev = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        rxqual = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+       ta = atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+   argv += 3;</span><br><span style="color: hsl(120, 100%, 40%);">+    argc -= 3;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  "Penalty timer must not run\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "The MS will try to handover to a better cell, but this will fail.\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Even though the cell is still better, handover will not be performed\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "due to penalty timer after handover failure\n",</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!lchan_state_is(lc, LCHAN_ST_ESTABLISHED)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Error: sending measurement report for %s which is in state %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 gsm_lchan_name(lc), lchan_state_name(lc));</span><br><span style="color: hsl(120, 100%, 40%);">+             exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-failed",</span><br><span style="color: hsl(0, 100%, 40%);">-  "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+        /* skip the optional [neighbors] keyword */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (argc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           argv++;</span><br><span style="color: hsl(120, 100%, 40%);">+               argc--;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_4[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-     "2",</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(stderr, "- Sending measurement report from %s: rxlev=%u rxqual=%u ta=%u (%d neighbors)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm_lchan_name(lc), rxlev, rxqual, ta, argc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       "TCH/H keeping with HR codec\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "The MS is using half rate V1 codec, but the better cell is congested\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "at TCH/H slots. As the congestion is removed, the handover takes\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "place.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 6; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          int neighbor_bts_nr = i;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* since our bts is not in the list of neighbor cells, we need to shift */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (neighbor_bts_nr >= lc->ts->trx->bts->nr)</span><br><span style="color: hsl(120, 100%, 40%);">+                   neighbor_bts_nr++;</span><br><span style="color: hsl(120, 100%, 40%);">+            nm[i] = (struct neighbor_meas){</span><br><span style="color: hsl(120, 100%, 40%);">+                       .rxlev = argc > i ? atoi(argv[i]) : 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     .bsic = 0x3f,</span><br><span style="color: hsl(120, 100%, 40%);">+                 .bcch_f = i,</span><br><span style="color: hsl(120, 100%, 40%);">+          };</span><br><span style="color: hsl(120, 100%, 40%);">+            if (i < argc)</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, " * Neighbor cell #%d, actual BTS %d: rxlev=%d\n", i, neighbor_bts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                              nm[i].rxlev);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     got_chan_req = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     gen_meas_rep(lc, rxlev, rxqual, ta, argc, nm);</span><br><span style="color: hsl(120, 100%, 40%);">+        return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/H", "HR",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "meas-rep", "0","0","5","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-min-free", "1", "TCH/H", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","5","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(congestion_check, congestion_check_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "congestion-check",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Trigger a congestion check\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(stderr, "- Triggering congestion check\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ got_chan_req = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     hodec2_congestion_check(bsc_gsmnet);</span><br><span style="color: hsl(120, 100%, 40%);">+  return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_5[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        "2",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(expect_no_chan, expect_no_chan_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "expect-no-chan",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Expect that no channel request was sent from BSC to any cell\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    fprintf(stderr, "- Expecting no channel request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        if (got_chan_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fprintf(stderr, " * Got channel request at %s\n", gsm_lchan_name(chan_req_lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "Test failed, because channel was requested\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, " * Got no channel request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "TCH/F keeping with FR codec\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "The MS is using full rate V1 codec, but the better cell is congested\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "at TCH/F slots. As the congestion is removed, the handover takes\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "place.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+static void _expect_chan_activ(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, "- Expecting channel request at %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!got_chan_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "Test failed, because no channel was requested\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, " * Got channel request at %s\n", gsm_lchan_name(chan_req_lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lchan != chan_req_lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "Test failed, because channel was requested on a different lchan than expected\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                  "expected: %s  got: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_lchan_name(lchan), gsm_lchan_name(chan_req_lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+                exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "FR",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-min-free", "1", "TCH/F", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+static void _ack_chan_activ(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       fprintf(stderr, "- Acknowledging channel request on %s\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+  got_ho_req = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       send_chan_act_ack(lchan, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_6[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-       "2",</span><br><span style="color: hsl(120, 100%, 40%);">+static void _expect_ho_req(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        fprintf(stderr, "- Expecting handover/assignment request at %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm_lchan_name(lchan));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     "TCH/F keeping with EFR codec\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "The MS is using full rate V2 codec, but the better cell is congested\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "at TCH/F slots. As the congestion is removed, the handover takes\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "place.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!got_ho_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Test failed, because no handover was requested\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, " * Got handover/assignment request at %s\n", gsm_lchan_name(ho_req_lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ho_req_lchan != lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "Test failed, because handover/assignment was not commanded on the expected lchan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "EFR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-min-free", "1", "TCH/F", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(expect_chan, expect_chan_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "expect-chan " LCHAN_ARGS,</span><br><span style="color: hsl(120, 100%, 40%);">+      "Expect a channel request from BSC to a cell for a specific lchan\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       _expect_chan_activ(parse_lchan_args(argv));</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_7[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        "2",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(ack_chan, ack_chan_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "ack-chan",</span><br><span style="color: hsl(120, 100%, 40%);">+      "ACK a previous Channel Request\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(got_chan_req);</span><br><span style="color: hsl(120, 100%, 40%);">+    _ack_chan_activ(chan_req_lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "TCH/F to TCH/H changing with AMR codec\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "The MS is using AMR V3 codec, the better cell is congested at TCH/F\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "slots. The handover is performed to non-congested TCH/H slots.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(expect_ho_req, expect_ho_req_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "expect-ho-req " LCHAN_ARGS,</span><br><span style="color: hsl(120, 100%, 40%);">+      "Expect a handover of a given lchan\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      LCHAN_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        _expect_ho_req(parse_lchan_args(argv));</span><br><span style="color: hsl(120, 100%, 40%);">+       return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(ho_complete, ho_complete_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "ho-complete",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Send Handover Complete for the most recent HO target lchan\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!got_chan_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "Cannot ack handover/assignment, because no chan request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!got_ho_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Cannot ack handover/assignment, because no ho request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     send_ho_complete(chan_req_lchan, true);</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan_release_ack(ho_req_lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_8[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        "2",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(expect_ho, expect_ho_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "expect-ho from " LCHAN_ARGS " to " LCHAN_ARGS,</span><br><span style="color: hsl(120, 100%, 40%);">+      "Expect a handover of a specific lchan to a specific target lchan;"</span><br><span style="color: hsl(120, 100%, 40%);">+      " shorthand for expect-chan, ack-chan, expect-ho, ho-complete.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "lchan to handover from\n" LCHAN_ARGS_DOC</span><br><span style="color: hsl(120, 100%, 40%);">+      "lchan that to handover to\n" LCHAN_ARGS_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_lchan *from = parse_lchan_args(argv);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_lchan *to = parse_lchan_args(argv+4);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    "No handover to a cell with no slots available\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "If no slot is available, no handover is performed\n",</span><br><span style="color: hsl(120, 100%, 40%);">+      _expect_chan_activ(to);</span><br><span style="color: hsl(120, 100%, 40%);">+       _ack_chan_activ(to);</span><br><span style="color: hsl(120, 100%, 40%);">+  _expect_ho_req(from);</span><br><span style="color: hsl(120, 100%, 40%);">+ send_ho_complete(to, true);</span><br><span style="color: hsl(120, 100%, 40%);">+   lchan_release_ack(from);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "create-ms", "1", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "1", "0", "*", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "TCH/HH", "TCH/HH", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(ho_failed, ho_failed_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "ho-failed",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Fail the most recent handover request\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!got_chan_req) {</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "Cannot fail handover, because no chan request\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     got_chan_req = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     got_ho_req = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       send_ho_complete(ho_req_lchan, false);</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan_release_ack(chan_req_lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+    return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_9[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        "2",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(expect_ts_use, expect_ts_use_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "expect-ts-use trx <0-255> <0-255> states" TS_USE TS_USE TS_USE TS_USE TS_USE TS_USE TS_USE TS_USE,</span><br><span style="color: hsl(120, 100%, 40%);">+     "Expect timeslots of a BTS' TRX to be in a specific state\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "Indicate a BTS and TRX\n" "BTS nr\n" "TRX nr\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "List of 8 expected TS states\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = bts_by_num_str(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx = trx_by_num_str(bts, argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+       argv += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+    argc -= 2;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!_expect_ts_use(bts, trx, argv))</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "No more parallel handovers, if max_unsync_ho is defined\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "There are tree mobiles that want to handover, but only two can do\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "it at a time, because the maximum number is limited to two.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(codec_f, codec_f_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "codec tch/f (AMR|EFR|FR)",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Define which codec should be used for new TCH/F lchans (for set-ts-use)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Configure the TCH/F codec to use\nAMR\nEFR\nFR\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_talloc_replace_string(ctx, &codec_tch_f, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-max-ho", "1", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-   "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "meas-rep", "0","0","2","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "1", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-  "meas-rep", "0","0","3","0", "0","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(codec_h, codec_h_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   "codec tch/h (AMR|HR)",</span><br><span style="color: hsl(120, 100%, 40%);">+     "Define which codec should be used for new TCH/H lchans (for set-ts-use)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Configure the TCH/H codec to use\nAMR\nHR\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_talloc_replace_string(ctx, &codec_tch_h, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_10[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-       "2",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(set_ts_use, set_ts_use_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+     "set-ts-use trx <0-255> <0-255> states" TS_USE TS_USE TS_USE TS_USE TS_USE TS_USE TS_USE TS_USE,</span><br><span style="color: hsl(120, 100%, 40%);">+        "Put timeslots of a BTS' TRX into a specific state\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "Indicate a BTS and TRX\n" "BTS nr\n" "TRX nr\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "List of 8 TS states to apply\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC TS_USE_DOC)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = bts_by_num_str(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts_trx *trx = trx_by_num_str(bts, argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+       argv += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+    argc -= 2;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!_set_ts_use(bts, trx, argv))</span><br><span style="color: hsl(120, 100%, 40%);">+             exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!_expect_ts_use(bts, trx, argv))</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      "Hysteresis\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "If neighbor cell is better, handover is only performed if the\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "amount of improvement is greater or equal hyteresis\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "27","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "26","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_11[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "No Hysteresis and minimum RX level\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "If current cell's RX level is below mimium level, handover must be\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "performed, no matter of the hysteresis. First do not perform\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "handover to better neighbor cell, because the hysteresis is not\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "met. Second do not perform handover because better neighbor cell is\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "below minimum RX level. Third perform handover because current cell\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "is below minimum RX level, even if the better neighbor cell (minimum\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "RX level reached) does not meet the hysteresis.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "10","0", "1","0","11",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "8","0", "1","0","9",</span><br><span style="color: hsl(0, 100%, 40%);">-  "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "9","0", "1","0","10",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_12[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "No handover to congested cell\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "The better neighbor cell is congested, so no handover is performed.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "After the congestion is over, handover will be performed.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-min-free", "1", "TCH/F", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_13[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Handover to balance congestion\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "The current and the better cell are congested, so no handover is\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "performed. This is because handover would congest the neighbor cell\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "more. After congestion raises in the current cell, the handover is\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "performed to balance congestion\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "set-min-free", "0", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "meas-rep", "0","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "TCH/F", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_14[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Handover to congested cell, if RX level is below minimum\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "The better neighbor cell is congested, so no handover is performed.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "If the RX level of the current cell drops below minimum acceptable\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "level, the handover is performed.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "10","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "9","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_15[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Handover to cell with worse RXLEV, if RXQUAL is below minimum\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "The neighbor cell has worse RXLEV, so no handover is performed.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "If the RXQUAL of the current cell drops below minimum acceptable\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "level, the handover is performed. It is also required that 10\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "reports are received, before RXQUAL is checked.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-  /* (See also test 28, which tests for RXQUAL triggering HO to congested cell.) */</span><br><span style="color: hsl(0, 100%, 40%);">-       /* TODO: bad RXQUAL may want to prefer assignment within the same cell to avoid interference.</span><br><span style="color: hsl(0, 100%, 40%);">-    * See Performance Enhancements in a Frequency Hopping GSM Network (Nielsen Wigard 2002), Chapter</span><br><span style="color: hsl(0, 100%, 40%);">-        * 2.1.1, "Interference" in the list of triggers on p.157. */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "40","6", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_16[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Handover due to maximum TA exceeded\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "The MS in the current (best) cell has reached maximum allowed timing\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "advance. No handover is performed until the timing advance exceeds\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "it. The originating cell is still the best, but no handover is\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "performed back to that cell, because the penalty timer (due to\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "maximum allowed timing advance) is running.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "set-max-ta", "0", "5", /* of cell */</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-ta", "0", "5", /* of ms */</span><br><span style="color: hsl(0, 100%, 40%);">-   "meas-rep", "0","0","1","0", "30","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-ta", "0", "6", /* of ms */</span><br><span style="color: hsl(0, 100%, 40%);">-   "meas-rep", "0","0","1","0", "30","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "1","0","1","0", "20","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_17[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: No congestion\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Three cells have different number of used slots, but there is no\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "congestion in any of these cells. No handover is performed.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "2", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "2", "TCH/H", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","1","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","2","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","5","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","5","1", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","1","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","5","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_18[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: One out of three cells is congested\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "Three cells have different number of used slots, but there is\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion at TCH/F in the first cell. Handover is performed with\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "the best candidate.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-n-bts", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "2", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "2", "TCH/H", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "1", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","1","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","2","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","3","0", "30","0", "2","0","21","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","5","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","5","1", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","1","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","5","0", "30","0", "2","0","20","1","20",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "1", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "3", /* best candidate is MS 2 at BTS 0, TS 3 */</span><br><span style="color: hsl(0, 100%, 40%);">-        "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ts-use", "1", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_19[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Balancing over congested cells\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "Two cells are congested, but the second cell is less congested.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "Handover is performed to solve the congestion.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "FR",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "FR",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "FR",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "1", "TCH/F", "FR",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "30","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","2","0", "30","0", "1","0","21",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","3","0", "30","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","1","0", "30","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "1", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "2", /* best candidate is MS 1 at BTS 0, TS 2 */</span><br><span style="color: hsl(0, 100%, 40%);">-        "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "TCH/F", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "TCH/F", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_20[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Solving congestion by handover TCH/F -> TCH/H\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Two BTS, one MS in the first congested BTS must handover to\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "non-congested TCH/H of second BTS, in order to solve congestion\n",</span><br><span style="color: hsl(0, 100%, 40%);">-  "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "30","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "1", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_21[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Balancing congestion by handover TCH/F -> TCH/H\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "Two BTS, one MS in the first congested BTS must handover to\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "less-congested TCH/H of second BTS, in order to balance congestion\n",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "meas-rep", "0","0","1","0", "30","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "TCH/F", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_22[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Upgrading worst candidate from TCH/H -> TCH/F\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "There is only one BTS. The TCH/H slots are congested. Since\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "assignment is performed to less-congested TCH/F, the candidate with\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "the worst RX level is chosen.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    "create-n-bts", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "TCH/HH", "TCH/H-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","5","0", "30","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","5","1", "34","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","6","0", "20","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "6",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_23[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Story: 'A neighbor is your friend'\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-n-bts", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        "print",</span><br><span style="color: hsl(0, 100%, 40%);">-      "Andreas is driving along the coast, on a sunny june afternoon.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "Suddenly he is getting a call from his friend and neighbor Axel.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "What happens: Two MS are created, #0 for Axel, #1 for Andreas.",</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Axel */</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "2", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       /* andreas */</span><br><span style="color: hsl(0, 100%, 40%);">-   "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "2", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "40","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     "print",</span><br><span style="color: hsl(0, 100%, 40%);">-      "Axel asks Andreas if he would like to join them for a barbecue.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "Axel's house is right in the neighborhood and the weather is fine.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "Andreas agrees, so he drives to a close store to buy some barbecue\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "skewers.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "What happens: While driving, a different cell (mounted atop the\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "store) becomes better.",</span><br><span style="color: hsl(0, 100%, 40%);">-     /* drive to bts 1 */</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "20","0", "1","0","35",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "2", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    "print",</span><br><span style="color: hsl(0, 100%, 40%);">-      "While Andreas is walking into the store, Axel asks, if he could also\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "bring some beer. Andreas has problems understanding him: \"I have a\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "bad reception here. The cell tower is right atop the store, but poor\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "coverage inside. Can you repeat please?\"\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "What happens: Inside the store the close cell is so bad, that\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "handover back to the previous cell is required.",</span><br><span style="color: hsl(0, 100%, 40%);">-    /* bts 1 becomes bad, so bts 0 helps out */</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","1","0", "5","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">- "expect-chan", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "2", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    "print",</span><br><span style="color: hsl(0, 100%, 40%);">-      "After Andreas bought skewers and beer, he leaves the store.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "What happens: Outside the store the close cell is better again, so\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "handover back to the that cell is performed.",</span><br><span style="color: hsl(0, 100%, 40%);">-       /* bts 1 becomes better again */</span><br><span style="color: hsl(0, 100%, 40%);">-        "meas-rep", "0","0","1","0", "20","0", "1","0","35",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "2", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    "print",</span><br><span style="color: hsl(0, 100%, 40%);">-      /* bts 2 becomes better */</span><br><span style="color: hsl(0, 100%, 40%);">-      "Andreas drives down to the lake where Axel's house is.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  "What happens: There is a small cell at Axel's house, which becomes\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "better, because the current cell has no good comverage at the lake.",</span><br><span style="color: hsl(0, 100%, 40%);">-        "meas-rep", "1","0","1","0", "14","0", "2","0","2","1","63",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-chan", "2", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "2", "0", "*", "TCH/F", "TCH/F", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        "print",</span><br><span style="color: hsl(0, 100%, 40%);">-      "Andreas wonders why he still has good radio coverage: \"Last time it\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "was so bad\". Axel says: \"I installed a pico cell in my house,\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "now we can use our mobile phones down here at the lake.\"",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_24[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-  "No (or not enough) measurements for handover\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "Do not solve congestion in cell, because there is no measurement.\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "As soon as enough measurements available (1 in our case), perform\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "handover. Afterwards the old cell becomes congested and the new\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "cell is not. Do not perform handover until new measurements are\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "received.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* two cells, first in congested, but no handover */</span><br><span style="color: hsl(0, 100%, 40%);">-    "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* send measurement and trigger congestion check */</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "20","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* congest the first cell and remove congestion from second cell */</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-min-free", "0", "TCH/F", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* no handover until measurements applied */</span><br><span style="color: hsl(0, 100%, 40%);">-    "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "1","0","1","0", "20","0", "1","0","20",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-ts-use", "1", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_25[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "1",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Stay in better cell\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "There are many neighbor cells, but only the current cell is the best\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "cell, so no handover is performed\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-n-bts", "7",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "30","0",</span><br><span style="color: hsl(0, 100%, 40%);">-            "6","0","20","1","21","2","18","3","20","4","23","5","19",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_26[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "1",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Handover to best better cell\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "The best neighbor cell is selected\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-n-bts", "7",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "meas-rep", "0","0","1","0", "10","0",</span><br><span style="color: hsl(0, 100%, 40%);">-            "6","0","20","1","21","2","18","3","20","4","23","5","19",</span><br><span style="color: hsl(0, 100%, 40%);">-    "expect-chan", "5", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "5", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_27[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Upgrading worst candidate from TCH/H -> TCH/F\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "There is only one BTS. The TCH/H slots are congested. Since\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "assignment is performed to less-congested TCH/F, the candidate with\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "the worst RX level is chosen. (So far like test 22.)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "After that, trigger more congestion checks to ensure stability.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "create-n-bts", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "TCH/HH", "TCH/H-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","5","0", "30","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","5","1", "34","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","6","0", "20","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "6",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/-H", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_28[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Handover to congested cell, if RX quality is below minimum\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "The better neighbor cell is congested, so no handover is performed.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       "If the RX quality of the current cell drops below minimum acceptable\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "level, the handover is performed. It is also required that 10\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "resports are received, before RX quality is checked.\n",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-n-bts", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-        "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    "set-min-free", "1", "TCH/F", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "1", "TCH/H", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-      "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","1","0", "30","6", "1","0","40",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-chan", "1", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "1", "0", "*", "TCH/F", "-", "-", "-", "-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-    NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_29[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Balancing congestion by handover TCH/F -> TCH/H\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "One BTS, and TCH/F are considered congested, TCH/H are not.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-       ,</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-n-bts", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-        "set-min-free", "0", "TCH/F", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-      "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "-", "-", "TCH/H-", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   "meas-rep", "0","0","1","0", "30","0", "1","0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "TCH/F", "-", "-", "TCH/HH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-       NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_30[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: Balancing congestion by handover TCH/F -> TCH/H\n\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "With dynamic timeslots.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "As soon as only one TCH/F is left, there should be HO to a dyn TS.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        ,</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-bts", "1", "c+s4", "TCH/F", "TCH/F", "TCH/F", "dyn", "dyn", "dyn", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-  "set-min-free", "0", "TCH/F", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-      "set-min-free", "0", "TCH/H", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-      "as-enable", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "set-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "PDCH", "PDCH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-  "meas-rep", "0","0","1","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","2","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","3","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","4","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","5","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "PDCH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-      "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "6",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "PDCH", "TCH/H-", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "6",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "PDCH", "PDCH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-      "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","4","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "PDCH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-     "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "PDCH", "TCH/H-", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-    "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "5",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "TCH/F", "TCH/F", "PDCH", "TCH/HH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-        "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","1","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "PDCH", "TCH/HH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-    "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "TCH/F", "TCH/F", "TCH/H-", "TCH/HH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-      "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "4",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "2",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0", "*", "-", "-", "TCH/F", "TCH/HH", "TCH/HH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-  "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","1","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "-", "TCH/F", "TCH/HH", "TCH/HH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-      "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     "create-ms", "0", "TCH/F", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "meas-rep", "0","0","2","0", "40","0", "1", "0","30",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0", "*", "TCH/F", "TCH/F", "TCH/F", "TCH/HH", "TCH/HH", "TCH/HH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-  "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-no-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-     NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_31[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: re-use half used TCH/H to avoid switching more dyn TS to TCH/H\n"</span><br><span style="color: hsl(0, 100%, 40%);">-  ,</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-bts", "1", "c+s4", "TCH/F", "TCH/F", "TCH/F", "dyn", "dyn", "dyn", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-  "set-ts-use", "0", "0",  "*", "-", "-", "-", "PDCH", "TCH/H-", "PDCH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-    "create-ms", "0", "TCH/H", "AMR",</span><br><span style="color: hsl(0, 100%, 40%);">-       "expect-ts-use", "0", "0",  "*", "-", "-", "-", "PDCH", "TCH/HH", "PDCH", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">- NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char *test_case_32[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-   "2",</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  "Congestion check: favor moving a TCH/H that frees a half-used dyn TS completely\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   ,</span><br><span style="color: hsl(0, 100%, 40%);">-       "create-bts", "1", "c+s4", "dyn", "dyn", "dyn", "dyn", "dyn", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-     "set-ts-use", "0", "0",  "*", "PDCH", "TCH/HH", "TCH/H-", "TCH/HH", "PDCH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","2","1", "30","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","3","0", "30","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","4","0", "30","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     "meas-rep", "0","0","4","1", "30","0", "0",</span><br><span style="color: hsl(0, 100%, 40%);">-     /* pick one to move */</span><br><span style="color: hsl(0, 100%, 40%);">-  "set-min-free", "0", "TCH/H", "6",</span><br><span style="color: hsl(0, 100%, 40%);">-      "congestion-check",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-chan", "0", "1",</span><br><span style="color: hsl(0, 100%, 40%);">-  "ack-chan",</span><br><span style="color: hsl(0, 100%, 40%);">-   "expect-ho", "0", "3",</span><br><span style="color: hsl(0, 100%, 40%);">-    "ho-complete",</span><br><span style="color: hsl(0, 100%, 40%);">-        "expect-ts-use", "0", "0",  "*", "TCH/F", "TCH/HH", "PDCH", "TCH/HH", "PDCH", "-", "-",</span><br><span style="color: hsl(0, 100%, 40%);">-   NULL</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static char **test_cases[] =  {</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_0,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_1,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_2,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_3,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_4,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_5,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_6,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_7,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_8,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_9,</span><br><span style="color: hsl(0, 100%, 40%);">-    test_case_10,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_11,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_12,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_13,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_14,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_15,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_16,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_17,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_18,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_19,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_20,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_21,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_22,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_23,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_24,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_25,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_26,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_27,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_28,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_29,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_30,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_31,</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_32,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+static void ho_test_vty_init()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(CONFIG_NODE, &create_n_bts_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(CONFIG_NODE, &create_bts_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(CONFIG_NODE, &create_ms_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CONFIG_NODE, &meas_rep_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(CONFIG_NODE, &congestion_check_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(CONFIG_NODE, &expect_no_chan_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(CONFIG_NODE, &expect_chan_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(CONFIG_NODE, &ack_chan_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(CONFIG_NODE, &expect_ho_req_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(CONFIG_NODE, &ho_complete_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(CONFIG_NODE, &expect_ho_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CONFIG_NODE, &ho_failed_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CONFIG_NODE, &expect_ts_use_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(CONFIG_NODE, &codec_f_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CONFIG_NODE, &codec_h_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CONFIG_NODE, &set_ts_use_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> static const struct log_info_cat log_categories[] = {</span><br><span>   [DHO] = {</span><br><span>@@ -1878,35 +1163,43 @@</span><br><span>  .num_cat = ARRAY_SIZE(log_categories),</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts *bts_by_num_str(const char *num_str)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts *bts = gsm_bts_num(bsc_gsmnet, atoi(num_str));</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-       return bts;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+static struct vty_app_info vty_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "ho_test",</span><br><span style="color: hsl(120, 100%, 40%);">+  .copyright =</span><br><span style="color: hsl(120, 100%, 40%);">+  "Copyright (C) 2020 sysmocom - s.f.m.c. GmbH\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "License AGPLv3+: GNU AGPL version 3 or later <http://gnu.org/licenses/agpl-3.0.html>\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "This is free software: you are free to change and redistribute it.\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "There is NO WARRANTY, to the extent permitted by law.\r\n",</span><br><span style="color: hsl(120, 100%, 40%);">+        .version        = PACKAGE_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+    .usr_attr_desc  = {</span><br><span style="color: hsl(120, 100%, 40%);">+           [BSC_VTY_ATTR_RESTART_ABIS_OML_LINK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                      "This command applies on A-bis OML link (re)establishment",</span><br><span style="color: hsl(120, 100%, 40%);">+         [BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                      "This command applies on A-bis RSL link (re)establishment",</span><br><span style="color: hsl(120, 100%, 40%);">+         [BSC_VTY_ATTR_NEW_LCHAN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                  "This command applies for newly created lchans",</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    .usr_attr_letters = {</span><br><span style="color: hsl(120, 100%, 40%);">+         [BSC_VTY_ATTR_RESTART_ABIS_OML_LINK]    = 'o',</span><br><span style="color: hsl(120, 100%, 40%);">+                [BSC_VTY_ATTR_RESTART_ABIS_RSL_LINK]    = 'r',</span><br><span style="color: hsl(120, 100%, 40%);">+                [BSC_VTY_ATTR_NEW_LCHAN]                = 'l',</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      char **test_case;</span><br><span style="color: hsl(0, 100%, 40%);">-       int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  int algorithm;</span><br><span style="color: hsl(0, 100%, 40%);">-  int test_case_i;</span><br><span style="color: hsl(0, 100%, 40%);">-        int last_test_i;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *test_file = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (argc < 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+            fprintf(stderr, "Pass a handover test script as argument\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     test_file = argv[1];</span><br><span> </span><br><span>     ctx = talloc_named_const(NULL, 0, "handover_test");</span><br><span>        msgb_talloc_ctx_init(ctx, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   test_case_i = argc > 1? atoi(argv[1]) : -1;</span><br><span style="color: hsl(0, 100%, 40%);">-  last_test_i = ARRAY_SIZE(test_cases) - 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (test_case_i < 0 || test_case_i > last_test_i) {</span><br><span style="color: hsl(0, 100%, 40%);">-               for (i = 0; i <= last_test_i; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 printf("Test #%d (algorithm %s):\n%s\n", i,</span><br><span style="color: hsl(0, 100%, 40%);">-                           test_cases[i][0], test_cases[i][1]);</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("\nPlease specify test case number 0..%d\n", last_test_i);</span><br><span style="color: hsl(0, 100%, 40%);">-             return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_info.tall_ctx = ctx;</span><br><span> </span><br><span>         osmo_init_logging2(ctx, &log_info);</span><br><span> </span><br><span>@@ -1919,6 +1212,10 @@</span><br><span>         if (!bsc_gsmnet)</span><br><span>             exit(1);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  vty_init(&vty_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc_vty_init(bsc_gsmnet);</span><br><span style="color: hsl(120, 100%, 40%);">+     ho_test_vty_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        ts_fsm_init();</span><br><span>       lchan_fsm_init();</span><br><span>    bsc_subscr_conn_fsm_init();</span><br><span>@@ -1945,355 +1242,24 @@</span><br><span>       /* We don't really need any specific model here */</span><br><span>       bts_model_unknown_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   test_case = test_cases[test_case_i];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    fprintf(stderr, "--------------------\n");</span><br><span style="color: hsl(0, 100%, 40%);">-    fprintf(stderr, "Performing the following test %d (algorithm %s):\n%s",</span><br><span style="color: hsl(0, 100%, 40%);">-               test_case_i, test_case[0], test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-       algorithm = atoi(test_case[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- test_case += 2;</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "--------------------\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         /* Disable the congestion check timer, we will trigger manually. */</span><br><span>  bsc_gsmnet->hodec2.congestion_check_interval_s = 0;</span><br><span> </span><br><span>   handover_decision_1_init();</span><br><span>  hodec2_init(bsc_gsmnet);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    while (*test_case) {</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!strcmp(*test_case, "create-n-bts")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    int n = atoi(test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                     for (i = 0; i < n; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                              create_bts(1, bts_default_ts);</span><br><span style="color: hsl(0, 100%, 40%);">-                  test_case += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "create-bts")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* new BTS with one TRX:</span><br><span style="color: hsl(0, 100%, 40%);">-                         * "create-bts", "1", "CCCH+SDCCH4", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "TCH/H", "TCH/H", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-                   *</span><br><span style="color: hsl(0, 100%, 40%);">-                       * new BTS with two TRX:</span><br><span style="color: hsl(0, 100%, 40%);">-                         * "create-bts", "2", "CCCH+SDCCH4", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "TCH/H", "TCH/H", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-                   *                    "SDCCH8", "TCH/F", "TCH/F", "TCH/F", "TCH/F", "TCH/H", "TCH/H", "PDCH",</span><br><span style="color: hsl(0, 100%, 40%);">-                    */</span><br><span style="color: hsl(0, 100%, 40%);">-                     int num_trx = atoi(test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                       const char * const * ts_cfg = (void*)&test_case[2];</span><br><span style="color: hsl(0, 100%, 40%);">-                 create_bts(num_trx, ts_cfg);</span><br><span style="color: hsl(0, 100%, 40%);">-                    test_case += 2 + 8 * num_trx;</span><br><span style="color: hsl(0, 100%, 40%);">-           } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "as-enable")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "- Set assignment enable state at "</span><br><span style="color: hsl(0, 100%, 40%);">-                           "BTS %s to %s\n", test_case[1], test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ho_set_hodec2_as_active(bts_by_num_str(test_case[1])->ho, atoi(test_case[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "ho-enable")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "- Set handover enable state at "</span><br><span style="color: hsl(0, 100%, 40%);">-                             "BTS %s to %s\n", test_case[1], test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ho_set_ho_active(bts_by_num_str(test_case[1])->ho, atoi(test_case[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-                      test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "afs-rxlev-improve")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "- Set afs RX level improvement at "</span><br><span style="color: hsl(0, 100%, 40%);">-                          "BTS %s to %s\n", test_case[1], test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ho_set_hodec2_afs_bias_rxlev(bts_by_num_str(test_case[1])->ho, atoi(test_case[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-                  test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "afs-rxqual-improve")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      fprintf(stderr, "- Set afs RX quality improvement at "</span><br><span style="color: hsl(0, 100%, 40%);">-                                "BTS %s to %s\n", test_case[1], test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        ho_set_hodec2_afs_bias_rxqual(bts_by_num_str(test_case[1])->ho, atoi(test_case[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-                 test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "set-min-free")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    fprintf(stderr, "- Setting minimum required free %s "</span><br><span style="color: hsl(0, 100%, 40%);">-                         "slots at BTS %s to %s\n", test_case[2],</span><br><span style="color: hsl(0, 100%, 40%);">-                              test_case[1], test_case[3]);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (!strcmp(test_case[2], "TCH/F"))</span><br><span style="color: hsl(0, 100%, 40%);">-                           ho_set_hodec2_tchf_min_slots(bts_by_num_str(test_case[1])->ho, atoi(test_case[3]));</span><br><span style="color: hsl(0, 100%, 40%);">-                  else</span><br><span style="color: hsl(0, 100%, 40%);">-                            ho_set_hodec2_tchh_min_slots(bts_by_num_str(test_case[1])->ho, atoi(test_case[3]));</span><br><span style="color: hsl(0, 100%, 40%);">-                  test_case += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "set-max-ho")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      fprintf(stderr, "- Setting maximum parallel handovers "</span><br><span style="color: hsl(0, 100%, 40%);">-                               "at BTS %s to %s\n", test_case[1],</span><br><span style="color: hsl(0, 100%, 40%);">-                            test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  ho_set_hodec2_ho_max( bts_by_num_str(test_case[1])->ho, atoi(test_case[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-                 test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "set-max-ta")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      fprintf(stderr, "- Setting maximum timing advance "</span><br><span style="color: hsl(0, 100%, 40%);">-                           "at BTS %s to %s\n", test_case[1],</span><br><span style="color: hsl(0, 100%, 40%);">-                            test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  ho_set_hodec2_max_distance(bts_by_num_str(test_case[1])->ho, atoi(test_case[2]));</span><br><span style="color: hsl(0, 100%, 40%);">-                    test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "create-ms")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       const char *bts_nr_str = test_case[1];</span><br><span style="color: hsl(0, 100%, 40%);">-                  const char *tch_type = test_case[2];</span><br><span style="color: hsl(0, 100%, 40%);">-                    const char *codec = test_case[3];</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct gsm_lchan *lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(stderr, "- Creating mobile at BTS %s on "</span><br><span style="color: hsl(0, 100%, 40%);">-                             "%s with %s codec\n", bts_nr_str, tch_type, codec);</span><br><span style="color: hsl(0, 100%, 40%);">-                   lchan = create_lchan(bts_by_num_str(bts_nr_str),</span><br><span style="color: hsl(0, 100%, 40%);">-                                !strcmp(tch_type, "TCH/F"), codec);</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (!lchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           printf("Failed to create lchan!\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                          return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, " * New MS is at BTS %d TS %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             lchan->ts->trx->bts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                            lchan->ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                   test_case += 4;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "set-ta")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  fprintf(stderr, "- Setting maximum timing advance "</span><br><span style="color: hsl(0, 100%, 40%);">-                           "at MS %s to %s\n", test_case[1],</span><br><span style="color: hsl(0, 100%, 40%);">-                             test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  meas_ta_ms = atoi(test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "meas-rep")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        /* meas-rep <bts-nr> <trx-nr> <ts-nr> <lchan-nr> <rxlev> <rxqual> <nr-of-neighbors> [<cell-idx> <rxlev> [...]] */</span><br><span style="color: hsl(0, 100%, 40%);">-                 int n;</span><br><span style="color: hsl(0, 100%, 40%);">-                  struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-                    struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(0, 100%, 40%);">-                      struct gsm_lchan *lc;</span><br><span style="color: hsl(0, 100%, 40%);">-                   int bts_nr = atoi(test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        int trx_nr = atoi(test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        int ts_nr = atoi(test_case[3]);</span><br><span style="color: hsl(0, 100%, 40%);">-                 int ss_nr = atoi(test_case[4]);</span><br><span style="color: hsl(0, 100%, 40%);">-                 meas_dl_rxlev = atoi(test_case[5]);</span><br><span style="color: hsl(0, 100%, 40%);">-                     meas_dl_rxqual = atoi(test_case[6]);</span><br><span style="color: hsl(0, 100%, 40%);">-                    n = atoi(test_case[7]);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                 bts = gsm_bts_num(bsc_gsmnet, bts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                  trx = gsm_bts_trx_num(bts, trx_nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                     ts = &trx->ts[ts_nr];</span><br><span style="color: hsl(0, 100%, 40%);">-                    lc = &ts->lchan[ss_nr];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (!lchan_state_is(lc, LCHAN_ST_ESTABLISHED)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                printf("Error: sending measurement report for %d-%d-%d-%d which is in state %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                   bts_nr, trx_nr, ts_nr, ss_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   lchan_state_name(lc));</span><br><span style="color: hsl(0, 100%, 40%);">-                           exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-                        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "- Sending measurement report from "</span><br><span style="color: hsl(0, 100%, 40%);">-                          "%d-%d-%d-%d (rxlev=%d, rxqual=%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                bts_nr, trx_nr, ts_nr, ss_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                           meas_dl_rxlev, meas_dl_rxqual);</span><br><span style="color: hsl(0, 100%, 40%);">-                 meas_num_nc = n;</span><br><span style="color: hsl(0, 100%, 40%);">-                        test_case += 8;</span><br><span style="color: hsl(0, 100%, 40%);">-                 for (i = 0; i < n; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            int nr = atoi(test_case[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-                            /* since our bts is not in the list of neighbor</span><br><span style="color: hsl(0, 100%, 40%);">-                          * cells, we need to shift */</span><br><span style="color: hsl(0, 100%, 40%);">-                           if (nr >= lc->ts->trx->bts->nr)</span><br><span style="color: hsl(0, 100%, 40%);">-                                  nr++;</span><br><span style="color: hsl(0, 100%, 40%);">-                           fprintf(stderr, " * Neighbor cell #%s, actual "</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "BTS %d (rxlev=%s)\n", test_case[0], nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                          meas_bcch_f_nc[i] = atoi(test_case[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-                                 /* bts number, not counting our own */</span><br><span style="color: hsl(0, 100%, 40%);">-                          meas_rxlev_nc[i] = atoi(test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                          meas_bsic_nc[i] = 0x3f;</span><br><span style="color: hsl(0, 100%, 40%);">-                         test_case += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-                       got_chan_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       gen_meas_rep(lc);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "congestion-check")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(stderr, "- Triggering congestion check\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                   got_chan_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (algorithm == 2)</span><br><span style="color: hsl(0, 100%, 40%);">-                             hodec2_congestion_check(bsc_gsmnet);</span><br><span style="color: hsl(0, 100%, 40%);">-                    test_case += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "expect-chan")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     fprintf(stderr, "- Expecting channel request at BTS %s "</span><br><span style="color: hsl(0, 100%, 40%);">-                              "TS %s\n", test_case[1], test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (!got_chan_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            printf("Test failed, because no channel was "</span><br><span style="color: hsl(0, 100%, 40%);">-                                 "requested\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, " * Got channel request at BTS %d "</span><br><span style="color: hsl(0, 100%, 40%);">-                           "TS %d\n", chan_req_lchan->ts->trx->bts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                              chan_req_lchan->ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (chan_req_lchan->ts->trx->bts->nr</span><br><span style="color: hsl(0, 100%, 40%);">-                                                != atoi(test_case[1])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                printf("Test failed, because channel was not "</span><br><span style="color: hsl(0, 100%, 40%);">-                                        "requested on expected BTS\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (chan_req_lchan->ts->nr != atoi(test_case[2])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                               printf("Test failed, because channel was not "</span><br><span style="color: hsl(0, 100%, 40%);">-                                        "requested on expected TS\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "expect-no-chan")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  fprintf(stderr, "- Expecting no channel request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (got_chan_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             fprintf(stderr, " * Got channel request at "</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "BTS %d TS %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     chan_req_lchan->ts->trx->bts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   chan_req_lchan->ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                          printf("Test failed, because channel was "</span><br><span style="color: hsl(0, 100%, 40%);">-                                    "requested\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, " * Got no channel request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "expect-ho")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "- Expecting handover/assignment "</span><br><span style="color: hsl(0, 100%, 40%);">-                            "request at BTS %s TS %s\n", test_case[1],</span><br><span style="color: hsl(0, 100%, 40%);">-                            test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (!got_ho_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              printf("Test failed, because no handover was "</span><br><span style="color: hsl(0, 100%, 40%);">-                                        "requested\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                               return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, " * Got handover/assignment request at "</span><br><span style="color: hsl(0, 100%, 40%);">-                              "BTS %d TS %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             ho_req_lchan->ts->trx->bts->nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                             ho_req_lchan->ts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (ho_req_lchan->ts->trx->bts->nr</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  != atoi(test_case[1])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                printf("Test failed, because "</span><br><span style="color: hsl(0, 100%, 40%);">-                                        "handover/assignment was not commanded "</span><br><span style="color: hsl(0, 100%, 40%);">-                                      "at the expected BTS\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                             return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (ho_req_lchan->ts->nr != atoi(test_case[2])) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         printf("Test failed, because "</span><br><span style="color: hsl(0, 100%, 40%);">-                                        "handover/assignment was not commanded "</span><br><span style="color: hsl(0, 100%, 40%);">-                                      "at the expected TS\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                              return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "ack-chan")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        fprintf(stderr, "- Acknowledging channel request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!got_chan_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            printf("Cannot ack channel, because no "</span><br><span style="color: hsl(0, 100%, 40%);">-                                      "request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                         return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                 got_ho_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                 send_chan_act_ack(chan_req_lchan, 1);</span><br><span style="color: hsl(0, 100%, 40%);">-           } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "ho-complete")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     fprintf(stderr, "- Acknowledging handover/assignment "</span><br><span style="color: hsl(0, 100%, 40%);">-                                "request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!got_chan_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            printf("Cannot ack handover/assignment, "</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "because no chan request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                         return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (!got_ho_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              printf("Cannot ack handover/assignment, "</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "because no ho request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                           return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                 got_chan_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       got_ho_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                 send_ho_complete(chan_req_lchan, true);</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "ho-failed")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       fprintf(stderr, "- Making handover fail\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (!got_chan_req) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            printf("Cannot fail handover, because no chan "</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "request\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                         return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-                       test_case += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                 got_chan_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                       got_ho_req = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                 send_ho_complete(ho_req_lchan, false);</span><br><span style="color: hsl(0, 100%, 40%);">-          } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "expect-ts-use")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* expect-ts-use <bts-nr> <trx-nr> 8x<ts-use></span><br><span style="color: hsl(0, 100%, 40%);">-                  * e.g.</span><br><span style="color: hsl(0, 100%, 40%);">-                  * expect-ts-use 0 0  - TCH/F - - TCH/H- TCH/HH TCH/-H PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-                      * TCH/F: one FR call.</span><br><span style="color: hsl(0, 100%, 40%);">-                   * TCH/H-: HR TS with first subslot used as TCH/H, other subslot unused.</span><br><span style="color: hsl(0, 100%, 40%);">-                         * TCH/HH: HR TS with both subslots used as TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-                        * TCH/-H: HR TS with only second subslot used as TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-                  * PDCH: TS used for PDCH (e.g. unused dynamic TS)</span><br><span style="color: hsl(0, 100%, 40%);">-                       */</span><br><span style="color: hsl(0, 100%, 40%);">-                     int bts_nr = atoi(test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        int trx_nr = atoi(test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        const char * const * ts_use = (void*)&test_case[3];</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!expect_ts_use(bts_nr, trx_nr, ts_use))</span><br><span style="color: hsl(0, 100%, 40%);">-                             return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    test_case += 1 + 2 + 8;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "set-ts-use")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* set-ts-use <bts-nr> <trx-nr> 8x<ts-use></span><br><span style="color: hsl(0, 100%, 40%);">-                     * e.g.</span><br><span style="color: hsl(0, 100%, 40%);">-                  * set-ts-use 0 0  * TCH/F - - TCH/H- TCH/HH TCH/-H PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-                         * '*': keep as is</span><br><span style="color: hsl(0, 100%, 40%);">-                       * TCH/F: one FR call.</span><br><span style="color: hsl(0, 100%, 40%);">-                   * TCH/H-: HR TS with first subslot used as TCH/H, other subslot unused.</span><br><span style="color: hsl(0, 100%, 40%);">-                         * TCH/HH: HR TS with both subslots used as TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-                        * TCH/-H: HR TS with only second subslot used as TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-                  * PDCH: TS used for PDCH (e.g. unused dynamic TS)</span><br><span style="color: hsl(0, 100%, 40%);">-                       */</span><br><span style="color: hsl(0, 100%, 40%);">-                     int bts_nr = atoi(test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        int trx_nr = atoi(test_case[2]);</span><br><span style="color: hsl(0, 100%, 40%);">-                        const char * const * ts_use = (void*)&test_case[3];</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!set_ts_use(bts_nr, trx_nr, ts_use))</span><br><span style="color: hsl(0, 100%, 40%);">-                                return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (!expect_ts_use(bts_nr, trx_nr, ts_use))</span><br><span style="color: hsl(0, 100%, 40%);">-                             return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-                    test_case += 1 + 2 + 8;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!strcmp(*test_case, "print")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   fprintf(stderr, "\n%s\n\n", test_case[1]);</span><br><span style="color: hsl(0, 100%, 40%);">-                    test_case += 2;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        printf("Unknown test command '%s', please fix!\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                            *test_case);</span><br><span style="color: hsl(0, 100%, 40%);">-                    return EXIT_FAILURE;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               {</span><br><span style="color: hsl(0, 100%, 40%);">-                       /* Help the lchan out of releasing states */</span><br><span style="color: hsl(0, 100%, 40%);">-                    struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-                    llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-                                llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        int ts_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-                                      for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                struct gsm_lchan *lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                ts_for_each_lchan(lchan, &trx->ts[ts_nr]) {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      if (lchan->fi && lchan->fi->state == LCHAN_ST_WAIT_BEFORE_RF_RELEASE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                osmo_fsm_inst_state_chg(lchan->fi, LCHAN_ST_WAIT_RF_RELEASE_ACK, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              osmo_fsm_inst_dispatch(lchan->fi, LCHAN_EV_RSL_RF_CHAN_REL_ACK, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = vty_read_config_file(test_file, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Failed to parse the test file: '%s'\n", test_file);</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   fprintf(stderr, "--------------------\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    printf("Test OK\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  fprintf(stderr, "--------------------\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         talloc_free(ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-       return EXIT_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+  fprintf(stderr,"-------------------\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!rc)</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "pass\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          fprintf(stderr, "FAIL\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  return rc;</span><br><span> }</span><br><span> </span><br><span> void rtp_socket_free() {}</span><br><span>diff --git a/tests/handover/handover_test.ok b/tests/handover/handover_test.ok</span><br><span>deleted file mode 100644</span><br><span>index 678f9a3..0000000</span><br><span>--- a/tests/handover/handover_test.ok</span><br><span>+++ /dev/null</span><br><span>@@ -1 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-Test OK</span><br><span>diff --git a/tests/handover/handover_tests.ok b/tests/handover/handover_tests.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..5ec8dc2</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/handover_tests.ok</span><br><span>@@ -0,0 +1,33 @@</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0000.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0001.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0002.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0003.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0004.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0005.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0006.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0007.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0008.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0009.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0010.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0011.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0012.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0013.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0014.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0015.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0016.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0017.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0018.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0019.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0020.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0021.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0022.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0023.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0024.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0025.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0026.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0027.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0028.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0029.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0030.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0031.ho_vty</span><br><span style="color: hsl(120, 100%, 40%);">+pass test0032.ho_vty</span><br><span>diff --git a/tests/handover/handover_tests.sh b/tests/handover/handover_tests.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..68a8e2d</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/handover_tests.sh</span><br><span>@@ -0,0 +1,68 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+set -e</span><br><span style="color: hsl(120, 100%, 40%);">+tests_dir="${1:-.}"</span><br><span style="color: hsl(120, 100%, 40%);">+build_dir="${2:-.}"</span><br><span style="color: hsl(120, 100%, 40%);">+update="$3"</span><br><span style="color: hsl(120, 100%, 40%);">+test -d "$tests_dir"</span><br><span style="color: hsl(120, 100%, 40%);">+test -d "$build_dir"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -n "$update" -a "x$update" != "x-u" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "unknown argument: $update"</span><br><span style="color: hsl(120, 100%, 40%);">+    exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+one_test() {</span><br><span style="color: hsl(120, 100%, 40%);">+    test_path="$1"</span><br><span style="color: hsl(120, 100%, 40%);">+      test_name="$(basename "$test_path")"</span><br><span style="color: hsl(120, 100%, 40%);">+      got_out="$(mktemp "tmp.$test_name.stdout.XXXXX")"</span><br><span style="color: hsl(120, 100%, 40%);">+ got_err="$(mktemp "tmp.$test_name.stderr.XXXXX")"</span><br><span style="color: hsl(120, 100%, 40%);">+ set +e</span><br><span style="color: hsl(120, 100%, 40%);">+        "$build_dir"/handover_test "$test_path" > "$got_out" 2> "$got_err"</span><br><span style="color: hsl(120, 100%, 40%);">+      rc=$?</span><br><span style="color: hsl(120, 100%, 40%);">+ if [ "x$rc" = "x0" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                expect_out="$test_path.ok"</span><br><span style="color: hsl(120, 100%, 40%);">+          expect_err="$test_path.err"</span><br><span style="color: hsl(120, 100%, 40%);">+         if [ "x$update" = "x-u" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                   cp "$got_out" "$expect_out"</span><br><span style="color: hsl(120, 100%, 40%);">+                       cp "$got_err" "$expect_err"</span><br><span style="color: hsl(120, 100%, 40%);">+               else</span><br><span style="color: hsl(120, 100%, 40%);">+                  if [ -f "$expect_out" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                               diff -u "$expect_out" "$got_out"</span><br><span style="color: hsl(120, 100%, 40%);">+                          rc=$?</span><br><span style="color: hsl(120, 100%, 40%);">+                 fi</span><br><span style="color: hsl(120, 100%, 40%);">+                    if [ -f "$expect_err" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                               diff -u "$expect_err" "$got_err"</span><br><span style="color: hsl(120, 100%, 40%);">+                          rc2=$?</span><br><span style="color: hsl(120, 100%, 40%);">+                        fi</span><br><span style="color: hsl(120, 100%, 40%);">+                    if [ "x$rc" = "x0" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                                rc=$rc2</span><br><span style="color: hsl(120, 100%, 40%);">+                       fi</span><br><span style="color: hsl(120, 100%, 40%);">+            fi</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+    rm "$got_out"</span><br><span style="color: hsl(120, 100%, 40%);">+       rm "$got_err"</span><br><span style="color: hsl(120, 100%, 40%);">+       set -e</span><br><span style="color: hsl(120, 100%, 40%);">+        return $rc</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%);">+results="$(mktemp "tmp.handover_test_results.XXXXX")"</span><br><span style="color: hsl(120, 100%, 40%);">+for test_path in "$tests_dir"/test*.ho_vty ; do</span><br><span style="color: hsl(120, 100%, 40%);">+ test_name="$(basename "$test_path")"</span><br><span style="color: hsl(120, 100%, 40%);">+      if one_test "$test_path"; then</span><br><span style="color: hsl(120, 100%, 40%);">+              echo "pass $test_name" >> "$results"</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "FAIL $test_name" >> "$results"</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+done</span><br><span style="color: hsl(120, 100%, 40%);">+set +e</span><br><span style="color: hsl(120, 100%, 40%);">+cat "$results"</span><br><span style="color: hsl(120, 100%, 40%);">+failed="$(grep FAIL "$results")"</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z "$failed" -a "x$update" = "x-u" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+       cp "$results" "$tests_dir"/handover_tests.ok</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+rm "$results"</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -n "$failed" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    echo "tests failed"</span><br><span style="color: hsl(120, 100%, 40%);">+ exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+exit 0</span><br><span>diff --git a/tests/handover/test0000.ho_vty b/tests/handover/test0000.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..00e0e1a</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0000.ho_vty</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Stay in better cell</span><br><span style="color: hsl(120, 100%, 40%);">+# There are many neighbor cells, but only the current cell is the best cell, so no handover is performed</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 7</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 21 18 20 23 19</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span>diff --git a/tests/handover/test0001.ho_vty b/tests/handover/test0001.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..afa0a88</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0001.ho_vty</span><br><span>@@ -0,0 +1,8 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover to best better cell</span><br><span style="color: hsl(120, 100%, 40%);">+# The best neighbor cell is selected</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 7</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 20 21 18 20 23 19</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 5 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 5 0 states * TCH/F - - - - - -</span><br><span>diff --git a/tests/handover/test0002.ho_vty b/tests/handover/test0002.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..ffd0311</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0002.ho_vty</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover and Assignment must be enabled</span><br><span style="color: hsl(120, 100%, 40%);">+# This test will start with disabled assignment and handover.  A</span><br><span style="color: hsl(120, 100%, 40%);">+# better neighbor cell (assignment enabled) will not be selected and</span><br><span style="color: hsl(120, 100%, 40%);">+# also no assignment from TCH/H to TCH/F to improve quality. There</span><br><span style="color: hsl(120, 100%, 40%);">+# will be no handover nor assignment. After enabling assignment on the</span><br><span style="color: hsl(120, 100%, 40%);">+# current cell, the MS will assign to TCH/F. After enabling handover</span><br><span style="color: hsl(120, 100%, 40%);">+# in the current cell, but disabling in the neighbor cell, handover</span><br><span style="color: hsl(120, 100%, 40%);">+# will not be performed, until it is enabled in the neighbor cell too.</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ handover 0</span><br><span style="color: hsl(120, 100%, 40%);">+ handover2 afs-bias rxlev 5</span><br><span style="color: hsl(120, 100%, 40%);">+ handover2 assignment 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * - - - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 assignment 1</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover 1</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover 1</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0003.ho_vty b/tests/handover/test0003.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..be25c20</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0003.ho_vty</span><br><span>@@ -0,0 +1,16 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Penalty timer must not run</span><br><span style="color: hsl(120, 100%, 40%);">+# The MS will try to handover to a better cell, but this will fail.</span><br><span style="color: hsl(120, 100%, 40%);">+# Even though the cell is still better, handover will not be performed</span><br><span style="color: hsl(120, 100%, 40%);">+# due to penalty timer after handover failure</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-chan lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+ack-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho-req lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+ho-failed</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span>diff --git a/tests/handover/test0004.ho_vty b/tests/handover/test0004.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..2f514bf</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0004.ho_vty</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# TCH/H keeping with HR codec</span><br><span style="color: hsl(120, 100%, 40%);">+# The MS is using half rate V1 codec, but the better cell is congested</span><br><span style="color: hsl(120, 100%, 40%);">+# at TCH/H slots. As the congestion is removed, the handover takes</span><br><span style="color: hsl(120, 100%, 40%);">+# place.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+codec tch/h HR</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * - - - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 3</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 5 0 to lchan 1 0 5 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - TCH/H- - -</span><br><span>diff --git a/tests/handover/test0005.ho_vty b/tests/handover/test0005.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..4729d25</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0005.ho_vty</span><br><span>@@ -0,0 +1,21 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# TCH/F keeping with FR codec</span><br><span style="color: hsl(120, 100%, 40%);">+# The MS is using full rate V1 codec, but the better cell is congested</span><br><span style="color: hsl(120, 100%, 40%);">+# at TCH/F slots. As the congestion is removed, the handover takes</span><br><span style="color: hsl(120, 100%, 40%);">+# place.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+codec tch/f FR</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 3</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0006.ho_vty b/tests/handover/test0006.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..f1a9b40</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0006.ho_vty</span><br><span>@@ -0,0 +1,21 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# TCH/F keeping with EFR codec</span><br><span style="color: hsl(120, 100%, 40%);">+# The MS is using full rate V2 codec, but the better cell is congested</span><br><span style="color: hsl(120, 100%, 40%);">+# at TCH/F slots. As the congestion is removed, the handover takes</span><br><span style="color: hsl(120, 100%, 40%);">+# place.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+codec tch/f EFR</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 3</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0007.ho_vty b/tests/handover/test0007.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..22c5e87</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0007.ho_vty</span><br><span>@@ -0,0 +1,14 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# TCH/F to TCH/H changing with AMR codec</span><br><span style="color: hsl(120, 100%, 40%);">+# The MS is using AMR V3 codec, the better cell is congested at TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+# slots. The handover is performed to non-congested TCH/H slots.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 5 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0008.ho_vty b/tests/handover/test0008.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..3b06d3d</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0008.ho_vty</span><br><span>@@ -0,0 +1,9 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# No handover to a cell with no slots available</span><br><span style="color: hsl(120, 100%, 40%);">+# If no slot is available, no handover is performed</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 1 0 states * TCH/F TCH/F TCH/F TCH/F TCH/HH TCH/HH -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0009.ho_vty b/tests/handover/test0009.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..31482d2</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0009.ho_vty</span><br><span>@@ -0,0 +1,16 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# No more parallel handovers, if max_unsync_ho is defined</span><br><span style="color: hsl(120, 100%, 40%);">+# There are three mobiles that want to handover, but only two can do</span><br><span style="color: hsl(120, 100%, 40%);">+# it at a time, because the maximum number is limited to two.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 max-handovers 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-chan lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-chan lchan 1 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 3 0 rxlev 0 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0010.ho_vty b/tests/handover/test0010.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..5c06a36</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0010.ho_vty</span><br><span>@@ -0,0 +1,13 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Hysteresis</span><br><span style="color: hsl(120, 100%, 40%);">+# If neighbor cell is better, handover is only performed if the</span><br><span style="color: hsl(120, 100%, 40%);">+# amount of improvement is greater or equal hyteresis</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 27 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 26 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0011.ho_vty b/tests/handover/test0011.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..e034fad</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0011.ho_vty</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# No Hysteresis and minimum RX level</span><br><span style="color: hsl(120, 100%, 40%);">+# If current cell's RX level is below mimium level, handover must be</span><br><span style="color: hsl(120, 100%, 40%);">+# performed, no matter of the hysteresis. First do not perform</span><br><span style="color: hsl(120, 100%, 40%);">+# handover to better neighbor cell, because the hysteresis is not</span><br><span style="color: hsl(120, 100%, 40%);">+# met. Second do not perform handover because better neighbor cell is</span><br><span style="color: hsl(120, 100%, 40%);">+# below minimum RX level. Third perform handover because current cell</span><br><span style="color: hsl(120, 100%, 40%);">+# is below minimum RX level, even if the better neighbor cell (minimum</span><br><span style="color: hsl(120, 100%, 40%);">+# RX level reached) does not meet the hysteresis.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 11</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 8 rxqual 0 ta 0 neighbors 9</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 9 rxqual 0 ta 0 neighbors 10</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0012.ho_vty b/tests/handover/test0012.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..b2319d4</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0012.ho_vty</span><br><span>@@ -0,0 +1,21 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# No handover to congested cell</span><br><span style="color: hsl(120, 100%, 40%);">+# The better neighbor cell is congested, so no handover is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+# After the congestion is over, handover will be performed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 3</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 3</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0013.ho_vty b/tests/handover/test0013.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..e8304a1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0013.ho_vty</span><br><span>@@ -0,0 +1,24 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover to balance congestion</span><br><span style="color: hsl(120, 100%, 40%);">+# The current and the better cell are congested, so no handover is</span><br><span style="color: hsl(120, 100%, 40%);">+# performed. This is because handover would congest the neighbor cell</span><br><span style="color: hsl(120, 100%, 40%);">+# more. After congestion rises in the current cell, the handover is</span><br><span style="color: hsl(120, 100%, 40%);">+# performed to balance congestion</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - TCH/F - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0014.ho_vty b/tests/handover/test0014.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..d43b89c</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0014.ho_vty</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover to congested cell, if RX level is below minimum</span><br><span style="color: hsl(120, 100%, 40%);">+# The better neighbor cell is congested, so no handover is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+# If the RX level of the current cell drops below minimum acceptable</span><br><span style="color: hsl(120, 100%, 40%);">+# level, the handover is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 9 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0015.ho_vty b/tests/handover/test0015.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..2b80d01</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0015.ho_vty</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover to cell with worse RXLEV, if RXQUAL is below minimum</span><br><span style="color: hsl(120, 100%, 40%);">+# The neighbor cell has worse RXLEV, so no handover is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+# If the RXQUAL of the current cell drops below minimum acceptable</span><br><span style="color: hsl(120, 100%, 40%);">+# level, the handover is performed. It is also required that 10</span><br><span style="color: hsl(120, 100%, 40%);">+# reports are received, before RXQUAL is checked.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (See also test 28, which tests for RXQUAL triggering HO to congested cell.)</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# TODO: bad RXQUAL may want to prefer assignment within the same cell to avoid interference.</span><br><span style="color: hsl(120, 100%, 40%);">+# See Performance Enhancements in a Frequency Hopping GSM Network (Nielsen Wigard 2002), Chapter</span><br><span style="color: hsl(120, 100%, 40%);">+# 2.1.1, "Interference" in the list of triggers on p.157.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 6 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0016.ho_vty b/tests/handover/test0016.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..05c4a76</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0016.ho_vty</span><br><span>@@ -0,0 +1,21 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover due to maximum TA exceeded</span><br><span style="color: hsl(120, 100%, 40%);">+# The MS in the current (best) cell has reached maximum allowed timing</span><br><span style="color: hsl(120, 100%, 40%);">+# advance. No handover is performed until the timing advance exceeds</span><br><span style="color: hsl(120, 100%, 40%);">+# it. The originating cell is still the best, but no handover is</span><br><span style="color: hsl(120, 100%, 40%);">+# performed back to that cell, because the penalty timer (due to</span><br><span style="color: hsl(120, 100%, 40%);">+# maximum allowed timing advance) is running.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 maximum distance 5</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 5 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 6 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 20 rxqual 0 ta 6 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0017.ho_vty b/tests/handover/test0017.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..824d1d3</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0017.ho_vty</span><br><span>@@ -0,0 +1,34 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: No congestion</span><br><span style="color: hsl(120, 100%, 40%);">+# Three cells have different number of used slots, but there is no</span><br><span style="color: hsl(120, 100%, 40%);">+# congestion in any of these cells. No handover is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 3</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 2</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 2</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 1 0 states * TCH/F -     - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 1 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F -     - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0018.ho_vty b/tests/handover/test0018.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..4919d20</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0018.ho_vty</span><br><span>@@ -0,0 +1,39 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: One out of three cells is congested</span><br><span style="color: hsl(120, 100%, 40%);">+# Three cells have different number of used slots, but there is</span><br><span style="color: hsl(120, 100%, 40%);">+# congestion at TCH/F in the first cell. Handover is performed with</span><br><span style="color: hsl(120, 100%, 40%);">+# the best candidate.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 3</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 2</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 2</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 1 0 states * TCH/F -     -     - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0 neighbors 21 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 1 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 5 0 rxlev 30 rxqual 0 ta 0 neighbors 20 1 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F -     -     - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 3 0 to lchan 1 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F TCH/F - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0019.ho_vty b/tests/handover/test0019.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..2e7fa5a</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0019.ho_vty</span><br><span>@@ -0,0 +1,26 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Balancing over congested cells</span><br><span style="color: hsl(120, 100%, 40%);">+# Two cells are congested, but the second cell is less congested.</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover is performed to solve the congestion.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+codec tch/f FR</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 0 rxlev 30 rxqual 0 ta 0 neighbors 21</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 2 0 to lchan 1 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F -     TCH/F - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F TCH/F -     - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0020.ho_vty b/tests/handover/test0020.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..5c93494</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0020.ho_vty</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Solving congestion by handover TCH/F -> TCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+# Two BTS, one MS in the first congested BTS must handover to</span><br><span style="color: hsl(120, 100%, 40%);">+# non-congested TCH/H of second BTS, in order to solve congestion</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 5 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - -      - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0021.ho_vty b/tests/handover/test0021.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..79a3084</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0021.ho_vty</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Balancing congestion by handover TCH/F -> TCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+# Two BTS, one MS in the first congested BTS must handover to</span><br><span style="color: hsl(120, 100%, 40%);">+# less-congested TCH/H of second BTS, in order to balance congestion</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * -     TCH/F - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F -     - - -      - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0022.ho_vty b/tests/handover/test0022.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..d6515fc</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0022.ho_vty</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Upgrading worst candidate from TCH/H -> TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+# There is only one BTS. The TCH/H slots are congested. Since</span><br><span style="color: hsl(120, 100%, 40%);">+# assignment is performed to less-congested TCH/F, the candidate with</span><br><span style="color: hsl(120, 100%, 40%);">+# the worst RX level is chosen.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * - - - - TCH/HH TCH/H- -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 1 rxlev 34 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0023.ho_vty b/tests/handover/test0023.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..4e82761</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0023.ho_vty</span><br><span>@@ -0,0 +1,72 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Story: 'A neighbor is your friend'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Andreas is driving along the coast, on a sunny june afternoon.</span><br><span style="color: hsl(120, 100%, 40%);">+# Suddenly he is getting a call from his friend and neighbor Axel.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# What happens: Two MS are created, #0 for Axel, #1 for Andreas.</span><br><span style="color: hsl(120, 100%, 40%);">+# Axel:</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 2 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+# andreas:</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 2 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Axel asks Andreas if he would like to join them for a barbecue.</span><br><span style="color: hsl(120, 100%, 40%);">+# Axel's house is right in the neighborhood and the weather is fine.</span><br><span style="color: hsl(120, 100%, 40%);">+# Andreas agrees, so he drives to a close store to buy some barbecue</span><br><span style="color: hsl(120, 100%, 40%);">+# skewers.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# What happens: While driving, a different cell (mounted atop the</span><br><span style="color: hsl(120, 100%, 40%);">+# store) becomes better.</span><br><span style="color: hsl(120, 100%, 40%);">+# drive to bts 1:</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 35</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 2 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# While Andreas is walking into the store, Axel asks, if he could also</span><br><span style="color: hsl(120, 100%, 40%);">+# bring some beer. Andreas has problems understanding him: "I have a</span><br><span style="color: hsl(120, 100%, 40%);">+# bad reception here. The cell tower is right atop the store, but poor</span><br><span style="color: hsl(120, 100%, 40%);">+# coverage inside. Can you repeat please?"</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# What happens: Inside the store the close cell is so bad, that</span><br><span style="color: hsl(120, 100%, 40%);">+# handover back to the previous cell is required.</span><br><span style="color: hsl(120, 100%, 40%);">+# bts 1 becomes bad, so bts 0 helps out:</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 5 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 1 0 1 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 2 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# After Andreas bought skewers and beer, he leaves the store.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# What happens: Outside the store the close cell is better again, so</span><br><span style="color: hsl(120, 100%, 40%);">+# handover back to the that cell is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+# bts 1 becomes better again:</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 35</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 2 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# bts 2 becomes better:</span><br><span style="color: hsl(120, 100%, 40%);">+# Andreas drives down to the lake where Axel's house is.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# What happens: There is a small cell at Axel's house, which becomes</span><br><span style="color: hsl(120, 100%, 40%);">+# better, because the current cell has no good comverage at the lake.</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 14 rxqual 0 ta 0 neighbors 2 63</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 1 0 1 0 to lchan 2 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 2 0 states * TCH/F TCH/F - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Andreas wonders why he still has good radio coverage: "Last time it</span><br><span style="color: hsl(120, 100%, 40%);">+# was so bad". Axel says: "I installed a pico cell in my house,</span><br><span style="color: hsl(120, 100%, 40%);">+# now we can use our mobile phones down here at the lake."</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0024.ho_vty b/tests/handover/test0024.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..b67a248</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0024.ho_vty</span><br><span>@@ -0,0 +1,46 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# No (or not enough) measurements for handover</span><br><span style="color: hsl(120, 100%, 40%);">+# Do not solve congestion in cell, because there is no measurement.</span><br><span style="color: hsl(120, 100%, 40%);">+# As soon as enough measurements available (1 in our case), perform</span><br><span style="color: hsl(120, 100%, 40%);">+# handover. Afterwards the old cell becomes congested and the new</span><br><span style="color: hsl(120, 100%, 40%);">+# cell is not. Do not perform handover until new measurements are</span><br><span style="color: hsl(120, 100%, 40%);">+# received.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# two cells, first in congested, but no handover:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# send measurement and trigger congestion check:</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# congest the first cell and remove congestion from second cell:</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 0</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# no handover until measurements applied:</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 1 0 1 0 rxlev 20 rxqual 0 ta 0 neighbors 20</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 1 0 1 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0025.ho_vty b/tests/handover/test0025.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..b3e76f8</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0025.ho_vty</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Stay in better cell</span><br><span style="color: hsl(120, 100%, 40%);">+# There are many neighbor cells, but only the current cell is the best</span><br><span style="color: hsl(120, 100%, 40%);">+# cell, so no handover is performed</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 7</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 20 21 18 20 23 19</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0026.ho_vty b/tests/handover/test0026.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..c3f5544</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0026.ho_vty</span><br><span>@@ -0,0 +1,10 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover to best better cell</span><br><span style="color: hsl(120, 100%, 40%);">+# The best neighbor cell is selected</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 7</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 10 rxqual 0 ta 0 neighbors 20 21 18 20 23 19</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 5 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 5 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0027.ho_vty b/tests/handover/test0027.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..e7778d0</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0027.ho_vty</span><br><span>@@ -0,0 +1,27 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Upgrading worst candidate from TCH/H -> TCH/F</span><br><span style="color: hsl(120, 100%, 40%);">+# There is only one BTS. The TCH/H slots are congested. Since</span><br><span style="color: hsl(120, 100%, 40%);">+# assignment is performed to less-congested TCH/F, the candidate with</span><br><span style="color: hsl(120, 100%, 40%);">+# the worst RX level is chosen. (So far like test 22.)</span><br><span style="color: hsl(120, 100%, 40%);">+# After that, trigger more congestion checks to ensure stability.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * - - - - TCH/HH TCH/H- -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 1 rxlev 34 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 5 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/-H - -</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0028.ho_vty b/tests/handover/test0028.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..1e81293</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0028.ho_vty</span><br><span>@@ -0,0 +1,35 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Handover to congested cell, if RX quality is below minimum</span><br><span style="color: hsl(120, 100%, 40%);">+# The better neighbor cell is congested, so no handover is performed.</span><br><span style="color: hsl(120, 100%, 40%);">+# If the RX quality of the current cell drops below minimum acceptable</span><br><span style="color: hsl(120, 100%, 40%);">+# level, the handover is performed. It is also required that 10</span><br><span style="color: hsl(120, 100%, 40%);">+# resports are received, before RX quality is checked.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 2</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 4</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 4</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 6 ta 0 neighbors 40</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 1 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 1 0 states * TCH/F - - - - - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0029.ho_vty b/tests/handover/test0029.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..ffa3614</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0029.ho_vty</span><br><span>@@ -0,0 +1,15 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Balancing congestion by handover TCH/F -> TCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+# One BTS, and TCH/F are considered congested, TCH/H are not.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-n-bts 1</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 3</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 0</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/H- - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - TCH/F - - TCH/HH - -</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0030.ho_vty b/tests/handover/test0030.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..3ae5997</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0030.ho_vty</span><br><span>@@ -0,0 +1,81 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: Balancing congestion by handover TCH/F -> TCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+# With dynamic timeslots.</span><br><span style="color: hsl(120, 100%, 40%);">+# As soon as only one TCH/F is left, there should be HO to a dyn TS.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-bts trx-count 1 timeslots c+s4 TCH/F TCH/F TCH/F dyn dyn dyn PDCH</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/f 2</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 assignment 1</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch pdch pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# (there must be at leas one measurement report on each lchan for congestion check to work)</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 3 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 4 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 5 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F TCH/F pdch pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 5 0 to lchan 0 0 6 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/H- pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 4 0 to lchan 0 0 6 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch pdch TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 4 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 4 0 to lchan 0 0 5 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/H- TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - TCH/F TCH/F pdch TCH/HH TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/HH TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 1 0 to lchan 0 0 4 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - TCH/F TCH/F TCH/H- TCH/HH TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 2 0 to lchan 0 0 4 1</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * - - TCH/F TCH/HH TCH/HH TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - TCH/F TCH/HH TCH/HH TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/F AMR</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 0 rxlev 40 rxqual 0 ta 0 neighbors 30</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/HH TCH/HH TCH/HH pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0031.ho_vty b/tests/handover/test0031.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..c648c27</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0031.ho_vty</span><br><span>@@ -0,0 +1,7 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# assign new MS: re-use half used TCH/H to avoid switching more dyn TS to TCH/H</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-bts trx-count 1 timeslots c+s4 TCH/F TCH/F TCH/F dyn  dyn    dyn  PDCH</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use    trx 0 0     states *    -     -     -     pdch TCH/H- pdch pdch</span><br><span style="color: hsl(120, 100%, 40%);">+create-ms bts 0 TCH/H AMR</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0     states *    -     -     -     pdch TCH/HH pdch pdch</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/handover/test0032.ho_vty b/tests/handover/test0032.ho_vty</span><br><span>new file mode 100644</span><br><span>index 0000000..b90236d</span><br><span>--- /dev/null</span><br><span>+++ b/tests/handover/test0032.ho_vty</span><br><span>@@ -0,0 +1,15 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Congestion check: favor moving a TCH/H that frees a half-used dyn TS completely</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+create-bts trx-count 1 timeslots c+s4 dyn   dyn    dyn    dyn    dyn  - -</span><br><span style="color: hsl(120, 100%, 40%);">+set-ts-use    trx 0 0     states *    pdch  TCH/HH TCH/H- TCH/HH pdch - -</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 2 1 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 3 0 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 4 0 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+meas-rep lchan 0 0 4 1 rxlev 30 rxqual 0 ta 0</span><br><span style="color: hsl(120, 100%, 40%);">+# pick one to move:</span><br><span style="color: hsl(120, 100%, 40%);">+network</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+  handover2 min-free-slots tch/h 6</span><br><span style="color: hsl(120, 100%, 40%);">+congestion-check</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0     states *    TCH/F TCH/HH pdch TCH/HH pdch - -</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index afff9c5..17153cc 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -51,200 +51,8 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/handover/neighbor_ident_test], [], [expout], [experr])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 0])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 0], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 1])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 1], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 2])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 2], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 3])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 3], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 4])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 4], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 5])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 5], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 6])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 6], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 7])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 7], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 8])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 8], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 9])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 9], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 10])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 10], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 11])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 11], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 12])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 12], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 13])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 13], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 14])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 14], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 15])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 15], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 16])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 16], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 17])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 17], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 18])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 18], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 19])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 19], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 20])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 20], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 21])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 21], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 22])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 22], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 23])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 23], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 24])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 24], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 25])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 25], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 26])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 26], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 27])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 27], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 28])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 28], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 29])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 29], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 30])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 30], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 31])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 31], [], [expout], [ignore])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([handover test 32])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([handover])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/handover/handover_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/handover/handover_test 32], [], [expout], [ignore])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([handover_tests])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([handover_tests])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/handover/handover_tests.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_srcdir/handover/handover_tests.sh $abs_srcdir/handover $abs_builddir/handover], [], [expout], [ignore])</span><br><span> AT_CLEANUP</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21642">change 21642</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-bsc/+/21642"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie238ebe41039d3fa44c9699937589e000883e052 </div>
<div style="display:none"> Gerrit-Change-Number: 21642 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </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@osmocom.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>