Change in osmo-bsc[master]: codec_pref: handle S0-S15 in ASSIGNMENT REQUEST

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Fri Oct 5 07:58:22 UTC 2018


Harald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/11060 )

Change subject: codec_pref: handle S0-S15 in ASSIGNMENT REQUEST
......................................................................

codec_pref: handle S0-S15 in ASSIGNMENT REQUEST

Opposed to all other codecs that are common in GSM, AMR requires a codec
configuration that is expressed by a bitmask (S0 to S15) in the speech
codec list in the ASSIGNMENT REQUEST. Also the BSC acknowledges those
configuration in the ASSIGNMENT COMPLETE message.

At the moment osmo-bsc ignores all incoming configuration bits. The bits
in the ASSIGNMENT COMPLETE speech codec (choosen) field are hardcoded.

- Store the configuration bits while parsing the ASSIGNMENT COMPLETE
- Create an intersection with the configuration that is actually
  supported by the BSS
- Return the resulting (chosen) configuration bits with the assignment
  complete message.
- Use the (highest of the) agreed codec rates in RSL channel activation.

Change-Id: I2d8ded51b3eb4c003fe2da6f2d6f48d001b73737
Related: OS#3529
---
M include/osmocom/bsc/codec_pref.h
M include/osmocom/bsc/gsm_data.h
M include/osmocom/bsc/lchan_fsm.h
M src/osmo-bsc/assignment_fsm.c
M src/osmo-bsc/codec_pref.c
M src/osmo-bsc/handover_fsm.c
M src/osmo-bsc/lchan_fsm.c
M src/osmo-bsc/osmo_bsc_bssap.c
M tests/codec_pref/codec_pref_test.c
M tests/codec_pref/codec_pref_test.ok
10 files changed, 190 insertions(+), 101 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/bsc/codec_pref.h b/include/osmocom/bsc/codec_pref.h
index 09aaa60..3085ad4 100644
--- a/include/osmocom/bsc/codec_pref.h
+++ b/include/osmocom/bsc/codec_pref.h
@@ -12,11 +12,11 @@
 
 int match_codec_pref(enum gsm48_chan_mode *chan_mode,
 		     bool *full_rate,
+		     uint16_t *s15_s0,
 		     const struct gsm0808_channel_type *ct,
 		     const struct gsm0808_speech_codec_list *scl,
-		     struct gsm_audio_support * const *audio_support,
-		     int audio_length,
-		     const struct bts_codec_conf *bts_codec);
+		     const struct bsc_msc_data *msc,
+		     const struct gsm_bts *bts);
 
 void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl,
 				  const struct bsc_msc_data *msc,
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 33a5a8d..7c91e59 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -109,6 +109,7 @@
 
 	enum gsm48_chan_mode chan_mode;
 	bool full_rate;
+	uint16_t s15_s0;
 };
 
 struct assignment_fsm_data {
diff --git a/include/osmocom/bsc/lchan_fsm.h b/include/osmocom/bsc/lchan_fsm.h
index 9fbf9b3..d2e8724 100644
--- a/include/osmocom/bsc/lchan_fsm.h
+++ b/include/osmocom/bsc/lchan_fsm.h
@@ -58,6 +58,7 @@
 	/* This always is for a specific lchan, so its lchan->type indicates full or half rate.
 	 * When a dyn TS was selected, the lchan->type has been set to the desired rate. */
 	enum gsm48_chan_mode chan_mode;
+	uint16_t s15_s0;
 	bool requires_voice_stream;
 	bool wait_before_switching_rtp;
 	uint16_t msc_assigned_cic;
diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c
index 2410adb..3f553ff 100644
--- a/src/osmo-bsc/assignment_fsm.c
+++ b/src/osmo-bsc/assignment_fsm.c
@@ -169,8 +169,8 @@
 		 * assignment complete message. */
 		if (gscon_is_aoip(conn)) {
 			/* Extrapolate speech codec from speech mode */
-			/* FIXME: AMR codec configuration must be derived from lchan1! */
 			gsm0808_speech_codec_from_chan_type(&sc, perm_spch);
+			sc.cfg = conn->assignment.req.s15_s0;
 			sc_ptr = ≻
 		}
 	}
@@ -382,6 +382,7 @@
 		.activ_for = FOR_ASSIGNMENT,
 		.for_conn = conn,
 		.chan_mode = req->chan_mode,
