aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-03-20 22:36:27 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-03-20 22:36:27 +0100
commit870cc0fdac4251d9b8e8f7382ae6d196e16cb253 (patch)
tree9e8573b119876ef29c79f50ed5bb24f84d9008d7
parentf50f70452fca8e049f18be68343c176b4717e540 (diff)
parent63bfdd83ea94bef8f6b1a2756e80e7b2e8b46250 (diff)
Merge branch 'jolly/mncc'
Merge the interface changes to the MNCC protocol
-rw-r--r--openbsc/include/openbsc/mncc.h14
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c6
-rw-r--r--openbsc/src/libmsc/mncc.c6
-rw-r--r--openbsc/src/libmsc/mncc_builtin.c22
-rw-r--r--openbsc/src/libmsc/mncc_sock.c3
-rw-r--r--openbsc/src/libtrau/rtp_proxy.c14
-rw-r--r--openbsc/src/libtrau/trau_mux.c2
-rw-r--r--openbsc/tests/trau/trau_test.c2
8 files changed, 46 insertions, 23 deletions
diff --git a/openbsc/include/openbsc/mncc.h b/openbsc/include/openbsc/mncc.h
index ffc247b7c..ffac7fd6f 100644
--- a/openbsc/include/openbsc/mncc.h
+++ b/openbsc/include/openbsc/mncc.h
@@ -95,7 +95,9 @@ struct gsm_call {
#define GSM_TCHF_FRAME 0x0300
#define GSM_TCHF_FRAME_EFR 0x0301
-#define GSM_TCHF_BAD_FRAME 0x03ff
+#define GSM_TCHH_FRAME 0x0302
+#define GSM_TCH_FRAME_AMR 0x0303
+#define GSM_BAD_FRAME 0x03ff
#define MNCC_SOCKET_HELLO 0x0400
@@ -161,7 +163,7 @@ struct gsm_data_frame {
unsigned char data[0];
};
-#define MNCC_SOCK_VERSION 2
+#define MNCC_SOCK_VERSION 4
struct gsm_mncc_hello {
uint32_t msg_type;
uint32_t version;
@@ -189,4 +191,12 @@ int mncc_sock_from_cc(struct gsm_network *net, struct msgb *msg);
int mncc_sock_init(struct gsm_network *gsmnet);
+#define mncc_is_data_frame(msg_type) \
+ (msg_type == GSM_TCHF_FRAME \
+ || msg_type == GSM_TCHF_FRAME_EFR \
+ || msg_type == GSM_TCHH_FRAME \
+ || msg_type == GSM_TCH_FRAME_AMR \
+ || msg_type == GSM_BAD_FRAME)
+
+
#endif
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index cd2a0b5cd..df934330a 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -2952,6 +2952,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) {
@@ -2963,11 +2964,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.c b/openbsc/src/libmsc/mncc.c
index b48477225..73db5f047 100644
--- a/openbsc/src/libmsc/mncc.c
+++ b/openbsc/src/libmsc/mncc.c
@@ -84,7 +84,11 @@ static struct mncc_names {
{"MNCC_FRAME_DROP", 0x0202},
{"MNCC_LCHAN_MODIFY", 0x0203},
- {"GSM_TCH_FRAME", 0x0300},
+ {"GSM_TCHF_FRAME", 0x0300},
+ {"GSM_TCHF_FRAME_EFR", 0x0301},
+ {"GSM_TCHH_FRAME", 0x0302},
+ {"GSM_TCH_FRAME_AMR", 0x0303},
+ {"GSM_BAD_FRAME", 0x03ff},
{NULL, 0} };
diff --git a/openbsc/src/libmsc/mncc_builtin.c b/openbsc/src/libmsc/mncc_builtin.c
index be3545475..a5a463beb 100644
--- a/openbsc/src/libmsc/mncc_builtin.c
+++ b/openbsc/src/libmsc/mncc_builtin.c
@@ -273,8 +273,8 @@ static int mncc_rel_cnf(struct gsm_call *call, int msg_type, struct gsm_mncc *re
return 0;
}
-/* receiving a TCH/F frame from the BSC code */
-static int mncc_rcv_tchf(struct gsm_call *call, int msg_type,
+/* receiving a (speech) traffic frame from the BSC code */
+static int mncc_rcv_data(struct gsm_call *call, int msg_type,
struct gsm_data_frame *dfr)
{
struct gsm_trans *remote_trans;
@@ -339,16 +339,14 @@ int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
DEBUGP(DMNCC, "(call %x) Call created.\n", call->callref);
}
- switch (msg_type) {
- case GSM_TCHF_FRAME:
- case GSM_TCHF_FRAME_EFR:
- break;
- default:
- DEBUGP(DMNCC, "(call %x) Received message %s\n", call->callref,
- get_mncc_name(msg_type));
- break;
+ if (mncc_is_data_frame(msg_type)) {
+ rc = mncc_rcv_data(call, msg_type, arg);
+ goto out_free;
}
+ DEBUGP(DMNCC, "(call %x) Received message %s\n", call->callref,
+ get_mncc_name(msg_type));
+
switch(msg_type) {
case MNCC_SETUP_IND:
rc = mncc_setup_ind(call, msg_type, arg);
@@ -408,10 +406,6 @@ int int_mncc_recv(struct gsm_network *net, struct msgb *msg)
call->callref, data->cause.value);
rc = mncc_tx_to_cc(net, MNCC_RETRIEVE_REJ, data);
break;
- case GSM_TCHF_FRAME:
- case GSM_TCHF_FRAME_EFR:
- rc = mncc_rcv_tchf(call, msg_type, arg);
- break;
default:
LOGP(DMNCC, LOGL_NOTICE, "(call %x) Message unhandled\n", callref);
break;
diff --git a/openbsc/src/libmsc/mncc_sock.c b/openbsc/src/libmsc/mncc_sock.c
index cf4bca87a..dd0a44fb5 100644
--- a/openbsc/src/libmsc/mncc_sock.c
+++ b/openbsc/src/libmsc/mncc_sock.c
@@ -54,8 +54,7 @@ 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 (!mncc_is_data_frame(msg_type)) {
/* 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 94a5b2f57..143bfa006 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 != %d (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);
diff --git a/openbsc/src/libtrau/trau_mux.c b/openbsc/src/libtrau/trau_mux.c
index 7b9bac0eb..fd1895f94 100644
--- a/openbsc/src/libtrau/trau_mux.c
+++ b/openbsc/src/libtrau/trau_mux.c
@@ -314,7 +314,7 @@ struct msgb *trau_decode_efr(uint32_t callref,
return msg;
bad_frame:
- frame->msg_type = GSM_TCHF_BAD_FRAME;
+ frame->msg_type = GSM_BAD_FRAME;
return msg;
}
diff --git a/openbsc/tests/trau/trau_test.c b/openbsc/tests/trau/trau_test.c
index f8a48dbd8..b95f1e876 100644
--- a/openbsc/tests/trau/trau_test.c
+++ b/openbsc/tests/trau/trau_test.c
@@ -57,7 +57,7 @@ void test_trau_fr_efr(unsigned char *data)
msg = trau_decode_efr(1, &tf);
OSMO_ASSERT(msg != NULL);
frame = (struct gsm_data_frame *)msg->data;
- OSMO_ASSERT(frame->msg_type == GSM_TCHF_BAD_FRAME);
+ OSMO_ASSERT(frame->msg_type == GSM_BAD_FRAME);
msgb_free(msg);
}