aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2018-10-22 14:21:57 +0200
committerPhilipp Maier <pmaier@sysmocom.de>2018-10-24 09:22:41 +0200
commit3b9dcb3fc1abfa3780b4da2a9a05bd79f65a5c44 (patch)
treedb36e5acaaf693db023e67afb2e6784d7b3a3410 /tests
parentbca82edab74678a1af08a50201d916bdcd9b7140 (diff)
gsm_04_08: improve gsm48_multirate_config()
The function gsm48_multirate_config() generates the multirate configuration IE, that is sent via RSL to configure the active set of AMR codecs inside the BTS. The function already works, but it does not check the input data for consistancy. Lets add some consistancy check to make sure that inconsistant parameters are rejected. Also allow the output pointer to be NULL, so that the function can be used to perform a dry run to be able to verify parameters. - Check for invalid / inconsistant configuration parameters - Perform a dry-run when lv pointer is set to NULL Change-Id: I06beb7dd7236c81c3a91af4d09c31891f4b910a4 Related: OS#3529
Diffstat (limited to 'tests')
-rw-r--r--tests/gsm0408/Makefile.am1
-rw-r--r--tests/gsm0408/gsm0408_test.c138
-rw-r--r--tests/gsm0408/gsm0408_test.ok4
3 files changed, 143 insertions, 0 deletions
diff --git a/tests/gsm0408/Makefile.am b/tests/gsm0408/Makefile.am
index d790fc870..b207f8b09 100644
--- a/tests/gsm0408/Makefile.am
+++ b/tests/gsm0408/Makefile.am
@@ -23,6 +23,7 @@ gsm0408_test_SOURCES = \
$(NULL)
gsm0408_test_LDADD = \
+ $(top_builddir)/src/osmo-bsc/gsm_04_08_rr.o \
$(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \
$(top_builddir)/src/osmo-bsc/gsm_data.o \
$(top_builddir)/src/osmo-bsc/gsm_timers.o \
diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c
index bc2777d3c..faeca39fa 100644
--- a/tests/gsm0408/gsm0408_test.c
+++ b/tests/gsm0408/gsm0408_test.c
@@ -35,6 +35,8 @@
#include <osmocom/gsm/sysinfo.h>
#include <osmocom/gsm/gsm48.h>
+#include <osmocom/bsc/gsm_04_08_rr.h>
+
#define COMPARE(result, op, value) \
if (!((result) op (value))) {\
fprintf(stderr, "Compare failed. Was %x should be %x in %s:%d\n",result, value, __FILE__, __LINE__); \
@@ -799,6 +801,106 @@ static void test_gsm48_ra_id_by_bts()
OSMO_ASSERT(pass);
}
+static void test_gsm48_multirate_config()
+{
+ uint8_t lv[7];
+ struct gsm48_multi_rate_conf *gsm48_ie;
+ struct amr_multirate_conf mr;
+ int rc;
+
+ memset(&mr, 0, sizeof(mr));
+
+ /* Use some made up threshold and hysteresis values */
+ mr.ms_mode[0].threshold = 11;
+ mr.ms_mode[1].threshold = 12;
+ mr.ms_mode[2].threshold = 13;
+ mr.ms_mode[0].hysteresis = 15;
+ mr.ms_mode[1].hysteresis = 12;
+ mr.ms_mode[2].hysteresis = 8;
+
+ gsm48_ie = (struct gsm48_multi_rate_conf *)&mr.gsm48_ie;
+ gsm48_ie->ver = 1;
+ gsm48_ie->m5_90 = 1;
+ gsm48_ie->m7_40 = 1;
+ gsm48_ie->m7_95 = 1;
+ gsm48_ie->m12_2 = 1;
+
+ /* Test #1: Normal configuration with 4 active set members */
+ mr.ms_mode[0].mode = 2;
+ mr.ms_mode[1].mode = 4;
+ mr.ms_mode[2].mode = 5;
+ mr.ms_mode[3].mode = 7;
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 4);
+ OSMO_ASSERT(rc == 0);
+ printf("gsm48_multirate_config(): rc=%i, lv=%s\n", rc,
+ osmo_hexdump_nospc(lv, lv[0]));
+
+ /* Test #2: 4 active set members, but wrong mode order: */
+ mr.ms_mode[3].mode = 2;
+ mr.ms_mode[2].mode = 4;
+ mr.ms_mode[1].mode = 5;
+ mr.ms_mode[0].mode = 7;
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 4);
+ OSMO_ASSERT(rc == -EINVAL);
+
+ /* Test #3: Normal configuration with 3 active set members */
+ mr.ms_mode[0].mode = 2;
+ mr.ms_mode[1].mode = 4;
+ mr.ms_mode[2].mode = 5;
+ mr.ms_mode[3].mode = 0;
+ gsm48_ie->m12_2 = 0;
+ mr.ms_mode[2].threshold = 0;
+ mr.ms_mode[2].hysteresis = 0;
+
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 3);
+ OSMO_ASSERT(rc == 0);
+ printf("gsm48_multirate_config(): rc=%i, lv=%s\n", rc,
+ osmo_hexdump_nospc(lv, lv[0]));
+
+ /* Test #4: 3 active set members, but wrong mode order: */
+ mr.ms_mode[0].mode = 2;
+ mr.ms_mode[2].mode = 4;
+ mr.ms_mode[1].mode = 5;
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 3);
+ OSMO_ASSERT(rc == -EINVAL);
+
+ /* Test #5: Normal configuration with 2 active set members */
+ mr.ms_mode[0].mode = 2;
+ mr.ms_mode[1].mode = 4;
+ mr.ms_mode[2].mode = 0;
+ gsm48_ie->m7_95 = 0;
+ mr.ms_mode[1].threshold = 0;
+ mr.ms_mode[1].hysteresis = 0;
+
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 2);
+ OSMO_ASSERT(rc == 0);
+ printf("gsm48_multirate_config(): rc=%i, lv=%s\n", rc,
+ osmo_hexdump_nospc(lv, lv[0]));
+
+ /* Test #6: 2 active set members, but wrong mode order: */
+ mr.ms_mode[1].mode = 2;
+ mr.ms_mode[0].mode = 4;
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 2);
+ OSMO_ASSERT(rc == -EINVAL);
+
+ /* Test #7: Normal configuration with 1 active set member */
+ mr.ms_mode[0].mode = 2;
+ mr.ms_mode[1].mode = 0;
+ gsm48_ie->m7_40 = 0;
+ mr.ms_mode[0].threshold = 0;
+ mr.ms_mode[0].hysteresis = 0;
+
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 1);
+ OSMO_ASSERT(rc == 0);
+ printf("gsm48_multirate_config(): rc=%i, lv=%s\n", rc,
+ osmo_hexdump_nospc(lv, lv[0]));
+
+ /* Test #8: 0 active set members: */
+ mr.ms_mode[0].mode = 0;
+ rc = gsm48_multirate_config(lv, gsm48_ie, mr.ms_mode, 1);
+ OSMO_ASSERT(rc == -EINVAL);
+}
+
static const struct log_info_cat log_categories[] = {
};
@@ -839,6 +941,8 @@ int main(int argc, char **argv)
test_gsm48_ra_id_by_bts();
+ test_gsm48_multirate_config();
+
printf("Done.\n");
return EXIT_SUCCESS;
@@ -854,3 +958,37 @@ bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)
}
void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}
+
+void bsc_cm_update(struct gsm_subscriber_connection *conn,
+ const uint8_t *cm2, uint8_t cm2_len,
+ const uint8_t *cm3, uint8_t cm3_len) {}
+
+int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci)
+{ return 0; }
+
+int rsl_chan_mode_modify_req(struct gsm_lchan *ts) { return 0; }
+
+int rsl_tx_ipacc_crcx(struct gsm_lchan *lchan) { return 0; }
+
+void gscon_submit_rsl_dtap(struct gsm_subscriber_connection *conn,
+ struct msgb *msg, int link_id, int allow_sacch) {}
+
+bool lchan_may_receive_data(struct gsm_lchan *lchan) { return true; }
+
+int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg,
+ uint16_t chosen_channel) { return 0; }
+
+void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id,
+ struct msgb *msg) {}
+
+void bsc_cipher_mode_compl(struct gsm_subscriber_connection *conn,
+ struct msgb *msg, uint8_t chosen_encr) {}
+
+const char *bsc_subscr_name(struct bsc_subscr *bsub) { return NULL; }
+
+void lchan_release(struct gsm_lchan *lchan, bool sacch_deact,
+ bool err, enum gsm48_rr_cause cause_rr) {}
+
+int rsl_data_request(struct msgb *msg, uint8_t link_id) { return 0; }
+
+int rsl_encryption_cmd(struct msgb *msg) { return 0; }
diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok
index 727072137..9424167f3 100644
--- a/tests/gsm0408/gsm0408_test.ok
+++ b/tests/gsm0408/gsm0408_test.ok
@@ -226,4 +226,8 @@ test_gsm48_ra_id_by_bts[3]: digits='000000' lac=0x0000=htons(0) rac=0x00=0 pass
test_gsm48_ra_id_by_bts[4]: digits='999999' lac=0xffff=htons(65535) rac=0xff=255 pass
test_gsm48_ra_id_by_bts[5]: digits='09f909' lac=0xcdab=htons(43981) rac=0xab=171 pass
test_gsm48_ra_id_by_bts[6]: digits='090990' lac=0xcdab=htons(43981) rac=0xab=171 pass
+gsm48_multirate_config(): rc=0, lv=0620b40bf330
+gsm48_multirate_config(): rc=0, lv=0520340bf3
+gsm48_multirate_config(): rc=0, lv=0420140b
+gsm48_multirate_config(): rc=0, lv=0220
Done.