From 9de384a28cd67e39c900d56da8cd1034d9a4e2a2 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Fri, 7 Jan 2022 16:27:04 +0100 Subject: [PATCH] Avoid setting audio codec if not available during assignment_complete (MDCX) RAB Assignment Complete contains no codec info, hence assignment_complete.codec is not set and assignment_complete.codec_present is false. As a result a wrong value is passed to rtp_stream_set_codec. This fixes osmo-msc sending "a=rtpmap:112 AMR/8000/1" during MDCX in the RAT-side connection of the call leg after having properly sent VND.3GPP.IUFP/16000 in CRCX. Change-Id: Ic028d35893d29f7d72f22f82ef89695229c9b01b --- src/libmsc/msc_a.c | 7 +++++-- tests/msc_vlr/msc_vlr_tests.c | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c index 904209047..e2bf975ca 100644 --- a/src/libmsc/msc_a.c +++ b/src/libmsc/msc_a.c @@ -1311,6 +1311,8 @@ static void msc_a_up_call_assignment_complete(struct msc_a *msc_a, const struct { struct gsm_trans *cc_trans = msc_a->cc.active_trans; struct rtp_stream *rtps_to_ran = msc_a->cc.call_leg ? msc_a->cc.call_leg->rtp[RTP_TO_RAN] : NULL; + const enum mgcp_codecs *codec_if_known = ac->assignment_complete.codec_present ? + &ac->assignment_complete.codec : NULL; if (!rtps_to_ran) { LOG_MSC_A(msc_a, LOGL_ERROR, "Rx Assignment Complete, but no RTP stream is set up\n"); @@ -1329,7 +1331,8 @@ static void msc_a_up_call_assignment_complete(struct msc_a *msc_a, const struct } /* Update RAN-side endpoint CI: */ - rtp_stream_set_codec(rtps_to_ran, ac->assignment_complete.codec); + if (codec_if_known) + rtp_stream_set_codec(rtps_to_ran, *codec_if_known); rtp_stream_set_remote_addr(rtps_to_ran, &ac->assignment_complete.remote_rtp); if (rtps_to_ran->use_osmux) rtp_stream_set_remote_osmux_cid(rtps_to_ran, @@ -1344,7 +1347,7 @@ static void msc_a_up_call_assignment_complete(struct msc_a *msc_a, const struct * - the Assignment has chosen a speech codec * go on to create the CN side RTP stream's CI. */ if (call_leg_ensure_ci(msc_a->cc.call_leg, RTP_TO_CN, cc_trans->callref, cc_trans, - &ac->assignment_complete.codec, NULL)) { + codec_if_known, NULL)) { LOG_MSC_A_CAT(msc_a, DCC, LOGL_ERROR, "Error creating MGW CI towards CN\n"); call_leg_release(msc_a->cc.call_leg); return; diff --git a/tests/msc_vlr/msc_vlr_tests.c b/tests/msc_vlr/msc_vlr_tests.c index fbd254018..378f84ac8 100644 --- a/tests/msc_vlr/msc_vlr_tests.c +++ b/tests/msc_vlr/msc_vlr_tests.c @@ -1007,6 +1007,7 @@ void ms_sends_assignment_complete(enum mgcp_codecs assigned_codec) ran_dec = (struct ran_msg){ .msg_type = RAN_MSG_ASSIGNMENT_COMPLETE, .assignment_complete = { + .codec_present = true, .codec = assigned_codec, }, };