<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>