+		.s15_s0 = req->s15_s0,
 		.requires_voice_stream = conn->assignment.requires_voice_stream,
 		.msc_assigned_cic = req->msc_assigned_cic,
 		.old_lchan = conn->lchan,
diff --git a/src/osmo-bsc/codec_pref.c b/src/osmo-bsc/codec_pref.c
index c998e60..afecaa3 100644
--- a/src/osmo-bsc/codec_pref.c
+++ b/src/osmo-bsc/codec_pref.c
@@ -94,14 +94,18 @@
  * matches one of the permitted speech settings of the channel type element.
  * The matched permitted speech value is then also compared against the
  * speech codec list. (optional, only relevant for AoIP) */
-static bool test_codec_pref(const struct gsm0808_channel_type *ct,
-			    const struct gsm0808_speech_codec_list *scl, uint8_t perm_spch)
+static bool test_codec_pref(const struct gsm0808_speech_codec **sc_match,
+			    const struct gsm0808_speech_codec_list *scl,
+			    const struct gsm0808_channel_type *ct,
+			    uint8_t perm_spch)
 {
 	unsigned int i;
 	bool match = false;
 	struct gsm0808_speech_codec sc;
 	int rc;
 
+	*sc_match = NULL;
+
 	/* Try to find the given permitted speech value in the
 	 * codec list of the channel type element */
 	for (i = 0; i < ct->perm_spch_len; i++) {
@@ -129,8 +133,10 @@
 	/* Try to find extrapolated speech codec data in
 	 * the speech codec list */
 	for (i = 0; i < scl->len; i++) {
-		if (sc.type == scl->codec[i].type)
+		if (sc.type == scl->codec[i].type) {
+			*sc_match = &scl->codec[i];
 			return true;
+		}
 	}
 
 	return false;
@@ -168,40 +174,74 @@
 	return false;
 }
 
+/* Generate the bss supported amr configuration bits (S0-S15) */
+static uint16_t gen_bss_supported_amr_s15_s0(const struct bsc_msc_data *msc, const struct gsm_bts *bts, bool hr)
+{
+	const struct gsm48_multi_rate_conf *amr_cfg_bts;
+	const struct gsm48_multi_rate_conf *amr_cfg_msc;
+	uint16_t amr_s15_s0_bts;
+	uint16_t amr_s15_s0_msc;
+
+	/* Lookup the BTS specific AMR rate configuration. This config is set
+	 * via the VTY for each BTS individually. In cases where no configuration
+	 * is set we will assume a safe default */
+	if (hr) {
+		amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie;
+		amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, false);
+	} else {
+		amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie;
+		amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, true);
+	}
+
+	/* Lookup the AMR rate configuration that is set for the MSC */
+	amr_cfg_msc = &msc->amr_conf;
+	amr_s15_s0_msc = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_msc, true);
+
+	/* Calculate the intersection of the two configurations and update S0-S15
+	 * in the codec list. */
+	return amr_s15_s0_bts & amr_s15_s0_msc;
+}
+
 /*! Match the codec preferences from local config with a received codec preferences IEs received from the
  * MSC and the BTS' codec configuration.
  *  \param[out] chan_mode GSM 04.08 channel mode.
  *  \param[out] full_rate true if full-rate.
+ *  \param[out] s15_s0 codec configuration bits S15-S0 (AMR)
  *  \param[in] ct GSM 08.08 channel type received from MSC.
  *  \param[in] scl GSM 08.08 speech codec list received from MSC (optional).
- *  \param[in] audio_support List of allowed codecs as from local config.
- *  \param[in] audio_length Number of items in audio_support.
- *  \param[in] bts_codec BTS codec configuration.
+ *  \param[in] msc associated msc (current codec settings).
+ *  \param[in] bts associated bts (current codec settings).
  *  \returns 0 on success, -1 in case no match was found */
 int match_codec_pref(enum gsm48_chan_mode *chan_mode,
 		     bool *full_rate,
+		     uint16_t *s15_s0,
 		     const struct gsm0808_channel_type *ct,
 		     const struct gsm0808_speech_codec_list *scl,
-		     struct gsm_audio_support * const *audio_support,
-		     int audio_length,
-		     const struct bts_codec_conf *bts_codec)
+		     const struct bsc_msc_data *msc,
+		     const struct gsm_bts *bts)
 {
 	unsigned int i;
 	uint8_t perm_spch;
 	bool match = false;
+	const struct gsm0808_speech_codec *sc_match = NULL;
+	uint16_t amr_s15_s0_supported;
 
-	for (i = 0; i < audio_length; i++) {
+	/* Note: Normally the MSC should never try to advertise a codec that
+	 * we did not advertise as supported before. In order to ensure that
+	 * no unsupported codec is accepted, we make sure that the codec is
+	 * indeed available with the current BTS and MSC configuration */
+	for (i = 0; i < msc->audio_length; i++) {
 		/* Pick a permitted speech value from the global codec configuration list */
-		perm_spch = audio_support_to_gsm88(audio_support[i]);
+		perm_spch = audio_support_to_gsm88(msc->audio_support[i]);
 
 		/* Check this permitted speech value against the BTS specific parameters.
 		 * if the BTS does not support the codec, try the next one */
-		if (!test_codec_support_bts(bts_codec, perm_spch))
+		if (!test_codec_support_bts(&bts->codec, perm_spch))
 			continue;
 
 		/* Match the permitted speech value against the codec lists that were
 		 * advertised by the MS and the MSC */
-		if (test_codec_pref(ct, scl, perm_spch)) {
+		if (test_codec_pref(&sc_match, scl, ct, perm_spch)) {
 			match = true;
 			break;
 		}
@@ -211,6 +251,7 @@
 	if (!match) {
 		*full_rate = false;
 		*chan_mode = GSM48_CMODE_SIGN;
+		*s15_s0 = 0;
 		return -1;
 	}
 
@@ -240,6 +281,31 @@
 	/* Lookup a channel mode for the selected codec */
 	*chan_mode = gsm88_to_chan_mode(perm_spch);
 
+	/* Special handling for AMR */
+	if (perm_spch == GSM0808_PERM_HR3 || perm_spch == GSM0808_PERM_FR3) {
+		/* Normally the MSC should never try to advertise an AMR codec
+		 * configuration that we did not previously advertise as
+		 * supported. However, to ensure that no unsupported AMR codec
+		 * configuration enters the further processing steps we again
+		 * lookup what we support and generate an intersection. All
+		 * further processing is then done with this intersection
+		 * result */
+		amr_s15_s0_supported = gen_bss_supported_amr_s15_s0(msc, bts, (perm_spch == GSM0808_PERM_HR3));
+		if (sc_match)
+			*s15_s0 = sc_match->cfg & amr_s15_s0_supported;
+		else
+			*s15_s0 = amr_s15_s0_supported;
+
+		/* NOTE: The function test_codec_pref() will populate the
+		 * sc_match pointer from the searched speech codec list. For
+		 * AoIP based networks, no speech codec list will be present
+		 * and therefore no sc_match will be populated. For those
+		 * cases only the local configuration will influence s15_s0.
+		 * However s15_s0 is always populated with a meaningful value,
+		 * regardless if AoIP is in use or not. */
+	} else
+		*s15_s0 = 0;
+
 	return 0;
 }
 
@@ -254,11 +320,6 @@
 	uint8_t perm_spch;
 	unsigned int i;
 	int rc;
-	uint16_t amr_s15_s0_bts;
-	uint16_t amr_s15_s0_msc;
-	uint16_t amr_s15_s0;
-	const struct gsm48_multi_rate_conf *amr_cfg_bts;
-	const struct gsm48_multi_rate_conf *amr_cfg_msc;
 
 	memset(scl, 0, sizeof(*scl));
 
@@ -280,28 +341,8 @@
 		/* AMR (HR/FR version 3) is the only codec that requires a codec
 		 * configuration (S0-S15). Determine the current configuration and update
 		 * the cfg flag. */
-		if (msc->audio_support[i]->ver == 3) {
-
-			/* First lookup the BTS specific AMR rate configuration. Thsi config
-			 * is set via the VTY for each BTS individually. In cases where no
-			 * configuration is set we will assume a safe default */
-			if (msc->audio_support[i]->hr) {
-				amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie;
-				amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, false);
-			} else {
-				amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie;
-				amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, true);
-			}
-
-			/* At next, lookup the AMR rate configuration that is set for the MSC */
-			amr_cfg_msc = &msc->amr_conf;
-			amr_s15_s0_msc = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_msc, true);
-
-			/* Calculate the intersection of the two configurations and update S0-S15
-			 * in the codec list. */
-			amr_s15_s0 = amr_s15_s0_bts & amr_s15_s0_msc;
-			scl->codec[scl->len].cfg = amr_s15_s0;
-		}
+		if (msc->audio_support[i]->ver == 3)
+			scl->codec[scl->len].cfg = gen_bss_supported_amr_s15_s0(msc, bts, msc->audio_support[i]->hr);
 
 		scl->len++;
 	}
diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c
index 9d558bc..0ba5061 100644
--- a/src/osmo-bsc/handover_fsm.c
+++ b/src/osmo-bsc/handover_fsm.c
@@ -522,6 +522,7 @@
 	int match_idx;
 	enum gsm48_chan_mode mode;
 	bool full_rate;
+	uint16_t s15_s0;
 	struct osmo_fsm_inst *fi;
 
 	handover_fsm_alloc(conn);
@@ -560,8 +561,7 @@
 		       bts->nr, req->cell_id_target_name);
 
 		/* Figure out channel type */
-		if (match_codec_pref(&mode, &full_rate, &req->ct, &req->scl, msc->audio_support,
-				     msc->audio_length, &bts->codec)) {
+		if (match_codec_pref(&mode, &full_rate, &s15_s0, &req->ct, &req->scl, msc, bts)) {
 			LOG_HO(conn, LOGL_DEBUG,
 			       "BTS %u has no matching channel codec (%s, speech codec list len = %u)",
 			       bts->nr, gsm0808_channel_type_name(&req->ct), req->scl.len);
@@ -606,6 +606,7 @@
 		.activ_for = FOR_HANDOVER,
 		.for_conn = conn,
 		.chan_mode = mode,
+		.s15_s0 = s15_s0,
 		.requires_voice_stream = chan_mode_is_tch(mode),
 		.msc_assigned_cic = req->msc_assigned_cic,
 	};
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c
index c80d8a1..4aaedde 100644
--- a/src/osmo-bsc/lchan_fsm.c
+++ b/src/osmo-bsc/lchan_fsm.c
@@ -425,11 +425,48 @@
 	};
 }
 
