From 249130c6b2ce253ee035908efb396643eb47a9d9 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 7 Apr 2012 13:25:47 +0200 Subject: bsc: Allow to run a mixed TCH/H, TCH/F configuration In case the call handling starts on a TCH/H switch to a TCH/F if fullrate is requested. Add a method that is used to determine if the mode and current channel are compatible with each other. --- openbsc/src/libbsc/bsc_api.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'openbsc/src') diff --git a/openbsc/src/libbsc/bsc_api.c b/openbsc/src/libbsc/bsc_api.c index db79eb6bc..72d5fbe8f 100644 --- a/openbsc/src/libbsc/bsc_api.c +++ b/openbsc/src/libbsc/bsc_api.c @@ -313,19 +313,37 @@ int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, } } +/* + * \brief Check if the given channel is compatible with the mode/fullrate + * + * NOTE: This code is only written with TCH/F and TCH/H in mind. This means + * that it will not work for CSD, handover. This also assume that the lchan + * is either TCH or SDCCH. + */ +static int chan_compat_with_mode(struct gsm_lchan *lchan, int chan_mode, int full_rate) +{ + if (lchan->type == GSM_LCHAN_SDCCH) + return 1; + if (full_rate && lchan->type != GSM_LCHAN_TCH_F) + return 1; + + return 0; +} + /** * Send a GSM08.08 Assignment Request. Right now this does not contain the * audio codec type or the allowed rates for the config. It is assumed that - * this is for audio handling and that when we have a TCH it is capable of - * handling the audio codec. In case AMR is used we will leave the multi - * rate configuration to someone else. + * this is for audio handling only. In case the current channel does not allow + * the selected mode a new one will be allocated. + * + * TODO: add multirate configuration, work for more than audio. */ int gsm0808_assign_req(struct gsm_subscriber_connection *conn, int chan_mode, int full_rate) { struct bsc_api *api; api = conn->bts->network->bsc_api; - if (conn->lchan->type == GSM_LCHAN_SDCCH) { + if (chan_compat_with_mode(conn->lchan, chan_mode, full_rate) != 0) { if (handle_new_assignment(conn, chan_mode, full_rate) != 0) goto error; } else { -- cgit v1.2.3