[PATCH] osmo-bsc[master]: bssmap: State correct speech codec in ASSIGNMENT COMPLETE

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
Thu Mar 22 08:06:22 UTC 2018


Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/7434

to look at the new patch set (#3).

bssmap: State correct speech codec in ASSIGNMENT COMPLETE

Correctly compute the TS 48.008 "speech mode" (codec) for AMR on TCH/F.

There are way too many different ways how to express a given voice
codec.  There are two different schemes in TS 48.008 alone, plus one
on TS 48.058 and one in 04.08 / 44.018.  Let's avoid unneeded
conversion (that we might get wrong) and avoid storing information in
a sub-struct of the lchan if we can simply derive it from the lchan
at the time we need it.

Also, move BSSAP related encoding/conversion functions closer to the
user (osmo_bsc_bssap), rather than in libbsc.

Without this patch, TCH/F with AMR was erroneously reported as TCH/H
with AMR in the BSSMAP ASSIGNMENT COMPLETE.  After this patch, it's
reported correctly.

Change-Id: I6feebfae77fdc93a7ce333a25dd9b9267c5a4a2e
Related: OS#3094
Related: OS#3095
Related: OS#3096
---
M include/osmocom/bsc/bsc_api.h
M include/osmocom/bsc/gsm_data.h
M src/libbsc/bsc_api.c
M src/libbsc/bsc_subscr_conn_fsm.c
M src/osmo-bsc/osmo_bsc_api.c
5 files changed, 91 insertions(+), 110 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/34/7434/3

diff --git a/include/osmocom/bsc/bsc_api.h b/include/osmocom/bsc/bsc_api.h
index 01f90b1..06f8093 100644
--- a/include/osmocom/bsc/bsc_api.h
+++ b/include/osmocom/bsc/bsc_api.h
@@ -21,9 +21,7 @@
 	void (*dtap)(struct gsm_subscriber_connection *conn, uint8_t link_id,
 			struct msgb *msg);
 	/*! \brief BSC->MSC: Assignment of lchan successful */
-	void (*assign_compl)(struct gsm_subscriber_connection *conn,
-			  uint8_t rr_cause, uint8_t chosen_channel,
-			  uint8_t encr_alg_id, uint8_t speech_mode);
+	void (*assign_compl)(struct gsm_subscriber_connection *conn, uint8_t rr_cause);
 	/*! \brief BSC->MSC: Assignment of lchan failed */
 	void (*assign_fail)(struct gsm_subscriber_connection *conn,
 			 uint8_t cause, uint8_t *rr_cause);
@@ -45,9 +43,6 @@
 	/** Callback for additional actions during conn cleanup */
 	void (*conn_cleanup)(struct gsm_subscriber_connection *conn);
 };
-
-uint8_t lchan_to_chosen_channel(struct gsm_lchan *lchan);
-uint8_t chan_mode_to_speech(struct gsm_lchan *lchan);
 
 int bsc_api_init(struct gsm_network *network, struct bsc_api *api);
 int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id, int allow_sacch);
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 82a5a51..f743e9c 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -416,9 +416,6 @@
 		 * assignment completed message */
 		struct {
 			uint8_t rr_cause;
-			uint8_t chosen_channel;
-			uint8_t encr_alg_id;
-			uint8_t speech_mode;
 			bool valid;
 		} ass_compl;
 	} abis_ip;
diff --git a/src/libbsc/bsc_api.c b/src/libbsc/bsc_api.c
index 7482453..142efef 100644
--- a/src/libbsc/bsc_api.c
+++ b/src/libbsc/bsc_api.c
@@ -50,89 +50,6 @@
 static void handle_chan_ack(struct gsm_subscriber_connection *conn, struct bsc_api *bsc, struct  gsm_lchan *lchan);
 static void handle_chan_nack(struct gsm_subscriber_connection *conn, struct bsc_api *bsc, struct  gsm_lchan *lchan);
 
-/* GSM 08.08 3.2.2.33 */
-uint8_t lchan_to_chosen_channel(struct gsm_lchan *lchan)
-{
-	uint8_t channel_mode = 0, channel = 0;
-
-	switch (lchan->tch_mode) {
-	case GSM48_CMODE_SPEECH_V1:
-	case GSM48_CMODE_SPEECH_EFR:
-	case GSM48_CMODE_SPEECH_AMR:
-		channel_mode = 0x9;
-		break;
-	case GSM48_CMODE_SIGN:
-		channel_mode = 0x8;
-		break;
-	case GSM48_CMODE_DATA_14k5:
-		channel_mode = 0xe;
-		break;
-	case GSM48_CMODE_DATA_12k0:
-		channel_mode = 0xb;
-		break;
-	case GSM48_CMODE_DATA_6k0:
-		channel_mode = 0xc;
-		break;
-	case GSM48_CMODE_DATA_3k6:
-		channel_mode = 0xd;
-		break;
-	}
-
-	switch (lchan->type) {
-	case GSM_LCHAN_NONE:
-		channel = 0x0;
-		break;
-	case GSM_LCHAN_SDCCH:
-		channel = 0x1;
-		break;
-	case GSM_LCHAN_TCH_F:
-		channel = 0x8;
-		break;
-	case GSM_LCHAN_TCH_H:
-		channel = 0x9;
-		break;
-	case GSM_LCHAN_UNKNOWN:
-	default:
-		LOGP(DMSC, LOGL_ERROR, "Unknown lchan type: %p\n", lchan);
-		break;
-	}
-
-	return channel_mode << 4 | channel;
-}
-
-uint8_t chan_mode_to_speech(struct gsm_lchan *lchan)
-{
-	int mode = 0;
-
-	switch (lchan->tch_mode) {
-	case GSM48_CMODE_SPEECH_V1:
-		mode = 1;
-		break;
-	case GSM48_CMODE_SPEECH_EFR:
-		mode = 0x11;
-		break;
-	case GSM48_CMODE_SPEECH_AMR:
-		mode = 0x21;
-		break;
-	case GSM48_CMODE_SIGN:
-	case GSM48_CMODE_DATA_14k5:
-	case GSM48_CMODE_DATA_12k0:
-	case GSM48_CMODE_DATA_6k0:
-	case GSM48_CMODE_DATA_3k6:
-	default:
-		LOGP(DMSC, LOGL_ERROR, "Using non speech mode: %d\n", mode);
-		return 0;
-		break;
-	}
-
-	/* assume to always do AMR HR on any TCH type */
-	if (lchan->type == GSM_LCHAN_TCH_H ||
-	    lchan->tch_mode == GSM48_CMODE_SPEECH_AMR)
-		mode |= 0x4;
-
-        return mode;
-}
-
 /*! \brief Determine and apply AMR multi-rate configuration to lchan
  *  Determine which AMR multi-rate configuration to use and apply it to
  *  the lchan (so it can be communicated to BTS and MS during channel
@@ -470,10 +387,7 @@
 	if (is_ipaccess_bts(conn_get_bts(conn)) && conn->lchan->tch_mode != GSM48_CMODE_SIGN)
 		rsl_ipacc_crcx(conn->lchan);
 
-	api->assign_compl(conn, gh->data[0],
-			  lchan_to_chosen_channel(conn->lchan),
-			  conn->lchan->encr.alg_id,
-			  chan_mode_to_speech(conn->lchan));
+	api->assign_compl(conn, gh->data[0]);
 }
 
 static void handle_ass_fail(struct gsm_subscriber_connection *conn,
@@ -673,10 +587,7 @@
 						 GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE,
 						 NULL);
 			} else if (rc >= 0) {
-				api->assign_compl(conn, 0,
-						  lchan_to_chosen_channel(conn->lchan),
-						  conn->lchan->encr.alg_id,
-						  chan_mode_to_speech(conn->lchan));
+				api->assign_compl(conn, 0);
 			}
 			break;
 		case GSM48_MT_RR_CLSM_CHG:
diff --git a/src/libbsc/bsc_subscr_conn_fsm.c b/src/libbsc/bsc_subscr_conn_fsm.c
index a2b818b..d1baccc 100644
--- a/src/libbsc/bsc_subscr_conn_fsm.c
+++ b/src/libbsc/bsc_subscr_conn_fsm.c
@@ -145,12 +145,95 @@
 		LOGPFSML(fi, LOGL_ERROR, "Unable to deliver SCCP message!\n");
 }
 
+
+/* See TS 48.008 3.2.2.11 Channel Type Octet 5 */
+static int bssap_speech_from_lchan(const struct gsm_lchan *lchan)
+{
+	switch (lchan->type) {
+	case GSM_LCHAN_TCH_H:
+		switch (lchan->tch_mode) {
+		case GSM48_CMODE_SPEECH_V1:
+			return 0x05;
+		case GSM48_CMODE_SPEECH_AMR:
+			return 0x25;
+		default:
+			return -1;
+		}
+		break;
+	case GSM_LCHAN_TCH_F:
+		switch (lchan->tch_mode) {
+		case GSM48_CMODE_SPEECH_V1:
+			return 0x01;
+		case GSM48_CMODE_SPEECH_EFR:
+			return 0x11;
+		case GSM48_CMODE_SPEECH_AMR:
+			return 0x21;
+		default:
+			return -1;
+		}
+		break;
+	default:
+		return -1;
+	}
+}
+
+/* GSM 08.08 3.2.2.33 */
+static uint8_t lchan_to_chosen_channel(struct gsm_lchan *lchan)
+{
+	uint8_t channel_mode = 0, channel = 0;
+
+	switch (lchan->tch_mode) {
+	case GSM48_CMODE_SPEECH_V1:
+	case GSM48_CMODE_SPEECH_EFR:
+	case GSM48_CMODE_SPEECH_AMR:
+		channel_mode = 0x9;
+		break;
+	case GSM48_CMODE_SIGN:
+		channel_mode = 0x8;
+		break;
+	case GSM48_CMODE_DATA_14k5:
+		channel_mode = 0xe;
+		break;
+	case GSM48_CMODE_DATA_12k0:
+		channel_mode = 0xb;
+		break;
+	case GSM48_CMODE_DATA_6k0:
+		channel_mode = 0xc;
+		break;
+	case GSM48_CMODE_DATA_3k6:
+		channel_mode = 0xd;
+		break;
+	}
+
+	switch (lchan->type) {
+	case GSM_LCHAN_NONE:
+		channel = 0x0;
+		break;
+	case GSM_LCHAN_SDCCH:
+		channel = 0x1;
+		break;
+	case GSM_LCHAN_TCH_F:
+		channel = 0x8;
+		break;
+	case GSM_LCHAN_TCH_H:
+		channel = 0x9;
+		break;
+	case GSM_LCHAN_UNKNOWN:
+	default:
+		LOGP(DMSC, LOGL_ERROR, "Unknown lchan type: %p\n", lchan);
+		break;
+	}
+
+	return channel_mode << 4 | channel;
+}
+
 /* Generate and send assignment complete message */
 static void send_ass_compl(struct gsm_lchan *lchan, struct osmo_fsm_inst *fi)
 {
 	struct msgb *resp;
 	struct gsm0808_speech_codec sc;
 	struct gsm_subscriber_connection *conn;
+	int perm_spch = bssap_speech_from_lchan(lchan);
 
 	conn = lchan->conn;
 
@@ -160,13 +243,13 @@
 	LOGPFSML(fi, LOGL_DEBUG, "Sending assignment complete message... (id=%i)\n", conn->sccp.conn_id);
 
 	/* Extrapolate speech codec from speech mode */
-	gsm0808_speech_codec_from_chan_type(&sc, lchan->abis_ip.ass_compl.speech_mode);
+	gsm0808_speech_codec_from_chan_type(&sc, perm_spch);
+	/* FIXME: AMR codec configuration must be derived from lchan1! */
 
 	/* Generate message */
 	resp = gsm0808_create_ass_compl(lchan->abis_ip.ass_compl.rr_cause,
-					lchan->abis_ip.ass_compl.chosen_channel,
-					lchan->abis_ip.ass_compl.encr_alg_id,
-					lchan->abis_ip.ass_compl.speech_mode,
+					lchan_to_chosen_channel(lchan),
+					lchan->encr.alg_id, perm_spch,
 					&conn->user_plane.aoip_rtp_addr_local, &sc, NULL);
 
 	if (!resp) {
diff --git a/src/osmo-bsc/osmo_bsc_api.c b/src/osmo-bsc/osmo_bsc_api.c
index 40c06dd..9c519a4 100644
--- a/src/osmo-bsc/osmo_bsc_api.c
+++ b/src/osmo-bsc/osmo_bsc_api.c
@@ -410,17 +410,12 @@
 	osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_MO_DTAP, msg);
 }
 
-static void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause,
-			     uint8_t chosen_channel, uint8_t encr_alg_id,
-			     uint8_t speech_model)
+static void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause)
 {
 	if (!msc_connected(conn))
 		return;
 
 	conn->lchan->abis_ip.ass_compl.rr_cause = rr_cause;
-	conn->lchan->abis_ip.ass_compl.chosen_channel = chosen_channel;
-	conn->lchan->abis_ip.ass_compl.encr_alg_id = encr_alg_id;
-	conn->lchan->abis_ip.ass_compl.speech_mode = speech_model;
 
 	if (is_ipaccess_bts(conn_get_bts(conn)) && conn->user_plane.rtp_ip) {
 		/* NOTE: In a network that makes use of an IPA base station

-- 
To view, visit https://gerrit.osmocom.org/7434
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I6feebfae77fdc93a7ce333a25dd9b9267c5a4a2e
Gerrit-PatchSet: 3
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list