aboutsummaryrefslogtreecommitdiffstats
path: root/src/libbsc/bsc_api.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-03-21 22:11:32 +0100
committerHarald Welte <laforge@gnumonks.org>2018-03-22 15:15:12 +0000
commitead291aaf2bbbea3a853ef02008f88fe4c001db0 (patch)
tree69095987a9cfc7a3daa3a873794f58f8af59c039 /src/libbsc/bsc_api.c
parent6900f8123611fc4667ba42c25a03abf96e697aa7 (diff)
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
Diffstat (limited to 'src/libbsc/bsc_api.c')
-rw-r--r--src/libbsc/bsc_api.c93
1 files changed, 2 insertions, 91 deletions
diff --git a/src/libbsc/bsc_api.c b/src/libbsc/bsc_api.c
index 748245342..142efef02 100644
--- a/src/libbsc/bsc_api.c
+++ b/src/libbsc/bsc_api.c
@@ -50,89 +50,6 @@ static void handle_release(struct gsm_subscriber_connection *conn, struct bsc_ap
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 @@ static void handle_ass_compl(struct gsm_subscriber_connection *conn,
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 @@ static void dispatch_dtap(struct gsm_subscriber_connection *conn,
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: