diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2023-11-17 04:12:29 +0100 |
---|---|---|
committer | Keith Whyte <keith@rhizomatica.org> | 2023-11-29 23:54:56 +0000 |
commit | 1cfc59e608d1746ef83d5f6f8464ee699c7d78ba (patch) | |
tree | 7cd781ea858b2691c006e140f5937323339eb048 /src/libmsc/gsm_04_08_cc.c | |
parent | 683d140d270582493bd65c5d7f6c13726bfb572f (diff) |
implement re-assignment to match codecsrhizomatica/testing
This is the last missing piece that allows osmo-msc to make good TFO
codecs choices.
Since the codec_filter, osmo-msc properly gathers codec options and
limitations. But the MO call leg still assigns a voice channel before
getting a response from the MT call leg, and is then stuck with that.
Add the capability to adjust the MO call leg's codec in case the MT side
needs a different codec for TFO.
This is only relevant for 2G; on 3G we always have AMR/IuUP.
For inter-MSC handover, keep the behavior unchanged: offer only the
currently assigned codec to the remote side. Codec-changing HO should be
equally trivial to implement, but that is for another day.
msc_vlr_test_call's codec tests are adjusted to test the new feature in
Ib933554f826c1b4347dfa3f6c4f6fe086be8b133. For now, avoid change in
these tests by validating the first codec in SDP lists only.
Related: OS#6258
Related: osmo-ttcn3-hacks I402ed0523a2a87b83f29c5577b2c828102005d53
Change-Id: I8760feaa8598047369ef8c3ab2673013bac8ac8a
Diffstat (limited to 'src/libmsc/gsm_04_08_cc.c')
-rw-r--r-- | src/libmsc/gsm_04_08_cc.c | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c index a4c2ba258..7bab2554a 100644 --- a/src/libmsc/gsm_04_08_cc.c +++ b/src/libmsc/gsm_04_08_cc.c @@ -283,7 +283,16 @@ static void _log_mncc_rx_tx(const char *file, int line, break; } - if (sdp && sdp[0] && (sdp_msg_from_sdp_str(&sdp_msg, sdp) == 0)) { + if (sdp && sdp[0]) { + int rc = sdp_msg_from_sdp_str(&sdp_msg, sdp); + if (rc != 0) { + LOG_TRANS_CAT_SRC(trans, DMNCC, LOGL_ERROR, file, line, "%s %s: invalid SDP message (trying anyway)\n", + rx_tx, + get_mncc_name(mncc->msg_type)); + LOG_TRANS_CAT_SRC(trans, DMNCC, LOGL_DEBUG, file, line, "erratic SDP: %s\n", + osmo_quote_cstr_c(OTC_SELECT, sdp, -1)); + return; + } LOG_TRANS_CAT_SRC(trans, DMNCC, LOGL_DEBUG, file, line, "%s %s (RTP=%s)\n", rx_tx, get_mncc_name(mncc->msg_type), @@ -1130,6 +1139,7 @@ static int gsm48_cc_tx_alerting(struct gsm_trans *trans, void *arg) struct gsm_mncc *alerting = arg; struct msgb *msg = gsm48_msgb_alloc_name("GSM 04.08 CC ALERT"); struct gsm48_hdr *gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh)); + struct codec_filter *codecs = &trans->cc.codecs; int rc; gh->msg_type = GSM48_MT_CC_ALERTING; @@ -1162,7 +1172,23 @@ static int gsm48_cc_tx_alerting(struct gsm_trans *trans, void *arg) } } - return trans_tx_gsm48(trans, msg); + /* First handle the MNCC event */ + rc = trans_tx_gsm48(trans, msg); + + /* Now see if the codecs are fine for TFO: + * This is the first time we are told the MT call leg's codec capabilities, via the MNCC_ALERT_REQ from MT to + * MO. Here, at MO, we have already assigned a specific codec. If the MT call leg does not support this codec, + * but the MO does support one of MT's codecs, we need to re-assign our assigned codec to match MT. */ + if (sdp_audio_codec_is_set(&codecs->assignment) + && trans->cc.remote.audio_codecs.count + && !sdp_audio_codecs_by_descr(&trans->cc.remote.audio_codecs, &codecs->assignment)) { + LOG_TRANS(trans, LOGL_INFO, "Remote call leg mismatches assigned codec: %s\n", + codec_filter_to_str(&trans->cc.codecs, &trans->cc.local, &trans->cc.remote)); + + msc_a_tx_assignment(trans->msc_a); + } + + return rc; } static int gsm48_cc_tx_progress(struct gsm_trans *trans, void *arg) @@ -2055,17 +2081,23 @@ int cc_on_assignment_done(struct gsm_trans *trans) switch (trans->cc.state) { case GSM_CSTATE_INITIATED: case GSM_CSTATE_MO_CALL_PROC: - /* MO call */ + /* MO call, send ACK in form of an MNCC_RTP_CREATE (below) */ break; case GSM_CSTATE_CALL_RECEIVED: case GSM_CSTATE_MO_TERM_CALL_CONF: - /* MT call */ + /* MT call, send ACK in form of an MNCC_RTP_CREATE (below) */ break; case GSM_CSTATE_ACTIVE: - /* already active. MNCC finished before Abis completed the Assignment. */ - break; + /* already active. We decided to re-assign later on during the call - at time of writing this never + * happens. */ + case GSM_CSTATE_CALL_DELIVERED: + case GSM_CSTATE_CONNECT_IND: + /* MNCC has progressed past the initial assignment. Usually it means that this happened: after + * MNCC_ALERT_REQ, MO has triggered a re-assignment, to adjust MO's codec to MT's codec. */ + LOG_TRANS(trans, LOGL_DEBUG, "Re-Assignment complete\n"); + return 0; default: LOG_TRANS(trans, LOGL_ERROR, "Assignment done in unexpected CC state: %d\n", trans->cc.state); |