From f9606a95fa6530ad92ec7f7dae5ede318e40fc27 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Thu, 28 Jan 2021 15:28:51 +0100 Subject: hodec2: fix intra-cell congestion balancing with source lchan on dyn TS Related: SYS#5301 Change-Id: I332477cbddf32cf6f057007b45cda8477227f0b1 --- src/osmo-bsc/handover_decision_2.c | 12 ++++++++++-- ...yn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty | 18 ++++++++---------- ...yn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty | 5 ++--- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c index 0bfae9ba2..530b42d32 100644 --- a/src/osmo-bsc/handover_decision_2.c +++ b/src/osmo-bsc/handover_decision_2.c @@ -682,7 +682,11 @@ static void check_requirements(struct ho_candidate *c) current_overbooked = load_above_congestion(c->current.free_tch, c->current.min_free_tch); if (requirement & REQUIREMENT_A_TCHF) { bool ok; - int32_t target_overbooked = load_above_congestion(c->target.free_tchf - 1, c->target.min_free_tchf); + int32_t target_overbooked; + int target_free_tchf_after_ho = c->target.free_tchf - 1; + if (c->current.bts == c->target.bts) + target_free_tchf_after_ho += c->current.lchan_frees_tchf; + target_overbooked = load_above_congestion(target_free_tchf_after_ho, c->target.min_free_tchf); LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "current overbooked = %s%%, TCH/F target overbooked after HO = %s%%\n", osmo_int_to_float_str_c(OTC_SELECT, current_overbooked, LOAD_PRECISION - 2), @@ -718,7 +722,11 @@ static void check_requirements(struct ho_candidate *c) } if (requirement & REQUIREMENT_A_TCHH) { bool ok; - int32_t target_overbooked = load_above_congestion(c->target.free_tchh - 1, c->target.min_free_tchh); + int32_t target_overbooked; + int target_free_tchh_after_ho = c->target.free_tchh - 1; + if (c->current.bts == c->target.bts) + target_free_tchh_after_ho += c->current.lchan_frees_tchh; + target_overbooked = load_above_congestion(target_free_tchh_after_ho, c->target.min_free_tchh); LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "current overbooked = %s%%, TCH/H target overbooked after HO = %s%%\n", osmo_int_to_float_str_c(OTC_SELECT, current_overbooked, LOAD_PRECISION - 2), diff --git a/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty b/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty index 619459662..a7984572d 100644 --- a/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty +++ b/tests/handover/test_dyn_ts_amr_tch_f_to_h_congestion_assignment_2.ho_vty @@ -14,16 +14,15 @@ 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 -# FAIL: after the handover from the dyn TS to TCH/H, the dyn TS has freed two TCH/H, while the static TCH/H has reduced -# the TCH/H count by one. So the resulting free slots are 3 TCH/H, which means no congestion. A handover should occur. -expect-no-chan +expect-ho 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 -# FAIL: resulting free slots are 2 TCH/H, which means no congestion. A handover should occur. -expect-no-chan +expect-ho 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 create-bts trx-count 1 timeslots c+s4 dyn TCH/F TCH/F dyn PDCH PDCH PDCH @@ -37,13 +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 -# FAIL: after the handover from the dyn TS to TCH/H, the dyn TS has freed two TCH/H, while the static TCH/H has reduced -# the TCH/H count by one. So the resulting free slots are 3 TCH/H, which means no congestion. A handover should occur. -expect-no-chan +expect-ho 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 -# FAIL: resulting free slots are 2 TCH/H, which means no congestion. A handover should occur. -expect-no-chan +expect-ho from lchan 1 0 1 0 to lchan 1 0 4 1 +expect-ts-use trx 1 0 states * pdch TCH/F - TCH/HH * * * diff --git a/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty b/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty index 36a981745..de9595b48 100644 --- a/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty +++ b/tests/handover/test_dyn_ts_amr_tch_h_to_f_congestion_assignment_2.ho_vty @@ -21,8 +21,7 @@ expect-ts-use trx 0 0 states * pdch TCH/F - - * * * set-ts-use trx 0 0 states * TCH/H- - - TCH/F * * * meas-rep lchan * * * * rxlev 40 rxqual 0 ta 0 neighbors 30 congestion-check -# FAIL: after the handover from the dyn TS to TCH/F, the dyn TS has freed a TCH/F, while the static TCH/F has reduced -# the TCH/F count by one. So the resulting free slots are 2 TCH/F, which means no congestion. A handover should occur. -expect-no-chan +expect-ho 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) -- cgit v1.2.3