<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21987">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hodec2: reduce check_requirements() args<br><br>Instead of passing single args, pass the ho_candidate struct.<br><br>No functional change.<br><br>Change-Id: I086aef9cc47ad8a5376f18179024c486f6f8b779<br>---<br>M src/osmo-bsc/handover_decision_2.c<br>1 file changed, 83 insertions(+), 84 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/87/21987/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c</span><br><span>index 77b6e6b..7fd6941 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>@@ -433,113 +433,113 @@</span><br><span>  *  * The number of free slots are checked for TCH/F and TCH/H slot types</span><br><span>  *    individually.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static uint8_t check_requirements(struct gsm_lchan *lchan, struct gsm_bts *bts, int tchf_count, int tchh_count)</span><br><span style="color: hsl(120, 100%, 40%);">+static void check_requirements(struct ho_candidate *c, int tchf_count, int tchh_count)</span><br><span> {</span><br><span>      int count;</span><br><span>   uint8_t requirement = 0;</span><br><span>     unsigned int penalty_time;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts *current_bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+   c->requirements = 0;</span><br><span> </span><br><span>  /* Requirement A */</span><br><span> </span><br><span>      /* the handover/assignment must not be disabled */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (current_bts == bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!ho_get_hodec2_as_active(bts->ho)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGPHOLCHAN(lchan, LOGL_DEBUG, "Assignment disabled\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (c->current.bts == c->target.bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!ho_get_hodec2_as_active(c->target.bts->ho)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPHOLCHAN(c->current.lchan, LOGL_DEBUG, "Assignment disabled\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      return;</span><br><span>              }</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (!ho_get_ho_active(bts->ho)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!ho_get_ho_active(c->target.bts->ho)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG,</span><br><span>                                   "not a candidate, handover is disabled in target BTS\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span>        /* the handover penalty timer must not run for this bts */</span><br><span style="color: hsl(0, 100%, 40%);">-      penalty_time = conn_penalty_time_remaining(lchan->conn, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+      penalty_time = conn_penalty_time_remaining(c->current.lchan->conn, c->target.bts);</span><br><span>  if (penalty_time) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG, "not a candidate, target BTS still in penalty time"</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "not a candidate, target BTS still in penalty time"</span><br><span>                             " (%u seconds left)\n", penalty_time);</span><br><span style="color: hsl(0, 100%, 40%);">-               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      }</span><br><span> </span><br><span>        /* compatibility check for codecs.</span><br><span>    * if so, the candidates for full rate and half rate are selected */</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (lchan->tch_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (c->current.lchan->tch_mode) {</span><br><span>  case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-             switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+             switch (c->current.lchan->type) {</span><br><span>              case GSM_LCHAN_TCH_F: /* mandatory */</span><br><span>                        requirement |= REQUIREMENT_A_TCHF;</span><br><span>                   break;</span><br><span>               case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (!bts->codec.hr) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (!c->target.bts->codec.hr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG,</span><br><span>                                           "tch_mode='%s' type='%s' not supported\n",</span><br><span>                                                 get_value_string(gsm48_chan_mode_names,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                  lchan->tch_mode),</span><br><span style="color: hsl(0, 100%, 40%);">-                                           gsm_lchant_name(lchan->type));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              c->current.lchan->tch_mode),</span><br><span style="color: hsl(120, 100%, 40%);">+                                           gsm_lchant_name(c->current.lchan->type));</span><br><span>                             break;</span><br><span>                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (codec_type_is_supported(lchan->conn, GSM0808_SCT_HR1))</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_HR1))</span><br><span>                          requirement |= REQUIREMENT_A_TCHH;</span><br><span>                   break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPHOLCHAN(lchan, LOGL_ERROR, "Unexpected channel type: neither TCH/F nor TCH/H for %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                               get_value_string(gsm48_chan_mode_names, lchan->tch_mode));</span><br><span style="color: hsl(0, 100%, 40%);">-                       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPHOLCHAN(c->current.lchan, LOGL_ERROR, "Unexpected channel type: neither TCH/F nor TCH/H for %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                               get_value_string(gsm48_chan_mode_names, c->current.lchan->tch_mode));</span><br><span style="color: hsl(120, 100%, 40%);">+                       return;</span><br><span>              }</span><br><span>            break;</span><br><span>       case GSM48_CMODE_SPEECH_EFR:</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!bts->codec.efr) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGPHOBTS(bts, LOGL_DEBUG, "EFR not supported\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!c->target.bts->codec.efr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPHOBTS(c->target.bts, LOGL_DEBUG, "EFR not supported\n");</span><br><span>                    break;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (codec_type_is_supported(lchan->conn, GSM0808_SCT_FR2))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_FR2))</span><br><span>                  requirement |= REQUIREMENT_A_TCHF;</span><br><span>           break;</span><br><span>       case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-            if (!bts->codec.amr) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGPHOBTS(bts, LOGL_DEBUG, "AMR not supported\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!c->target.bts->codec.amr) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPHOBTS(c->target.bts, LOGL_DEBUG, "AMR not supported\n");</span><br><span>                    break;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (codec_type_is_supported(lchan->conn, GSM0808_SCT_FR3))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_FR3))</span><br><span>                  requirement |= REQUIREMENT_A_TCHF;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (codec_type_is_supported(lchan->conn, GSM0808_SCT_HR3))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_HR3))</span><br><span>                  requirement |= REQUIREMENT_A_TCHH;</span><br><span>           break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG, "Not even considering: src is not a SPEECH mode lchan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "Not even considering: src is not a SPEECH mode lchan\n");</span><br><span>             /* FIXME: should allow handover of non-speech lchans */</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      }</span><br><span> </span><br><span>        /* no candidate, because new cell is incompatible */</span><br><span>         if (!requirement) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG, "not a candidate, because codec of MS and BTS are incompatible\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "not a candidate, because codec of MS and BTS are incompatible\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      }</span><br><span> </span><br><span>        /* remove slot types that are not available */</span><br><span>       if (!tchf_count && requirement & REQUIREMENT_A_TCHF) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG,</span><br><span>                           "removing TCH/F, since all TCH/F lchans are in use\n");</span><br><span>           requirement &= ~(REQUIREMENT_A_TCHF);</span><br><span>    }</span><br><span>    if (!tchh_count && requirement & REQUIREMENT_A_TCHH) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG,</span><br><span>                           "removing TCH/H, since all TCH/H lchans are in use\n");</span><br><span>           requirement &= ~(REQUIREMENT_A_TCHH);</span><br><span>    }</span><br><span> </span><br><span>        if (!requirement) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG, "not a candidate, because no suitable slots available\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG, "not a candidate, because no suitable slots available\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span>      }</span><br><span> </span><br><span>        /* omit same channel type on same BTS (will not change anything) */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (bts == current_bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-               switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (c->target.bts == c->current.bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+          switch (c->current.lchan->type) {</span><br><span>              case GSM_LCHAN_TCH_F:</span><br><span>                        requirement &= ~(REQUIREMENT_A_TCHF);</span><br><span>                    break;</span><br><span>@@ -551,9 +551,9 @@</span><br><span>                 }</span><br><span> </span><br><span>                if (!requirement) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGPHOLCHAN(lchan, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPHOLCHAN(c->current.lchan, LOGL_DEBUG,</span><br><span>                                     "Reassignment within cell not an option, no differing channel types available\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span>@@ -561,26 +561,26 @@</span><br><span>        // This was useful in osmo-nitb. We're in osmo-bsc now and have no idea whether the osmo-msc does</span><br><span>        // internal or external call control. Maybe a future config switch wants to add this behavior?</span><br><span>       /* Built-in call control requires equal codec rates. Remove rates that are not equal. */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (lchan->tch_mode == GSM48_CMODE_SPEECH_AMR</span><br><span style="color: hsl(0, 100%, 40%);">-            && current_bts->network->mncc_recv != mncc_sock_from_cc) {</span><br><span style="color: hsl(0, 100%, 40%);">-            switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (c->current.lchan->tch_mode == GSM48_CMODE_SPEECH_AMR</span><br><span style="color: hsl(120, 100%, 40%);">+            && c->current.bts->network->mncc_recv != mncc_sock_from_cc) {</span><br><span style="color: hsl(120, 100%, 40%);">+            switch (c->current.lchan->type) {</span><br><span>              case GSM_LCHAN_TCH_F:</span><br><span>                        if ((requirement & REQUIREMENT_A_TCHF)</span><br><span style="color: hsl(0, 100%, 40%);">-                          && !!memcmp(&current_bts->mr_full, &bts->mr_full,</span><br><span style="color: hsl(120, 100%, 40%);">+                       && !!memcmp(&c->current.bts->mr_full, &c->target.bts->mr_full,</span><br><span>                                       sizeof(struct amr_multirate_conf)))</span><br><span>                          requirement &= ~(REQUIREMENT_A_TCHF);</span><br><span>                    if ((requirement & REQUIREMENT_A_TCHH)</span><br><span style="color: hsl(0, 100%, 40%);">-                          && !!memcmp(&current_bts->mr_full, &bts->mr_half,</span><br><span style="color: hsl(120, 100%, 40%);">+                       && !!memcmp(&c->current.bts->mr_full, &c->target.bts->mr_half,</span><br><span>                                       sizeof(struct amr_multirate_conf)))</span><br><span>                          requirement &= ~(REQUIREMENT_A_TCHH);</span><br><span>                    break;</span><br><span>               case GSM_LCHAN_TCH_H:</span><br><span>                        if ((requirement & REQUIREMENT_A_TCHF)</span><br><span style="color: hsl(0, 100%, 40%);">-                          && !!memcmp(&current_bts->mr_half, &bts->mr_full,</span><br><span style="color: hsl(120, 100%, 40%);">+                       && !!memcmp(&c->current.bts->mr_half, &c->target.bts->mr_full,</span><br><span>                                       sizeof(struct amr_multirate_conf)))</span><br><span>                          requirement &= ~(REQUIREMENT_A_TCHF);</span><br><span>                    if ((requirement & REQUIREMENT_A_TCHH)</span><br><span style="color: hsl(0, 100%, 40%);">-                          && !!memcmp(&current_bts->mr_half, &bts->mr_half,</span><br><span style="color: hsl(120, 100%, 40%);">+                       && !!memcmp(&c->current.bts->mr_half, &c->target.bts->mr_half,</span><br><span>                                       sizeof(struct amr_multirate_conf)))</span><br><span>                          requirement &= ~(REQUIREMENT_A_TCHH);</span><br><span>                    break;</span><br><span>@@ -589,20 +589,20 @@</span><br><span>               }</span><br><span> </span><br><span>                if (!requirement) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG,</span><br><span>                                   "not a candidate, cannot provide identical codec rate\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span>              }</span><br><span>    }</span><br><span> #endif</span><br><span> </span><br><span>      /* the maximum number of unsynchronized handovers must no be exceeded */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (current_bts != bts</span><br><span style="color: hsl(0, 100%, 40%);">-      && bts_handover_count(bts, HO_SCOPE_ALL) >= ho_get_hodec2_ho_max(bts->ho)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPHOLCHANTOBTS(lchan, bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+      if (c->current.bts != c->target.bts</span><br><span style="color: hsl(120, 100%, 40%);">+         && bts_handover_count(c->target.bts, HO_SCOPE_ALL) >= ho_get_hodec2_ho_max(c->target.bts->ho)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_DEBUG,</span><br><span>                           "not a candidate, number of allowed handovers (%d) would be exceeded\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                              ho_get_hodec2_ho_max(bts->ho));</span><br><span style="color: hsl(0, 100%, 40%);">-             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                              ho_get_hodec2_ho_max(c->target.bts->ho));</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span>      }</span><br><span> </span><br><span>        /* Requirement B */</span><br><span>@@ -610,11 +610,11 @@</span><br><span>  /* the minimum free timeslots that are defined for this cell must</span><br><span>     * be maintained _after_ handover/assignment */</span><br><span>      if (requirement & REQUIREMENT_A_TCHF) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (tchf_count - 1 >= ho_get_hodec2_tchf_min_slots(bts->ho))</span><br><span style="color: hsl(120, 100%, 40%);">+            if (tchf_count - 1 >= ho_get_hodec2_tchf_min_slots(c->target.bts->ho))</span><br><span>                      requirement |= REQUIREMENT_B_TCHF;</span><br><span>   }</span><br><span>    if (requirement & REQUIREMENT_A_TCHH) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (tchh_count - 1 >= ho_get_hodec2_tchh_min_slots(bts->ho))</span><br><span style="color: hsl(120, 100%, 40%);">+            if (tchh_count - 1 >= ho_get_hodec2_tchh_min_slots(c->target.bts->ho))</span><br><span>                      requirement |= REQUIREMENT_B_TCHH;</span><br><span>   }</span><br><span> </span><br><span>@@ -622,8 +622,8 @@</span><br><span> </span><br><span>      /* the nr of free timeslots of the target cell must be >= the</span><br><span>      * free slots of the current cell _after_ handover/assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-        count = bts_count_free_ts(current_bts,</span><br><span style="color: hsl(0, 100%, 40%);">-                            (lchan->type == GSM_LCHAN_TCH_H) ?</span><br><span style="color: hsl(120, 100%, 40%);">+       count = bts_count_free_ts(c->current.bts,</span><br><span style="color: hsl(120, 100%, 40%);">+                            (c->current.lchan->type == GSM_LCHAN_TCH_H) ?</span><br><span>                                   GSM_PCHAN_TCH_H : GSM_PCHAN_TCH_F);</span><br><span>       if (requirement & REQUIREMENT_A_TCHF) {</span><br><span>          if (tchf_count - 1 >= count + 1)</span><br><span>@@ -635,63 +635,63 @@</span><br><span>  }</span><br><span> </span><br><span>        /* return mask of fulfilled requirements */</span><br><span style="color: hsl(0, 100%, 40%);">-     return requirement;</span><br><span style="color: hsl(120, 100%, 40%);">+   c->requirements = requirement;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static uint8_t check_requirements_remote_bss(struct gsm_lchan *lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      const struct gsm0808_cell_id_list2 *cil)</span><br><span style="color: hsl(120, 100%, 40%);">+static void check_requirements_remote_bss(struct ho_candidate *c)</span><br><span> {</span><br><span>        uint8_t requirement = 0;</span><br><span>     unsigned int penalty_time;</span><br><span style="color: hsl(120, 100%, 40%);">+    c->requirements = 0;</span><br><span> </span><br><span>  /* Requirement A */</span><br><span> </span><br><span>      /* the handover penalty timer must not run for this bts */</span><br><span style="color: hsl(0, 100%, 40%);">-      penalty_time = conn_penalty_time_remaining(lchan->conn, cil);</span><br><span style="color: hsl(120, 100%, 40%);">+      penalty_time = conn_penalty_time_remaining(c->current.lchan->conn, c->target.cil);</span><br><span>  if (penalty_time) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHANTOREMOTE(lchan, cil, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPHOLCHANTOREMOTE(c->current.lchan, c->target.cil, LOGL_DEBUG,</span><br><span>                                   "not a candidate, target BSS still in penalty time"</span><br><span>                                " (%u seconds left)\n", penalty_time);</span><br><span style="color: hsl(0, 100%, 40%);">-            return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      }</span><br><span> </span><br><span>        /* compatibility check for codecs -- we have no notion of what the remote BSS supports. We can</span><br><span>        * only assume that a handover would work, and use only the local requirements. */</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (lchan->tch_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (c->current.lchan->tch_mode) {</span><br><span>  case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-             switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+             switch (c->current.lchan->type) {</span><br><span>              case GSM_LCHAN_TCH_F: /* mandatory */</span><br><span>                        requirement |= REQUIREMENT_A_TCHF;</span><br><span>                   break;</span><br><span>               case GSM_LCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (codec_type_is_supported(lchan->conn, GSM0808_SCT_HR1))</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_HR1))</span><br><span>                          requirement |= REQUIREMENT_A_TCHH;</span><br><span>                   break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPHOLCHAN(lchan, LOGL_ERROR, "Unexpected channel type: neither TCH/F nor TCH/H for %s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                               get_value_string(gsm48_chan_mode_names, lchan->tch_mode));</span><br><span style="color: hsl(0, 100%, 40%);">-                       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPHOLCHAN(c->current.lchan, LOGL_ERROR, "Unexpected channel type: neither TCH/F nor TCH/H for %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                               get_value_string(gsm48_chan_mode_names, c->current.lchan->tch_mode));</span><br><span style="color: hsl(120, 100%, 40%);">+                       return;</span><br><span>              }</span><br><span>            break;</span><br><span>       case GSM48_CMODE_SPEECH_EFR:</span><br><span style="color: hsl(0, 100%, 40%);">-            if (codec_type_is_supported(lchan->conn, GSM0808_SCT_FR2))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_FR2))</span><br><span>                  requirement |= REQUIREMENT_A_TCHF;</span><br><span>           break;</span><br><span>       case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-            if (codec_type_is_supported(lchan->conn, GSM0808_SCT_FR3))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_FR3))</span><br><span>                  requirement |= REQUIREMENT_A_TCHF;</span><br><span style="color: hsl(0, 100%, 40%);">-              if (codec_type_is_supported(lchan->conn, GSM0808_SCT_HR3))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (codec_type_is_supported(c->current.lchan->conn, GSM0808_SCT_HR3))</span><br><span>                  requirement |= REQUIREMENT_A_TCHH;</span><br><span>           break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPHOLCHAN(lchan, LOGL_DEBUG, "Not even considering: src is not a SPEECH mode lchan\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPHOLCHAN(c->current.lchan, LOGL_DEBUG, "Not even considering: src is not a SPEECH mode lchan\n");</span><br><span>            /* FIXME: should allow handover of non-speech lchans */</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      }</span><br><span> </span><br><span>        if (!requirement) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHAN(lchan, LOGL_ERROR, "lchan doesn't fit its own requirements??\n");</span><br><span style="color: hsl(0, 100%, 40%);">-             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOLCHAN(c->current.lchan, LOGL_ERROR, "lchan doesn't fit its own requirements??\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      }</span><br><span> </span><br><span>        /* Requirement B and C */</span><br><span>@@ -704,7 +704,7 @@</span><br><span>              requirement |= REQUIREMENT_B_TCHH | REQUIREMENT_C_TCHH;</span><br><span> </span><br><span>  /* return mask of fulfilled requirements */</span><br><span style="color: hsl(0, 100%, 40%);">-     return requirement;</span><br><span style="color: hsl(120, 100%, 40%);">+   c->requirements = requirement;</span><br><span> }</span><br><span> </span><br><span> /* Trigger handover or assignment depending on the target BTS */</span><br><span>@@ -831,7 +831,7 @@</span><br><span> {</span><br><span> #define HO_CANDIDATE_FMT(tchx, TCHX) "TCH/" #TCHX "={free %d (want %d), " REQUIREMENTS_FMT "}"</span><br><span> #define HO_CANDIDATE_ARGS(tchx, TCHX) \</span><br><span style="color: hsl(0, 100%, 40%);">-         tch##tchx##_count, ho_get_hodec2_tch##tchx##_min_slots(candidate->target.bts->ho), \</span><br><span style="color: hsl(120, 100%, 40%);">+            free_tch##tchx, ho_get_hodec2_tch##tchx##_min_slots(candidate->target.bts->ho), \</span><br><span>              REQUIREMENTS_ARGS(candidate->requirements, TCHX)</span><br><span> </span><br><span>         if (!candidate->target.bts && !candidate->target.cil)</span><br><span>@@ -880,7 +880,7 @@</span><br><span>                    .rxlev = rxlev_current, /* same cell, same rxlev */</span><br><span>          },</span><br><span>   };</span><br><span style="color: hsl(0, 100%, 40%);">-      c.requirements = check_requirements(c.current.lchan, c.target.bts, tchf_count, tchh_count),</span><br><span style="color: hsl(120, 100%, 40%);">+   check_requirements(&c, tchf_count, tchh_count);</span><br><span> </span><br><span>      debug_candidate(&c, tchf_count, tchh_count);</span><br><span> </span><br><span>@@ -987,10 +987,9 @@</span><br><span>  if (neighbor_bts) {</span><br><span>          tchf_count = bts_count_free_ts(neighbor_bts, GSM_PCHAN_TCH_F);</span><br><span>               tchh_count = bts_count_free_ts(neighbor_bts, GSM_PCHAN_TCH_H);</span><br><span style="color: hsl(0, 100%, 40%);">-          c.requirements = check_requirements(lchan, neighbor_bts, tchf_count,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                tchh_count);</span><br><span style="color: hsl(120, 100%, 40%);">+              check_requirements(&c, tchf_count, tchh_count);</span><br><span>  } else</span><br><span style="color: hsl(0, 100%, 40%);">-          c.requirements = check_requirements_remote_bss(lchan, neighbor_cil);</span><br><span style="color: hsl(120, 100%, 40%);">+          check_requirements_remote_bss(&c);</span><br><span> </span><br><span>   debug_candidate(&c, tchf_count, tchh_count);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21987">change 21987</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/+/21987"/><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: I086aef9cc47ad8a5376f18179024c486f6f8b779 </div>
<div style="display:none"> Gerrit-Change-Number: 21987 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>