This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Hoernchen gerrit-no-reply at lists.osmocom.orgHoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/24646 )
Change subject: assignment: special mixed desc/alloc conditions
......................................................................
assignment: special mixed desc/alloc conditions
There was a request to enable descending alloc in case a (averaged)
rxlev condition AND a #used ts threshold was met.
This is a hack that should not be merged.
Change-Id: I4ef37874807ebd26a14616fa49498e6ab124b07b
Related: SYS#5460
---
M include/osmocom/bsc/bts.h
M include/osmocom/bsc/lchan_select.h
M src/osmo-bsc/abis_rsl.c
M src/osmo-bsc/assignment_fsm.c
M src/osmo-bsc/bsc_vty.c
M src/osmo-bsc/handover_decision_2.c
M src/osmo-bsc/lchan_select.c
7 files changed, 147 insertions(+), 27 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/46/24646/1
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h
index 72f83eb..196fb05 100644
--- a/include/osmocom/bsc/bts.h
+++ b/include/osmocom/bsc/bts.h
@@ -288,6 +288,11 @@
/* maximum Tx power that the MS is permitted to use in this cell */
int ms_max_power;
+ /* conditions for desc alloc usage */
+ int assign_tsused_tresh;
+ int assign_rxlev_avgnum;
+ int assign_rxlev_tresh;
+
/* how do we talk OML with this TRX? */
struct gsm_e1_subslot oml_e1_link;
uint8_t oml_tei;
diff --git a/include/osmocom/bsc/lchan_select.h b/include/osmocom/bsc/lchan_select.h
index aa2f40e..3f0375f 100644
--- a/include/osmocom/bsc/lchan_select.h
+++ b/include/osmocom/bsc/lchan_select.h
@@ -5,4 +5,6 @@
enum gsm_chan_t chan_mode_to_chan_type(enum gsm48_chan_mode chan_mode, enum channel_rate chan_rate);
struct gsm_lchan *lchan_select_by_chan_mode(struct gsm_bts *bts,
enum gsm48_chan_mode chan_mode, enum channel_rate chan_rate);
-struct gsm_lchan *lchan_avail_by_type(struct gsm_bts *bts, enum gsm_chan_t type, bool log);
+struct gsm_lchan *lchan_select_by_chan_mode2(struct gsm_bts *bts,
+ enum gsm48_chan_mode chan_mode, enum channel_rate chan_rate, struct gsm_lchan* old_lchan);
+struct gsm_lchan *lchan_avail_by_type(struct gsm_bts *bts, enum gsm_chan_t type, bool log, struct gsm_lchan* old_lchan);
diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c
index ac8006d..25ef5a1 100644
--- a/src/osmo-bsc/abis_rsl.c
+++ b/src/osmo-bsc/abis_rsl.c
@@ -1731,12 +1731,12 @@
/* First check the situation on the BTS, if we have TCH/H or TCH/F resources available for another (EMERGENCY)
* call. If yes, then no (further) action has to be carried out. */
- if (lchan_avail_by_type(rqd->bts, GSM_LCHAN_TCH_F, true)) {
+ if (lchan_avail_by_type(rqd->bts, GSM_LCHAN_TCH_F, true, 0)) {
LOG_BTS(rqd->bts, DRSL, LOGL_NOTICE,
"CHAN RQD/EMERGENCY-PRIORITY: at least one TCH/F is (now) available!\n");
return false;
}
- if (lchan_avail_by_type(rqd->bts, GSM_LCHAN_TCH_H, true)) {
+ if (lchan_avail_by_type(rqd->bts, GSM_LCHAN_TCH_H, true, 0)) {
LOG_BTS(rqd->bts, DRSL, LOGL_NOTICE,
"CHAN RQD/EMERGENCY-PRIORITY: at least one TCH/H is (now) available!\n");
return false;
diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c
index f5aee82..d6ea525 100644
--- a/src/osmo-bsc/assignment_fsm.c
+++ b/src/osmo-bsc/assignment_fsm.c
@@ -585,8 +585,8 @@
} else {
/* Try to allocate a new lchan in order of preference */
for (i = 0; i < req->n_ch_mode_rate; i++) {
- conn->assignment.new_lchan = lchan_select_by_chan_mode(bts,
- req->ch_mode_rate_list[i].chan_mode, req->ch_mode_rate_list[i].chan_rate);
+ conn->assignment.new_lchan = lchan_select_by_chan_mode2(bts,
+ req->ch_mode_rate_list[i].chan_mode, req->ch_mode_rate_list[i].chan_rate, conn->lchan);
if (!conn->assignment.new_lchan)
continue;
LOG_ASSIGNMENT(conn, LOGL_DEBUG, "selected new lchan %s for mode[%d] = %s channel_rate=%d\n",
diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c
index 430863b..4a5101a 100644
--- a/src/osmo-bsc/bsc_vty.c
+++ b/src/osmo-bsc/bsc_vty.c
@@ -1293,6 +1293,12 @@
config_write_power_ctrl(vty, 2, &bts->bs_power_ctrl);
config_write_power_ctrl(vty, 2, &bts->ms_power_ctrl);
+ if (bts->assign_rxlev_avgnum > 0) {
+ vty_out(vty, " assign_rxlev_avgnum %u%s", bts->assign_rxlev_avgnum, VTY_NEWLINE);
+ vty_out(vty, " assign_rxlev_tresh %d%s", bts->assign_rxlev_tresh, VTY_NEWLINE);
+ vty_out(vty, " assign_tsused_tresh %u%s", bts->assign_tsused_tresh, VTY_NEWLINE);
+ }
+
config_write_bts_model(vty, bts);
}
@@ -5051,6 +5057,67 @@
return CMD_SUCCESS;
}
+DEFUN_USRATTR(cfg_bts_assign_tsused_tresh,
+ cfg_bts_assign_tsused_tresh_cmd,
+ X(BSC_VTY_ATTR_NEW_LCHAN),
+ "assign_tsused_tresh <0-65535>",
+ "Set #ts used cutoff value for enabling descending chan alloc\n" "#ts\n")
+{
+ struct gsm_bts *bts = vty->index;
+ int tresh = atoi(argv[0]);
+
+ if (tresh < 0 || tresh > 0xffff) {
+ vty_out(vty, "%% assign_tsused_tresh %d is not in the valid range (0-65535)%s",
+ tresh, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bts->assign_tsused_tresh = tresh;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN_USRATTR(cfg_bts_assign_rxlev_avgnum,
+ cfg_bts_assign_rxlev_avgnum_cmd,
+ X(BSC_VTY_ATTR_NEW_LCHAN),
+ "assign_rxlev_avgnum <0-10>",
+ "Set numver of measurements to average for enabling descending chan alloc\n" "#meas\n")
+{
+ struct gsm_bts *bts = vty->index;
+ int avg = atoi(argv[0]);
+
+ if (avg < 0 || avg > 10) {
+ vty_out(vty, "%% assign_rxlev_avgnum %d is not in the valid range (0-10)%s",
+ avg, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bts->assign_rxlev_avgnum = avg;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN_USRATTR(cfg_bts_assign_rxlev_tresh,
+ cfg_bts_assign_rxlev_tresh_cmd,
+ X(BSC_VTY_ATTR_NEW_LCHAN),
+ "assign_rxlev_tresh <-150-150>",
+ "Set rxlev cutoff value (dBm) for enabling descending chan alloc\n" "num ts\n")
+{
+ struct gsm_bts *bts = vty->index;
+ int tresh = atoi(argv[0]);
+
+ if (tresh < -150 || tresh > 150) {
+ vty_out(vty, "%% assign_rxlev_tresh %d is not in the valid range (-150-150)%s",
+ tresh, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bts->assign_rxlev_tresh = tresh;
+
+ return CMD_SUCCESS;
+}
+
+
DEFUN_USRATTR(cfg_power_ctrl_mode,
cfg_power_ctrl_mode_cmd,
X(BSC_VTY_ATTR_NEW_LCHAN),
@@ -8107,6 +8174,10 @@
install_element(BTS_NODE, &cfg_bts_power_ctrl_cmd);
install_element(BTS_NODE, &cfg_bts_no_power_ctrl_cmd);
+ install_element(BTS_NODE, &cfg_bts_assign_tsused_tresh_cmd);
+ install_element(BTS_NODE, &cfg_bts_assign_rxlev_avgnum_cmd);
+ install_element(BTS_NODE, &cfg_bts_assign_rxlev_tresh_cmd);
+
install_node(&power_ctrl_node, dummy_config_write);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_mode_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_bs_power_cmd);
diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c
index a866293..e0458b0 100644
--- a/src/osmo-bsc/handover_decision_2.c
+++ b/src/osmo-bsc/handover_decision_2.c
@@ -1009,7 +1009,7 @@
c->target.min_free_tchh = ho_get_hodec2_tchh_min_slots(c->target.bts->ho);
/* Would the next TCH/F lchan occupy a dynamic timeslot that currently counts for free TCH/H timeslots? */
- next_lchan = lchan_avail_by_type(c->target.bts, GSM_LCHAN_TCH_F, false);
+ next_lchan = lchan_avail_by_type(c->target.bts, GSM_LCHAN_TCH_F, false, 0);
if (next_lchan && next_lchan->ts->pchan_on_init == GSM_PCHAN_TCH_F_TCH_H_PDCH)
c->target.next_tchf_reduces_tchh = 2;
else
@@ -1017,7 +1017,7 @@
/* Would the next TCH/H lchan occupy a dynamic timeslot that currently counts for free TCH/F timeslots?
* Note that a dyn TS already in TCH/H mode (half occupied) would not reduce free TCH/F. */
- next_lchan = lchan_avail_by_type(c->target.bts, GSM_LCHAN_TCH_H, false);
+ next_lchan = lchan_avail_by_type(c->target.bts, GSM_LCHAN_TCH_H, false, 0);
if (next_lchan && next_lchan->ts->pchan_on_init == GSM_PCHAN_TCH_F_TCH_H_PDCH
&& next_lchan->ts->pchan_is != GSM_PCHAN_TCH_H)
c->target.next_tchh_reduces_tchf = 1;
diff --git a/src/osmo-bsc/lchan_select.c b/src/osmo-bsc/lchan_select.c
index 53c4358..22fb3bd 100644
--- a/src/osmo-bsc/lchan_select.c
+++ b/src/osmo-bsc/lchan_select.c
@@ -32,7 +32,7 @@
static struct gsm_lchan *
_lc_find_trx(struct gsm_bts_trx *trx, enum gsm_phys_chan_config pchan,
- enum gsm_phys_chan_config as_pchan, bool allow_pchan_switch, bool log)
+ enum gsm_phys_chan_config as_pchan, bool allow_pchan_switch, bool log, bool use_desc_alloc)
{
struct gsm_lchan *lchan;
struct gsm_bts_trx_ts *ts;
@@ -52,7 +52,7 @@
return NULL;
}
- if (trx->bts->chan_alloc_reverse) {
+ if (trx->bts->chan_alloc_reverse || use_desc_alloc) {
/* check TS 7..0 */
start = 7;
stop = -1;
@@ -106,7 +106,7 @@
static struct gsm_lchan *
_lc_dyn_find_bts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan,
- enum gsm_phys_chan_config dyn_as_pchan, bool log)
+ enum gsm_phys_chan_config dyn_as_pchan, bool log, bool use_desc_alloc)
{
struct gsm_bts_trx *trx;
struct gsm_lchan *lc;
@@ -120,15 +120,15 @@
* true, because they never switch anyway. */
try_pchan_switch = (pchan != dyn_as_pchan);
for (allow_pchan_switch = 0; allow_pchan_switch <= (try_pchan_switch ? 1 : 0); allow_pchan_switch++) {
- if (bts->chan_alloc_reverse) {
+ if (bts->chan_alloc_reverse || use_desc_alloc) {
llist_for_each_entry_reverse(trx, &bts->trx_list, list) {
- lc = _lc_find_trx(trx, pchan, dyn_as_pchan, (bool)allow_pchan_switch, log);
+ lc = _lc_find_trx(trx, pchan, dyn_as_pchan, (bool)allow_pchan_switch, log, use_desc_alloc);
if (lc)
return lc;
}
} else {
llist_for_each_entry(trx, &bts->trx_list, list) {
- lc = _lc_find_trx(trx, pchan, dyn_as_pchan, (bool)allow_pchan_switch, log);
+ lc = _lc_find_trx(trx, pchan, dyn_as_pchan, (bool)allow_pchan_switch, log, use_desc_alloc);
if (lc)
return lc;
}
@@ -139,9 +139,9 @@
}
static struct gsm_lchan *
-_lc_find_bts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan, bool log)
+_lc_find_bts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan, bool log, bool use_desc_alloc)
{
- return _lc_dyn_find_bts(bts, pchan, pchan, log);
+ return _lc_dyn_find_bts(bts, pchan, pchan, log, use_desc_alloc);
}
enum gsm_chan_t chan_mode_to_chan_type(enum gsm48_chan_mode chan_mode, enum channel_rate chan_rate)
@@ -187,17 +187,34 @@
return lchan_select_by_type(bts, type);
}
-struct gsm_lchan *lchan_avail_by_type(struct gsm_bts *bts, enum gsm_chan_t type, bool log)
+static bool special_alloc_handling(struct gsm_bts *bts, struct gsm_lchan* lc)
+{
+ int ts_used;
+ int avglev;
+
+ if (!bts->assign_rxlev_avgnum || !lc)
+ return false;
+
+ ts_used = bts_count_free_ts(bts, GSM_PCHAN_TCH_F) + bts_count_free_ts(bts, GSM_PCHAN_TCH_H);
+ avglev = get_meas_rep_avg(lc, MEAS_REP_DL_RXLEV_FULL, bts->assign_rxlev_avgnum);
+
+ if (rxlev2dbm(avglev) > bts->assign_rxlev_tresh && ts_used > bts->assign_tsused_tresh)
+ return true;
+ return false;
+}
+
+struct gsm_lchan *lchan_avail_by_type(struct gsm_bts *bts, enum gsm_chan_t type, bool log, struct gsm_lchan* old_lchan)
{
struct gsm_lchan *lchan = NULL;
enum gsm_phys_chan_config first, first_cbch, second, second_cbch;
+ bool use_desc_alloc = special_alloc_handling(bts, old_lchan);
if (log)
LOG_BTS(bts, DRLL, LOGL_DEBUG, "lchan_avail_by_type(%s)\n", gsm_lchant_name(type));
switch (type) {
case GSM_LCHAN_SDCCH:
- if (bts->chan_alloc_reverse) {
+ if (bts->chan_alloc_reverse || use_desc_alloc) {
first = GSM_PCHAN_SDCCH8_SACCH8C;
first_cbch = GSM_PCHAN_SDCCH8_SACCH8C_CBCH;
second = GSM_PCHAN_CCCH_SDCCH4;
@@ -209,20 +226,20 @@
second_cbch = GSM_PCHAN_SDCCH8_SACCH8C_CBCH;
}
- lchan = _lc_find_bts(bts, first, log);
+ lchan = _lc_find_bts(bts, first, log, use_desc_alloc);
if (lchan == NULL)
- lchan = _lc_find_bts(bts, first_cbch, log);
+ lchan = _lc_find_bts(bts, first_cbch, log, use_desc_alloc);
if (lchan == NULL)
- lchan = _lc_find_bts(bts, second, log);
+ lchan = _lc_find_bts(bts, second, log, use_desc_alloc);
if (lchan == NULL)
- lchan = _lc_find_bts(bts, second_cbch, log);
+ lchan = _lc_find_bts(bts, second_cbch, log, use_desc_alloc);
break;
case GSM_LCHAN_TCH_F:
- lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_F, log);
+ lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_F, log, use_desc_alloc);
/* If we don't have TCH/F available, try dynamic TCH/F_PDCH */
if (!lchan) {
lchan = _lc_dyn_find_bts(bts, GSM_PCHAN_TCH_F_PDCH,
- GSM_PCHAN_TCH_F, log);
+ GSM_PCHAN_TCH_F, log, use_desc_alloc);
/* TCH/F_PDCH used as TCH/F -- here, type is already
* set to GSM_LCHAN_TCH_F, but for clarity's sake... */
if (lchan)
@@ -233,19 +250,19 @@
if (!lchan && bts->network->dyn_ts_allow_tch_f) {
lchan = _lc_dyn_find_bts(bts,
GSM_PCHAN_TCH_F_TCH_H_PDCH,
- GSM_PCHAN_TCH_F, log);
+ GSM_PCHAN_TCH_F, log, use_desc_alloc);
if (lchan)
type = GSM_LCHAN_TCH_F;
}
break;
case GSM_LCHAN_TCH_H:
- lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_H, log);
+ lchan = _lc_find_bts(bts, GSM_PCHAN_TCH_H, log, use_desc_alloc);
/* No dedicated TCH/x available -- try fully dynamic
* TCH/F_TCH/H_PDCH */
if (!lchan) {
lchan = _lc_dyn_find_bts(bts,
GSM_PCHAN_TCH_F_TCH_H_PDCH,
- GSM_PCHAN_TCH_H, log);
+ GSM_PCHAN_TCH_H, log, use_desc_alloc);
if (lchan)
type = GSM_LCHAN_TCH_H;
}
@@ -264,7 +281,7 @@
{
struct gsm_lchan *lchan = NULL;
- lchan = lchan_avail_by_type(bts, type, true);
+ lchan = lchan_avail_by_type(bts, type, true, 0);
LOG_BTS(bts, DRLL, LOGL_DEBUG, "lchan_select_by_type(%s)\n", gsm_lchant_name(type));
@@ -277,3 +294,28 @@
return lchan;
}
+
+
+
+struct gsm_lchan *lchan_select_by_chan_mode2(struct gsm_bts *bts,
+ enum gsm48_chan_mode chan_mode, enum channel_rate chan_rate, struct gsm_lchan* old_lchan)
+{
+ enum gsm_chan_t type = chan_mode_to_chan_type(chan_mode, chan_rate);
+ struct gsm_lchan *lchan = NULL;
+
+ if (type == GSM_LCHAN_NONE)
+ return NULL;
+
+ lchan = lchan_avail_by_type(bts, type, true, old_lchan);
+
+ LOG_BTS(bts, DRLL, LOGL_DEBUG, "lchan_select_by_type2(%s)\n", gsm_lchant_name(type));
+
+ if (lchan) {
+ lchan->type = type;
+ LOG_LCHAN(lchan, LOGL_INFO, "Selected\n");
+ } else
+ LOG_BTS(bts, DRLL, LOGL_NOTICE, "Failed to select %s channel\n",
+ gsm_lchant_name(type));
+
+ return lchan;
+}
\ No newline at end of file
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/24646
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I4ef37874807ebd26a14616fa49498e6ab124b07b
Gerrit-Change-Number: 24646
Gerrit-PatchSet: 1
Gerrit-Owner: Hoernchen <ewild at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210610/c22c1e9b/attachment.htm>