From 9e1e0f46fb82fabb3be11006effa964ed4163ed8 Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Wed, 28 Jun 2017 18:22:46 +0200 Subject: mgcp: Fix missing call id in DLCX The call id field in the DLCX message is missing. Use the endpoint id as call id in all CRCX and DLCX messages. --- openbsc/include/openbsc/mgcpgw_client.h | 3 ++- openbsc/src/libmgcp/mgcpgw_client.c | 9 ++++----- openbsc/src/libmsc/msc_ifaces.c | 11 +++++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/openbsc/include/openbsc/mgcpgw_client.h b/openbsc/include/openbsc/mgcpgw_client.h index 24b1fd6e7..b1b5fd42b 100644 --- a/openbsc/include/openbsc/mgcpgw_client.h +++ b/openbsc/include/openbsc/mgcpgw_client.h @@ -97,7 +97,8 @@ struct msgb *mgcp_msg_mdcx(struct mgcpgw_client *mgcp, uint16_t rtp_endpoint, const char *rtp_conn_addr, uint16_t rtp_port, enum mgcp_connection_mode mode); -struct msgb *mgcp_msg_dlcx(struct mgcpgw_client *mgcp, uint16_t rtp_endpoint); +struct msgb *mgcp_msg_dlcx(struct mgcpgw_client *mgcp, uint16_t rtp_endpoint, + unsigned int call_id); void mgcpgw_client_vty_init(int node, struct mgcpgw_client_conf *conf); int mgcpgw_client_config_write(struct vty *vty, const char *indent); diff --git a/openbsc/src/libmgcp/mgcpgw_client.c b/openbsc/src/libmgcp/mgcpgw_client.c index f21983ed6..1910a9f35 100644 --- a/openbsc/src/libmgcp/mgcpgw_client.c +++ b/openbsc/src/libmgcp/mgcpgw_client.c @@ -606,12 +606,11 @@ struct msgb *mgcp_msg_mdcx(struct mgcpgw_client *mgcp, rtp_port); } -struct msgb *mgcp_msg_dlcx(struct mgcpgw_client *mgcp, uint16_t rtp_endpoint) +struct msgb *mgcp_msg_dlcx(struct mgcpgw_client *mgcp, uint16_t rtp_endpoint, + unsigned int call_id) { mgcp_trans_id_t trans_id = mgcpgw_client_next_trans_id(mgcp); return mgcp_msg_from_str(trans_id, - "DLCX %u %x@mgw MGCP 1.0\r\n" - , - trans_id, - rtp_endpoint); + "DLCX %u %x@mgw MGCP 1.0\r\n" + "C: %x\r\n", trans_id, rtp_endpoint, call_id); } diff --git a/openbsc/src/libmsc/msc_ifaces.c b/openbsc/src/libmsc/msc_ifaces.c index cdc724b5b..8eb688224 100644 --- a/openbsc/src/libmsc/msc_ifaces.c +++ b/openbsc/src/libmsc/msc_ifaces.c @@ -219,7 +219,9 @@ static int conn_iu_rab_act_cs(struct gsm_trans *trans) * endpoint in order to ensure that this endpoint is not occupied * with some old connection that was not properly cleared during * some crash or restart event */ - msg_dlcx = mgcp_msg_dlcx(mgcp, conn->iu.mgcp_rtp_endpoint); + msg_dlcx = + mgcp_msg_dlcx(mgcp, conn->iu.mgcp_rtp_endpoint, + conn->iu.mgcp_rtp_endpoint); if (mgcpgw_client_tx(mgcp, msg_dlcx, NULL, NULL)) LOGP(DMGCP, LOGL_ERROR, "Failed to send DLCX message for %s\n", @@ -228,8 +230,8 @@ static int conn_iu_rab_act_cs(struct gsm_trans *trans) /* Establish the RTP stream first as looping back to the originator. * The MDCX will patch through to the counterpart. TODO: play a ring * tone instead. */ - msg = mgcp_msg_crcx(mgcp, conn->iu.mgcp_rtp_endpoint, trans->callref, - MGCP_CONN_LOOPBACK); + msg = mgcp_msg_crcx(mgcp, conn->iu.mgcp_rtp_endpoint, + conn->iu.mgcp_rtp_endpoint, MGCP_CONN_LOOPBACK); return mgcpgw_client_tx(mgcp, msg, mgcp_response_rab_act_cs_crcx, trans); } #endif @@ -355,7 +357,8 @@ void msc_call_release(struct gsm_trans *trans) struct mgcpgw_client *mgcp = conn->network->mgcpgw.client; /* Send DLCX */ - msg = mgcp_msg_dlcx(mgcp, conn->iu.mgcp_rtp_endpoint); + msg = mgcp_msg_dlcx(mgcp, conn->iu.mgcp_rtp_endpoint, + conn->iu.mgcp_rtp_endpoint); if (mgcpgw_client_tx(mgcp, msg, NULL, NULL)) LOGP(DMGCP, LOGL_ERROR, "Failed to send DLCX message for %s\n", -- cgit v1.2.3