aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2012-04-07 13:25:47 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2012-04-11 20:15:54 +0200
commita5dcdd9a9ae1d55ef49cd74d78e4406180aab0d9 (patch)
treec19fbb26f15a1dd97bc6280b4be2c031b01856e4 /openbsc
parent5d52c97cff618e5763d38c267939b823e397a612 (diff)
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.
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/libbsc/bsc_api.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/openbsc/src/libbsc/bsc_api.c b/openbsc/src/libbsc/bsc_api.c
index 9d301f002..95b418b4f 100644
--- a/openbsc/src/libbsc/bsc_api.c
+++ b/openbsc/src/libbsc/bsc_api.c
@@ -311,19 +311,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, etc. This also assumes that the
+ * type of the lchan is either a TCH or a 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, make it 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 {