diff options
-rw-r--r-- | include/osmocom/mgcp_client/mgcp_client_fsm.h | 4 | ||||
-rw-r--r-- | src/libosmo-mgcp-client/mgcp_client_fsm.c | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/include/osmocom/mgcp_client/mgcp_client_fsm.h b/include/osmocom/mgcp_client/mgcp_client_fsm.h index bb07872aa..716a6d4ac 100644 --- a/include/osmocom/mgcp_client/mgcp_client_fsm.h +++ b/include/osmocom/mgcp_client/mgcp_client_fsm.h @@ -47,6 +47,10 @@ struct mgcp_conn_peer { * known to issue incoherent or unknown CallIDs / to issue CRCX commands with a different domain * name than the BSC. An OsmoMGW will then ignore these and not fail on mismatches. */ uint32_t x_osmo_ign; + + /*! If left MGCP_CONN_NONE, use MGCP_CONN_RECV_ONLY or MGCP_CONN_RECV_SEND, depending on whether an audio RTP + * address is set. If != MGCP_CONN_NONE, force this conn mode. */ + enum mgcp_connection_mode conn_mode; }; struct osmo_fsm_inst *mgcp_conn_create(struct mgcp_client *mgcp, struct osmo_fsm_inst *parent_fi, uint32_t parent_term_evt, 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); |