RES IND: add test_resource_indication.ho_vty

Show that osmo-bsc does not yet take Resource Indication's reported
interference levels into account. (An upcoming patch will change that.)

This test is not actually doing any handover, but it is using the
handover/*.ho_vty scripting that was intended for handover testing.
(Like test_dyn_ts_favor_half_used_tch_h_as_target.ho_vty does.)

Related: SYS#5313
Change-Id: I56ec61196a1e103f0b4caf18d25d8222bb82cf87
This commit is contained in:
Neels Hofmeyr 2021-07-08 04:55:46 +02:00
parent c8cd61ddf2
commit f764248b03
3 changed files with 165 additions and 0 deletions

View File

@ -1045,6 +1045,93 @@ DEFUN(meas_rep_repeat_bspower, meas_rep_repeat_bspower_cmd,
return CMD_SUCCESS;
}
DEFUN(res_ind, res_ind_cmd,
"res-ind trx <0-255> <0-255> levels .LEVELS",
"Send Resource Indication for a specific TRX, indicating interference levels per lchan\n"
"Indicate a BTS and TRX\n" "BTS nr\n" "TRX nr\n"
"Indicate interference levels: each level is an index to bts->interf_meas_params.bounds_dbm[],"
" i.e. <0-5> or '-' to omit a report for this timeslot/lchan."
" Separate timeslots by spaces, for individual subslots directly concatenate values."
" If a timeslot has more subslots than provided, the last given value is repeated."
" For example: 'res-ind trx 0 0 levels - 1 23 -': on BTS 0 TRX 0, omit ratings for the entire first timeslot,"
" send level=1 for timeslot 1, and for timeslot 2 send level=2 for subslot 0 and level=3 for subslot 1.\n")
{
int i;
uint8_t level;
struct gsm_bts *bts = bts_by_num_str(argv[0]);
struct gsm_bts_trx *trx = trx_by_num_str(bts, argv[1]);
struct msgb *msg = msgb_alloc_headroom(256, 64, "RES-IND");
struct abis_rsl_common_hdr *rslh;
uint8_t *res_info_len;
VTY_ECHO();
argv += 2;
argc -= 2;
rslh = (struct abis_rsl_common_hdr*)msgb_put(msg, sizeof(*rslh));
rslh->msg_discr = ABIS_RSL_MDISC_TRX;
rslh->msg_type = RSL_MT_RF_RES_IND;
msgb_put_u8(msg, RSL_IE_RESOURCE_INFO);
res_info_len = msg->tail;
msgb_put_u8(msg, 0);
level = 0xff;
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
const char *ts_str;
struct gsm_lchan *lchan;
size_t given_subslots = 0;
struct gsm_bts_trx_ts *ts = &trx->ts[i];
if (i < argc) {
ts_str = argv[i];
given_subslots = strlen(ts_str);
}
ts_for_n_lchans(lchan, ts, ts->max_lchans_possible) {
int chan_nr;
if (lchan->nr < given_subslots) {
char subslot_val = ts_str[lchan->nr];
switch (subslot_val) {
case '-':
level = INTERF_BAND_UNKNOWN;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
level = subslot_val - '0';
break;
default:
OSMO_ASSERT(false);
}
}
if (level == INTERF_BAND_UNKNOWN)
continue;
chan_nr = gsm_lchan2chan_nr(lchan, true);
if (chan_nr < 0)
continue;
msgb_put_u8(msg, chan_nr);
msgb_put_u8(msg, level << 5);
}
}
*res_info_len = msg->tail - res_info_len - 1;
msg->dst = trx->rsl_link_primary;
msg->l2h = msg->data;
abis_rsl_rcvmsg(msg);
return CMD_SUCCESS;
}
DEFUN(congestion_check, congestion_check_cmd,
"congestion-check",
"Trigger a congestion check\n")
@ -1313,6 +1400,7 @@ static void ho_test_vty_init()
install_element(CONFIG_NODE, &meas_rep_cmd);
install_element(CONFIG_NODE, &meas_rep_repeat_cmd);
install_element(CONFIG_NODE, &meas_rep_repeat_bspower_cmd);
install_element(CONFIG_NODE, &res_ind_cmd);
install_element(CONFIG_NODE, &congestion_check_cmd);
install_element(CONFIG_NODE, &expect_no_chan_cmd);
install_element(CONFIG_NODE, &expect_chan_cmd);

View File

@ -47,6 +47,7 @@ pass test_neighbor_congested.ho_vty
pass test_neighbor_full.ho_vty
pass test_no_congestion.ho_vty
pass test_penalty_timer.ho_vty
pass test_resource_indication.ho_vty
pass test_rxqual.ho_vty
pass test_rxqual_vs_congestion.ho_vty
pass test_stay_in_better_cell.ho_vty

View File

@ -0,0 +1,76 @@
# Test effects of interference levels reported in Resource Indication.
# Note, this is not actually a handover test.
create-bts trx-count 1 timeslots c+s4 TCH/F TCH/F TCH/F TCH/F TCH/F TCH/F PDCH
# By default, the ordering is most-interference-first
network
bts 0
channel allocator avoid-interference 1
interference-meas level-bounds -85 -91 -97 -103 -109 -115
# 0 1 2 3 4 5
res-ind trx 0 0 levels - 1 2 3 4 3 2 -
create-ms bts 0 TCH/F AMR
# FAIL: interference is ignored
expect-ts-use trx 0 0 states * TCH/F - - - - - *
# The ordering may also be configured reversed, still the lowest dBm value should win
network
bts 0
interference-meas level-bounds -115 -109 -103 -97 -91 -85
# 0 1 2 3 4 5
res-ind trx 0 0 levels - 5 4 2 - 3 4 -
create-ms bts 0 TCH/F AMR
# FAIL: interference is ignored
expect-ts-use trx 0 0 states * TCH/F TCH/F - - - - *
# Favor lchans that have an indicated interference level
res-ind trx 0 0 levels - - - - - 4 3 -
create-ms bts 0 TCH/F AMR
# FAIL: interference is ignored
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F - - - *
# For equal levels, pick the first
res-ind trx 0 0 levels - 2 2 - - 2 - -
create-ms bts 0 TCH/F AMR
# FAIL: interference is ignored
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F - - *
# Test clamping of indexes > 5
res-ind trx 0 0 levels - - 6 - - 4 - -
create-ms bts 0 TCH/F AMR
# FAIL: interference is ignored
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F TCH/F - *
# Also test for TCH/H
create-bts trx-count 1 timeslots c+s4 TCH/H TCH/H TCH/H TCH/H TCH/H TCH/H PDCH
network
bts 1
channel allocator avoid-interference 1
interference-meas level-bounds -115 -109 -103 -97 -91 -85
# 0 1 2 3 4 5
res-ind trx 1 0 levels - 54 32 21 23 45 54 -
create-ms bts 1 TCH/H AMR
# FAIL: interference is ignored
expect-ts-use trx 1 0 states * TCH/H- - - - - - *
# Favor lchans that have an indicated interference level
res-ind trx 1 0 levels - - - 4- 3- - - -
create-ms bts 1 TCH/H AMR
# FAIL: interference is ignored
expect-ts-use trx 1 0 states * TCH/HH - - - - - *
# For equal levels, pick the first
res-ind trx 1 0 levels - -2 22 2- -2 22 2- -
create-ms bts 1 TCH/H AMR
# FAIL: interference is ignored
expect-ts-use trx 1 0 states * TCH/HH TCH/H- - - - - *
# Test clamping of indexes > 5
res-ind trx 1 0 levels - 7- 67 6- -7 54 6- -
create-ms bts 1 TCH/H AMR
# FAIL: interference is ignored
expect-ts-use trx 1 0 states * TCH/HH TCH/HH - - - - *