diff options
Diffstat (limited to 'tests/gsm0408')
-rw-r--r-- | tests/gsm0408/Makefile.am | 1 | ||||
-rw-r--r-- | tests/gsm0408/gsm0408_test.c | 138 | ||||
-rw-r--r-- | tests/gsm0408/gsm0408_test.ok | 4 |
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. |