fixeria has uploaded this change for review.

View Change

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);
}


To view, visit change 30399. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I406b169963e6654110329d741728fa12c8c8eeec
Gerrit-Change-Number: 30399
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de>
Gerrit-MessageType: newchange