---
openbsc/include/openbsc/mncc.h | 1 +
openbsc/src/libmsc/gsm_04_08.c | 6 ++++--
openbsc/src/libmsc/mncc_builtin.c | 2 ++
openbsc/src/libmsc/mncc_sock.c | 5 +++--
openbsc/src/libtrau/rtp_proxy.c | 14 ++++++++++++++
5 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/openbsc/include/openbsc/mncc.h b/openbsc/include/openbsc/mncc.h
index ffc247b..ec4dac9 100644
--- a/openbsc/include/openbsc/mncc.h
+++ b/openbsc/include/openbsc/mncc.h
@@ -95,6 +95,7 @@ struct gsm_call {
#define GSM_TCHF_FRAME 0x0300
#define GSM_TCHF_FRAME_EFR 0x0301
+#define GSM_TCHH_FRAME 0x0302
#define GSM_TCHF_BAD_FRAME 0x03ff
#define MNCC_SOCKET_HELLO 0x0400
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index dbb30ec..46ad719 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -2945,6 +2945,7 @@ int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg)
return tch_recv_mncc(net, data->callref, 1);
case GSM_TCHF_FRAME:
case GSM_TCHF_FRAME_EFR:
+ case GSM_TCHH_FRAME:
/* Find callref */
trans = trans_find_by_callref(net, data->callref);
if (!trans) {
@@ -2956,11 +2957,12 @@ int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void
*arg)
LOGP(DMNCC, LOGL_NOTICE, "TCH frame for trans without conn\n");
return 0;
}
- if (trans->conn->lchan->type != GSM_LCHAN_TCH_F) {
+ if (trans->conn->lchan->type != GSM_LCHAN_TCH_F
+ && trans->conn->lchan->type != GSM_LCHAN_TCH_H) {
/* This should be LOGL_ERROR or NOTICE, but
* unfortuantely it happens for a couple of frames at
* the beginning of every RTP connection */
- LOGP(DMNCC, LOGL_DEBUG, "TCH frame for lchan != TCH_F\n");
+ LOGP(DMNCC, LOGL_DEBUG, "TCH frame for lchan != TCH_F/TCH_H\n");
return 0;
}
bts = trans->conn->lchan->ts->trx->bts;
diff --git a/openbsc/src/libmsc/mncc_builtin.c b/openbsc/src/libmsc/mncc_builtin.c
index be35454..506d004 100644
--- a/openbsc/src/libmsc/mncc_builtin.c
+++ b/openbsc/src/libmsc/mncc_builtin.c
@@ -342,6 +342,7 @@ int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
switch (msg_type) {
case GSM_TCHF_FRAME:
case GSM_TCHF_FRAME_EFR:
+ case GSM_TCHH_FRAME:
break;
default:
DEBUGP(DMNCC, "(call %x) Received message %s\n", call->callref,
@@ -410,6 +411,7 @@ int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
break;
case GSM_TCHF_FRAME:
case GSM_TCHF_FRAME_EFR:
+ case GSM_TCHH_FRAME:
rc = mncc_rcv_tchf(call, msg_type, arg);
break;
default:
diff --git a/openbsc/src/libmsc/mncc_sock.c b/openbsc/src/libmsc/mncc_sock.c
index cf4bca8..8d8e505 100644
--- a/openbsc/src/libmsc/mncc_sock.c
+++ b/openbsc/src/libmsc/mncc_sock.c
@@ -54,8 +54,9 @@ int mncc_sock_from_cc(struct gsm_network *net, struct msgb *msg)
if (net->mncc_state->conn_bfd.fd < 0) {
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) {
+ if (msg_type != GSM_TCHF_FRAME
+ && msg_type != GSM_TCHF_FRAME_EFR
+ && msg_type != GSM_TCHH_FRAME) {
/* release the request */
struct gsm_mncc mncc_out;
memset(&mncc_out, 0, sizeof(mncc_out));
diff --git a/openbsc/src/libtrau/rtp_proxy.c b/openbsc/src/libtrau/rtp_proxy.c
index 94a5b2f..2587e12 100644
--- a/openbsc/src/libtrau/rtp_proxy.c
+++ b/openbsc/src/libtrau/rtp_proxy.c
@@ -183,6 +183,15 @@ static int rtp_decode(struct msgb *msg, uint32_t callref, struct msgb
**data)
return -EINVAL;
}
break;
+ case RTP_PT_GSM_HALF:
+ msg_type = GSM_TCHH_FRAME;
+ if (payload_len != RTP_LEN_GSM_HALF) {
+ DEBUGPC(DLMUX, "received RTP half rate frame with "
+ "payload length != 15 (len = %d)\n",
+ RTP_LEN_GSM_HALF, payload_len);
+ return -EINVAL;
+ }
+ break;
default:
DEBUGPC(DLMUX, "received RTP frame with unknown payload "
"type %d\n", rtph->payload_type);
@@ -250,6 +259,11 @@ int rtp_send_frame(struct rtp_socket *rs, struct gsm_data_frame
*frame)
payload_len = RTP_LEN_GSM_EFR;
duration = RTP_GSM_DURATION;
break;
+ case GSM_TCHH_FRAME:
+ payload_type = RTP_PT_GSM_HALF;
+ payload_len = RTP_LEN_GSM_HALF;
+ duration = RTP_GSM_DURATION;
+ break;
default:
DEBUGPC(DLMUX, "unsupported message type %d\n",
frame->msg_type);
--
1.8.1.5