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 <[email protected]>
Gerrit-MessageType: newchange

Reply via email to