mobile: add missing TCH MNCC messages and handle them

Change-Id: I28a1ae1ed504748c33c64c86ca7d57a94c7c7c6d
Related: OS#5599
This commit is contained in:
Vadim Yanitskiy 2022-11-30 21:24:43 +07:00
parent 7304b1720d
commit 290ea6b7fa
4 changed files with 25 additions and 8 deletions

View File

@ -104,6 +104,9 @@ struct gsm_call {
#define GSM_TCHF_FRAME 0x0300
#define GSM_TCHF_FRAME_EFR 0x0301
#define GSM_TCHH_FRAME 0x0302
#define GSM_TCH_FRAME_AMR 0x0303
#define GSM_BAD_FRAME 0x03ff
#define GSM_MAX_FACILITY 128
#define GSM_MAX_SSVERSION 128

View File

@ -1966,6 +1966,10 @@ int mncc_tx_to_cc(void *inst, int msg_type, void *arg)
switch (msg_type) {
case GSM_TCHF_FRAME:
case GSM_TCHF_FRAME_EFR:
case GSM_TCHH_FRAME:
case GSM_TCH_FRAME_AMR:
case GSM_BAD_FRAME:
return gsm_send_voice_frame(ms, arg);
case MNCC_LCHAN_MODIFY:
return 0;

View File

@ -46,13 +46,19 @@ int mncc_sock_from_cc(struct mncc_sock_state *state, struct msgb *msg)
/* Check if we currently have a MNCC handler connected */
if (state->conn_bfd.fd < 0) {
struct gsm_mncc mncc_out;
LOGP(DMNCC, LOGL_ERROR, "mncc_sock receives %s for external CC app "
"but socket is gone\n", get_mncc_name(msg_type));
if (msg_type != GSM_TCHF_FRAME
&& msg_type != GSM_TCHF_FRAME_EFR
&& msg_type != MNCC_REL_IND) {
switch (msg_type) {
case MNCC_REL_IND:
case GSM_TCHF_FRAME:
case GSM_TCHF_FRAME_EFR:
case GSM_TCHH_FRAME:
case GSM_TCH_FRAME_AMR:
case GSM_BAD_FRAME:
break;
default:
/* release the request */
struct gsm_mncc mncc_out;
memset(&mncc_out, 0, sizeof(mncc_out));
mncc_out.callref = mncc_in->callref;
mncc_set_cause(&mncc_out, GSM48_CAUSE_LOC_PRN_S_LU,

View File

@ -82,14 +82,18 @@ int gsm_send_voice_frame(struct osmocom_ms *ms, const struct gsm_data_frame *fra
struct msgb *nmsg;
int len;
switch (ms->rrlayer.cd_now.mode) {
case GSM48_CMODE_SPEECH_V1:
/* FIXME: FR only, check for TCH/F (FR) and TCH/H (HR) */
switch (frame->msg_type) {
case GSM_TCHF_FRAME:
len = GSM_FR_BYTES;
break;
case GSM48_CMODE_SPEECH_EFR:
case GSM_TCHF_FRAME_EFR:
len = GSM_EFR_BYTES;
break;
case GSM_TCHH_FRAME:
len = GSM_HR_BYTES;
break;
/* TODO: case GSM_TCH_FRAME_AMR (variable length) */
/* TODO: case GSM_BAD_FRAME (empty?) */
default:
LOGP(DL1C, LOGL_ERROR, "%s(): msg_type=0x%02x: not implemented\n",
__func__, frame->msg_type);