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