fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/30399 )
Change subject: mobile: rework gsm_recv_voice(), add AUDIO_IOH_MNCC_SOCK ......................................................................
mobile: rework gsm_recv_voice(), add AUDIO_IOH_MNCC_SOCK
Do not send voice frames to the external MNCC unconditionally. Add a new I/O handler type for the external MNCC application.
Change-Id: I406b169963e6654110329d741728fa12c8c8eeec Related: OS#5599 --- M src/host/layer23/include/osmocom/bb/mobile/settings.h M src/host/layer23/src/mobile/gsm48_rr.c M src/host/layer23/src/mobile/settings.c M src/host/layer23/src/mobile/voice.c M src/host/layer23/src/mobile/vty_interface.c 5 files changed, 36 insertions(+), 7 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/99/30399/1
diff --git a/src/host/layer23/include/osmocom/bb/mobile/settings.h b/src/host/layer23/include/osmocom/bb/mobile/settings.h index 8edde53..27b9f5a 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/settings.h +++ b/src/host/layer23/include/osmocom/bb/mobile/settings.h @@ -19,6 +19,8 @@ AUDIO_IOH_NONE = 0, /* L1 PHY (e.g. Calypso DSP) */ AUDIO_IOH_L1PHY, + /* External MNCC app (via MNCC socket) */ + AUDIO_IOH_MNCC_SOCK, /* Return to sender */ AUDIO_IOH_LOOPBACK, }; diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index 08242ee..65b021a 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -5620,6 +5620,7 @@ case AUDIO_IOH_L1PHY: rr->audio_mode = AUDIO_RX_SPEAKER | AUDIO_TX_MICROPHONE; break; + case AUDIO_IOH_MNCC_SOCK: case AUDIO_IOH_LOOPBACK: rr->audio_mode = AUDIO_RX_TRAFFIC_IND | AUDIO_TX_TRAFFIC_REQ; break; diff --git a/src/host/layer23/src/mobile/settings.c b/src/host/layer23/src/mobile/settings.c index 10e9984..7627c11 100644 --- a/src/host/layer23/src/mobile/settings.c +++ b/src/host/layer23/src/mobile/settings.c @@ -204,6 +204,7 @@ const struct value_string audio_io_handler_names[] = { { AUDIO_IOH_NONE, "none" }, { AUDIO_IOH_L1PHY, "l1phy" }, + { AUDIO_IOH_MNCC_SOCK, "mncc-sock" }, { AUDIO_IOH_LOOPBACK, "loopback" }, { 0x00, NULL} }; diff --git a/src/host/layer23/src/mobile/voice.c b/src/host/layer23/src/mobile/voice.c index 1e664dc..5833cad 100644 --- a/src/host/layer23/src/mobile/voice.c +++ b/src/host/layer23/src/mobile/voice.c @@ -25,8 +25,8 @@ #include <osmocom/bb/mobile/mncc.h> #include <osmocom/bb/mobile/voice.h>
-/* Receive a Downlink voice frame from the lower layers */ -static int gsm_recv_voice(struct osmocom_ms *ms, struct msgb *msg) +/* Forward a Downlink voice frame to the external MNCC handler */ +static int gsm_forward_mncc(struct osmocom_ms *ms, struct msgb *msg) { struct gsm_data_frame *mncc;
@@ -50,10 +50,6 @@ goto exit_free; }
- /* send voice frame back, if appropriate */ - if (ms->settings.audio.io_handler == AUDIO_IOH_LOOPBACK) - gsm_send_voice_frame(ms, mncc); - /* distribute and then free */ if (ms->mncc_entity.mncc_recv && ms->mncc_entity.ref) { ms->mncc_entity.mncc_recv(ms, mncc->msg_type, mncc); @@ -64,6 +60,24 @@ return 0; }
+/* Receive a Downlink voice frame from the lower layers */ +static int gsm_recv_voice(struct osmocom_ms *ms, struct msgb *msg) +{ + switch (ms->settings.audio.io_handler) { + case AUDIO_IOH_LOOPBACK: + /* Send voice frame back */ + return gsm_send_voice_msg(ms, msg); + case AUDIO_IOH_MNCC_SOCK: + return gsm_forward_mncc(ms, msg); + case AUDIO_IOH_L1PHY: + case AUDIO_IOH_NONE: + /* Drop voice frame */ + msgb_free(msg); + } + + return 0; +} + /* Send an Uplink voice frame to the lower layers */ int gsm_send_voice_msg(struct osmocom_ms *ms, struct msgb *msg) { diff --git a/src/host/layer23/src/mobile/vty_interface.c b/src/host/layer23/src/mobile/vty_interface.c index e3005ca..a94f96b 100644 --- a/src/host/layer23/src/mobile/vty_interface.c +++ b/src/host/layer23/src/mobile/vty_interface.c @@ -2831,13 +2831,24 @@ }
DEFUN(cfg_ms_audio_io_handler, cfg_ms_audio_io_handler_cmd, - "io-handler (none|l1phy|loopback)", + "io-handler (none|l1phy|mncc-sock|loopback)", "Set TCH frame I/O handler\n" "No handler, drop TCH frames (default)\n" "L1 PHY (e.g. Calypso DSP in Motorola C1xx phones)\n" + "External MNCC application (e.g. LCR) via MNCC socket\n" "Return TCH frame payload back to sender\n") { + struct osmocom_ms *ms = (struct osmocom_ms *) vty->index; int val = get_string_value(audio_io_handler_names, argv[0]); + + if (val == AUDIO_IOH_MNCC_SOCK) { + if (ms->settings.mncc_handler != MNCC_HANDLER_INTERNAL) { + vty_out(vty, "Audio I/O handler 'mncc-sock' can only be used " + "with MNCC handler 'external'%s", VTY_NEWLINE); + return CMD_WARNING; + } + } + return set_audio_io_handler(vty, val); }