fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmocom-bb/+/35740?usp=email )
Change subject: mobile: set TRAFFIC.{ind,req} mode during call establishment
......................................................................
mobile: set TRAFFIC.{ind,req} mode during call establishment
Now that we support data (CSD) calls in addition to voice calls,
we can no longer initialize the TRAFFIC.{ind,req} routing mode
in gsm48_rr_init(). We need to apply the appropriate TCH routing
mode *during call establishment* based on its type and the
configured I/O handler type.
After this patch, one can have the following configuration:
tch-voice
io-handler l1phy
tch-data
io-handler unix-sock
io-tch-format ti
so that the io-handler setting for voice would not affect data calls.
Before this patch, the L1 PHY (specifically, Calypso firmware) would
not route TRAFFIC.{ind,req} during data calls at all.
Change-Id: Iab68cb47c28380a9c1efc149c6196ea54f75fdb8
Related: OS#4396
---
M src/host/layer23/src/mobile/gsm48_rr.c
M src/host/layer23/src/mobile/tch.c
M src/host/layer23/src/mobile/tch_data.c
M src/host/layer23/src/mobile/tch_voice.c
4 files changed, 58 insertions(+), 27 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/40/35740/1
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c
b/src/host/layer23/src/mobile/gsm48_rr.c
index 4d879d6..83287c1 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -6996,20 +6996,7 @@
start_rr_t_meas(rr, 1, 0);
rr->tch_loop_mode = L1CTL_TCH_LOOP_OPEN;
-
- /* Configure audio handling in the L1PHY */
- switch (ms->settings.tch_voice.io_handler) {
- case TCH_VOICE_IOH_L1PHY:
- rr->audio_mode = AUDIO_RX_SPEAKER | AUDIO_TX_MICROPHONE;
- break;
- case TCH_VOICE_IOH_MNCC_SOCK:
- case TCH_VOICE_IOH_LOOPBACK:
- case TCH_VOICE_IOH_GAPK:
- rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ;
- break;
- case TCH_VOICE_IOH_NONE:
- rr->audio_mode = 0x00;
- }
+ rr->audio_mode = 0x00; /* set in tch_{voice,data}_state_init() */
/* List of notifications about ongoing ASCI calls */
INIT_LLIST_HEAD(&rr->vgcs.notif_list);
@@ -7126,9 +7113,6 @@
struct gsm48_rrlayer *rr = &ms->rrlayer;
uint8_t ch_type, ch_subch, ch_ts;
- if (ms->settings.tch_voice.io_handler != TCH_VOICE_IOH_NONE)
- return 0;
-
LOGP(DRR, LOGL_INFO, "setting audio mode to %d\n", mode);
rr->audio_mode = mode;
diff --git a/src/host/layer23/src/mobile/tch.c b/src/host/layer23/src/mobile/tch.c
index d5dda2e..5b59b79 100644
--- a/src/host/layer23/src/mobile/tch.c
+++ b/src/host/layer23/src/mobile/tch.c
@@ -122,8 +122,9 @@
static void tch_trans_cstate_active_cb(struct gsm_trans *trans)
{
struct osmocom_ms *ms = trans->ms;
+ const struct gsm48_rrlayer *rr = &ms->rrlayer;
+ const struct gsm48_rr_cd *cd = &rr->cd_now;
struct tch_state *state;
- enum gsm48_chan_mode ch_mode;
if (ms->tch_state != NULL)
return; /* TODO: handle modify? */
@@ -132,8 +133,7 @@
OSMO_ASSERT(state != NULL);
ms->tch_state = state;
- ch_mode = ms->rrlayer.cd_now.mode;
- switch (ch_mode) {
+ switch (cd->mode) {
case GSM48_CMODE_SPEECH_V1:
case GSM48_CMODE_SPEECH_EFR:
case GSM48_CMODE_SPEECH_AMR:
@@ -154,12 +154,15 @@
case GSM48_CMODE_SIGN:
default:
LOGP(DL1C, LOGL_ERROR, "Unhandled channel mode %s\n",
- get_value_string(gsm48_chan_mode_names, ch_mode));
+ get_value_string(gsm48_chan_mode_names, cd->mode));
exit_free:
talloc_free(state);
ms->tch_state = NULL;
return;
}
+
+ /* rr->audio_mode has been set by tch_{voice,data}_state_init(), apply it */
+ gsm48_rr_audio_mode(ms, rr->audio_mode);
}
static void tch_trans_free_cb(struct gsm_trans *trans)
@@ -173,6 +176,7 @@
tch_voice_state_free(&state->voice);
else
tch_data_state_free(&state->data);
+ ms->rrlayer.audio_mode = 0x00;
talloc_free(state);
ms->tch_state = NULL;
diff --git a/src/host/layer23/src/mobile/tch_data.c
b/src/host/layer23/src/mobile/tch_data.c
index c93c828..6e7eb0e 100644
--- a/src/host/layer23/src/mobile/tch_data.c
+++ b/src/host/layer23/src/mobile/tch_data.c
@@ -36,6 +36,8 @@
#include <osmocom/bb/mobile/transaction.h>
#include <osmocom/bb/mobile/tch.h>
+#include <l1ctl_proto.h>
+
struct csd_v110_frame_desc {
uint16_t num_blocks;
uint16_t num_bits;
@@ -495,6 +497,7 @@
struct tch_data_state *state)
{
struct osmocom_ms *ms = trans->ms;
+ struct gsm48_rrlayer *rr = &ms->rrlayer;
const struct gsm_mncc_bearer_cap *bcap = trans->cc.bcap;
int rc;
@@ -506,13 +509,13 @@
state->sock = tch_csd_sock_init(ms);
if (state->sock == NULL)
return -ENOMEM;
+ rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ;
break;
case TCH_DATA_IOH_LOOPBACK:
case TCH_DATA_IOH_NONE:
+ rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ;
/* we don't need V.110 TA / soft-UART */
return 0;
- default:
- break;
}
if (bcap->data.async) {
diff --git a/src/host/layer23/src/mobile/tch_voice.c
b/src/host/layer23/src/mobile/tch_voice.c
index f4bbcfa..a85d7dc 100644
--- a/src/host/layer23/src/mobile/tch_voice.c
+++ b/src/host/layer23/src/mobile/tch_voice.c
@@ -34,6 +34,8 @@
#include <osmocom/bb/mobile/transaction.h>
#include <osmocom/bb/mobile/tch.h>
+#include <l1ctl_proto.h>
+
/* Forward a Downlink voice frame to the external MNCC handler */
static int tch_forward_mncc(struct osmocom_ms *ms, struct msgb *msg)
{
@@ -119,11 +121,19 @@
int tch_voice_state_init(struct gsm_trans *trans, struct tch_voice_state *state)
{
-#ifdef WITH_GAPK_IO
struct osmocom_ms *ms = trans->ms;
- const struct gsm48_rr_cd *cd = &ms->rrlayer.cd_now;
+ struct gsm48_rrlayer *rr = &ms->rrlayer;
+ const struct gsm48_rr_cd *cd = &rr->cd_now;
switch (state->handler) {
+ case TCH_VOICE_IOH_L1PHY:
+ rr->audio_mode = AUDIO_RX_SPEAKER | AUDIO_TX_MICROPHONE;
+ break;
+ case TCH_VOICE_IOH_MNCC_SOCK:
+ case TCH_VOICE_IOH_LOOPBACK:
+ rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ;
+ break;
+#ifdef WITH_GAPK_IO
case TCH_VOICE_IOH_GAPK:
if ((cd->chan_nr & RSL_CHAN_NR_MASK) == RSL_CHAN_Bm_ACCHs)
state->gapk_io = gapk_io_state_alloc_mode_rate(ms, cd->mode, true);
@@ -131,11 +141,13 @@
state->gapk_io = gapk_io_state_alloc_mode_rate(ms, cd->mode, false);
if (state->gapk_io == NULL)
return -1;
+ rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ;
break;
- default:
+#endif
+ case TCH_VOICE_IOH_NONE:
+ rr->audio_mode = 0x00;
break;
}
-#endif
return 0;
}
--
To view, visit
https://gerrit.osmocom.org/c/osmocom-bb/+/35740?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: Iab68cb47c28380a9c1efc149c6196ea54f75fdb8
Gerrit-Change-Number: 35740
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange