hodec 2: do intra-cell congestion resolution by Assignment

So far we do all channel reassignments by Handover Command. Since
osmo-bsc now supports rassignment of ongoing voice calls, do intra-cell
congestion resolution by Assignment Command.

In effect, add support for expecting an Assignment Command in
handover_test, and expect assignments instead of handovers for
intra-cell congestion resolution test cases.

Related: SYS#5330 OS#3277
Change-Id: Id56a890106b93fcee67ac9401b890e7b63bba421
This commit is contained in:
Neels Hofmeyr 2021-05-11 17:21:30 +02:00
parent 651fda903b
commit 69def1f97e
16 changed files with 172 additions and 50 deletions

View File

@ -130,6 +130,7 @@ struct channel_mode_and_rate {
enum assign_for {
ASSIGN_FOR_NONE,
ASSIGN_FOR_BSSMAP_REQ,
ASSIGN_FOR_CONGESTION_RESOLUTION,
};
extern const struct value_string assign_for_names[];

View File

@ -942,6 +942,7 @@ const struct value_string lchan_modify_for_names[] = {
const struct value_string assign_for_names[] = {
OSMO_VALUE_STRING(ASSIGN_FOR_NONE),
OSMO_VALUE_STRING(ASSIGN_FOR_BSSMAP_REQ),
OSMO_VALUE_STRING(ASSIGN_FOR_CONGESTION_RESOLUTION),
{}
};

View File

@ -29,6 +29,7 @@
#include <osmocom/bsc/debug.h>
#include <osmocom/bsc/gsm_data.h>
#include <osmocom/bsc/assignment_fsm.h>
#include <osmocom/bsc/handover_fsm.h>
#include <osmocom/bsc/handover_decision.h>
#include <osmocom/bsc/handover_decision_2.h>
@ -812,7 +813,6 @@ static void check_requirements_remote_bss(struct ho_candidate *c)
/* Trigger handover or assignment depending on the target BTS */
static int trigger_local_ho_or_as(struct ho_candidate *c, uint8_t requirements)
{
struct handover_out_req req;
int afs_bias = 0;
bool full_rate = false;
@ -868,23 +868,25 @@ static int trigger_local_ho_or_as(struct ho_candidate *c, uint8_t requirements)
}
/* trigger handover or assignment */
if (c->current.bts == c->target.bts)
if (c->current.bts == c->target.bts) {
LOGPHOLCHAN(c->current.lchan, LOGL_NOTICE, "Triggering assignment to %s, due to %s\n",
full_rate ? "TCH/F" : "TCH/H",
ho_reason_name(global_ho_reason));
else
reassignment_request_to_chan_type(ASSIGN_FOR_CONGESTION_RESOLUTION, c->current.lchan,
full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H);
} else {
struct handover_out_req req = {
.from_hodec_id = HODEC2,
.old_lchan = c->current.lchan,
.new_lchan_type = full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H,
};
bts_cell_ab(&req.target_cell_ab, c->target.bts);
LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_INFO,
"Triggering handover to %s, due to %s\n",
full_rate ? "TCH/F" : "TCH/H",
ho_reason_name(global_ho_reason));
req = (struct handover_out_req){
.from_hodec_id = HODEC2,
.old_lchan = c->current.lchan,
.new_lchan_type = full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H,
};
bts_cell_ab(&req.target_cell_ab, c->target.bts);
handover_request(&req);
handover_request(&req);
}
return 0;
}

View File

@ -35,6 +35,7 @@
#include <osmocom/bsc/bsc_subscriber.h>
#include <osmocom/bsc/lchan_select.h>
#include <osmocom/bsc/lchan_fsm.h>
#include <osmocom/bsc/assignment_fsm.h>
#include <osmocom/bsc/handover_decision.h>
#include <osmocom/bsc/system_information.h>
#include <osmocom/bsc/handover.h>
@ -372,6 +373,10 @@ void create_conn(struct gsm_lchan *lchan)
snprintf(imsi, sizeof(imsi), "%06u", next_imsi);
lchan->conn->bsub = bsc_subscr_find_or_create_by_imsi(net->bsc_subscribers, imsi, BSUB_USE_CONN);
/* Set RTP data that the MSC normally would have sent */
OSMO_STRLCPY_ARRAY(conn->user_plane.msc_assigned_rtp_addr, "1.2.3.4");
conn->user_plane.msc_assigned_rtp_port = 1234;
/* kick the FSM from INIT through to the ACTIVE state */
osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_MO_COMPL_L3, NULL);
osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CONN_CFM, NULL);
@ -535,6 +540,9 @@ static struct gsm_lchan *last_chan_req = NULL;
static struct gsm_lchan *new_ho_cmd = NULL;
static struct gsm_lchan *last_ho_cmd = NULL;
static struct gsm_lchan *new_as_cmd = NULL;
static struct gsm_lchan *last_as_cmd = NULL;
/* send channel activation ack */
static void send_chan_act_ack(struct gsm_lchan *lchan, int act)
{
@ -553,6 +561,44 @@ static void send_chan_act_ack(struct gsm_lchan *lchan, int act)
abis_rsl_rcvmsg(msg);
}
/* Send RR Assignment Complete for SAPI[0] */
static void send_assignment_complete(struct gsm_lchan *lchan)
{
struct msgb *msg = msgb_alloc_headroom(256, 64, "RSL");
struct abis_rsl_rll_hdr *rh;
uint8_t chan_nr = gsm_lchan2chan_nr(lchan);
uint8_t *buf;
struct gsm48_hdr *gh;
struct gsm48_ho_cpl *hc;
fprintf(stderr, "- Send RR Assignment Complete for %s\n", gsm_lchan_name(lchan));
rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh));
rh->c.msg_discr = ABIS_RSL_MDISC_RLL;
rh->c.msg_type = RSL_MT_DATA_IND;
rh->ie_chan = RSL_IE_CHAN_NR;
rh->chan_nr = chan_nr;
rh->ie_link_id = RSL_IE_LINK_IDENT;
rh->link_id = 0x00;
buf = msgb_put(msg, 3);
buf[0] = RSL_IE_L3_INFO;
buf[1] = (sizeof(*gh) + sizeof(*hc)) >> 8;
buf[2] = (sizeof(*gh) + sizeof(*hc)) & 0xff;
gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));
hc = (struct gsm48_ho_cpl *) msgb_put(msg, sizeof(*hc));
gh->proto_discr = GSM48_PDISC_RR;
gh->msg_type = GSM48_MT_RR_ASS_COMPL;
msg->dst = lchan->ts->trx->rsl_link;
msg->l2h = (unsigned char *)rh;
msg->l3h = (unsigned char *)gh;
abis_rsl_rcvmsg(msg);
}
/* Send RLL Est Ind for SAPI[0] */
static void send_est_ind(struct gsm_lchan *lchan)
{
@ -700,14 +746,21 @@ int __wrap_abis_rsl_sendmsg(struct msgb *msg)
gh = (struct gsm48_hdr*)msg->l3h;
switch (gh->msg_type) {
case GSM48_MT_RR_HANDO_CMD:
case GSM48_MT_RR_ASS_CMD:
if (new_ho_cmd) {
if (new_ho_cmd || new_as_cmd) {
fprintf(stderr, "Test script is erratic: seen a Handover Command"
" while a previous Handover Command is still unhandled\n");
" while a previous Assignment or Handover Command is still unhandled\n");
exit(1);
}
new_ho_cmd = lchan;
break;
case GSM48_MT_RR_ASS_CMD:
if (new_ho_cmd || new_as_cmd) {
fprintf(stderr, "Test script is erratic: seen an Assignment Command"
" while a previous Assignment or Handover Command is still unhandled\n");
exit(1);
}
new_as_cmd = lchan;
break;
}
break;
case RSL_MT_IPAC_CRCX:
@ -1037,22 +1090,40 @@ static void _expect_chan_activ(struct gsm_lchan *lchan)
static void _expect_ho_cmd(struct gsm_lchan *lchan)
{
fprintf(stderr, "- Expecting Handover/Assignment Command at %s\n",
fprintf(stderr, "- Expecting Handover Command at %s\n",
gsm_lchan_name(lchan));
if (!new_ho_cmd) {
fprintf(stderr, "Test failed, no Handover Command\n");
exit(1);
}
fprintf(stderr, " * Got Handover/Assignment Command at %s\n", gsm_lchan_name(new_ho_cmd));
fprintf(stderr, " * Got Handover Command at %s\n", gsm_lchan_name(new_ho_cmd));
if (new_ho_cmd != lchan) {
fprintf(stderr, "Test failed, Handover/Assignment Command not on the expected lchan\n");
fprintf(stderr, "Test failed, Handover Command not on the expected lchan\n");
exit(1);
}
last_ho_cmd = new_ho_cmd;
new_ho_cmd = NULL;
}
static void _expect_as_cmd(struct gsm_lchan *lchan)
{
fprintf(stderr, "- Expecting Assignment Command at %s\n",
gsm_lchan_name(lchan));
if (!new_as_cmd) {
fprintf(stderr, "Test failed, no Assignment Command\n");
exit(1);
}
fprintf(stderr, " * Got Assignment Command at %s\n", gsm_lchan_name(new_as_cmd));
if (new_as_cmd != lchan) {
fprintf(stderr, "Test failed, Assignment Command not on the expected lchan\n");
exit(1);
}
last_as_cmd = new_as_cmd;
new_as_cmd = NULL;
}
DEFUN(expect_chan, expect_chan_cmd,
"expect-chan " LCHAN_ARGS,
"Expect RSL Channel Activation of a specific lchan\n"
@ -1073,6 +1144,16 @@ DEFUN(expect_handover_command, expect_handover_command_cmd,
return CMD_SUCCESS;
}
DEFUN(expect_assignment_command, expect_assignment_command_cmd,
"expect-as-cmd " LCHAN_ARGS,
"Expect Assignment Command for a given lchan\n"
LCHAN_ARGS_DOC)
{
VTY_ECHO();
_expect_as_cmd(parse_lchan_args(argv));
return CMD_SUCCESS;
}
DEFUN(ho_detection, ho_detection_cmd,
"ho-detect",
"Send Handover Detection to the most recent HO target lchan\n")
@ -1109,7 +1190,7 @@ DEFUN(expect_ho, expect_ho_cmd,
"Expect a handover of a specific lchan to a specific target lchan;"
" shorthand for expect-chan, ack-chan, expect-ho, ho-complete.\n"
"lchan to handover from\n" LCHAN_ARGS_DOC
"lchan that to handover to\n" LCHAN_ARGS_DOC)
"lchan to handover to\n" LCHAN_ARGS_DOC)
{
struct gsm_lchan *from = parse_lchan_args(argv);
struct gsm_lchan *to = parse_lchan_args(argv+4);
@ -1119,6 +1200,31 @@ DEFUN(expect_ho, expect_ho_cmd,
_expect_ho_cmd(from);
send_ho_detect(to);
send_ho_complete(to, true);
lchan_release_ack(from);
return CMD_SUCCESS;
}
DEFUN(expect_as, expect_as_cmd,
"expect-as from " LCHAN_ARGS " to " LCHAN_ARGS,
"Expect an intra-cell re-assignment of a specific lchan to a specific target lchan;"
" shorthand for expect-chan, ack-chan, expect-as, TODO.\n"
"lchan to be re-assigned elsewhere\n" LCHAN_ARGS_DOC
"new lchan to re-assign to\n" LCHAN_ARGS_DOC)
{
struct gsm_lchan *from = parse_lchan_args(argv);
struct gsm_lchan *to = parse_lchan_args(argv+4);
VTY_ECHO();
_expect_chan_activ(to);
if (from->ts->trx->bts != to->ts->trx->bts) {
vty_out(vty, "%% Error: re-assignment only works within the same BTS%s", VTY_NEWLINE);
return CMD_WARNING;
}
_expect_as_cmd(from);
send_assignment_complete(to);
send_est_ind(to);
lchan_release_ack(from);
return CMD_SUCCESS;
}
@ -1209,9 +1315,11 @@ static void ho_test_vty_init()
install_element(CONFIG_NODE, &expect_no_chan_cmd);
install_element(CONFIG_NODE, &expect_chan_cmd);
install_element(CONFIG_NODE, &expect_handover_command_cmd);
install_element(CONFIG_NODE, &expect_assignment_command_cmd);
install_element(CONFIG_NODE, &ho_detection_cmd);
install_element(CONFIG_NODE, &ho_complete_cmd);
install_element(CONFIG_NODE, &expect_ho_cmd);
install_element(CONFIG_NODE, &expect_as_cmd);
install_element(CONFIG_NODE, &ho_failed_cmd);
install_element(CONFIG_NODE, &expect_ts_use_cmd);
install_element(CONFIG_NODE, &codec_f_cmd);
@ -1330,7 +1438,8 @@ int main(int argc, char **argv)
osmo_init_logging2(ctx, &log_info);
log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_BASENAME);
log_set_print_filename_pos(osmo_stderr_target, LOG_FILENAME_POS_LINE_END);
log_set_print_category(osmo_stderr_target, 1);
log_set_print_category_hex(osmo_stderr_target, 0);
log_set_print_level(osmo_stderr_target, 1);
@ -1349,6 +1458,7 @@ int main(int argc, char **argv)
lchan_fsm_init();
bsc_subscr_conn_fsm_init();
handover_fsm_init();
assignment_fsm_init();
ho_set_algorithm(bsc_gsmnet->ho, 2);
ho_set_ho_active(bsc_gsmnet->ho, true);
@ -1437,3 +1547,12 @@ const char *osmo_mgcpc_ep_ci_name(const struct osmo_mgcpc_ep_ci *ci)
{
return "fake-ci";
}
const struct mgcp_conn_peer *osmo_mgcpc_ep_ci_get_rtp_info(const struct osmo_mgcpc_ep_ci *ci)
{
static struct mgcp_conn_peer ret = {
.addr = "1.2.3.4",
.port = 1234,
.endpoint = "fake-endpoint",
};
return &ret;
}

View File

@ -14,6 +14,5 @@ meas-rep lchan 0 0 5 1 rxlev 34 rxqual 0 ta 0
meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0
expect-no-chan
congestion-check
expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0
expect-as from lchan 0 0 6 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -

View File

@ -15,10 +15,10 @@ meas-rep lchan 0 0 5 1 rxlev 34 rxqual 0 ta 0
meas-rep lchan 0 0 6 0 rxlev 20 rxqual 0 ta 0
expect-no-chan
congestion-check
expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0
expect-as from lchan 0 0 6 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - TCH/HH - -
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 2 0
expect-as from lchan 0 0 5 0 to lchan 0 0 2 0
expect-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/-H - -
congestion-check
expect-no-chan

View File

@ -10,6 +10,6 @@ set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/H- - -
meas-rep lchan 0 0 1 0 rxlev 30 rxqual 0 ta 0 neighbors 30
expect-no-chan
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1
expect-as from lchan 0 0 1 0 to lchan 0 0 5 1
expect-ts-use trx 0 0 states * - TCH/F - - TCH/HH - -

View File

@ -10,5 +10,5 @@ set-ts-use trx 0 0 states * - - - TCH/H- - - *
meas-rep lchan 0 0 4 0 rxlev 30 rxqual 0 ta 0
expect-no-chan
congestion-check
expect-ho from lchan 0 0 4 0 to lchan 0 0 1 0
expect-as from lchan 0 0 4 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - - *

View File

@ -12,6 +12,6 @@ set-ts-use trx 1 0 states * - - - TCH/H- - - *
meas-rep repeat 10 lchan 1 0 4 0 rxlev 30 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 1 0 4 0 to lchan 1 0 1 0
expect-as from lchan 1 0 4 0 to lchan 1 0 1 0
expect-ts-use trx 0 0 states * - - - - - - *
expect-ts-use trx 1 0 states * TCH/F - - - - - *

View File

@ -23,7 +23,7 @@ expect-no-chan
set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH TCH/HH TCH/HH
meas-rep lchan * * * * rxlev 10 rxqual 0 ta 0
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 3 0
expect-as from lchan 0 0 5 0 to lchan 0 0 3 0
# Now similar load percentages, just with different min-free-slots settings for tch/f vs tch/h.
@ -50,4 +50,4 @@ expect-no-chan
set-ts-use trx 0 0 states * TCH/F TCH/F - - TCH/HH TCH/HH TCH/H-
meas-rep lchan * * * * rxlev 20 rxqual 0 ta 0
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 3 0
expect-as from lchan 0 0 5 0 to lchan 0 0 3 0

View File

@ -12,7 +12,7 @@ meas-rep lchan 0 0 6 0 rxlev 30 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0
expect-as from lchan 0 0 6 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - TCH/H- - *
expect-ts-use trx 1 0 states * - - - - - - *
@ -27,7 +27,7 @@ meas-rep lchan 0 0 6 0 rxlev 31 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0
expect-as from lchan 0 0 5 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *
expect-ts-use trx 1 0 states * - - - - - - *
@ -42,7 +42,7 @@ meas-rep lchan 0 0 6 0 rxlev 31 rxqual 0 ta 0 neighbors 21
expect-no-chan
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0
expect-as from lchan 0 0 5 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *
expect-ts-use trx 1 0 states * - - - - - - *
@ -57,7 +57,7 @@ meas-rep lchan 0 0 6 0 rxlev 31 rxqual 0 ta 0 neighbors 20
expect-no-chan
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0
expect-as from lchan 0 0 5 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *
expect-ts-use trx 1 0 states * - - - - - - *
@ -72,7 +72,7 @@ meas-rep lchan 0 0 6 0 rxlev 31 rxqual 0 ta 0 neighbors 31
expect-no-chan
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0
expect-as from lchan 0 0 5 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - TCH/H- *
expect-ts-use trx 1 0 states * - - - - - - *
@ -87,7 +87,7 @@ meas-rep lchan 0 0 6 0 rxlev 30 rxqual 0 ta 0 neighbors 30
expect-no-chan
congestion-check
expect-ho from lchan 0 0 6 0 to lchan 0 0 1 0
expect-as from lchan 0 0 6 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - TCH/H- - *
expect-ts-use trx 1 0 states * - - - - - - *

View File

@ -19,7 +19,7 @@ network
bts 0
handover2 assignment 1
meas-rep lchan 0 0 5 0 rxlev 0 rxqual 0 ta 0 neighbors 30
expect-ho from lchan 0 0 5 0 to lchan 0 0 1 0
expect-as from lchan 0 0 5 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F - - - - - -
network
bts 0

View File

@ -22,11 +22,11 @@ meas-rep lchan 0 0 5 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F TCH/F pdch *
congestion-check
expect-ho from lchan 0 0 5 0 to lchan 0 0 6 0
expect-as from lchan 0 0 5 0 to lchan 0 0 6 0
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/H- *
congestion-check
expect-ho from lchan 0 0 4 0 to lchan 0 0 6 1
expect-as from lchan 0 0 4 0 to lchan 0 0 6 1
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch pdch TCH/HH *
congestion-check
@ -37,11 +37,11 @@ meas-rep lchan 0 0 4 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F TCH/F pdch TCH/HH *
congestion-check
expect-ho from lchan 0 0 4 0 to lchan 0 0 5 0
expect-as from lchan 0 0 4 0 to lchan 0 0 5 0
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/H- TCH/HH *
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 5 1
expect-as from lchan 0 0 1 0 to lchan 0 0 5 1
expect-ts-use trx 0 0 states * - TCH/F TCH/F pdch TCH/HH TCH/HH *
congestion-check
@ -52,11 +52,11 @@ meas-rep lchan 0 0 1 0 rxlev 40 rxqual 0 ta 0 neighbors 30
expect-ts-use trx 0 0 states * TCH/F TCH/F TCH/F pdch TCH/HH TCH/HH *
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 4 0
expect-as from lchan 0 0 1 0 to lchan 0 0 4 0
expect-ts-use trx 0 0 states * - TCH/F TCH/F TCH/H- TCH/HH TCH/HH *
congestion-check
expect-ho from lchan 0 0 2 0 to lchan 0 0 4 1
expect-as from lchan 0 0 2 0 to lchan 0 0 4 1
expect-ts-use trx 0 0 states * - - TCH/F TCH/HH TCH/HH TCH/HH *
congestion-check

View File

@ -14,14 +14,14 @@ set-ts-use trx 0 0 states * TCH/F - - - * * *
# (there must be at least one measurement report on each lchan for congestion check to work)
meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 4 0
expect-as from lchan 0 0 1 0 to lchan 0 0 4 0
expect-ts-use trx 0 0 states * pdch - - TCH/H- * * *
# Again with one more TCH/H occupied, there will still be two free TCH/H after HO on the dyn TS
set-ts-use trx 0 0 states * TCH/F - - TCH/H- * * *
meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 4 1
expect-as from lchan 0 0 1 0 to lchan 0 0 4 1
expect-ts-use trx 0 0 states * pdch - - TCH/HH * * *
# Again, with the target being a dyn TS
@ -36,12 +36,12 @@ network
set-ts-use trx 1 0 states * TCH/F TCH/F - pdch * * *
meas-rep lchan 1 * * * rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-ho from lchan 1 0 1 0 to lchan 1 0 4 0
expect-as from lchan 1 0 1 0 to lchan 1 0 4 0
expect-ts-use trx 1 0 states * pdch TCH/F - TCH/H- * * *
# Again with one more TCH/H occupied, there will still be two free TCH/H after HO on the dyn TS
set-ts-use trx 1 0 states * TCH/F TCH/F - TCH/H- * * *
meas-rep lchan 1 * * * rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-ho from lchan 1 0 1 0 to lchan 1 0 4 1
expect-as from lchan 1 0 1 0 to lchan 1 0 4 1
expect-ts-use trx 1 0 states * pdch TCH/F - TCH/HH * * *

View File

@ -14,14 +14,14 @@ set-ts-use trx 0 0 states * TCH/H- - - - * * *
# (there must be at least one measurement report on each lchan for congestion check to work)
meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 2 0
expect-as from lchan 0 0 1 0 to lchan 0 0 2 0
expect-ts-use trx 0 0 states * pdch TCH/F - - * * *
# Again with one more TCH/F occupied, there will still be two free TCH/F after HO on the dyn TS
set-ts-use trx 0 0 states * TCH/H- - - TCH/F * * *
meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30
congestion-check
expect-ho from lchan 0 0 1 0 to lchan 0 0 2 0
expect-as from lchan 0 0 1 0 to lchan 0 0 2 0
expect-ts-use trx 0 0 states * pdch TCH/F - TCH/F * * *
# (TCH/H -> TCH/F onto a dyn TS will always make TCH/H congestion worse, so there is no useful test case left here)

View File

@ -10,7 +10,7 @@ network
set-ts-use trx 0 0 states * - TCH/HH TCH/H- TCH/HH pdch - -
meas-rep lchan * * * * rxlev 30 rxqual 0 ta 0
congestion-check
expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0
expect-as from lchan 0 0 3 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F TCH/HH pdch TCH/HH pdch - -
# clear measurements for the next run
@ -24,7 +24,7 @@ meas-rep lchan 0 0 3 0 rxlev 31 rxqual 0 ta 0
meas-rep lchan 0 0 4 0 rxlev 32 rxqual 0 ta 0
meas-rep lchan 0 0 4 1 rxlev 33 rxqual 0 ta 0
congestion-check
expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0
expect-as from lchan 0 0 3 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F TCH/HH pdch TCH/HH pdch - -
# clear measurements for the next run
@ -38,5 +38,5 @@ meas-rep lchan 0 0 3 0 rxlev 33 rxqual 0 ta 0
meas-rep lchan 0 0 4 0 rxlev 32 rxqual 0 ta 0
meas-rep lchan 0 0 4 1 rxlev 31 rxqual 0 ta 0
congestion-check
expect-ho from lchan 0 0 3 0 to lchan 0 0 1 0
expect-as from lchan 0 0 3 0 to lchan 0 0 1 0
expect-ts-use trx 0 0 states * TCH/F TCH/HH pdch TCH/HH pdch - -