aboutsummaryrefslogtreecommitdiffstats
path: root/src/libosmo-mgcp-client/mgcp_client_fsm.c
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2019-03-04 21:07:54 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2019-03-04 22:25:06 +0100
commitcb760bdebea52f4c586179b59e6eaaa25bd7d65e (patch)
treea63e8876a8787d8e4d0b0169816b3a33e9319490 /src/libosmo-mgcp-client/mgcp_client_fsm.c
parente3f8bca42418ba82d460c50c524daca57bfb99db (diff)
mgcp client: allow setting conn mode for CRCX and MDCX
Add conn_mode to struct mgcp_conn_peer, to allow setting an explicit connection mode instead of implicit MGCP_CONN_RECV_ONLY / MGCP_CONN_RECV_SEND depending on remote RTP port presence. Default to old behavior if this is left unset. Rationale: For IuUP Initialization, osmo-msc currently still uses a hack at osmo-mgw to echo the IuUP Initialization back to the sender as an ACK. For sanity checking reasons, this is done iff the CRCX created the CI in loopback mode. So, in order to be able to switch to the mgcp_client_fsm in osmo-msc instead of "manual" MGCP message composition and yet still be able to support IuUP and IuCS, we need to be able to set the conn mode upon CRCX to loopback. If we merged the IuUP patch (which is already on a branch somewhere) to osmo-mgw, we wouldn't bother with this patch, but adding this conn mode choice has these benefits: - post-IuUP-fix osmo-msc versions can interop with older osmo-mgw IuUP for IuCS. - It is conceivable that some MGCP clients prefer explicit conn modes instead of the implicit MGCP_CONN_RECV_ONLY / MGCP_CONN_RECV_SEND choice. This opens the possibility to switch between conn modes with MDCX messages. Change-Id: I26be5c4b06a680f25f19797407ab56a5a4880ddc
Diffstat (limited to 'src/libosmo-mgcp-client/mgcp_client_fsm.c')
-rw-r--r--src/libosmo-mgcp-client/mgcp_client_fsm.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/libosmo-mgcp-client/mgcp_client_fsm.c b/src/libosmo-mgcp-client/mgcp_client_fsm.c
index da900c529..7c4e08189 100644
--- a/src/libosmo-mgcp-client/mgcp_client_fsm.c
+++ b/src/libosmo-mgcp-client/mgcp_client_fsm.c
@@ -134,6 +134,13 @@ static void add_audio(struct mgcp_msg *mgcp_msg, struct mgcp_conn_peer *info)
mgcp_msg->conn_mode = MGCP_CONN_RECV_SEND;
}
+static void set_conn_mode(struct mgcp_msg *mgcp_msg, struct mgcp_conn_peer *peer)
+{
+ enum mgcp_connection_mode conn_mode = peer->conn_mode;
+ if (conn_mode != MGCP_CONN_NONE)
+ mgcp_msg->conn_mode = conn_mode;
+}
+
static struct msgb *make_mdcx_msg(struct mgcp_ctx *mgcp_ctx)
{
struct mgcp_msg mgcp_msg;
@@ -155,6 +162,8 @@ static struct msgb *make_mdcx_msg(struct mgcp_ctx *mgcp_ctx)
memcpy(mgcp_msg.codecs, mgcp_ctx->conn_peer_local.codecs, sizeof(mgcp_msg.codecs));
memcpy(mgcp_msg.ptmap, mgcp_ctx->conn_peer_local.ptmap, sizeof(mgcp_msg.ptmap));
+ set_conn_mode(&mgcp_msg, &mgcp_ctx->conn_peer_local);
+
/* Note: We take the endpoint and the call_id from the remote
* connection info, because we can be confident that the
* information there is valid. For the local info, we explicitly
@@ -199,6 +208,8 @@ static void fsm_crcx_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data)
make_crcx_msg(&mgcp_msg, &mgcp_ctx->conn_peer_local);
if (mgcp_ctx->conn_peer_local.port)
add_audio(&mgcp_msg, &mgcp_ctx->conn_peer_local);
+ set_conn_mode(&mgcp_msg, &mgcp_ctx->conn_peer_local);
+
msg = mgcp_msg_gen(mgcp_ctx->mgcp, &mgcp_msg);
OSMO_ASSERT(msg);