<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>