<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11060">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">codec_pref: handle S0-S15 in ASSIGNMENT REQUEST<br><br>Opposed to all other codecs that are common in GSM, AMR requires a codec<br>configuration that is expressed by a bitmask (S0 to S15) in the speech<br>codec list in the ASSIGNMENT REQUEST. Also the BSC acknowledges those<br>configuration in the ASSIGNMENT COMPLETE message.<br><br>At the moment osmo-bsc ignores all incoming configuration bits. The bits<br>in the ASSIGNMENT COMPLETE speech codec (choosen) field are hardcoded.<br><br>- Store the configuration bits while parsing the ASSIGNMENT COMPLETE<br>- Create an intersection with the configuration that is actually<br> supported by the BSS<br>- Return the resulting (choosen) configuration bits with the assignment<br> complete message.<br><br>Change-Id: I2d8ded51b3eb4c003fe2da6f2d6f48d001b73737<br>Related: OS#3529<br>---<br>M include/osmocom/bsc/codec_pref.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/assignment_fsm.c<br>M src/osmo-bsc/codec_pref.c<br>M src/osmo-bsc/handover_fsm.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M tests/codec_pref/codec_pref_test.c<br>7 files changed, 89 insertions(+), 50 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/60/11060/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/codec_pref.h b/include/osmocom/bsc/codec_pref.h</span><br><span>index 09aaa60..3085ad4 100644</span><br><span>--- a/include/osmocom/bsc/codec_pref.h</span><br><span>+++ b/include/osmocom/bsc/codec_pref.h</span><br><span>@@ -12,11 +12,11 @@</span><br><span> </span><br><span> int match_codec_pref(enum gsm48_chan_mode *chan_mode,</span><br><span> bool *full_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t *s15_s0,</span><br><span> const struct gsm0808_channel_type *ct,</span><br><span> const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_audio_support * const *audio_support,</span><br><span style="color: hsl(0, 100%, 40%);">- int audio_length,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct bts_codec_conf *bts_codec);</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct bsc_msc_data *msc,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm_bts *bts);</span><br><span> </span><br><span> void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl,</span><br><span> const struct bsc_msc_data *msc,</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 33a5a8d..7c91e59 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -109,6 +109,7 @@</span><br><span> </span><br><span> enum gsm48_chan_mode chan_mode;</span><br><span> bool full_rate;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t s15_s0;</span><br><span> };</span><br><span> </span><br><span> struct assignment_fsm_data {</span><br><span>diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c</span><br><span>index 5304d6c..221657e 100644</span><br><span>--- a/src/osmo-bsc/assignment_fsm.c</span><br><span>+++ b/src/osmo-bsc/assignment_fsm.c</span><br><span>@@ -169,8 +169,8 @@</span><br><span> * assignment complete message. */</span><br><span> if (gscon_is_aoip(conn)) {</span><br><span> /* Extrapolate speech codec from speech mode */</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: AMR codec configuration must be derived from lchan1! */</span><br><span> gsm0808_speech_codec_from_chan_type(&sc, perm_spch);</span><br><span style="color: hsl(120, 100%, 40%);">+ sc.cfg = conn->assignment.req.s15_s0;</span><br><span> sc_ptr = ≻</span><br><span> }</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/codec_pref.c b/src/osmo-bsc/codec_pref.c</span><br><span>index c998e60..7aa5130 100644</span><br><span>--- a/src/osmo-bsc/codec_pref.c</span><br><span>+++ b/src/osmo-bsc/codec_pref.c</span><br><span>@@ -94,14 +94,18 @@</span><br><span> * matches one of the permitted speech settings of the channel type element.</span><br><span> * The matched permitted speech value is then also compared against the</span><br><span> * speech codec list. (optional, only relevant for AoIP) */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool test_codec_pref(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm0808_speech_codec_list *scl, uint8_t perm_spch)</span><br><span style="color: hsl(120, 100%, 40%);">+static bool test_codec_pref(const struct gsm0808_speech_codec **sc_match,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t perm_spch)</span><br><span> {</span><br><span> unsigned int i;</span><br><span> bool match = false;</span><br><span> struct gsm0808_speech_codec sc;</span><br><span> int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ *sc_match = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Try to find the given permitted speech value in the</span><br><span> * codec list of the channel type element */</span><br><span> for (i = 0; i < ct->perm_spch_len; i++) {</span><br><span>@@ -129,8 +133,10 @@</span><br><span> /* Try to find extrapolated speech codec data in</span><br><span> * the speech codec list */</span><br><span> for (i = 0; i < scl->len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (sc.type == scl->codec[i].type)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (sc.type == scl->codec[i].type) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *sc_match = &scl->codec[i];</span><br><span> return true;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> return false;</span><br><span>@@ -168,40 +174,74 @@</span><br><span> return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Helper function to generate the bss supported amr configuration bits (S0-S15) */</span><br><span style="color: hsl(120, 100%, 40%);">+static uint16_t gen_bss_supported_amr_s15_s0(const struct bsc_msc_data *msc, const struct gsm_bts *bts, bool hr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm48_multi_rate_conf *amr_cfg_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm48_multi_rate_conf *amr_cfg_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t amr_s15_s0_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t amr_s15_s0_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Lookup the BTS specific AMR rate configuration. Thsi config is set</span><br><span style="color: hsl(120, 100%, 40%);">+ * via the VTY for each BTS individually. In cases where no configuration</span><br><span style="color: hsl(120, 100%, 40%);">+ * is set we will assume a safe default */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (hr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, false);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, true);</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%);">+ /* Lookup the AMR rate configuration that is set for the MSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_cfg_msc = &msc->amr_conf;</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_s15_s0_msc = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_msc, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Calculate the intersection of the two configurations and update S0-S15</span><br><span style="color: hsl(120, 100%, 40%);">+ * in the codec list. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return amr_s15_s0_bts & amr_s15_s0_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Match the codec preferences from local config with a received codec preferences IEs received from the</span><br><span> * MSC and the BTS' codec configuration.</span><br><span> * \param[out] chan_mode GSM 04.08 channel mode.</span><br><span> * \param[out] full_rate true if full-rate.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[out] s15_s0 codec configuration bits S15-S0 (AMR)</span><br><span> * \param[in] ct GSM 08.08 channel type received from MSC.</span><br><span> * \param[in] scl GSM 08.08 speech codec list received from MSC (optional).</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] audio_support List of allowed codecs as from local config.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] audio_length Number of items in audio_support.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] bts_codec BTS codec configuration.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] msc associated msc (current codec settings).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] bts associated bts (current codec settings).</span><br><span> * \returns 0 on success, -1 in case no match was found */</span><br><span> int match_codec_pref(enum gsm48_chan_mode *chan_mode,</span><br><span> bool *full_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t *s15_s0,</span><br><span> const struct gsm0808_channel_type *ct,</span><br><span> const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_audio_support * const *audio_support,</span><br><span style="color: hsl(0, 100%, 40%);">- int audio_length,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct bts_codec_conf *bts_codec)</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct bsc_msc_data *msc,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm_bts *bts)</span><br><span> {</span><br><span> unsigned int i;</span><br><span> uint8_t perm_spch;</span><br><span> bool match = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm0808_speech_codec *sc_match = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t amr_s15_s0_supported;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < audio_length; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Note: Normally the MSC should never try to advertise a codec that</span><br><span style="color: hsl(120, 100%, 40%);">+ * we did not advertise as supported before. In order to ensure that</span><br><span style="color: hsl(120, 100%, 40%);">+ * no unsupported codec is accepted, we make sure that the codec is</span><br><span style="color: hsl(120, 100%, 40%);">+ * indeed available with the current BTS and MSC configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < msc->audio_length; i++) {</span><br><span> /* Pick a permitted speech value from the global codec configuration list */</span><br><span style="color: hsl(0, 100%, 40%);">- perm_spch = audio_support_to_gsm88(audio_support[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ perm_spch = audio_support_to_gsm88(msc->audio_support[i]);</span><br><span> </span><br><span> /* Check this permitted speech value against the BTS specific parameters.</span><br><span> * if the BTS does not support the codec, try the next one */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!test_codec_support_bts(bts_codec, perm_spch))</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!test_codec_support_bts(&bts->codec, perm_spch))</span><br><span> continue;</span><br><span> </span><br><span> /* Match the permitted speech value against the codec lists that were</span><br><span> * advertised by the MS and the MSC */</span><br><span style="color: hsl(0, 100%, 40%);">- if (test_codec_pref(ct, scl, perm_spch)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (test_codec_pref(&sc_match, scl, ct, perm_spch)) {</span><br><span> match = true;</span><br><span> break;</span><br><span> }</span><br><span>@@ -211,6 +251,7 @@</span><br><span> if (!match) {</span><br><span> *full_rate = false;</span><br><span> *chan_mode = GSM48_CMODE_SIGN;</span><br><span style="color: hsl(120, 100%, 40%);">+ *s15_s0 = 0;</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span>@@ -240,6 +281,24 @@</span><br><span> /* Lookup a channel mode for the selected codec */</span><br><span> *chan_mode = gsm88_to_chan_mode(perm_spch);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Special handling for AMR */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (perm_spch == GSM0808_PERM_HR3 || perm_spch == GSM0808_PERM_FR3)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Normally the MSC should never try to advertise an AMR codec</span><br><span style="color: hsl(120, 100%, 40%);">+ * configuration that we did not previously advertised as</span><br><span style="color: hsl(120, 100%, 40%);">+ * supported. However, to ensure that no unsupported AMR codec</span><br><span style="color: hsl(120, 100%, 40%);">+ * configuration enters the further processing steps we agein</span><br><span style="color: hsl(120, 100%, 40%);">+ * lookup what we support and generate an intersection. All</span><br><span style="color: hsl(120, 100%, 40%);">+ * further processing is then done with this intersection</span><br><span style="color: hsl(120, 100%, 40%);">+ * result */</span><br><span style="color: hsl(120, 100%, 40%);">+ amr_s15_s0_supported = gen_bss_supported_amr_s15_s0(msc, bts, (perm_spch == GSM0808_PERM_HR3));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (sc_match)</span><br><span style="color: hsl(120, 100%, 40%);">+ *s15_s0 = sc_match->cfg & amr_s15_s0_supported;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ *s15_s0 = amr_s15_s0_supported;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else</span><br><span style="color: hsl(120, 100%, 40%);">+ *s15_s0 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -254,11 +313,6 @@</span><br><span> uint8_t perm_spch;</span><br><span> unsigned int i;</span><br><span> int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t amr_s15_s0_bts;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t amr_s15_s0_msc;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t amr_s15_s0;</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm48_multi_rate_conf *amr_cfg_bts;</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm48_multi_rate_conf *amr_cfg_msc;</span><br><span> </span><br><span> memset(scl, 0, sizeof(*scl));</span><br><span> </span><br><span>@@ -280,28 +334,8 @@</span><br><span> /* AMR (HR/FR version 3) is the only codec that requires a codec</span><br><span> * configuration (S0-S15). Determine the current configuration and update</span><br><span> * the cfg flag. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (msc->audio_support[i]->ver == 3) {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* First lookup the BTS specific AMR rate configuration. Thsi config</span><br><span style="color: hsl(0, 100%, 40%);">- * is set via the VTY for each BTS individually. In cases where no</span><br><span style="color: hsl(0, 100%, 40%);">- * configuration is set we will assume a safe default */</span><br><span style="color: hsl(0, 100%, 40%);">- if (msc->audio_support[i]->hr) {</span><br><span style="color: hsl(0, 100%, 40%);">- amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie;</span><br><span style="color: hsl(0, 100%, 40%);">- amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, false);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie;</span><br><span style="color: hsl(0, 100%, 40%);">- amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, true);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* At next, lookup the AMR rate configuration that is set for the MSC */</span><br><span style="color: hsl(0, 100%, 40%);">- amr_cfg_msc = &msc->amr_conf;</span><br><span style="color: hsl(0, 100%, 40%);">- amr_s15_s0_msc = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_msc, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Calculate the intersection of the two configurations and update S0-S15</span><br><span style="color: hsl(0, 100%, 40%);">- * in the codec list. */</span><br><span style="color: hsl(0, 100%, 40%);">- amr_s15_s0 = amr_s15_s0_bts & amr_s15_s0_msc;</span><br><span style="color: hsl(0, 100%, 40%);">- scl->codec[scl->len].cfg = amr_s15_s0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msc->audio_support[i]->ver == 3)</span><br><span style="color: hsl(120, 100%, 40%);">+ scl->codec[scl->len].cfg = gen_bss_supported_amr_s15_s0(msc, bts, msc->audio_support[i]->hr);</span><br><span> </span><br><span> scl->len++;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 9d558bc..e95ab9c 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -522,6 +522,7 @@</span><br><span> int match_idx;</span><br><span> enum gsm48_chan_mode mode;</span><br><span> bool full_rate;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t s15_s0;</span><br><span> struct osmo_fsm_inst *fi;</span><br><span> </span><br><span> handover_fsm_alloc(conn);</span><br><span>@@ -560,8 +561,9 @@</span><br><span> bts->nr, req->cell_id_target_name);</span><br><span> </span><br><span> /* Figure out channel type */</span><br><span style="color: hsl(0, 100%, 40%);">- if (match_codec_pref(&mode, &full_rate, &req->ct, &req->scl, msc->audio_support,</span><br><span style="color: hsl(0, 100%, 40%);">- msc->audio_length, &bts->codec)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match_codec_pref(&mode, &full_rate, &s15_s0, &req->ct, &req->scl, msc, bts)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: use the value in s15_s0 that has been computed by</span><br><span style="color: hsl(120, 100%, 40%);">+ * match_codec_pref(). */</span><br><span> LOG_HO(conn, LOGL_DEBUG,</span><br><span> "BTS %u has no matching channel codec (%s, speech codec list len = %u)",</span><br><span> bts->nr, gsm0808_channel_type_name(&req->ct), req->scl.len);</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index 97daa5c..537b851 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -603,6 +603,7 @@</span><br><span> uint16_t cic = 0;</span><br><span> enum gsm48_chan_mode chan_mode = GSM48_CMODE_SIGN;</span><br><span> bool full_rate = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t s15_s0 = 0;</span><br><span> bool aoip = false;</span><br><span> struct sockaddr_storage rtp_addr;</span><br><span> struct gsm0808_channel_type ct;</span><br><span>@@ -706,9 +707,8 @@</span><br><span> </span><br><span> /* Match codec information from the assignment command against the</span><br><span> * local preferences of the BSC and BTS */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = match_codec_pref(&chan_mode, &full_rate, &ct, &conn->codec_list,</span><br><span style="color: hsl(0, 100%, 40%);">- msc->audio_support, msc->audio_length,</span><br><span style="color: hsl(0, 100%, 40%);">- &conn_get_bts(conn)->codec);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = match_codec_pref(&chan_mode, &full_rate, &s15_s0, &ct, &conn->codec_list,</span><br><span style="color: hsl(120, 100%, 40%);">+ msc, conn_get_bts(conn));</span><br><span> if (rc < 0) {</span><br><span> LOGP(DMSC, LOGL_ERROR, "No supported audio type found for channel_type ="</span><br><span> " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch=[ %s] }\n",</span><br><span>@@ -730,6 +730,7 @@</span><br><span> .msc_assigned_cic = cic,</span><br><span> .chan_mode = chan_mode,</span><br><span> .full_rate = full_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+ .s15_s0 = s15_s0</span><br><span> };</span><br><span> if (aoip) {</span><br><span> unsigned int rc = osmo_sockaddr_to_str_and_uint(req.msc_rtp_addr,</span><br><span>diff --git a/tests/codec_pref/codec_pref_test.c b/tests/codec_pref/codec_pref_test.c</span><br><span>index 20e3525..34b8c75 100644</span><br><span>--- a/tests/codec_pref/codec_pref_test.c</span><br><span>+++ b/tests/codec_pref/codec_pref_test.c</span><br><span>@@ -374,6 +374,7 @@</span><br><span> unsigned int i;</span><br><span> bool full_rate;</span><br><span> enum gsm48_chan_mode chan_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t s15_s0;</span><br><span> </span><br><span> printf("Determining channel mode and rate:\n");</span><br><span> </span><br><span>@@ -398,7 +399,7 @@</span><br><span> printf(" codec->efr=%u\n", bts->codec.efr);</span><br><span> printf(" codec->amr=%u\n", bts->codec.amr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- rc = match_codec_pref(&chan_mode, &full_rate, ct, scl, msc->audio_support, msc->audio_length, &bts->codec);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = match_codec_pref(&chan_mode, &full_rate, &s15_s0, ct, scl, msc, bts);</span><br><span> printf(" * result: rc=%i, full_rate=%i, chan_mode=%s\n", rc, full_rate, gsm48_chan_mode_name(chan_mode));</span><br><span> </span><br><span> printf("\n");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11060">change 11060</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/11060"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I2d8ded51b3eb4c003fe2da6f2d6f48d001b73737 </div>
<div style="display:none"> Gerrit-Change-Number: 11060 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>