<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21987">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
pespin: Looks good to me, but someone else must approve
Jenkins Builder: Verified
</div><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, 82 insertions(+), 83 deletions(-)<br><br></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..4cf0e8a 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(¤t_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(¤t_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(¤t_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(¤t_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>@@ -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: 5 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>