+/* Mask all rates instead of the highest possible */
+static void lchan_mr_config_mask(struct gsm48_multi_rate_conf *mr_conf)
+{
+	unsigned int i;
+	bool highest_seen = false;
+	uint8_t *_mr_conf = (uint8_t *) mr_conf;
+
+	/* FIXME: At the moment we can not support multiple codec rates in one
+	 * struct gsm48_multi_rate_conf, because the struct lacks the fields
+	 * for Threshold and Hysteresis. Those fields are not needed when only
+	 * a single codec rate is in place, but as soon as multiple codec
+	 * rates are used the parameters are mandatory. The layout for the
+	 * struct would then also be different because each rate needs its
+	 * own Threshold and Hysteresis value. (See also 3GPP TS 04.08,
+	 * chapter 10.5.2.21aa MultiRate configuration).
+	 *
+	 * Since we are unable to signal multiple codec rates properly, we just
+	 * remove all codec rates from the active set, except the highest
+	 * possible. Doing so we lack the functionality to switch towards the
+	 * other, lower codec rates that were offered by the MSC, but it is
+	 * still guaranteed that a rate is selected that is supported by all
+	 * entities.
+	 *
+	 * To fix this problem, we should implement a proper encoder for
+	 * struct gsm48_multi_rate_conf, in libosmocore and use it here.
+	 * struct amr_mode already seems to have members for threshold and
+	 * hysteresis we can use. */
+
+	for (i = 7; i > 0; i--) {
+		if (_mr_conf[1] & (1 << i) && highest_seen == false) {
+			highest_seen = true;
+		} else if (highest_seen)
+			_mr_conf[1] &= ~(1 << i);
+	}
+}
+
 static void lchan_fsm_unused(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
 	struct lchan_activate_info *info = data;
 	struct gsm_lchan *lchan = lchan_fi_lchan(fi);
 	struct gsm_bts *bts = lchan->ts->trx->bts;
+	struct gsm48_multi_rate_conf mr_conf;
 
 	switch (event) {
 
@@ -469,8 +506,12 @@
 			 * - TA is still zero, to be determined by RACH. */
 		}
 
-		if (info->chan_mode == GSM48_CMODE_SPEECH_AMR)
-			lchan_mr_config(lchan, &info->for_conn->sccp.msc->amr_conf);
+		if (info->chan_mode == GSM48_CMODE_SPEECH_AMR) {
+			gsm48_mr_cfg_from_gsm0808_sc_cfg(&mr_conf, info->s15_s0);
+			/* FIXME: See above. */
+			lchan_mr_config_mask(&mr_conf);
+			lchan_mr_config(lchan, &mr_conf);
+		}
 
 		switch (info->chan_mode) {
 
diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c
index 97daa5c..537b851 100644
--- a/src/osmo-bsc/osmo_bsc_bssap.c
+++ b/src/osmo-bsc/osmo_bsc_bssap.c
@@ -603,6 +603,7 @@
 	uint16_t cic = 0;
 	enum gsm48_chan_mode chan_mode = GSM48_CMODE_SIGN;
 	bool full_rate = false;
+	uint16_t s15_s0 = 0;
 	bool aoip = false;
 	struct sockaddr_storage rtp_addr;
 	struct gsm0808_channel_type ct;
@@ -706,9 +707,8 @@
 
 		/* Match codec information from the assignment command against the
 		 * local preferences of the BSC and BTS */
-		rc = match_codec_pref(&chan_mode, &full_rate, &ct, &conn->codec_list,
-				      msc->audio_support, msc->audio_length,
-				      &conn_get_bts(conn)->codec);
+		rc = match_codec_pref(&chan_mode, &full_rate, &s15_s0, &ct, &conn->codec_list,
+				      msc, conn_get_bts(conn));
 		if (rc < 0) {
 			LOGP(DMSC, LOGL_ERROR, "No supported audio type found for channel_type ="
 			     " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch=[ %s] }\n",
@@ -730,6 +730,7 @@
 			.msc_assigned_cic = cic,
 			.chan_mode = chan_mode,
 			.full_rate = full_rate,
+			.s15_s0 = s15_s0
 		};
 		if (aoip) {
 			unsigned int rc = osmo_sockaddr_to_str_and_uint(req.msc_rtp_addr,
diff --git a/tests/codec_pref/codec_pref_test.c b/tests/codec_pref/codec_pref_test.c
index 20e3525..e2876e2 100644
--- a/tests/codec_pref/codec_pref_test.c
+++ b/tests/codec_pref/codec_pref_test.c
@@ -374,6 +374,7 @@
 	unsigned int i;
 	bool full_rate;
 	enum gsm48_chan_mode chan_mode;
+	uint16_t s15_s0;
 
 	printf("Determining channel mode and rate:\n");
 
@@ -398,8 +399,9 @@
 	printf("   codec->efr=%u\n", bts->codec.efr);
 	printf("   codec->amr=%u\n", bts->codec.amr);
 
-	rc = match_codec_pref(&chan_mode, &full_rate, ct, scl, msc->audio_support, msc->audio_length, &bts->codec);
-	printf(" * result: rc=%i, full_rate=%i, chan_mode=%s\n", rc, full_rate, gsm48_chan_mode_name(chan_mode));
+	rc = match_codec_pref(&chan_mode, &full_rate, &s15_s0, ct, scl, msc, bts);
+	printf(" * result: rc=%i, full_rate=%i, s15_s0=%04x, chan_mode=%s\n",
+	       rc, full_rate, s15_s0, gsm48_chan_mode_name(chan_mode));
 
 	printf("\n");
 
diff --git a/tests/codec_pref/codec_pref_test.ok b/tests/codec_pref/codec_pref_test.ok
index befc497..16d86ba 100644
--- a/tests/codec_pref/codec_pref_test.ok
+++ b/tests/codec_pref/codec_pref_test.ok
@@ -12,7 +12,7 @@
    codec->hr=0
    codec->efr=0
    codec->amr=0
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -26,7 +26,7 @@
    codec->hr=1
    codec->efr=0
    codec->amr=0
- * result: rc=0, full_rate=0, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -40,7 +40,7 @@
    codec->hr=0
    codec->efr=1
    codec->amr=0
- * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_EFR
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -54,7 +54,7 @@
    codec->hr=0
    codec->efr=0
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR
+ * result: rc=0, full_rate=1, s15_s0=57ff, chan_mode=SPEECH_AMR
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -68,7 +68,7 @@
    codec->hr=0
    codec->efr=0
    codec->amr=1
- * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR
+ * result: rc=0, full_rate=0, s15_s0=073f, chan_mode=SPEECH_AMR
 
 Determining channel mode and rate:
  * MS: speech codec list (2 items):
@@ -85,7 +85,7 @@
    codec->hr=1
    codec->efr=0
    codec->amr=0
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (3 items):
@@ -105,7 +105,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=0
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (3 items):
@@ -125,7 +125,7 @@
    codec->hr=0
    codec->efr=0
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -151,7 +151,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 ============== test_ms ==============
 
@@ -175,7 +175,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -197,7 +197,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=0, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -219,7 +219,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_EFR
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -241,7 +241,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR
+ * result: rc=0, full_rate=1, s15_s0=57ff, chan_mode=SPEECH_AMR
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -263,7 +263,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR
+ * result: rc=0, full_rate=0, s15_s0=073f, chan_mode=SPEECH_AMR
 
 Determining channel mode and rate:
  * MS: speech codec list (2 items):
@@ -286,7 +286,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (3 items):
@@ -310,7 +310,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (3 items):
@@ -334,7 +334,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -360,7 +360,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 ============== test_ct ==============
 
@@ -384,7 +384,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -406,7 +406,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=0, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -428,7 +428,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_EFR
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -450,7 +450,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR
+ * result: rc=0, full_rate=1, s15_s0=57ff, chan_mode=SPEECH_AMR
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -472,7 +472,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR
+ * result: rc=0, full_rate=0, s15_s0=073f, chan_mode=SPEECH_AMR
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -495,7 +495,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -519,7 +519,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -543,7 +543,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -569,7 +569,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 ============== test_msc ==============
 
@@ -597,7 +597,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -623,7 +623,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -649,7 +649,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -675,7 +675,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -701,7 +701,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -727,7 +727,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -753,7 +753,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -779,7 +779,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -805,7 +805,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 ============== test_selected_working ==============
 
@@ -826,7 +826,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -843,7 +843,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -860,7 +860,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=0, full_rate=0, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (3 items):
@@ -879,7 +879,7 @@
    codec->hr=0
    codec->efr=0
    codec->amr=1
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -896,7 +896,7 @@
    codec->hr=0
    codec->efr=1
    codec->amr=0
- * result: rc=0, full_rate=1, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -913,7 +913,7 @@
    codec->hr=1
    codec->efr=0
    codec->amr=0
- * result: rc=0, full_rate=0, chan_mode=SPEECH_V1
+ * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1
 
 ============== test_selected_non_working ==============
 
@@ -932,7 +932,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=-1, full_rate=0, chan_mode=SIGNALLING
+ * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -949,7 +949,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=-1, full_rate=0, chan_mode=SIGNALLING
+ * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -965,7 +965,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=-1, full_rate=0, chan_mode=SIGNALLING
+ * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -981,7 +981,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=-1, full_rate=0, chan_mode=SIGNALLING
+ * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING
 
 Determining channel mode and rate:
  * MS: speech codec list (1 items):
@@ -996,7 +996,7 @@
    codec->hr=1
    codec->efr=1
    codec->amr=1
- * result: rc=-1, full_rate=0, chan_mode=SIGNALLING
+ * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING
 
 Determining channel mode and rate:
  * MS: speech codec list (5 items):
@@ -1016,7 +1016,7 @@
    codec->hr=0
    codec->efr=0
    codec->amr=1
- * result: rc=-1, full_rate=0, chan_mode=SIGNALLING
+ * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING
 
 ============== test_gen_bss_supp_codec_list_cfgs ==============
 

-- 
To view, visit https://gerrit.osmocom.org/11060
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I2d8ded51b3eb4c003fe2da6f2d6f48d001b73737
Gerrit-Change-Number: 11060
Gerrit-PatchSet: 10
Gerrit-Owner: dexter <pmaier at sysmocom.de>
Gerrit-Assignee: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder (1000002)
Gerrit-CC: Neels Hofmeyr <nhofmeyr at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181005/f75eef0b/attachment.htm>


More information about the gerrit-log mailing list