aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am30
-rw-r--r--tests/amr/Makefile.am11
-rw-r--r--tests/amr/amr_test.c151
-rw-r--r--tests/amr/amr_test.ok152
-rw-r--r--tests/meas/meas_testcases.h2
-rw-r--r--tests/osmo-bts.vty297
-rw-r--r--tests/power/bs_power_loop_test.c67
-rw-r--r--tests/power/bs_power_loop_test.err189
-rw-r--r--tests/power/bs_power_loop_test.ok25
-rw-r--r--tests/power/ms_power_loop_test.c272
-rw-r--r--tests/power/ms_power_loop_test.err116
-rw-r--r--tests/power/ms_power_loop_test.ok46
-rw-r--r--tests/ta_control/ta_control_test.c19
-rw-r--r--tests/ta_control/ta_control_test.ok784
-rw-r--r--tests/testsuite.at6
15 files changed, 1442 insertions, 725 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 57687eef..a1d04a77 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = paging cipher agch misc handover tx_power power meas ta_control
+SUBDIRS = paging cipher agch misc handover tx_power power meas ta_control amr
if ENABLE_SYSMOBTS
SUBDIRS += sysmobts
@@ -22,12 +22,38 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac
echo ' [$(PACKAGE_URL)])'; \
} >'$(srcdir)/package.m4'
-EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE)
+EXTRA_DIST = \
+ testsuite.at \
+ $(srcdir)/package.m4 \
+ $(TESTSUITE) \
+ osmo-bts.vty \
+ $(NULL)
TESTSUITE = $(srcdir)/testsuite
DISTCLEANFILES = atconfig
+if ENABLE_EXT_TESTS
+python-tests: $(BUILT_SOURCES)
+ $(MAKE) vty-test
+else
+python-tests: $(BUILT_SOURCES)
+ echo "Not running python-based tests (determined at configure-time)"
+endif
+
+# Run a specific test with: 'make vty-test VTY_TEST=foo.vty'
+VTY_TEST ?= *.vty
+
+# To update the VTY script from current application behavior,
+# pass -u to vty_script_runner.py by doing:
+# make vty-test U=-u
+vty-test:
+ osmo_verify_transcript_vty.py -v \
+ -n OsmoBTS -p 4241 \
+ -r "$(top_builddir)/src/osmo-bts-virtual/osmo-bts-virtual --vty-test -c $(top_srcdir)/doc/examples/virtual/osmo-bts-virtual.cfg" \
+ $(U) $(srcdir)/$(VTY_TEST)
+
check-local: atconfig $(TESTSUITE)
$(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
+ $(MAKE) $(AM_MAKEFLAGS) python-tests
installcheck-local: atconfig $(TESTSUITE)
$(SHELL) '$(TESTSUITE)' AUTOTEST_PATH='$(bindir)' \
diff --git a/tests/amr/Makefile.am b/tests/amr/Makefile.am
new file mode 100644
index 00000000..dc0f1b81
--- /dev/null
+++ b/tests/amr/Makefile.am
@@ -0,0 +1,11 @@
+AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
+AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOCODEC_CFLAGS) \
+ $(LIBOSMOABIS_CFLAGS) $(LIBOSMOTRAU_CFLAGS)
+LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOCODEC_LIBS) \
+ $(LIBOSMOABIS_LIBS) $(LIBOSMOTRAU_LIBS)
+noinst_PROGRAMS = amr_test
+EXTRA_DIST = amr_test.ok
+
+misc_test_SOURCES = amr_test.c
+misc_test_LDADD = $(top_builddir)/src/common/libbts.a \
+ $(LDADD)
diff --git a/tests/amr/amr_test.c b/tests/amr/amr_test.c
new file mode 100644
index 00000000..4efbf402
--- /dev/null
+++ b/tests/amr/amr_test.c
@@ -0,0 +1,151 @@
+/* (C) 2021 by sysmocom s.f.m.c. GmbH
+ * All Rights Reserved
+ *
+ * Author: Philipp Maier
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <osmo-bts/logging.h>
+#include <osmocom/core/utils.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "../../src/osmo-bts-trx/sched_utils.h"
+
+struct amr_cmi_test_data {
+ /* Frame number that marks the beginning of the voice block */
+ uint32_t gsm_fn;
+ /* In uplink: True, when the voice block is a CMI block, false otherwise. */
+ /* In downlink: False, when the voice block is a CMI block, true otherwise. */
+ bool is_cmi;
+};
+
+/* The behavior of AHS in subslot 0 and AFS is the same */
+static const struct amr_cmi_test_data testvec_ahs_h0_and_afs[] = {
+ { 0, true },
+ { 4, false },
+ { 8, true },
+ { 13, false },
+ { 17, true },
+ { 21, false },
+ { 26, true },
+ { 30, false },
+ { 34, true },
+ { 39, false },
+ { 43, true },
+ { 47, false },
+ { 52, true },
+ { 56, false },
+ { 60, true },
+ { 65, false },
+ { 69, true },
+ { 73, false },
+ { 78, true },
+ { 82, false },
+ { 86, true },
+ { 91, false },
+ { 95, true },
+ { 99, false },
+};
+
+static const struct amr_cmi_test_data testvec_ahs_h1[] = {
+ { 1, true },
+ { 5, false },
+ { 9, true },
+ { 14, false },
+ { 18, true },
+ { 22, false },
+ { 27, true },
+ { 31, false },
+ { 35, true },
+ { 40, false },
+ { 44, true },
+ { 48, false },
+ { 53, true },
+ { 57, false },
+ { 61, true },
+ { 66, false },
+ { 70, true },
+ { 74, false },
+ { 79, true },
+ { 83, false },
+ { 87, true },
+ { 92, false },
+ { 96, true },
+ { 100, false },
+};
+
+static void test_amr_cmi_sched(void)
+{
+ unsigned int i;
+ bool res;
+
+ printf("AMR transmission phase (CMI) in relation to GSM FN:\n");
+
+ for (i = 0; i < ARRAY_SIZE(testvec_ahs_h0_and_afs); i++) {
+ res = ul_amr_fn_is_cmi(testvec_ahs_h0_and_afs[i].gsm_fn);
+ printf("Uplink, AMR AHS on HR subslot 0: fn_begin=%u, CMI=%u\n", testvec_ahs_h0_and_afs[i].gsm_fn, res);
+ OSMO_ASSERT(res == testvec_ahs_h0_and_afs[i].is_cmi);
+ }
+
+ printf("\n");
+
+ for (i = 0; i < ARRAY_SIZE(testvec_ahs_h0_and_afs); i++) {
+ res = dl_amr_fn_is_cmi(testvec_ahs_h0_and_afs[i].gsm_fn);
+ printf("Downlink, AMR AHS on HR subslot 0: fn_begin=%u, CMI=%u\n", testvec_ahs_h0_and_afs[i].gsm_fn, res);
+ OSMO_ASSERT(res == !testvec_ahs_h0_and_afs[i].is_cmi);
+ }
+
+ printf("\n");
+ printf("\n");
+
+ for (i = 0; i < ARRAY_SIZE(testvec_ahs_h1); i++) {
+ res = ul_amr_fn_is_cmi(testvec_ahs_h1[i].gsm_fn);
+ printf("Uplink, AMR AHS on HR subslot 1: fn_begin=%u, CMI=%u\n", testvec_ahs_h1[i].gsm_fn, res);
+ OSMO_ASSERT(res == testvec_ahs_h1[i].is_cmi);
+ }
+
+ printf("\n");
+
+ for (i = 0; i < ARRAY_SIZE(testvec_ahs_h1); i++) {
+ res = dl_amr_fn_is_cmi(testvec_ahs_h1[i].gsm_fn);
+ printf("Downlink, AMR AHS on HR subslot 1: fn_begin=%u, CMI=%u\n", testvec_ahs_h1[i].gsm_fn, res);
+ OSMO_ASSERT(res == !testvec_ahs_h1[i].is_cmi);
+ }
+
+ printf("\n");
+ printf("\n");
+
+ for (i = 0; i < ARRAY_SIZE(testvec_ahs_h0_and_afs); i++) {
+ res = ul_amr_fn_is_cmi(testvec_ahs_h0_and_afs[i].gsm_fn);
+ printf("Uplink, AMR AFS: fn_begin=%u, CMI=%u\n", testvec_ahs_h0_and_afs[i].gsm_fn, res);
+ OSMO_ASSERT(res == testvec_ahs_h0_and_afs[i].is_cmi);
+ }
+
+ printf("\n");
+
+ for (i = 0; i < ARRAY_SIZE(testvec_ahs_h0_and_afs); i++) {
+ res = dl_amr_fn_is_cmi(testvec_ahs_h0_and_afs[i].gsm_fn);
+ printf("Downlink, AMR AFS: fn_begin=%u, CMI=%u\n", testvec_ahs_h0_and_afs[i].gsm_fn, res);
+ OSMO_ASSERT(res == !testvec_ahs_h0_and_afs[i].is_cmi);
+ }
+}
+
+int main(int argc, char **argv)
+{
+
+ test_amr_cmi_sched();
+ return EXIT_SUCCESS;
+}
diff --git a/tests/amr/amr_test.ok b/tests/amr/amr_test.ok
new file mode 100644
index 00000000..ec1d1a08
--- /dev/null
+++ b/tests/amr/amr_test.ok
@@ -0,0 +1,152 @@
+AMR transmission phase (CMI) in relation to GSM FN:
+Uplink, AMR AHS on HR subslot 0: fn_begin=0, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=4, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=8, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=13, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=17, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=21, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=26, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=30, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=34, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=39, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=43, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=47, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=52, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=56, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=60, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=65, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=69, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=73, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=78, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=82, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=86, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=91, CMI=0
+Uplink, AMR AHS on HR subslot 0: fn_begin=95, CMI=1
+Uplink, AMR AHS on HR subslot 0: fn_begin=99, CMI=0
+
+Downlink, AMR AHS on HR subslot 0: fn_begin=0, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=4, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=8, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=13, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=17, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=21, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=26, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=30, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=34, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=39, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=43, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=47, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=52, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=56, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=60, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=65, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=69, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=73, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=78, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=82, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=86, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=91, CMI=1
+Downlink, AMR AHS on HR subslot 0: fn_begin=95, CMI=0
+Downlink, AMR AHS on HR subslot 0: fn_begin=99, CMI=1
+
+
+Uplink, AMR AHS on HR subslot 1: fn_begin=1, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=5, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=9, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=14, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=18, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=22, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=27, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=31, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=35, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=40, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=44, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=48, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=53, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=57, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=61, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=66, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=70, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=74, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=79, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=83, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=87, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=92, CMI=0
+Uplink, AMR AHS on HR subslot 1: fn_begin=96, CMI=1
+Uplink, AMR AHS on HR subslot 1: fn_begin=100, CMI=0
+
+Downlink, AMR AHS on HR subslot 1: fn_begin=1, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=5, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=9, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=14, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=18, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=22, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=27, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=31, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=35, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=40, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=44, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=48, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=53, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=57, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=61, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=66, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=70, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=74, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=79, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=83, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=87, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=92, CMI=1
+Downlink, AMR AHS on HR subslot 1: fn_begin=96, CMI=0
+Downlink, AMR AHS on HR subslot 1: fn_begin=100, CMI=1
+
+
+Uplink, AMR AFS: fn_begin=0, CMI=1
+Uplink, AMR AFS: fn_begin=4, CMI=0
+Uplink, AMR AFS: fn_begin=8, CMI=1
+Uplink, AMR AFS: fn_begin=13, CMI=0
+Uplink, AMR AFS: fn_begin=17, CMI=1
+Uplink, AMR AFS: fn_begin=21, CMI=0
+Uplink, AMR AFS: fn_begin=26, CMI=1
+Uplink, AMR AFS: fn_begin=30, CMI=0
+Uplink, AMR AFS: fn_begin=34, CMI=1
+Uplink, AMR AFS: fn_begin=39, CMI=0
+Uplink, AMR AFS: fn_begin=43, CMI=1
+Uplink, AMR AFS: fn_begin=47, CMI=0
+Uplink, AMR AFS: fn_begin=52, CMI=1
+Uplink, AMR AFS: fn_begin=56, CMI=0
+Uplink, AMR AFS: fn_begin=60, CMI=1
+Uplink, AMR AFS: fn_begin=65, CMI=0
+Uplink, AMR AFS: fn_begin=69, CMI=1
+Uplink, AMR AFS: fn_begin=73, CMI=0
+Uplink, AMR AFS: fn_begin=78, CMI=1
+Uplink, AMR AFS: fn_begin=82, CMI=0
+Uplink, AMR AFS: fn_begin=86, CMI=1
+Uplink, AMR AFS: fn_begin=91, CMI=0
+Uplink, AMR AFS: fn_begin=95, CMI=1
+Uplink, AMR AFS: fn_begin=99, CMI=0
+
+Downlink, AMR AFS: fn_begin=0, CMI=0
+Downlink, AMR AFS: fn_begin=4, CMI=1
+Downlink, AMR AFS: fn_begin=8, CMI=0
+Downlink, AMR AFS: fn_begin=13, CMI=1
+Downlink, AMR AFS: fn_begin=17, CMI=0
+Downlink, AMR AFS: fn_begin=21, CMI=1
+Downlink, AMR AFS: fn_begin=26, CMI=0
+Downlink, AMR AFS: fn_begin=30, CMI=1
+Downlink, AMR AFS: fn_begin=34, CMI=0
+Downlink, AMR AFS: fn_begin=39, CMI=1
+Downlink, AMR AFS: fn_begin=43, CMI=0
+Downlink, AMR AFS: fn_begin=47, CMI=1
+Downlink, AMR AFS: fn_begin=52, CMI=0
+Downlink, AMR AFS: fn_begin=56, CMI=1
+Downlink, AMR AFS: fn_begin=60, CMI=0
+Downlink, AMR AFS: fn_begin=65, CMI=1
+Downlink, AMR AFS: fn_begin=69, CMI=0
+Downlink, AMR AFS: fn_begin=73, CMI=1
+Downlink, AMR AFS: fn_begin=78, CMI=0
+Downlink, AMR AFS: fn_begin=82, CMI=1
+Downlink, AMR AFS: fn_begin=86, CMI=0
+Downlink, AMR AFS: fn_begin=91, CMI=1
+Downlink, AMR AFS: fn_begin=95, CMI=0
+Downlink, AMR AFS: fn_begin=99, CMI=1
diff --git a/tests/meas/meas_testcases.h b/tests/meas/meas_testcases.h
index d7eee5c3..90f0f850 100644
--- a/tests/meas/meas_testcases.h
+++ b/tests/meas/meas_testcases.h
@@ -1,5 +1,5 @@
#define ULM(ber, ta, sub, neg_rssi) \
- { .ber10k = (ber), .ta_offs_256bits = (ta), .c_i = 1.0, .is_sub = sub, .inv_rssi = (neg_rssi) }
+ { .ber10k = (ber), .ta_offs_256bits = (ta), .c_i = 10, .is_sub = sub, .inv_rssi = (neg_rssi) }
struct meas_testcase {
const char *name;
diff --git a/tests/osmo-bts.vty b/tests/osmo-bts.vty
new file mode 100644
index 00000000..fb74747c
--- /dev/null
+++ b/tests/osmo-bts.vty
@@ -0,0 +1,297 @@
+OsmoBTS> list
+...
+ show bts [<0-255>]
+ show trx [<0-255>] [<0-255>]
+ show timeslot [<0-255>] [<0-255>] [<0-7>]
+ show lchan [<0-255>] [<0-255>] [<0-7>] [<0-7>]
+ show lchan summary [<0-255>] [<0-255>] [<0-7>] [<0-7>]
+ show bts <0-255> gprs
+...
+ show timer [(bts|abis)] [TNNNN]
+ show e1_driver
+ show e1_line [<0-255>] [stats]
+ show e1_timeslot [<0-255>] [<0-31>]
+...
+OsmoBTS> ?
+...
+ show Show running system information
+...
+
+OsmoBTS> show ?
+...
+ bts Display information about a BTS
+ trx Display information about a TRX
+ timeslot Display information about a TS
+ lchan Display information about a logical channel
+ timer Show timers
+ e1_driver Display information about available E1 drivers
+ e1_line Display information about a E1 line
+ e1_timeslot Display information about a E1 timeslot
+...
+OsmoBTS> show bts ?
+ [<0-255>] BTS Number
+ <0-255> BTS Number
+OsmoBTS> show bts 0 ?
+ gprs GPRS/EGPRS configuration
+ <cr>
+OsmoBTS> show trx ?
+ [<0-255>] BTS Number
+OsmoBTS> show trx 0 ?
+ [<0-255>] TRX Number
+OsmoBTS> show timeslot ?
+ [<0-255>] BTS Number
+OsmoBTS> show timeslot 0 ?
+ [<0-255>] TRX Number
+OsmoBTS> show timeslot 0 0 ?
+ [<0-7>] Timeslot Number
+OsmoBTS> show lchan ?
+ [<0-255>] BTS Number
+ summary Short summary
+OsmoBTS> show lchan 0 ?
+ [<0-255>] TRX Number
+OsmoBTS> show lchan 0 0 ?
+ [<0-7>] Timeslot Number
+OsmoBTS> show lchan 0 0 0 ?
+ [<0-7>] Logical Channel Number
+OsmoBTS> show lchan summary ?
+ [<0-255>] BTS Number
+OsmoBTS> show lchan summary 0 ?
+ [<0-255>] TRX Number
+OsmoBTS> show lchan summary 0 0 ?
+ [<0-7>] Timeslot Number
+OsmoBTS> show lchan summary 0 0 0 ?
+ [<0-7>] Logical Channel Number
+
+OsmoBTS> show timer ?
+ [bts] BTS process timers
+ [abis] Abis (RSL) related timers
+OsmoBTS> show timer
+bts: X1 = 300 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)
+bts: X2 = 3 s Time after which osmo-bts exits if requesting transceivers to stop during shut down process does not finish (s) (default: 3 s)
+abis: X15 = 0 ms Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 0 ms)
+OsmoBTS> show timer bts ?
+ [TNNNN] T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.
+OsmoBTS> show timer bts
+bts: X1 = 300 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)
+bts: X2 = 3 s Time after which osmo-bts exits if requesting transceivers to stop during shut down process does not finish (s) (default: 3 s)
+OsmoBTS> show timer bts X1
+bts: X1 = 300 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)
+OsmoBTS> show timer bts X2
+bts: X2 = 3 s Time after which osmo-bts exits if requesting transceivers to stop during shut down process does not finish (s) (default: 3 s)
+OsmoBTS> show timer abis ?
+ [TNNNN] T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.
+OsmoBTS> show timer abis X15
+abis: X15 = 0 ms Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 0 ms)
+
+OsmoBTS> show e1_driver ?
+ <cr>
+OsmoBTS> show e1_line ?
+ [<0-255>] E1 Line Number
+OsmoBTS> show e1_line 0 ?
+ [stats] Include statistics
+OsmoBTS> show e1_timeslot ?
+ [<0-255>] E1 Line Number
+OsmoBTS> show e1_timeslot 0 ?
+ [<0-31>] E1 Timeslot Number
+
+OsmoBTS> enable
+OsmoBTS# list
+...
+ show bts [<0-255>]
+ show trx [<0-255>] [<0-255>]
+ show timeslot [<0-255>] [<0-255>] [<0-7>]
+ show lchan [<0-255>] [<0-255>] [<0-7>] [<0-7>]
+ show lchan summary [<0-255>] [<0-255>] [<0-7>] [<0-7>]
+ show bts <0-255> gprs
+...
+ show timer [(bts|abis)] [TNNNN]
+ bts <0-0> trx <0-255> ts <0-7> (lchan|shadow-lchan) <0-7> rtp jitter-buffer <0-10000>
+ test send-failure-event-report <0-255>
+ bts <0-255> c0-power-red <0-6>
+ show e1_driver
+ show e1_line [<0-255>] [stats]
+ show e1_timeslot [<0-255>] [<0-31>]
+...
+
+OsmoBTS# ?
+...
+ show Show running system information
+...
+
+OsmoBTS# show ?
+...
+ bts Display information about a BTS
+ trx Display information about a TRX
+ timeslot Display information about a TS
+ lchan Display information about a logical channel
+ timer Show timers
+ e1_driver Display information about available E1 drivers
+ e1_line Display information about a E1 line
+ e1_timeslot Display information about a E1 timeslot
+...
+OsmoBTS# show bts ?
+ [<0-255>] BTS Number
+ <0-255> BTS Number
+OsmoBTS# show bts 0 ?
+ gprs GPRS/EGPRS configuration
+ <cr>
+OsmoBTS# show trx ?
+ [<0-255>] BTS Number
+OsmoBTS# show trx 0 ?
+ [<0-255>] TRX Number
+OsmoBTS# show timeslot ?
+ [<0-255>] BTS Number
+OsmoBTS# show timeslot 0 ?
+ [<0-255>] TRX Number
+OsmoBTS# show timeslot 0 0 ?
+ [<0-7>] Timeslot Number
+OsmoBTS# show lchan ?
+ [<0-255>] BTS Number
+ summary Short summary
+OsmoBTS# show lchan 0 ?
+ [<0-255>] TRX Number
+OsmoBTS# show lchan 0 0 ?
+ [<0-7>] Timeslot Number
+OsmoBTS# show lchan 0 0 0 ?
+ [<0-7>] Logical Channel Number
+OsmoBTS# show lchan summary ?
+ [<0-255>] BTS Number
+OsmoBTS# show lchan summary 0 ?
+ [<0-255>] TRX Number
+OsmoBTS# show lchan summary 0 0 ?
+ [<0-7>] Timeslot Number
+OsmoBTS# show lchan summary 0 0 0 ?
+ [<0-7>] Logical Channel Number
+OsmoBTS# show e1_driver ?
+ <cr>
+OsmoBTS# show e1_line ?
+ [<0-255>] E1 Line Number
+OsmoBTS# show e1_line 0 ?
+ [stats] Include statistics
+OsmoBTS# show e1_timeslot ?
+ [<0-255>] E1 Line Number
+OsmoBTS# show e1_timeslot 0 ?
+ [<0-31>] E1 Timeslot Number
+
+OsmoBTS# configure terminal
+OsmoBTS(config)# list
+...
+ bts BTS_NR
+...
+ timer [(bts|abis)] [TNNNN] [(<0-2147483647>|default)]
+ phy <0-255>
+ e1_input
+...
+OsmoBTS(config)# ?
+...
+ bts Select a BTS to configure
+...
+ timer Configure or show timers
+ phy Select a PHY to configure
+ e1_input Configure E1/T1/J1 TDM input
+...
+OsmoBTS(config)# bts ?
+ BTS_NR BTS Number
+OsmoBTS(config)# phy ?
+ <0-255> PHY number
+
+OsmoBTS(config)# timer ?
+ [bts] BTS process timers
+ [abis] Abis (RSL) related timers
+OsmoBTS(config)# timer bts ?
+ [TNNNN] T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.
+OsmoBTS(config)# timer bts X1
+bts: X1 = 300 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)
+OsmoBTS(config)# timer bts X2
+bts: X2 = 3 s Time after which osmo-bts exits if requesting transceivers to stop during shut down process does not finish (s) (default: 3 s)
+OsmoBTS(config)# timer bts X1 ?
+ [<0-2147483647>] New timer value
+ [default] Set to default timer value
+OsmoBTS(config)# timer bts X1 123
+OsmoBTS(config)# timer bts X1
+bts: X1 = 123 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)
+OsmoBTS(config)# timer bts X1 default
+OsmoBTS(config)# timer bts X1
+bts: X1 = 300 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)
+
+OsmoBTS(config)# timer abis X15
+abis: X15 = 0 ms Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 0 ms)
+OsmoBTS(config)# timer abis X15 123
+OsmoBTS(config)# timer abis X15
+abis: X15 = 123 ms Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 0 ms)
+OsmoBTS(config)# timer abis X15 default
+OsmoBTS(config)# timer abis X15
+abis: X15 = 0 ms Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 0 ms)
+
+OsmoBTS(config)# bts 0
+OsmoBTS(bts)# list
+...
+ ipa unit-id <0-65534> <0-255>
+ oml remote-ip A.B.C.D
+ no oml remote-ip A.B.C.D
+ rtp jitter-buffer <0-10000> [adaptive]
+ rtp port-range <1-65534> <1-65534>
+ rtp ip-dscp <0-63>
+ rtp socket-priority <0-255>
+ band (450|GSM450|480|GSM480|750|GSM750|810|GSM810|850|GSM850|900|GSM900|1800|DCS1800|1900|PCS1900)
+ description .TEXT
+ no description
+ paging queue-size <1-1024>
+ paging lifetime <0-60>
+ agch-queue-mgmt default
+ agch-queue-mgmt threshold <0-100> low <0-100> high <0-100000>
+ min-qual-rach <-100-100>
+ min-qual-norm <-100-100>
+ max-ber10k-rach <0-10000>
+ pcu-socket PATH
+ supp-meas-info toa256
+ no supp-meas-info toa256
+ smscb queue-max-length <1-60>
+ smscb queue-target-length <1-30>
+ smscb queue-hysteresis <0-30>
+ gsmtap-remote-host [HOSTNAME]
+ no gsmtap-remote-host
+ gsmtap-sapi (enable-all|disable-all)
+ gsmtap-sapi (bcch|ccch|rach|agch|pch|sdcch|tch/f|tch/h|pacch|pdtch|ptcch|cbch|sacch)
+ no gsmtap-sapi (bcch|ccch|rach|agch|pch|sdcch|tch/f|tch/h|pacch|pdtch|ptcch|cbch|sacch)
+ trx <0-254>
+...
+OsmoBTS(bts)# ?
+...
+ ipa ip.access RSL commands
+ oml OML Parameters
+ no Negate a command or set its defaults
+ rtp RTP parameters
+ band Set the frequency band of this BTS
+ description Save human-readable description of the object
+ paging Paging related parameters
+ agch-queue-mgmt AGCH queue mgmt
+ min-qual-rach Set the minimum link quality level of Access Bursts to be accepted
+ min-qual-norm Set the minimum link quality level of Normal Bursts to be accepted
+ max-ber10k-rach Set the maximum BER for valid RACH requests
+ pcu-socket Configure the PCU socket file/path name
+ supp-meas-info Configure the RSL Supplementary Measurement Info
+ smscb SMSCB (SMS Cell Broadcast) / CBCH configuration
+ gsmtap-remote-host Enable GSMTAP Um logging (see also 'gsmtap-sapi')
+ gsmtap-sapi Enable/disable sending of UL/DL messages over GSMTAP
+ trx Select a TRX to configure
+...
+OsmoBTS(bts)# trx 0
+OsmoBTS(trx)# list
+...
+ user-gain <-100000-100000> (dB|mdB)
+ power-ramp max-initial <-10000-100000> (dBm|mdBm)
+ power-ramp step-size <1-100000> (dB|mdB)
+ power-ramp step-interval <1-100>
+ ms-power-control (dsp|osmo)
+ ta-control interval <0-31>
+ phy <0-255> instance <0-255>
+...
+OsmoBTS(trx)# ?
+...
+ user-gain Inform BTS about additional, user-provided gain or attenuation at TRX output
+ power-ramp Power-Ramp settings
+ ms-power-control Mobile Station Power Level Control
+ ta-control Timing Advance Control Parameters
+ phy Configure PHY Link+Instance for this TRX
+...
diff --git a/tests/power/bs_power_loop_test.c b/tests/power/bs_power_loop_test.c
index 53fdbba6..06fe3ed4 100644
--- a/tests/power/bs_power_loop_test.c
+++ b/tests/power/bs_power_loop_test.c
@@ -47,14 +47,8 @@
{ DL_MEAS_FULL(rxqual, rxlev), \
DL_MEAS_SUB(rxqual, rxlev) }
-#define DL_MEAS_FULL_SUB_INV(rxqual, rxlev) \
- { DL_MEAS_FULL(rxqual, rxlev), \
- DL_MEAS_SUB(rxqual, rxlev), \
- .invalid = true }
-
enum power_test_step_type {
PWR_TEST_ST_IND_MEAS = 0,
- PWR_TEST_ST_IND_DUMMY,
PWR_TEST_ST_SET_STATE,
PWR_TEST_ST_SET_CTRL_INTERVAL,
PWR_TEST_ST_SET_STEP_SIZE,
@@ -78,7 +72,6 @@ struct power_test_step {
uint8_t rxqual_sub;
uint8_t rxlev_full;
uint8_t rxlev_sub;
- bool invalid;
} meas;
/* Increase / reduce step size */
struct {
@@ -112,31 +105,32 @@ static void init_test(const char *name)
g_bts->band = GSM_BAND_900;
g_bts->c0 = g_trx;
+ /* Init defaultBS power control parameters, enable dynamic power control */
+ struct gsm_power_ctrl_params *params = &g_trx->ts[0].lchan[0].bs_dpc_params;
+ g_trx->ts[0].lchan[0].bs_power_ctrl.dpc_params = params;
+ *params = power_ctrl_params_def;
+
+ /* Disable loop SACCH block skip by default: */
+ params->ctrl_interval = 0;
+
printf("\nStarting test case '%s'\n", name);
}
-static void enc_meas_rep(struct gsm48_hdr *gh,
+static void enc_meas_rep(struct gsm48_meas_res *mr,
const unsigned int n,
const struct power_test_step *step)
{
- struct gsm48_meas_res *mr = (struct gsm48_meas_res *) gh->data;
-
- gh->proto_discr = GSM48_PDISC_RR;
- gh->msg_type = GSM48_MT_RR_MEAS_REP;
-
*mr = (struct gsm48_meas_res) {
.rxlev_full = step->meas.rxlev_full,
.rxlev_sub = step->meas.rxlev_sub,
.rxqual_full = step->meas.rxqual_full,
.rxqual_sub = step->meas.rxqual_sub,
- /* NOTE: inversed logic (1 means invalid) */
- .meas_valid = step->meas.invalid,
};
- printf("#%02u %s() -> Measurement Results (%svalid): "
+ printf("#%02u %s() -> Measurement Results (valid): "
"RXLEV-FULL(%02u), RXQUAL-FULL(%u), "
"RXLEV-SUB(%02u), RXQUAL-SUB(%u)\n",
- n, __func__, step->meas.invalid ? "in" : "",
+ n, __func__,
mr->rxlev_full, mr->rxqual_full,
mr->rxlev_sub, mr->rxqual_sub);
}
@@ -145,11 +139,8 @@ static int exec_power_step(struct gsm_lchan *lchan,
const unsigned int n,
const struct power_test_step *step)
{
- struct gsm48_hdr *gh;
+ struct gsm48_meas_res mr;
uint8_t old, new;
- uint8_t buf[18];
-
- gh = (struct gsm48_hdr *) buf;
switch (step->type) {
case PWR_TEST_ST_SET_STATE:
@@ -184,20 +175,16 @@ static int exec_power_step(struct gsm_lchan *lchan,
printf("#%02u %s() <- Enable DTXd\n", n, __func__);
lchan->tch.dtx.dl_active = true;
return 0; /* we're done */
- case PWR_TEST_ST_IND_DUMMY:
- printf("#%02u %s() <- Dummy block\n", n, __func__);
- memset(buf, 0x2b, sizeof(buf));
- break;
case PWR_TEST_ST_IND_MEAS:
- enc_meas_rep(gh, n, step);
+ enc_meas_rep(&mr, n, step);
break;
}
- printf("#%02u lchan_bs_pwr_ctrl() <- UL SACCH: %s\n",
- n, osmo_hexdump(buf, sizeof(buf)));
+ printf("#%02u lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 %s\n",
+ n, osmo_hexdump((void *)&mr, sizeof(mr)));
old = lchan->bs_power_ctrl.current;
- lchan_bs_pwr_ctrl(lchan, gh);
+ lchan_bs_pwr_ctrl(lchan, &mr);
new = lchan->bs_power_ctrl.current;
printf("#%02u lchan_bs_pwr_ctrl() -> BS power reduction: "
@@ -219,9 +206,6 @@ static void exec_power_test(const struct power_test_step *steps,
struct gsm_lchan *lchan = &g_trx->ts[0].lchan[0];
struct gsm_power_ctrl_params *params = &lchan->bs_dpc_params;
- /* Default BS power control parameters */
- memcpy(params, &power_ctrl_params_def, sizeof(*params));
-
/* No RxLev hysteresis: lower == upper */
params->rxlev_meas.lower_thresh = PWR_TEST_RXLEV_TARGET;
params->rxlev_meas.upper_thresh = PWR_TEST_RXLEV_TARGET;
@@ -401,24 +385,6 @@ static const struct power_test_step TC_rxqual_ber[] = {
{ .meas = DL_MEAS_FULL_SUB(7, PWR_TEST_RXLEV_TARGET) }, /* max */
};
-/* Verify that invalid and dummy SACCH blocks are ignored. */
-static const struct power_test_step TC_inval_dummy[] = {
- /* Initial state: 16 dB, up to 20 dB */
- { .type = PWR_TEST_ST_SET_STATE,
- .state = { .current = 16, .max = 2 * 10 } },
-
- /* MS sends invalid measurement results which must be ignored */
- { .meas = DL_MEAS_FULL_SUB_INV(7, 63), .exp_txred = 16 },
- { .meas = DL_MEAS_FULL_SUB_INV(0, 0), .exp_txred = 16 },
-
- /* Let's say SMS (SAPI=3) blocks substitute some of the reports */
- { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET), .exp_txred = 16 },
- { .type = PWR_TEST_ST_IND_DUMMY, /* not a report */ .exp_txred = 16 },
- { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET), .exp_txred = 16 },
- { .type = PWR_TEST_ST_IND_DUMMY, /* not a report */ .exp_txred = 16 },
- { .meas = DL_MEAS_FULL_SUB(0, PWR_TEST_RXLEV_TARGET), .exp_txred = 16 },
-};
-
/* Verify handling of optional power control interval (P_Con_INTERVAL). */
static const struct power_test_step TC_ctrl_interval[] = {
/* Initial state: 0 dB, up to 20 dB */
@@ -540,7 +506,6 @@ int main(int argc, char **argv)
exec_test(TC_dtxd_mode);
exec_test(TC_rxqual_ber);
- exec_test(TC_inval_dummy);
exec_test(TC_ctrl_interval);
exec_test(TC_rxlev_hyst);
diff --git a/tests/power/bs_power_loop_test.err b/tests/power/bs_power_loop_test.err
index c4726b1b..24107ba9 100644
--- a/tests/power/bs_power_loop_test.err
+++ b/tests/power/bs_power_loop_test.err
@@ -1,196 +1,191 @@
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 2 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 0 dB => 2 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 4 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 2 dB => 4 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 6 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 4 dB => 6 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 6 -> 8 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 6 dB => 8 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 10 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 8 dB => 10 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 10 -> 12 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 10 dB => 12 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 14 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 12 dB => 14 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 14 -> 16 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 14 dB => 16 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 18 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 16 dB => 18 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 18 -> 20 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 18 dB => 20 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 20 dB: max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 20 dB: max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 20 -> 16 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 20 dB => 16 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 12 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 16 dB => 12 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 8 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 12 dB => 8 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 4 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 8 dB => 4 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 4 dB => 0 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 4 dB (maximum 20 dB, suggested delta 4 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 0 dB => 4 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 8 dB (maximum 20 dB, suggested delta 4 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 4 dB => 8 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 12 dB (maximum 20 dB, suggested delta 4 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 8 dB => 12 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 16 dB (maximum 20 dB, suggested delta 4 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 12 dB => 16 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 20 dB (maximum 20 dB, suggested delta 4 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 16 dB => 20 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 20 dB (maximum 20 dB, suggested delta 4 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 20 dB: max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 20 -> 14 dB (maximum 20 dB, suggested delta -6 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 20 dB => 14 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 14 -> 8 dB (maximum 20 dB, suggested delta -6 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 14 dB => 8 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 2 dB (maximum 20 dB, suggested delta -6 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 8 dB => 2 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 0 dB (maximum 20 dB, suggested delta -6 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 2 dB => 0 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta -6 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(31), RXQUAL-FULL(0), RXLEV-SUB(31), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 10 -> 11 dB (maximum 20 dB, suggested delta 1 dB, RxLev current 31 (-79 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 10 dB => 11 dB:max 20 dB, RSSI[curr -79, avg -79, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 11 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 11 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(32), RXQUAL-FULL(0), RXLEV-SUB(32), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 11 -> 13 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 32 (-78 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 11 dB => 13 dB:max 20 dB, RSSI[curr -78, avg -78, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 13 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 13 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(33), RXQUAL-FULL(0), RXLEV-SUB(33), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 13 -> 16 dB (maximum 20 dB, suggested delta 3 dB, RxLev current 33 (-77 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 13 dB => 16 dB:max 20 dB, RSSI[curr -77, avg -77, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(29), RXQUAL-FULL(0), RXLEV-SUB(29), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 10 -> 9 dB (maximum 20 dB, suggested delta -1 dB, RxLev current 29 (-81 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 10 dB => 9 dB:max 20 dB, RSSI[curr -81, avg -81, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 9 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 9 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(27), RXQUAL-FULL(0), RXLEV-SUB(27), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 9 -> 6 dB (maximum 20 dB, suggested delta -3 dB, RxLev current 27 (-83 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 9 dB => 6 dB:max 20 dB, RSSI[curr -83, avg -83, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 6 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 6 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(25), RXQUAL-FULL(0), RXLEV-SUB(25), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 6 -> 1 dB (maximum 20 dB, suggested delta -5 dB, RxLev current 25 (-85 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 6 dB => 1 dB:max 20 dB, RSSI[curr -85, avg -85, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 1 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 1 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(00), RXQUAL-FULL(7), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is enabled => using SUB
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(3), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is enabled => using SUB
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(63), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is enabled => using SUB
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 0 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(1), RXLEV-SUB(30), RXQUAL-SUB(1), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 1, avg 1, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(2), RXLEV-SUB(30), RXQUAL-SUB(2), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 2, avg 2, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(3), RXLEV-SUB(30), RXQUAL-SUB(3), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 3, avg 3, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(4), RXLEV-SUB(30), RXQUAL-SUB(4), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Reducing Downlink attenuation: 16 -> 12 dB due to RxQual 4 worse than L_RXQUAL_XX_P 3
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 16 dB => 12 dB:max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 4, avg 4, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(34), RXQUAL-FULL(5), RXLEV-SUB(34), RXQUAL-SUB(5), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Reducing Downlink attenuation: 12 -> 8 dB due to RxQual 5 worse than L_RXQUAL_XX_P 3
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 12 dB => 8 dB:max 20 dB, RSSI[curr -76, avg -76, thresh -80..-80] dBm, RxQual[curr 5, avg 5, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(38), RXQUAL-FULL(6), RXLEV-SUB(38), RXQUAL-SUB(6), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Reducing Downlink attenuation: 8 -> 4 dB due to RxQual 6 worse than L_RXQUAL_XX_P 3
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 8 dB => 4 dB:max 20 dB, RSSI[curr -72, avg -72, thresh -80..-80] dBm, RxQual[curr 6, avg 6, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(42), RXQUAL-FULL(7), RXLEV-SUB(42), RXQUAL-SUB(7), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Reducing Downlink attenuation: 4 -> 0 dB due to RxQual 7 worse than L_RXQUAL_XX_P 3
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 4 dB => 0 dB:max 20 dB, RSSI[curr -68, avg -68, thresh -80..-80] dBm, RxQual[curr 7, avg 7, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(46), RXQUAL-FULL(7), RXLEV-SUB(46), RXQUAL-SUB(7), DTx is disabled => using FULL
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -64, avg -64, thresh -80..-80] dBm, RxQual[curr 7, avg 7, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(46), RXQUAL-FULL(0), RXLEV-SUB(46), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 2 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 46 (-64 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 0 dB => 2 dB:max 20 dB, RSSI[curr -64, avg -64, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(44), RXQUAL-FULL(0), RXLEV-SUB(44), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 4 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 44 (-66 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 2 dB => 4 dB:max 20 dB, RSSI[curr -66, avg -66, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(42), RXQUAL-FULL(0), RXLEV-SUB(42), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 6 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 42 (-68 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 4 dB => 6 dB:max 20 dB, RSSI[curr -68, avg -68, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(7), RXLEV-SUB(30), RXQUAL-SUB(7), DTx is disabled => using FULL
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 7, avg 7, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(7), RXLEV-SUB(30), RXQUAL-SUB(7), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) The measurement results are not valid
-(bts=0,trx=0,ts=0,ss=0) The measurement results are not valid
-(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
-(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
-(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 20 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 0 dB: max 20 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 7, avg 7, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 2 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 0 dB => 2 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 4 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 2 dB => 4 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 6 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 4 dB => 6 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 6 -> 8 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 6 dB => 8 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 4 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 8 dB => 4 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 4 dB => 0 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 0 -> 2 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 0 dB => 2 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 2 -> 4 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 2 dB => 4 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 6 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 4 dB => 6 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 6 -> 8 dB (maximum 20 dB, suggested delta 2 dB, RxLev current 60 (-50 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 6 dB => 8 dB:max 20 dB, RSSI[curr -50, avg -50, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(60), RXQUAL-FULL(0), RXLEV-SUB(60), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 8 -> 4 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 8 dB => 4 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(10), RXQUAL-FULL(0), RXLEV-SUB(10), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 4 -> 0 dB (maximum 20 dB, suggested delta -4 dB, RxLev current 10 (-100 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 4 dB => 0 dB:max 20 dB, RSSI[curr -100, avg -100, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(31), RXQUAL-FULL(0), RXLEV-SUB(31), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 13 dB (maximum 16 dB, suggested delta 1 dB, RxLev current 31 (-79 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 12 dB => 13 dB:max 16 dB, RSSI[curr -79, avg -79, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(28), RXQUAL-FULL(0), RXLEV-SUB(28), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 13 -> 11 dB (maximum 16 dB, suggested delta -2 dB, RxLev current 28 (-82 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 13 dB => 11 dB:max 16 dB, RSSI[curr -82, avg -82, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(33), RXQUAL-FULL(0), RXLEV-SUB(33), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 11 -> 13 dB (maximum 16 dB, suggested delta 2 dB, RxLev current 33 (-77 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 11 dB => 13 dB:max 16 dB, RSSI[curr -77, avg -77, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(28), RXQUAL-FULL(0), RXLEV-SUB(28), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 13 -> 11 dB (maximum 16 dB, suggested delta -2 dB, RxLev current 28 (-82 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 13 dB => 11 dB:max 16 dB, RSSI[curr -82, avg -82, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(31), RXQUAL-FULL(0), RXLEV-SUB(31), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 11 dB (maximum 16 dB, suggested delta 0 dB, RxLev current 31 (-79 dBm), thresholds 27 .. 33)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 11 dB: max 16 dB, RSSI[curr -79, avg -79, thresh -83..-77] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(28), RXQUAL-FULL(0), RXLEV-SUB(28), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 11 dB (maximum 16 dB, suggested delta 0 dB, RxLev current 28 (-82 dBm), thresholds 27 .. 33)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 11 dB: max 16 dB, RSSI[curr -82, avg -82, thresh -83..-77] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(33), RXQUAL-FULL(0), RXLEV-SUB(33), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 11 dB (maximum 16 dB, suggested delta 0 dB, RxLev current 33 (-77 dBm), thresholds 27 .. 33)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 11 dB: max 16 dB, RSSI[curr -77, avg -77, thresh -83..-77] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(28), RXQUAL-FULL(0), RXLEV-SUB(28), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 11 dB (maximum 16 dB, suggested delta 0 dB, RxLev current 28 (-82 dBm), thresholds 27 .. 33)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 11 dB: max 16 dB, RSSI[curr -82, avg -82, thresh -83..-77] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 30 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 30 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Keeping Downlink attenuation at 16 dB (maximum 30 dB, suggested delta 0 dB, RxLev current 30 (-80 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Keeping DL attenuation at 16 dB: max 30 dB, RSSI[curr -80, avg -80, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(26), RXQUAL-FULL(0), RXLEV-SUB(26), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 16 -> 14 dB (maximum 30 dB, suggested delta -2 dB, RxLev current 26 (-84 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 16 dB => 14 dB:max 30 dB, RSSI[curr -84, avg -82, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(26), RXQUAL-FULL(0), RXLEV-SUB(26), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 14 -> 11 dB (maximum 30 dB, suggested delta -3 dB, RxLev current 26 (-84 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Lowering DL attenuation 14 dB => 11 dB:max 30 dB, RSSI[curr -84, avg -83, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(35), RXQUAL-FULL(0), RXLEV-SUB(35), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 11 -> 12 dB (maximum 30 dB, suggested delta 1 dB, RxLev current 35 (-75 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 11 dB => 12 dB:max 30 dB, RSSI[curr -75, avg -79, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
(bts=0,trx=0,ts=0,ss=0) Rx DL Measurement Report: RXLEV-FULL(35), RXQUAL-FULL(0), RXLEV-SUB(35), RXQUAL-SUB(0), DTx is disabled => using FULL
-(bts=0,trx=0,ts=0,ss=0) Changing Downlink attenuation: 12 -> 14 dB (maximum 30 dB, suggested delta 2 dB, RxLev current 35 (-75 dBm), thresholds 30 .. 30)
+(bts=0,trx=0,ts=0,ss=0) Raising DL attenuation 12 dB => 14 dB:max 30 dB, RSSI[curr -75, avg -77, thresh -80..-80] dBm, RxQual[curr 0, avg 0, thresh 3..0]
diff --git a/tests/power/bs_power_loop_test.ok b/tests/power/bs_power_loop_test.ok
index 2c123928..18a94ba7 100644
--- a/tests/power/bs_power_loop_test.ok
+++ b/tests/power/bs_power_loop_test.ok
@@ -243,31 +243,6 @@ Starting test case 'TC_rxqual_ber'
#16 lchan_bs_pwr_ctrl() -> BS power reduction: 0 -> 0 (expected 0)
Test case verdict: SUCCESS
-Starting test case 'TC_inval_dummy'
-#00 exec_power_step() <- State (re)set (current 16 dB, max 20 dB)
-#01 enc_meas_rep() -> Measurement Results (invalid): RXLEV-FULL(63), RXQUAL-FULL(7), RXLEV-SUB(63), RXQUAL-SUB(7)
-#01 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 3f 7f 7e 00 00 00 00 00 00 00 00 00 00 00 00 00
-#01 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-#02 enc_meas_rep() -> Measurement Results (invalid): RXLEV-FULL(00), RXQUAL-FULL(0), RXLEV-SUB(00), RXQUAL-SUB(0)
-#02 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#02 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-#03 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)
-#03 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#03 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-#04 exec_power_step() <- Dummy block
-#04 lchan_bs_pwr_ctrl() <- UL SACCH: 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
-#04 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-#05 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)
-#05 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#05 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-#06 exec_power_step() <- Dummy block
-#06 lchan_bs_pwr_ctrl() <- UL SACCH: 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
-#06 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-#07 enc_meas_rep() -> Measurement Results (valid): RXLEV-FULL(30), RXQUAL-FULL(0), RXLEV-SUB(30), RXQUAL-SUB(0)
-#07 lchan_bs_pwr_ctrl() <- UL SACCH: 06 15 1e 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-#07 lchan_bs_pwr_ctrl() -> BS power reduction: 16 -> 16 (expected 16)
-Test case verdict: SUCCESS
-
Starting test case 'TC_ctrl_interval'
#00 exec_power_step() <- State (re)set (current 0 dB, max 20 dB)
#01 exec_power_step() <- (Re)set power control interval: 0 -> 0
diff --git a/tests/power/ms_power_loop_test.c b/tests/power/ms_power_loop_test.c
index 0d863108..e54d75ff 100644
--- a/tests/power/ms_power_loop_test.c
+++ b/tests/power/ms_power_loop_test.c
@@ -59,6 +59,9 @@ static void init_test(const char *name)
g_trx->ts[0].lchan[0].ms_power_ctrl.dpc_params = params;
*params = power_ctrl_params_def;
+ /* Disable loop SACCH block skip by default: */
+ params->ctrl_interval = 0;
+
/* Disable RxLev pre-processing and hysteresis by default */
struct gsm_power_ctrl_meas_params *mp = &params->rxlev_meas;
mp->lower_thresh = mp->upper_thresh = PWR_TEST_RXLEV_TARGET;
@@ -67,13 +70,11 @@ static void init_test(const char *name)
printf("\nStarting test case '%s'\n", name);
}
-static inline void apply_power_test(struct gsm_lchan *lchan, int rxlev, int exp_ret, uint8_t exp_current)
+static void apply_power_test_ext(struct gsm_lchan *lchan, uint8_t ms_pwr, int rxlev, int lqual_cb, int exp_ret, uint8_t exp_current)
{
- uint8_t old;
int ret;
- old = lchan->ms_power_ctrl.current;
- ret = lchan_ms_pwr_ctrl(lchan, lchan->ms_power_ctrl.current, rxlev);
+ ret = lchan_ms_pwr_ctrl(lchan, ms_pwr, rxlev, lqual_cb);
/* Keep the measurement counter updated */
lchan->meas.res_nr++;
@@ -81,15 +82,25 @@ static inline void apply_power_test(struct gsm_lchan *lchan, int rxlev, int exp_
printf("lchan_ms_pwr_ctrl(RxLvl=%d dBm) returns %d (expected %d)\n",
rxlev, ret, exp_ret);
printf("\tMS current power %u -> %u (expected %u)\n",
- old, lchan->ms_power_ctrl.current, exp_current);
+ ms_pwr, lchan->ms_power_ctrl.current, exp_current);
+}
+
+static inline void apply_power_test(struct gsm_lchan *lchan, int rxlev, int lqual_cb, int exp_ret, uint8_t exp_current)
+{
+ apply_power_test_ext(lchan, lchan->ms_power_ctrl.current, rxlev, lqual_cb, exp_ret, exp_current);
}
static void test_power_loop(void)
{
struct gsm_lchan *lchan;
+ const struct gsm_power_ctrl_params *params;
+ int16_t good_lqual;
init_test(__func__);
lchan = &g_trx->ts[0].lchan[0];
+ params = lchan->ms_power_ctrl.dpc_params;
+ lchan->type = GSM_LCHAN_SDCCH;
+ good_lqual = (params->ci_sdcch_meas.lower_thresh + 2) * 10;
lchan->ms_power_ctrl.current = ms_pwr_ctl_lvl(GSM_BAND_1800, 0);
OSMO_ASSERT(lchan->ms_power_ctrl.current == 15);
@@ -97,73 +108,78 @@ static void test_power_loop(void)
OSMO_ASSERT(lchan->ms_power_ctrl.max == 2);
/* Simply clamping */
- apply_power_test(lchan, -60, 0, 15);
+ apply_power_test(lchan, -60, good_lqual, 0, 15);
/*
* Now 15 dB too little and we should power it up. Could be a
* power level of 7 or 8 for 15 dBm. However, since we limit peace at
* which we change values, expect several steps of MS_RAISE_MAX_DB/2 levels:
*/
- apply_power_test(lchan, -90, 1, 13);
- apply_power_test(lchan, -90, 1, 11);
- apply_power_test(lchan, -90, 1, 9);
- apply_power_test(lchan, -90, 1, 7);
- apply_power_test(lchan, -90, 1, 5);
+ apply_power_test(lchan, -90, good_lqual, 1, 13);
+ apply_power_test(lchan, -90, good_lqual, 1, 11);
+ apply_power_test(lchan, -90, good_lqual, 1, 9);
+ apply_power_test(lchan, -90, good_lqual, 1, 7);
+ apply_power_test(lchan, -90, good_lqual, 1, 5);
/* Check good RSSI value keeps it at same power level: */
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, 0, 5);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, good_lqual, 0, 5);
- apply_power_test(lchan, -90, 1, 3);
- apply_power_test(lchan, -90, 1, 2); /* .max is pwr lvl 2 */
- apply_power_test(lchan, -90, 0, 2); /* .max is pwr lvl 2 */
+ apply_power_test(lchan, -90, good_lqual, 1, 3);
+ apply_power_test(lchan, -90, good_lqual, 1, 2); /* .max is pwr lvl 2 */
+ apply_power_test(lchan, -90, good_lqual, 0, 2); /* .max is pwr lvl 2 */
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 30);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 0);
- apply_power_test(lchan, -90, 1, 0); /* .max is pwr lvl 0 */
- apply_power_test(lchan, -90, 0, 0); /* .max is pwr lvl 0 */
+ apply_power_test(lchan, -90, good_lqual, 1, 0); /* .max is pwr lvl 0 */
+ apply_power_test(lchan, -90, good_lqual, 0, 0); /* .max is pwr lvl 0 */
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 36);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 29);
- apply_power_test(lchan, -90, 1, 30);
- apply_power_test(lchan, -90, 1, 29);
- apply_power_test(lchan, -90, 0, 29);
+ apply_power_test(lchan, -90, good_lqual, 1, 30);
+ apply_power_test(lchan, -90, good_lqual, 1, 29);
+ apply_power_test(lchan, -90, good_lqual, 0, 29);
/* Check good RSSI value keeps it at same power level: */
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, 0, 29);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, good_lqual, 0, 29);
/* Now go down, steps are double size in this direction: */
- apply_power_test(lchan, -45, 1, 1);
- apply_power_test(lchan, -45, 1, 5);
- apply_power_test(lchan, -45, 1, 9);
+ apply_power_test(lchan, -45, good_lqual, 1, 1);
+ apply_power_test(lchan, -45, good_lqual, 1, 5);
+ apply_power_test(lchan, -45, good_lqual, 1, 9);
/* Go down only one level down and up: */
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 2, 1, 10);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 2, 1, 9);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 2, good_lqual, 1, 10);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 2, good_lqual, 1, 9);
/* Check if BSC requesting a low max power is applied after loop calculation: */
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 2);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 14);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 2, 1, 14);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 2, good_lqual, 1, 14);
/* Set back a more normal max: */
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 30);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 0);
/* Disable dynamic power control and jump down */
lchan->ms_power_ctrl.dpc_params = NULL;
- apply_power_test(lchan, -60, 0, 14);
+ apply_power_test(lchan, -60, good_lqual, 0, 14);
/* Enable and leave it again */
lchan->ms_power_ctrl.dpc_params = &lchan->ms_dpc_params;
- apply_power_test(lchan, -40, 1, 15);
+ apply_power_test(lchan, -40, good_lqual, 1, 15);
}
static void test_pf_algo_ewma(void)
{
struct gsm_lchan *lchan;
+ const struct gsm_power_ctrl_params *params;
+ int16_t good_lqual;
const int *avg100;
init_test(__func__);
lchan = &g_trx->ts[0].lchan[0];
+ lchan->type = GSM_LCHAN_SDCCH;
+ params = lchan->ms_power_ctrl.dpc_params;
+ good_lqual = (params->ci_sdcch_meas.lower_thresh + 2) * 10;
avg100 = &lchan->ms_power_ctrl.rxlev_meas_proc.ewma.Avg100;
struct gsm_power_ctrl_meas_params *mp = &lchan->ms_dpc_params.rxlev_meas;
@@ -175,32 +191,30 @@ static void test_pf_algo_ewma(void)
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 26);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 2);
-#define CHECK_UL_RSSI_AVG100(exp) \
- printf("\tAvg[t] is %2.2f dBm (expected %2.2f dBm)\n", \
+#define CHECK_RXLEV_AVG100(exp) \
+ printf("\tAvg[t] is RxLev %2.2f (expected %2.2f)\n", \
((float) *avg100) / 100, exp);
/* UL RSSI remains constant => no UL power change */
- apply_power_test(lchan, -75, 0, 15);
- CHECK_UL_RSSI_AVG100(-75.00);
+ apply_power_test(lchan, -75, good_lqual, 0, 15);
+ CHECK_RXLEV_AVG100((float)dbm2rxlev(-75)); /* RXLEV 35 */
- /* Avg[t] = (0.2 * -90) + (0.8 * -75) = -78.0 dBm */
- apply_power_test(lchan, -90, 1, 13);
- CHECK_UL_RSSI_AVG100(-78.00);
+ /* Avg[t] = (0.2 * 20) + (0.8 * 35) = RXLEV 32, (-78 dBm) */
+ apply_power_test(lchan, -90, good_lqual, 1, 13); /* -90 dBm = RXLEV 20 */
+ CHECK_RXLEV_AVG100(32.00);
- /* Avg[t] = (0.2 * -90) + (0.8 * -78) = -80.4 dBm */
- apply_power_test(lchan, -90, 1, 11);
- CHECK_UL_RSSI_AVG100(-80.40);
+ /* Avg[t] = (0.2 * 20) + (0.8 * 32) = RXLEV 29.6 (-80.4 dBm) */
+ apply_power_test(lchan, -90, good_lqual, 1, 11); /* -90 dBm = RXLEV 20 */
+ CHECK_RXLEV_AVG100(29.60);
- /* Avg[t] = (0.2 * -70) + (0.8 * -80.4) = -78.32 dBm,
+ /* Avg[t] = (0.2 * 40) + (0.8 * 29.60) = RXLEV 31.68 (-78.32 dBm),
* but due to up-/down-scaling artefacts we get the following:
* Avg100[t] = Avg100[t - 1] + A * (Pwr - Avg[t] / 100)
- * Avg100[t] = -8040 + 20 * (-70 - (-8040 / 100))
- * Avg100[t] = -8040 + 20 * (-70 - (-8040 / 100))
- * Avg100[t] = -8040 + 20 * (-70 + 80)
- * Avg100[t] = -8040 + 200 = -7840
- * Avg[t] = -7840 / 100 = -78.4 */
- apply_power_test(lchan, -70, 1, 9);
- CHECK_UL_RSSI_AVG100(-78.40);
+ * Avg100[t] = 2960 + 20 * (40 - ((2960+50) / 100)) <- HERE we lose 0.1: (2960+50) / 100) = 30.1
+ * Avg100[t] = 2960 + 20 * (40 - 30) <- HERE we lose 20*0.1 = 2.0! (upscaled, hence we lose finally 2.0/100=0.2)
+ * Avg[t] = (3160) / 100 = 31.60*/
+ apply_power_test(lchan, -70, good_lqual, 1, 9); /* RXLEV 40 */
+ CHECK_RXLEV_AVG100(31.60);
mp->ewma.alpha = 70; /* 30% smoothing */
lchan->ms_power_ctrl.current = 15;
@@ -208,25 +222,30 @@ static void test_pf_algo_ewma(void)
(struct gsm_power_ctrl_meas_proc_state) { 0 };
/* This is the first sample, the filter outputs it as-is */
- apply_power_test(lchan, -50, 0, 15);
- CHECK_UL_RSSI_AVG100(-50.00);
+ apply_power_test(lchan, -50, good_lqual, 0, 15); /* RXLEV 60 */
+ CHECK_RXLEV_AVG100((float)dbm2rxlev(-50));
- /* Avg[t] = (0.7 * -50) + (0.3 * -50) = -50.0 dBm */
- apply_power_test(lchan, -50, 0, 15);
- CHECK_UL_RSSI_AVG100(-50.0);
+ /* Avg[t] = (0.7 * 60) + (0.3 * 60) = RXLEV 60 (-50.0 dBm) */
+ apply_power_test(lchan, -50, good_lqual, 0, 15);
+ CHECK_RXLEV_AVG100((float)dbm2rxlev(-50));
/* Simulate SACCH block loss (-110 dBm):
- * Avg[t] = (0.7 * -110) + (0.3 * -50) = -92.0 dBm */
- apply_power_test(lchan, -110, 1, 13);
- CHECK_UL_RSSI_AVG100(-92.0);
+ * Avg[t] = (0.7 * 0) + (0.3 * 60) = RXLEV 18.0 (-92.0 dBm) */
+ apply_power_test(lchan, -110, good_lqual, 1, 13); /* RXLEV 0 */
+ CHECK_RXLEV_AVG100(18.0);
}
static void test_power_hysteresis(void)
{
struct gsm_lchan *lchan;
+ const struct gsm_power_ctrl_params *params;
+ int16_t good_lqual;
init_test(__func__);
lchan = &g_trx->ts[0].lchan[0];
+ lchan->type = GSM_LCHAN_SDCCH;
+ params = lchan->ms_power_ctrl.dpc_params;
+ good_lqual = (params->ci_sdcch_meas.lower_thresh + 2) * 10;
/* Tolerate power deviations in range -80 .. -70 */
lchan->ms_dpc_params.rxlev_meas.lower_thresh = 30;
@@ -237,61 +256,66 @@ static void test_power_hysteresis(void)
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 26);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 2);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, 0, 15);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 3, 0, 15);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 3, 0, 15);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, good_lqual, 0, 15);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 3, good_lqual, 0, 15);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 3, good_lqual, 0, 15);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, 0, 15);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 5, 0, 15);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 5, 0, 15);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM, good_lqual, 0, 15);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM + 5, good_lqual, 0, 15);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 5, good_lqual, 0, 15);
- apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 10, 1, 13);
+ apply_power_test(lchan, PWR_TEST_RXLEV_TARGET_DBM - 10, good_lqual, 1, 13);
}
static void test_power_ctrl_interval(void)
{
struct gsm_lchan *lchan;
+ const struct gsm_power_ctrl_params *params;
+ int16_t good_lqual;
unsigned int i, j;
init_test(__func__);
lchan = &g_trx->ts[0].lchan[0];
+ lchan->type = GSM_LCHAN_SDCCH;
+ params = lchan->ms_power_ctrl.dpc_params;
+ good_lqual = (params->ci_sdcch_meas.lower_thresh + 2) * 10;
lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 26);
OSMO_ASSERT(lchan->ms_power_ctrl.max == 2);
- static const int script[][8][3] = {
+ const int script[][8][4] = {
{ /* P_Con_INTERVAL=0 (480 ms) */
/* { UL RxLev, expected rc, expected Tx power level } */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 13 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 11 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 9 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 7 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 5 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 3 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 2 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 2 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 13 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 11 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 9 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 7 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 5 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 3 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 2 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 2 },
},
{ /* P_Con_INTERVAL=1 (960 ms) */
/* { UL RxLev, expected rc, expected Tx power level } */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 13 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 13 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 11 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 11 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 9 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 9 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 7 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 7 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 13 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 13 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 11 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 11 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 9 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 9 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 7 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 7 }, /* skipped */
},
{ /* P_Con_INTERVAL=2 (1920 ms) */
/* { UL RxLev, expected rc, expected Tx power level } */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 13 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 13 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 13 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 13 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 1, 11 },
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 11 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 11 }, /* skipped */
- { PWR_TEST_RXLEV_TARGET_DBM - 15, 0, 11 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 13 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 13 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 13 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 13 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 1, 11 },
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 11 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 11 }, /* skipped */
+ { PWR_TEST_RXLEV_TARGET_DBM - 15, good_lqual, 0, 11 }, /* skipped */
},
};
@@ -305,14 +329,82 @@ static void test_power_ctrl_interval(void)
for (j = 0; j < ARRAY_SIZE(script[i]); j++) {
apply_power_test(lchan, script[i][j][0], /* UL RxLev */
- script[i][j][1], /* expected rc */
- script[i][j][2]); /* expected Tx power level */
+ script[i][j][1], /* UL C/I */
+ script[i][j][2], /* expected rc */
+ script[i][j][3]); /* expected Tx power level */
}
printf("\n");
}
}
+static void test_power_loop_ci(void)
+{
+ struct gsm_lchan *lchan;
+ const struct gsm_power_ctrl_params *params;
+ int16_t good_lqual, too_low_lqual, too_high_lqual;
+
+ init_test(__func__);
+ lchan = &g_trx->ts[0].lchan[0];
+ params = lchan->ms_power_ctrl.dpc_params;
+ lchan->type = GSM_LCHAN_SDCCH;
+ good_lqual = (params->ci_sdcch_meas.lower_thresh + 2) * 10;
+ too_low_lqual = (params->ci_sdcch_meas.lower_thresh - 1) * 10;
+ too_high_lqual = (params->ci_sdcch_meas.upper_thresh + 1) * 10;
+
+ lchan->ms_power_ctrl.current = ms_pwr_ctl_lvl(GSM_BAND_1800, 0);
+ OSMO_ASSERT(lchan->ms_power_ctrl.current == 15);
+ lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 26);
+ OSMO_ASSERT(lchan->ms_power_ctrl.max == 2);
+
+ /* Simply clamping */
+ apply_power_test(lchan, -60, good_lqual, 0, 15);
+
+ /* Now UL C/I is too bad as well as RSSI: */
+ apply_power_test(lchan, -100, too_low_lqual, 1, 13);
+ apply_power_test(lchan, -100, too_low_lqual, 1, 11);
+
+ /* Now UL C/I is good again while RSSI is good: */
+ apply_power_test(lchan, -60, good_lqual, 1, 12);
+ apply_power_test(lchan, -60, too_high_lqual, 1, 13);
+
+ /* Now UL C/I is good while RSSI is bad, C/I mandates: */
+ apply_power_test(lchan, -100, good_lqual, 1, 11);
+ apply_power_test(lchan, -100, too_high_lqual, 1, 12);
+
+ /* Now UL C/I is bad again while RSSI is good, C/I mandates: */
+ apply_power_test(lchan, -60, good_lqual, 1, 13);
+ apply_power_test(lchan, -60, too_high_lqual, 1, 14);
+}
+
+/* Test whether ping pong between requested MS Power Level and announced MS
+ * Power level occurs, oscillating between considered good levels all the time:
+ * FIXME: Current code shows there's an issue with oscillating values. */
+static void test_good_threshold_convergence(void)
+{
+ struct gsm_lchan *lchan;
+ const struct gsm_power_ctrl_params *params;
+ int16_t good_lqual, good_rxlev;
+
+ init_test(__func__);
+ lchan = &g_trx->ts[0].lchan[0];
+ params = lchan->ms_power_ctrl.dpc_params;
+ lchan->ms_dpc_params.rxlev_meas.upper_thresh = 37;
+ lchan->ms_dpc_params.rxlev_meas.lower_thresh = 30;
+ lchan->type = GSM_LCHAN_SDCCH;
+ good_lqual = (params->ci_sdcch_meas.lower_thresh + 2) * 10;
+ good_rxlev = rxlev2dbm(params->rxlev_meas.lower_thresh + 2);
+
+ lchan->ms_power_ctrl.current = 10;
+ lchan->ms_power_ctrl.max = 2;
+
+ apply_power_test_ext(lchan, 9, good_rxlev, good_lqual, 0, 10);
+ apply_power_test_ext(lchan, 10, good_rxlev, good_lqual, 0, 10);
+ apply_power_test_ext(lchan, 9, good_rxlev, good_lqual, 0, 10);
+ apply_power_test_ext(lchan, 10, good_rxlev, good_lqual, 0, 10);
+ apply_power_test_ext(lchan, 9, good_rxlev, good_lqual, 0, 10);
+}
+
int main(int argc, char **argv)
{
printf("Testing power loop...\n");
@@ -332,6 +424,8 @@ int main(int argc, char **argv)
test_pf_algo_ewma();
test_power_hysteresis();
test_power_ctrl_interval();
+ test_power_loop_ci();
+ test_good_threshold_convergence();
printf("Power loop test OK\n");
diff --git a/tests/power/ms_power_loop_test.err b/tests/power/ms_power_loop_test.err
index ae8ad033..07d90691 100644
--- a/tests/power/ms_power_loop_test.err
+++ b/tests/power/ms_power_loop_test.err
@@ -1,51 +1,65 @@
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -60 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 9 (12 dBm) to 7, 16 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 7 (16 dBm) to 5, 20 dBm (rx-ms-pwr-lvl 7, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 5, 20 dBm (rx-ms-pwr-lvl 5, max-ms-pwr-lvl 2, rx-current -75 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 5 (20 dBm) to 3, 24 dBm (rx-ms-pwr-lvl 5, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 3 (24 dBm) to 2, 26 dBm (rx-ms-pwr-lvl 3, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 2, 26 dBm (rx-ms-pwr-lvl 2, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 2 (26 dBm) to 0, 30 dBm (rx-ms-pwr-lvl 2, max-ms-pwr-lvl 0, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 0, 30 dBm (rx-ms-pwr-lvl 0, max-ms-pwr-lvl 0, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 0 (30 dBm) to 30, 34 dBm (rx-ms-pwr-lvl 0, max-ms-pwr-lvl 29, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 30 (34 dBm) to 29, 36 dBm (rx-ms-pwr-lvl 30, max-ms-pwr-lvl 29, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29, 36 dBm (rx-ms-pwr-lvl 29, max-ms-pwr-lvl 29, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29, 36 dBm (rx-ms-pwr-lvl 29, max-ms-pwr-lvl 29, rx-current -75 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 29 (36 dBm) to 30, 34 dBm (rx-ms-pwr-lvl 29, max-ms-pwr-lvl 29, rx-current -45 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 30 (34 dBm) to 31, 32 dBm (rx-ms-pwr-lvl 30, max-ms-pwr-lvl 29, rx-current -45 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 31 (32 dBm) to 0, 30 dBm (rx-ms-pwr-lvl 31, max-ms-pwr-lvl 29, rx-current -45 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 0 (30 dBm) to 1, 28 dBm (rx-ms-pwr-lvl 0, max-ms-pwr-lvl 29, rx-current -73 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 1 (28 dBm) to 0, 30 dBm (rx-ms-pwr-lvl 1, max-ms-pwr-lvl 29, rx-current -77 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 0 (30 dBm) to 14, 2 dBm (rx-ms-pwr-lvl 0, max-ms-pwr-lvl 14, rx-current -73 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 14 (2 dBm) to 15, 0 dBm (rx-ms-pwr-lvl 14, max-ms-pwr-lvl 0, rx-current -40 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -75 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 3 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 11 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -70 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -50 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -50 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -110 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -75 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -72 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -78 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -75 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -70 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -80 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -85 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 9 (12 dBm) to 7, 16 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 7 (16 dBm) to 5, 20 dBm (rx-ms-pwr-lvl 7, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 5 (20 dBm) to 3, 24 dBm (rx-ms-pwr-lvl 5, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 3 (24 dBm) to 2, 26 dBm (rx-ms-pwr-lvl 3, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 2, 26 dBm (rx-ms-pwr-lvl 2, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 9 (12 dBm) to 7, 16 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
-(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm)
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -60, avg -60, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 11 (8 dBm) => 9 (12 dBm): ms-pwr-lvl[curr 11, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 9 (12 dBm) => 7 (16 dBm): ms-pwr-lvl[curr 9, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 7 (16 dBm) => 5 (20 dBm): ms-pwr-lvl[curr 7, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 5 (20 dBm): ms-pwr-lvl[curr 5, max 2], RSSI[curr -75, avg -75, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 5 (20 dBm) => 3 (24 dBm): ms-pwr-lvl[curr 5, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 3 (24 dBm) => 2 (26 dBm): ms-pwr-lvl[curr 3, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 2 (26 dBm): ms-pwr-lvl[curr 2, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 2 (26 dBm) => 0 (30 dBm): ms-pwr-lvl[curr 2, max 0], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 0 (30 dBm): ms-pwr-lvl[curr 0, max 0], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 0 (30 dBm) => 30 (34 dBm): ms-pwr-lvl[curr 0, max 29], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 30 (34 dBm) => 29 (36 dBm): ms-pwr-lvl[curr 30, max 29], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29 (36 dBm): ms-pwr-lvl[curr 29, max 29], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29 (36 dBm): ms-pwr-lvl[curr 29, max 29], RSSI[curr -75, avg -75, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 29 (36 dBm) => 30 (34 dBm): ms-pwr-lvl[curr 29, max 29], RSSI[curr -45, avg -47, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 30 (34 dBm) => 31 (32 dBm): ms-pwr-lvl[curr 30, max 29], RSSI[curr -45, avg -47, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 31 (32 dBm) => 0 (30 dBm): ms-pwr-lvl[curr 31, max 29], RSSI[curr -45, avg -47, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 0 (30 dBm) => 1 (28 dBm): ms-pwr-lvl[curr 0, max 29], RSSI[curr -73, avg -73, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 1 (28 dBm) => 0 (30 dBm): ms-pwr-lvl[curr 1, max 29], RSSI[curr -77, avg -77, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 0 (30 dBm) => 14 (2 dBm): ms-pwr-lvl[curr 0, max 14], RSSI[curr -73, avg -73, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 14 (2 dBm) => 15 (0 dBm): ms-pwr-lvl[curr 14, max 0], RSSI[curr -40, avg -47, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -75, avg -75, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (3 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -90, avg -78, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -90, avg -80, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 11 (8 dBm) => 9 (11 dBm): ms-pwr-lvl[curr 11, max 2], RSSI[curr -70, avg -78, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -50, avg -50, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -50, avg -50, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -110, avg -92, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -75, avg -75, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -72, avg -72, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -78, avg -78, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -75, avg -75, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -70, avg -70, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -80, avg -80, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -85, avg -85, thresh -80..-70] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 11 (8 dBm) => 9 (12 dBm): ms-pwr-lvl[curr 11, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 9 (12 dBm) => 7 (16 dBm): ms-pwr-lvl[curr 9, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 7 (16 dBm) => 5 (20 dBm): ms-pwr-lvl[curr 7, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 5 (20 dBm) => 3 (24 dBm): ms-pwr-lvl[curr 5, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 3 (24 dBm) => 2 (26 dBm): ms-pwr-lvl[curr 3, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 2 (26 dBm): ms-pwr-lvl[curr 2, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 11 (8 dBm) => 9 (12 dBm): ms-pwr-lvl[curr 11, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 9 (12 dBm) => 7 (16 dBm): ms-pwr-lvl[curr 9, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -90, avg -90, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -60, avg -60, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 15 (0 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 15, max 2], RSSI[curr -100, avg -100, thresh -75..-75] dBm, C/I[curr 11, avg 11, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -100, avg -100, thresh -75..-75] dBm, C/I[curr 11, avg 11, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 11 (8 dBm) => 12 (6 dBm): ms-pwr-lvl[curr 11, max 2], RSSI[curr -60, avg -60, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 12 (6 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 12, max 2], RSSI[curr -60, avg -60, thresh -75..-75] dBm, C/I[curr 17, avg 17, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Raising MS power control level 13 (4 dBm) => 11 (8 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -100, avg -100, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 11 (8 dBm) => 12 (6 dBm): ms-pwr-lvl[curr 11, max 2], RSSI[curr -100, avg -100, thresh -75..-75] dBm, C/I[curr 17, avg 17, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 12 (6 dBm) => 13 (4 dBm): ms-pwr-lvl[curr 12, max 2], RSSI[curr -60, avg -60, thresh -75..-75] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Lowering MS power control level 13 (4 dBm) => 14 (2 dBm): ms-pwr-lvl[curr 13, max 2], RSSI[curr -60, avg -60, thresh -75..-75] dBm, C/I[curr 17, avg 17, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 9 (12 dBm): ms-pwr-lvl[curr 9, max 2], RSSI[curr -78, avg -78, thresh -80..-73] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 10 (10 dBm): ms-pwr-lvl[curr 10, max 2], RSSI[curr -78, avg -78, thresh -80..-73] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 9 (12 dBm): ms-pwr-lvl[curr 9, max 2], RSSI[curr -78, avg -78, thresh -80..-73] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 10 (10 dBm): ms-pwr-lvl[curr 10, max 2], RSSI[curr -78, avg -78, thresh -80..-73] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
+(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 9 (12 dBm): ms-pwr-lvl[curr 9, max 2], RSSI[curr -78, avg -78, thresh -80..-73] dBm, C/I[curr 14, avg 14, thresh 12..16] dB
diff --git a/tests/power/ms_power_loop_test.ok b/tests/power/ms_power_loop_test.ok
index 5fea4747..09e19ad4 100644
--- a/tests/power/ms_power_loop_test.ok
+++ b/tests/power/ms_power_loop_test.ok
@@ -53,25 +53,25 @@ lchan_ms_pwr_ctrl(RxLvl=-40 dBm) returns 1 (expected 1)
Starting test case 'test_pf_algo_ewma'
lchan_ms_pwr_ctrl(RxLvl=-75 dBm) returns 0 (expected 0)
MS current power 15 -> 15 (expected 15)
- Avg[t] is -75.00 dBm (expected -75.00 dBm)
+ Avg[t] is RxLev 35.00 (expected 35.00)
lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)
MS current power 15 -> 13 (expected 13)
- Avg[t] is -78.00 dBm (expected -78.00 dBm)
+ Avg[t] is RxLev 32.00 (expected 32.00)
lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 1 (expected 1)
MS current power 13 -> 11 (expected 11)
- Avg[t] is -80.40 dBm (expected -80.40 dBm)
+ Avg[t] is RxLev 29.60 (expected 29.60)
lchan_ms_pwr_ctrl(RxLvl=-70 dBm) returns 1 (expected 1)
MS current power 11 -> 9 (expected 9)
- Avg[t] is -78.40 dBm (expected -78.40 dBm)
+ Avg[t] is RxLev 31.60 (expected 31.60)
lchan_ms_pwr_ctrl(RxLvl=-50 dBm) returns 0 (expected 0)
MS current power 15 -> 15 (expected 15)
- Avg[t] is -50.00 dBm (expected -50.00 dBm)
+ Avg[t] is RxLev 60.00 (expected 60.00)
lchan_ms_pwr_ctrl(RxLvl=-50 dBm) returns 0 (expected 0)
MS current power 15 -> 15 (expected 15)
- Avg[t] is -50.00 dBm (expected -50.00 dBm)
+ Avg[t] is RxLev 60.00 (expected 60.00)
lchan_ms_pwr_ctrl(RxLvl=-110 dBm) returns 1 (expected 1)
MS current power 15 -> 13 (expected 13)
- Avg[t] is -92.00 dBm (expected -92.00 dBm)
+ Avg[t] is RxLev 18.00 (expected 18.00)
Starting test case 'test_power_hysteresis'
lchan_ms_pwr_ctrl(RxLvl=-75 dBm) returns 0 (expected 0)
@@ -144,4 +144,36 @@ lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)
lchan_ms_pwr_ctrl(RxLvl=-90 dBm) returns 0 (expected 0)
MS current power 11 -> 11 (expected 11)
+
+Starting test case 'test_power_loop_ci'
+lchan_ms_pwr_ctrl(RxLvl=-60 dBm) returns 0 (expected 0)
+ MS current power 15 -> 15 (expected 15)
+lchan_ms_pwr_ctrl(RxLvl=-100 dBm) returns 1 (expected 1)
+ MS current power 15 -> 13 (expected 13)
+lchan_ms_pwr_ctrl(RxLvl=-100 dBm) returns 1 (expected 1)
+ MS current power 13 -> 11 (expected 11)
+lchan_ms_pwr_ctrl(RxLvl=-60 dBm) returns 1 (expected 1)
+ MS current power 11 -> 12 (expected 12)
+lchan_ms_pwr_ctrl(RxLvl=-60 dBm) returns 1 (expected 1)
+ MS current power 12 -> 13 (expected 13)
+lchan_ms_pwr_ctrl(RxLvl=-100 dBm) returns 1 (expected 1)
+ MS current power 13 -> 11 (expected 11)
+lchan_ms_pwr_ctrl(RxLvl=-100 dBm) returns 1 (expected 1)
+ MS current power 11 -> 12 (expected 12)
+lchan_ms_pwr_ctrl(RxLvl=-60 dBm) returns 1 (expected 1)
+ MS current power 12 -> 13 (expected 13)
+lchan_ms_pwr_ctrl(RxLvl=-60 dBm) returns 1 (expected 1)
+ MS current power 13 -> 14 (expected 14)
+
+Starting test case 'test_good_threshold_convergence'
+lchan_ms_pwr_ctrl(RxLvl=-78 dBm) returns 0 (expected 0)
+ MS current power 9 -> 10 (expected 10)
+lchan_ms_pwr_ctrl(RxLvl=-78 dBm) returns 0 (expected 0)
+ MS current power 10 -> 10 (expected 10)
+lchan_ms_pwr_ctrl(RxLvl=-78 dBm) returns 0 (expected 0)
+ MS current power 9 -> 10 (expected 10)
+lchan_ms_pwr_ctrl(RxLvl=-78 dBm) returns 0 (expected 0)
+ MS current power 10 -> 10 (expected 10)
+lchan_ms_pwr_ctrl(RxLvl=-78 dBm) returns 0 (expected 0)
+ MS current power 9 -> 10 (expected 10)
Power loop test OK
diff --git a/tests/ta_control/ta_control_test.c b/tests/ta_control/ta_control_test.c
index 2e981b38..253491a8 100644
--- a/tests/ta_control/ta_control_test.c
+++ b/tests/ta_control/ta_control_test.c
@@ -26,36 +26,35 @@
#include <osmo-bts/logging.h>
#include <osmo-bts/gsm_data.h>
#include <osmo-bts/ta_control.h>
+#include <osmo-bts/bts_trx.h>
void lchan_ms_ta_ctrl_test(int16_t toa256_start, unsigned int steps)
{
- struct gsm_lchan lchan = { };
+ struct gsm_bts_trx trx = { };
+ struct gsm_bts_trx_ts ts = { .trx = &trx };
+ struct gsm_lchan lchan = { .ts = &ts };
unsigned int i;
uint8_t rqd_ta_after;
uint8_t rqd_ta_before;
int16_t toa256 = toa256_start;
- /* Arbitrary value, high enough so that a computation can happen. */
- lchan.meas.num_ul_meas = 10;
-
printf("toa256_start = %u / 256 = %u, steps = %u\n", toa256_start,
toa256_start / 256, steps);
for (i = 0; i < steps; i++) {
printf("Step #%u\n", i);
- printf(" lchan.rqd_ta (before) = %u\n", lchan.rqd_ta);
+ printf(" lchan.ta_ctrl.current (before) = %u\n", lchan.ta_ctrl.current);
printf(" toa256 (before) = %u / 256 = %u\n", toa256,
toa256 / 256);
- rqd_ta_before = lchan.rqd_ta;
+ rqd_ta_before = lchan.ta_ctrl.current;
- lchan.meas.ms_toa256 = toa256;
- lchan_ms_ta_ctrl(&lchan);
+ lchan_ms_ta_ctrl(&lchan, rqd_ta_before, toa256);
- rqd_ta_after = lchan.rqd_ta;
+ rqd_ta_after = lchan.ta_ctrl.current;
toa256 -= (rqd_ta_after - rqd_ta_before) * 256;
- printf(" lchan.rqd_ta (after) = %u\n", lchan.rqd_ta);
+ printf(" lchan.ta_ctrl.current (after) = %u\n", lchan.ta_ctrl.current);
printf(" toa256 (after) = %u / 256 = %u\n", toa256,
toa256 / 256);
}
diff --git a/tests/ta_control/ta_control_test.ok b/tests/ta_control/ta_control_test.ok
index 8ebe5d54..a1586759 100644
--- a/tests/ta_control/ta_control_test.ok
+++ b/tests/ta_control/ta_control_test.ok
@@ -1,609 +1,609 @@
toa256_start = 4096 / 256 = 16, steps = 20
Step #0
- lchan.rqd_ta (before) = 0
+ lchan.ta_ctrl.current (before) = 0
toa256 (before) = 4096 / 256 = 16
- lchan.rqd_ta (after) = 1
- toa256 (after) = 3840 / 256 = 15
-Step #1
- lchan.rqd_ta (before) = 1
- toa256 (before) = 3840 / 256 = 15
- lchan.rqd_ta (after) = 2
+ lchan.ta_ctrl.current (after) = 2
toa256 (after) = 3584 / 256 = 14
-Step #2
- lchan.rqd_ta (before) = 2
+Step #1
+ lchan.ta_ctrl.current (before) = 2
toa256 (before) = 3584 / 256 = 14
- lchan.rqd_ta (after) = 3
- toa256 (after) = 3328 / 256 = 13
-Step #3
- lchan.rqd_ta (before) = 3
- toa256 (before) = 3328 / 256 = 13
- lchan.rqd_ta (after) = 4
+ lchan.ta_ctrl.current (after) = 4
toa256 (after) = 3072 / 256 = 12
-Step #4
- lchan.rqd_ta (before) = 4
+Step #2
+ lchan.ta_ctrl.current (before) = 4
toa256 (before) = 3072 / 256 = 12
- lchan.rqd_ta (after) = 5
- toa256 (after) = 2816 / 256 = 11
-Step #5
- lchan.rqd_ta (before) = 5
- toa256 (before) = 2816 / 256 = 11
- lchan.rqd_ta (after) = 6
+ lchan.ta_ctrl.current (after) = 6
toa256 (after) = 2560 / 256 = 10
-Step #6
- lchan.rqd_ta (before) = 6
+Step #3
+ lchan.ta_ctrl.current (before) = 6
toa256 (before) = 2560 / 256 = 10
- lchan.rqd_ta (after) = 7
- toa256 (after) = 2304 / 256 = 9
-Step #7
- lchan.rqd_ta (before) = 7
- toa256 (before) = 2304 / 256 = 9
- lchan.rqd_ta (after) = 8
+ lchan.ta_ctrl.current (after) = 8
toa256 (after) = 2048 / 256 = 8
-Step #8
- lchan.rqd_ta (before) = 8
+Step #4
+ lchan.ta_ctrl.current (before) = 8
toa256 (before) = 2048 / 256 = 8
- lchan.rqd_ta (after) = 9
- toa256 (after) = 1792 / 256 = 7
-Step #9
- lchan.rqd_ta (before) = 9
- toa256 (before) = 1792 / 256 = 7
- lchan.rqd_ta (after) = 10
+ lchan.ta_ctrl.current (after) = 10
toa256 (after) = 1536 / 256 = 6
-Step #10
- lchan.rqd_ta (before) = 10
+Step #5
+ lchan.ta_ctrl.current (before) = 10
toa256 (before) = 1536 / 256 = 6
- lchan.rqd_ta (after) = 11
- toa256 (after) = 1280 / 256 = 5
-Step #11
- lchan.rqd_ta (before) = 11
- toa256 (before) = 1280 / 256 = 5
- lchan.rqd_ta (after) = 12
+ lchan.ta_ctrl.current (after) = 12
toa256 (after) = 1024 / 256 = 4
-Step #12
- lchan.rqd_ta (before) = 12
+Step #6
+ lchan.ta_ctrl.current (before) = 12
toa256 (before) = 1024 / 256 = 4
- lchan.rqd_ta (after) = 13
- toa256 (after) = 768 / 256 = 3
-Step #13
- lchan.rqd_ta (before) = 13
- toa256 (before) = 768 / 256 = 3
- lchan.rqd_ta (after) = 14
+ lchan.ta_ctrl.current (after) = 14
toa256 (after) = 512 / 256 = 2
-Step #14
- lchan.rqd_ta (before) = 14
+Step #7
+ lchan.ta_ctrl.current (before) = 14
toa256 (before) = 512 / 256 = 2
- lchan.rqd_ta (after) = 15
- toa256 (after) = 256 / 256 = 1
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #8
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #9
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #10
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #11
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #12
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #13
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
+Step #14
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
+ toa256 (after) = 0 / 256 = 0
Step #15
- lchan.rqd_ta (before) = 15
- toa256 (before) = 256 / 256 = 1
- lchan.rqd_ta (after) = 16
+ lchan.ta_ctrl.current (before) = 16
+ toa256 (before) = 0 / 256 = 0
+ lchan.ta_ctrl.current (after) = 16
toa256 (after) = 0 / 256 = 0
Step #16
- lchan.rqd_ta (before) = 16
+ lchan.ta_ctrl.current (before) = 16
toa256 (before) = 0 / 256 = 0
- lchan.rqd_ta (after) = 16
+ lchan.ta_ctrl.current (after) = 16
toa256 (after) = 0 / 256 = 0
Step #17
- lchan.rqd_ta (before) = 16
+ lchan.ta_ctrl.current (before) = 16
toa256 (before) = 0 / 256 = 0
- lchan.rqd_ta (after) = 16
+ lchan.ta_ctrl.current (after) = 16
toa256 (after) = 0 / 256 = 0
Step #18
- lchan.rqd_ta (before) = 16
+ lchan.ta_ctrl.current (before) = 16
toa256 (before) = 0 / 256 = 0
- lchan.rqd_ta (after) = 16
+ lchan.ta_ctrl.current (after) = 16
toa256 (after) = 0 / 256 = 0
Step #19
- lchan.rqd_ta (before) = 16
+ lchan.ta_ctrl.current (before) = 16
toa256 (before) = 0 / 256 = 0
- lchan.rqd_ta (after) = 16
+ lchan.ta_ctrl.current (after) = 16
toa256 (after) = 0 / 256 = 0
Done.
toa256_start = 4000 / 256 = 15, steps = 50
Step #0
- lchan.rqd_ta (before) = 0
+ lchan.ta_ctrl.current (before) = 0
toa256 (before) = 4000 / 256 = 15
- lchan.rqd_ta (after) = 1
- toa256 (after) = 3744 / 256 = 14
-Step #1
- lchan.rqd_ta (before) = 1
- toa256 (before) = 3744 / 256 = 14
- lchan.rqd_ta (after) = 2
+ lchan.ta_ctrl.current (after) = 2
toa256 (after) = 3488 / 256 = 13
-Step #2
- lchan.rqd_ta (before) = 2
+Step #1
+ lchan.ta_ctrl.current (before) = 2
toa256 (before) = 3488 / 256 = 13
- lchan.rqd_ta (after) = 3
- toa256 (after) = 3232 / 256 = 12
-Step #3
- lchan.rqd_ta (before) = 3
- toa256 (before) = 3232 / 256 = 12
- lchan.rqd_ta (after) = 4
+ lchan.ta_ctrl.current (after) = 4
toa256 (after) = 2976 / 256 = 11
-Step #4
- lchan.rqd_ta (before) = 4
+Step #2
+ lchan.ta_ctrl.current (before) = 4
toa256 (before) = 2976 / 256 = 11
- lchan.rqd_ta (after) = 5
- toa256 (after) = 2720 / 256 = 10
-Step #5
- lchan.rqd_ta (before) = 5
- toa256 (before) = 2720 / 256 = 10
- lchan.rqd_ta (after) = 6
+ lchan.ta_ctrl.current (after) = 6
toa256 (after) = 2464 / 256 = 9
-Step #6
- lchan.rqd_ta (before) = 6
+Step #3
+ lchan.ta_ctrl.current (before) = 6
toa256 (before) = 2464 / 256 = 9
- lchan.rqd_ta (after) = 7
- toa256 (after) = 2208 / 256 = 8
-Step #7
- lchan.rqd_ta (before) = 7
- toa256 (before) = 2208 / 256 = 8
- lchan.rqd_ta (after) = 8
+ lchan.ta_ctrl.current (after) = 8
toa256 (after) = 1952 / 256 = 7
-Step #8
- lchan.rqd_ta (before) = 8
+Step #4
+ lchan.ta_ctrl.current (before) = 8
toa256 (before) = 1952 / 256 = 7
- lchan.rqd_ta (after) = 9
- toa256 (after) = 1696 / 256 = 6
-Step #9
- lchan.rqd_ta (before) = 9
- toa256 (before) = 1696 / 256 = 6
- lchan.rqd_ta (after) = 10
+ lchan.ta_ctrl.current (after) = 10
toa256 (after) = 1440 / 256 = 5
-Step #10
- lchan.rqd_ta (before) = 10
+Step #5
+ lchan.ta_ctrl.current (before) = 10
toa256 (before) = 1440 / 256 = 5
- lchan.rqd_ta (after) = 11
- toa256 (after) = 1184 / 256 = 4
-Step #11
- lchan.rqd_ta (before) = 11
- toa256 (before) = 1184 / 256 = 4
- lchan.rqd_ta (after) = 12
+ lchan.ta_ctrl.current (after) = 12
toa256 (after) = 928 / 256 = 3
-Step #12
- lchan.rqd_ta (before) = 12
+Step #6
+ lchan.ta_ctrl.current (before) = 12
toa256 (before) = 928 / 256 = 3
- lchan.rqd_ta (after) = 13
- toa256 (after) = 672 / 256 = 2
-Step #13
- lchan.rqd_ta (before) = 13
- toa256 (before) = 672 / 256 = 2
- lchan.rqd_ta (after) = 14
+ lchan.ta_ctrl.current (after) = 14
toa256 (after) = 416 / 256 = 1
-Step #14
- lchan.rqd_ta (before) = 14
+Step #7
+ lchan.ta_ctrl.current (before) = 14
toa256 (before) = 416 / 256 = 1
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #8
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #9
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #10
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #11
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #12
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #13
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
+ toa256 (after) = 160 / 256 = 0
+Step #14
+ lchan.ta_ctrl.current (before) = 15
+ toa256 (before) = 160 / 256 = 0
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #15
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #16
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #17
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #18
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #19
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #20
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #21
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #22
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #23
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #24
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #25
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #26
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #27
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #28
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #29
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #30
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #31
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #32
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #33
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #34
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #35
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #36
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #37
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #38
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #39
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #40
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #41
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #42
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #43
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #44
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #45
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #46
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #47
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #48
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Step #49
- lchan.rqd_ta (before) = 15
+ lchan.ta_ctrl.current (before) = 15
toa256 (before) = 160 / 256 = 0
- lchan.rqd_ta (after) = 15
+ lchan.ta_ctrl.current (after) = 15
toa256 (after) = 160 / 256 = 0
Done.
toa256_start = 12345 / 256 = 48, steps = 50
Step #0
- lchan.rqd_ta (before) = 0
+ lchan.ta_ctrl.current (before) = 0
toa256 (before) = 12345 / 256 = 48
- lchan.rqd_ta (after) = 1
- toa256 (after) = 12089 / 256 = 47
-Step #1
- lchan.rqd_ta (before) = 1
- toa256 (before) = 12089 / 256 = 47
- lchan.rqd_ta (after) = 2
+ lchan.ta_ctrl.current (after) = 2
toa256 (after) = 11833 / 256 = 46
-Step #2
- lchan.rqd_ta (before) = 2
+Step #1
+ lchan.ta_ctrl.current (before) = 2
toa256 (before) = 11833 / 256 = 46
- lchan.rqd_ta (after) = 3
- toa256 (after) = 11577 / 256 = 45
-Step #3
- lchan.rqd_ta (before) = 3
- toa256 (before) = 11577 / 256 = 45
- lchan.rqd_ta (after) = 4
+ lchan.ta_ctrl.current (after) = 4
toa256 (after) = 11321 / 256 = 44
-Step #4
- lchan.rqd_ta (before) = 4
+Step #2
+ lchan.ta_ctrl.current (before) = 4
toa256 (before) = 11321 / 256 = 44
- lchan.rqd_ta (after) = 5
- toa256 (after) = 11065 / 256 = 43
-Step #5
- lchan.rqd_ta (before) = 5
- toa256 (before) = 11065 / 256 = 43
- lchan.rqd_ta (after) = 6
+ lchan.ta_ctrl.current (after) = 6
toa256 (after) = 10809 / 256 = 42
-Step #6
- lchan.rqd_ta (before) = 6
+Step #3
+ lchan.ta_ctrl.current (before) = 6
toa256 (before) = 10809 / 256 = 42
- lchan.rqd_ta (after) = 7
- toa256 (after) = 10553 / 256 = 41
-Step #7
- lchan.rqd_ta (before) = 7
- toa256 (before) = 10553 / 256 = 41
- lchan.rqd_ta (after) = 8
+ lchan.ta_ctrl.current (after) = 8
toa256 (after) = 10297 / 256 = 40
-Step #8
- lchan.rqd_ta (before) = 8
+Step #4
+ lchan.ta_ctrl.current (before) = 8
toa256 (before) = 10297 / 256 = 40
- lchan.rqd_ta (after) = 9
- toa256 (after) = 10041 / 256 = 39
-Step #9
- lchan.rqd_ta (before) = 9
- toa256 (before) = 10041 / 256 = 39
- lchan.rqd_ta (after) = 10
+ lchan.ta_ctrl.current (after) = 10
toa256 (after) = 9785 / 256 = 38
-Step #10
- lchan.rqd_ta (before) = 10
+Step #5
+ lchan.ta_ctrl.current (before) = 10
toa256 (before) = 9785 / 256 = 38
- lchan.rqd_ta (after) = 11
- toa256 (after) = 9529 / 256 = 37
-Step #11
- lchan.rqd_ta (before) = 11
- toa256 (before) = 9529 / 256 = 37
- lchan.rqd_ta (after) = 12
+ lchan.ta_ctrl.current (after) = 12
toa256 (after) = 9273 / 256 = 36
-Step #12
- lchan.rqd_ta (before) = 12
+Step #6
+ lchan.ta_ctrl.current (before) = 12
toa256 (before) = 9273 / 256 = 36
- lchan.rqd_ta (after) = 13
- toa256 (after) = 9017 / 256 = 35
-Step #13
- lchan.rqd_ta (before) = 13
- toa256 (before) = 9017 / 256 = 35
- lchan.rqd_ta (after) = 14
+ lchan.ta_ctrl.current (after) = 14
toa256 (after) = 8761 / 256 = 34
-Step #14
- lchan.rqd_ta (before) = 14
+Step #7
+ lchan.ta_ctrl.current (before) = 14
toa256 (before) = 8761 / 256 = 34
- lchan.rqd_ta (after) = 15
- toa256 (after) = 8505 / 256 = 33
-Step #15
- lchan.rqd_ta (before) = 15
- toa256 (before) = 8505 / 256 = 33
- lchan.rqd_ta (after) = 16
+ lchan.ta_ctrl.current (after) = 16
toa256 (after) = 8249 / 256 = 32
-Step #16
- lchan.rqd_ta (before) = 16
+Step #8
+ lchan.ta_ctrl.current (before) = 16
toa256 (before) = 8249 / 256 = 32
- lchan.rqd_ta (after) = 17
- toa256 (after) = 7993 / 256 = 31
-Step #17
- lchan.rqd_ta (before) = 17
- toa256 (before) = 7993 / 256 = 31
- lchan.rqd_ta (after) = 18
+ lchan.ta_ctrl.current (after) = 18
toa256 (after) = 7737 / 256 = 30
-Step #18
- lchan.rqd_ta (before) = 18
+Step #9
+ lchan.ta_ctrl.current (before) = 18
toa256 (before) = 7737 / 256 = 30
- lchan.rqd_ta (after) = 19
- toa256 (after) = 7481 / 256 = 29
-Step #19
- lchan.rqd_ta (before) = 19
- toa256 (before) = 7481 / 256 = 29
- lchan.rqd_ta (after) = 20
+ lchan.ta_ctrl.current (after) = 20
toa256 (after) = 7225 / 256 = 28
-Step #20
- lchan.rqd_ta (before) = 20
+Step #10
+ lchan.ta_ctrl.current (before) = 20
toa256 (before) = 7225 / 256 = 28
- lchan.rqd_ta (after) = 21
- toa256 (after) = 6969 / 256 = 27
-Step #21
- lchan.rqd_ta (before) = 21
- toa256 (before) = 6969 / 256 = 27
- lchan.rqd_ta (after) = 22
+ lchan.ta_ctrl.current (after) = 22
toa256 (after) = 6713 / 256 = 26
-Step #22
- lchan.rqd_ta (before) = 22
+Step #11
+ lchan.ta_ctrl.current (before) = 22
toa256 (before) = 6713 / 256 = 26
- lchan.rqd_ta (after) = 23
- toa256 (after) = 6457 / 256 = 25
-Step #23
- lchan.rqd_ta (before) = 23
- toa256 (before) = 6457 / 256 = 25
- lchan.rqd_ta (after) = 24
+ lchan.ta_ctrl.current (after) = 24
toa256 (after) = 6201 / 256 = 24
-Step #24
- lchan.rqd_ta (before) = 24
+Step #12
+ lchan.ta_ctrl.current (before) = 24
toa256 (before) = 6201 / 256 = 24
- lchan.rqd_ta (after) = 25
- toa256 (after) = 5945 / 256 = 23
-Step #25
- lchan.rqd_ta (before) = 25
- toa256 (before) = 5945 / 256 = 23
- lchan.rqd_ta (after) = 26
+ lchan.ta_ctrl.current (after) = 26
toa256 (after) = 5689 / 256 = 22
-Step #26
- lchan.rqd_ta (before) = 26
+Step #13
+ lchan.ta_ctrl.current (before) = 26
toa256 (before) = 5689 / 256 = 22
- lchan.rqd_ta (after) = 27
- toa256 (after) = 5433 / 256 = 21
-Step #27
- lchan.rqd_ta (before) = 27
- toa256 (before) = 5433 / 256 = 21
- lchan.rqd_ta (after) = 28
+ lchan.ta_ctrl.current (after) = 28
toa256 (after) = 5177 / 256 = 20
-Step #28
- lchan.rqd_ta (before) = 28
+Step #14
+ lchan.ta_ctrl.current (before) = 28
toa256 (before) = 5177 / 256 = 20
- lchan.rqd_ta (after) = 29
- toa256 (after) = 4921 / 256 = 19
-Step #29
- lchan.rqd_ta (before) = 29
- toa256 (before) = 4921 / 256 = 19
- lchan.rqd_ta (after) = 30
+ lchan.ta_ctrl.current (after) = 30
toa256 (after) = 4665 / 256 = 18
-Step #30
- lchan.rqd_ta (before) = 30
+Step #15
+ lchan.ta_ctrl.current (before) = 30
toa256 (before) = 4665 / 256 = 18
- lchan.rqd_ta (after) = 31
- toa256 (after) = 4409 / 256 = 17
-Step #31
- lchan.rqd_ta (before) = 31
- toa256 (before) = 4409 / 256 = 17
- lchan.rqd_ta (after) = 32
+ lchan.ta_ctrl.current (after) = 32
toa256 (after) = 4153 / 256 = 16
-Step #32
- lchan.rqd_ta (before) = 32
+Step #16
+ lchan.ta_ctrl.current (before) = 32
toa256 (before) = 4153 / 256 = 16
- lchan.rqd_ta (after) = 33
- toa256 (after) = 3897 / 256 = 15
-Step #33
- lchan.rqd_ta (before) = 33
- toa256 (before) = 3897 / 256 = 15
- lchan.rqd_ta (after) = 34
+ lchan.ta_ctrl.current (after) = 34
toa256 (after) = 3641 / 256 = 14
-Step #34
- lchan.rqd_ta (before) = 34
+Step #17
+ lchan.ta_ctrl.current (before) = 34
toa256 (before) = 3641 / 256 = 14
- lchan.rqd_ta (after) = 35
- toa256 (after) = 3385 / 256 = 13
-Step #35
- lchan.rqd_ta (before) = 35
- toa256 (before) = 3385 / 256 = 13
- lchan.rqd_ta (after) = 36
+ lchan.ta_ctrl.current (after) = 36
toa256 (after) = 3129 / 256 = 12
-Step #36
- lchan.rqd_ta (before) = 36
+Step #18
+ lchan.ta_ctrl.current (before) = 36
toa256 (before) = 3129 / 256 = 12
- lchan.rqd_ta (after) = 37
- toa256 (after) = 2873 / 256 = 11
-Step #37
- lchan.rqd_ta (before) = 37
- toa256 (before) = 2873 / 256 = 11
- lchan.rqd_ta (after) = 38
+ lchan.ta_ctrl.current (after) = 38
toa256 (after) = 2617 / 256 = 10
-Step #38
- lchan.rqd_ta (before) = 38
+Step #19
+ lchan.ta_ctrl.current (before) = 38
toa256 (before) = 2617 / 256 = 10
- lchan.rqd_ta (after) = 39
- toa256 (after) = 2361 / 256 = 9
-Step #39
- lchan.rqd_ta (before) = 39
- toa256 (before) = 2361 / 256 = 9
- lchan.rqd_ta (after) = 40
+ lchan.ta_ctrl.current (after) = 40
toa256 (after) = 2105 / 256 = 8
-Step #40
- lchan.rqd_ta (before) = 40
+Step #20
+ lchan.ta_ctrl.current (before) = 40
toa256 (before) = 2105 / 256 = 8
- lchan.rqd_ta (after) = 41
- toa256 (after) = 1849 / 256 = 7
-Step #41
- lchan.rqd_ta (before) = 41
- toa256 (before) = 1849 / 256 = 7
- lchan.rqd_ta (after) = 42
+ lchan.ta_ctrl.current (after) = 42
toa256 (after) = 1593 / 256 = 6
-Step #42
- lchan.rqd_ta (before) = 42
+Step #21
+ lchan.ta_ctrl.current (before) = 42
toa256 (before) = 1593 / 256 = 6
- lchan.rqd_ta (after) = 43
- toa256 (after) = 1337 / 256 = 5
-Step #43
- lchan.rqd_ta (before) = 43
- toa256 (before) = 1337 / 256 = 5
- lchan.rqd_ta (after) = 44
+ lchan.ta_ctrl.current (after) = 44
toa256 (after) = 1081 / 256 = 4
-Step #44
- lchan.rqd_ta (before) = 44
+Step #22
+ lchan.ta_ctrl.current (before) = 44
toa256 (before) = 1081 / 256 = 4
- lchan.rqd_ta (after) = 45
- toa256 (after) = 825 / 256 = 3
-Step #45
- lchan.rqd_ta (before) = 45
- toa256 (before) = 825 / 256 = 3
- lchan.rqd_ta (after) = 46
+ lchan.ta_ctrl.current (after) = 46
toa256 (after) = 569 / 256 = 2
-Step #46
- lchan.rqd_ta (before) = 46
+Step #23
+ lchan.ta_ctrl.current (before) = 46
toa256 (before) = 569 / 256 = 2
- lchan.rqd_ta (after) = 47
- toa256 (after) = 313 / 256 = 1
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #24
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #25
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #26
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #27
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #28
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #29
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #30
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #31
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #32
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #33
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #34
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #35
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #36
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #37
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #38
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #39
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #40
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #41
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #42
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #43
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #44
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #45
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
+Step #46
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
+ toa256 (after) = 57 / 256 = 0
Step #47
- lchan.rqd_ta (before) = 47
- toa256 (before) = 313 / 256 = 1
- lchan.rqd_ta (after) = 48
+ lchan.ta_ctrl.current (before) = 48
+ toa256 (before) = 57 / 256 = 0
+ lchan.ta_ctrl.current (after) = 48
toa256 (after) = 57 / 256 = 0
Step #48
- lchan.rqd_ta (before) = 48
+ lchan.ta_ctrl.current (before) = 48
toa256 (before) = 57 / 256 = 0
- lchan.rqd_ta (after) = 48
+ lchan.ta_ctrl.current (after) = 48
toa256 (after) = 57 / 256 = 0
Step #49
- lchan.rqd_ta (before) = 48
+ lchan.ta_ctrl.current (before) = 48
toa256 (before) = 57 / 256 = 0
- lchan.rqd_ta (after) = 48
+ lchan.ta_ctrl.current (after) = 48
toa256 (after) = 57 / 256 = 0
Done.
diff --git a/tests/testsuite.at b/tests/testsuite.at
index ba5a409b..f2d17fbf 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -63,3 +63,9 @@ AT_KEYWORDS([ta_control])
cat $abs_srcdir/ta_control/ta_control_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/ta_control/ta_control_test], [], [expout], [ignore])
AT_CLEANUP
+
+AT_SETUP([amr])
+AT_KEYWORDS([amr])
+cat $abs_srcdir/amr/amr_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/amr/amr_test], [], [expout], [ignore])
+AT_CLEANUP