neels has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-msc/+/35051?usp=email )


Change subject: implement re-assignment to match codecs
......................................................................

implement re-assignment to match codecs

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.

Related: OS#6258
Related: osmo-ttcn3-hacks I402ed0523a2a87b83f29c5577b2c828102005d53
Change-Id: I8760feaa8598047369ef8c3ab2673013bac8ac8a
---
M include/osmocom/msc/msc_a.h
M src/libmsc/call_leg.c
M src/libmsc/codec_filter.c
M src/libmsc/gsm_04_08_cc.c
M src/libmsc/msc_a.c
M src/libmsc/msc_ho.c
M tests/msc_vlr/msc_vlr_test_call.c
M tests/msc_vlr/msc_vlr_test_call.err
8 files changed, 106 insertions(+), 44 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/51/35051/1

diff --git a/include/osmocom/msc/msc_a.h b/include/osmocom/msc/msc_a.h
index 0276d62..5e1672a 100644
--- a/include/osmocom/msc/msc_a.h
+++ b/include/osmocom/msc/msc_a.h
@@ -216,6 +216,7 @@

 int msc_a_ensure_cn_local_rtp(struct msc_a *msc_a, struct gsm_trans *cc_trans);
 int msc_a_try_call_assignment(struct gsm_trans *cc_trans);
+void msc_a_tx_assignment(struct msc_a *msc_a);

 const char *msc_a_cm_service_type_to_use(struct msc_a *msc_a, enum 
osmo_cm_service_type cm_service_type);

diff --git a/src/libmsc/call_leg.c b/src/libmsc/call_leg.c
index b797322..5720417 100644
--- a/src/libmsc/call_leg.c
+++ b/src/libmsc/call_leg.c
@@ -158,7 +158,8 @@
                }
                if (!established)
                        break;
-               call_leg_state_chg(cl, CALL_LEG_ST_ESTABLISHED);
+               if (cl->fi->state != CALL_LEG_ST_ESTABLISHED)
+                       call_leg_state_chg(cl, CALL_LEG_ST_ESTABLISHED);
                break;

        case CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE:
diff --git a/src/libmsc/codec_filter.c b/src/libmsc/codec_filter.c
index a9d93a7..1a163ae 100644
--- a/src/libmsc/codec_filter.c
+++ b/src/libmsc/codec_filter.c
@@ -98,7 +98,7 @@
        if (remote->audio_codecs.count)
                sdp_audio_codecs_intersection(r, &remote->audio_codecs, true);

-#if 0
+#if 1
        /* Future: If osmo-msc were able to trigger a re-assignment after the 
remote side has picked a codec mismatching
         * the initial Assignment, then this code here would make sense: keep 
the other codecs as available to choose
         * from, but put the currently assigned codec in the first position. So 
far we only offer the single assigned
@@ -108,24 +108,11 @@
                /* Assignment has completed, the chosen codec should be the 
first of the resulting SDP.
                 * Make sure this is actually listed in the result SDP and move 
to first place. */
                struct sdp_audio_codec *select = sdp_audio_codecs_by_descr(r, 
a);
-
-               if (!select) {
-                       /* Not present. Add. */
-                       if (sdp_audio_codec_by_payload_type(r, a->payload_type, 
false)) {
-                               /* Oh crunch, that payload type number is 
already in use.
-                                * Find an unused one. */
-                               for (a->payload_type = 96; a->payload_type <= 
127; a->payload_type++) {
-                                       if (!sdp_audio_codec_by_payload_type(r, 
a->payload_type, false))
-                                               break;
-                               }
-
-                               if (a->payload_type > 127)
-                                       return -ENOSPC;
-                       }
-                       select = sdp_audio_codecs_add_copy(r, a);
-               }
-
-               sdp_audio_codecs_select(r, select);
+               if (select)
+                       sdp_audio_codecs_select(r, select);
+               /* If 'select' is NULL, the assigned codec is not present in 
the intersection of possible choices for
+                * TFO. We could add it, but it would taint the filter result. 
Just omit the assigned codec, and it is
+                * the CC code's responsibility to detect this and assign a 
working codec. */
        }
 #else
        /* Currently, osmo-msc does not trigger re-assignment if the remote 
side has picked a codec that is different
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 31fcb23..6b8819f 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -270,7 +270,16 @@
                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),
@@ -1131,6 +1140,7 @@
        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;
@@ -1163,7 +1173,23 @@
                }
        }

-       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_ERROR, "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)
@@ -2056,17 +2082,23 @@
        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_DELIVERED:
+       case GSM_CSTATE_CONNECT_IND:
+               /* MO re-assignment after MT codec mismatched MO codecs */
+               LOG_TRANS(trans, LOGL_DEBUG, "Re-Assignment complete\n");
+               return 0;
+
        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;
+               return 0;

        default:
                LOG_TRANS(trans, LOGL_ERROR, "Assignment done in unexpected CC 
state: %d\n", trans->cc.state);
diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c
index e64b54d..c10afb8 100644
--- a/src/libmsc/msc_a.c
+++ b/src/libmsc/msc_a.c
@@ -636,7 +636,7 @@
 }

 /* The MGW has given us a local IP address for the RAN side. Ready to start 
the Assignment of a voice channel. */
-static void msc_a_call_leg_ran_local_addr_available(struct msc_a *msc_a)
+void msc_a_tx_assignment(struct msc_a *msc_a)
 {
        struct ran_msg msg;
        struct gsm_trans *cc_trans = msc_a->cc.active_trans;
@@ -804,7 +804,7 @@
                          rtps->use_osmux ? "yes" : "no", 
rtps->local_osmux_cid);
                switch (rtps->dir) {
                case RTP_TO_RAN:
-                       msc_a_call_leg_ran_local_addr_available(msc_a);
+                       msc_a_tx_assignment(msc_a);
                        return;
                case RTP_TO_CN:
                        cc_on_cn_local_rtp_port_known(rtps->for_trans);
diff --git a/src/libmsc/msc_ho.c b/src/libmsc/msc_ho.c
index f826975..47f000b 100644
--- a/src/libmsc/msc_ho.c
+++ b/src/libmsc/msc_ho.c
@@ -380,7 +380,7 @@
        struct vlr_subscr *vsub = msc_a_vsub(msc_a);
        struct gsm_network *net = msc_a_net(msc_a);
        struct gsm0808_channel_type channel_type;
-       struct gsm0808_speech_codec_list scl;
+       struct gsm0808_speech_codec_list scl = {};
        struct gsm_trans *cc_trans = msc_a->cc.active_trans;
        struct ran_msg ran_enc_msg = {
                .msg_type = RAN_MSG_HANDOVER_REQUEST,
@@ -442,7 +442,13 @@
                ran_enc_msg.handover_request.call_id_present = true;
                ran_enc_msg.handover_request.call_id = cc_trans->call_id;

-               sdp_audio_codecs_to_speech_codec_list(&scl, 
&cc_trans->cc.local.audio_codecs);
+               /* Call assignment is now capable of re-assigning to overcome a 
codec mismatch with the remote call leg.
+                * But for inter-MSC handover, that is not supported yet. So 
keep here the old limitation of only
+                * offering the assigned codec. */
+               if (sdp_audio_codec_is_set(&cc_trans->cc.codecs.assignment))
+                       sdp_audio_codec_to_speech_codec_list(&scl, 
&cc_trans->cc.codecs.assignment);
+               else
+                       sdp_audio_codecs_to_speech_codec_list(&scl, 
&cc_trans->cc.local.audio_codecs);
                if (!scl.len) {
                        msc_ho_failed(msc_a, GSM0808_CAUSE_EQUIPMENT_FAILURE, 
"Failed to compose"
                                      " Codec List (MSC Preferred) for Handover 
Request message\n");
diff --git a/tests/msc_vlr/msc_vlr_test_call.c 
b/tests/msc_vlr/msc_vlr_test_call.c
index cb3c77b..74bdfcf 100644
--- a/tests/msc_vlr/msc_vlr_test_call.c
+++ b/tests/msc_vlr/msc_vlr_test_call.c
@@ -1083,6 +1083,9 @@
                        return false;
                }
                expect_pos++;
+
+               // only match first codec
+               return true;
        }
        if (*expect_pos) {
                BTW("%s: %s: ERROR: mismatch: expected %s to be listed, but not 
found", func, desc, *expect_pos);
diff --git a/tests/msc_vlr/msc_vlr_test_call.err 
b/tests/msc_vlr/msc_vlr_test_call.err
index a1da0f7..18bc2c1 100644
--- a/tests/msc_vlr/msc_vlr_test_call.err
+++ b/tests/msc_vlr/msc_vlr_test_call.err
@@ -2634,19 +2634,22 @@
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-6:RTP_TO_RAN:no-CI){UNINITIALIZED}:
 setting codecs to AMR:octet-align=1#112
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-6:RTP_TO_RAN:no-CI:local-10-23-23-1-23){UNINITIALIZED}:
 setting remote addr to 1.2.3.4:1234
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-6:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}:
 Not committing: no MGW endpoint CI set up
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) codecs: 10.23.23.1:23{AMR:octet-align=1#112} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) Assignment Complete: RAN: AMR:octet-align=1#112, CN: 
AMR:octet-align=1#112
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) codecs: 10.23.23.1:23{AMR:octet-align=1#112} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
-DMNCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) tx MNCC_RTP_CREATE (RTP=10.23.23.1:23{AMR:octet-align=1#112})
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) codecs: 
10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) Assignment Complete: RAN: AMR:octet-align=1#112, CN: 
AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) codecs: 
10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
+DMNCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000004 
tid-8) tx MNCC_RTP_CREATE 
(RTP=10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
   MSC --> MNCC: callref 0x80000004: MNCC_RTP_CREATE
 v=0
 o=OsmoMSC 0 0 IN IP4 10.23.23.1
 s=GSM Call
 c=IN IP4 10.23.23.1
 t=0 0
-m=audio 23 RTP/AVP 112
+m=audio 23 RTP/AVP 112 110 3 111
 a=rtpmap:112 AMR/8000
 a=fmtp:112 octet-align=1
+a=rtpmap:110 GSM-EFR/8000
+a=rtpmap:3 GSM/8000
+a=rtpmap:111 GSM-HR-08/8000
 a=ptime:20

 - VALIDATE_SDP OK: cc_to_mncc_tx_last_sdp == t->mo_tx_sdp_mncc_rtp_create == 
AMR
@@ -4458,19 +4461,22 @@
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-12:RTP_TO_RAN:no-CI){UNINITIALIZED}:
 setting codecs to AMR:octet-align=1#112
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-12:RTP_TO_RAN:no-CI:local-10-23-23-1-23){UNINITIALIZED}:
 setting remote addr to 1.2.3.4:1234
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-12:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}:
 Not committing: no MGW endpoint CI set up
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) codecs: 10.23.23.1:23{AMR:octet-align=1#112} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) Assignment Complete: RAN: AMR:octet-align=1#112, CN: 
AMR:octet-align=1#112
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) codecs: 10.23.23.1:23{AMR:octet-align=1#112} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
-DMNCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) tx MNCC_RTP_CREATE (RTP=10.23.23.1:23{AMR:octet-align=1#112})
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) codecs: 
10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) Assignment Complete: RAN: AMR:octet-align=1#112, CN: 
AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) codecs: 
10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
+DMNCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000007 
tid-8) tx MNCC_RTP_CREATE 
(RTP=10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
   MSC --> MNCC: callref 0x80000007: MNCC_RTP_CREATE
 v=0
 o=OsmoMSC 0 0 IN IP4 10.23.23.1
 s=GSM Call
 c=IN IP4 10.23.23.1
 t=0 0
-m=audio 23 RTP/AVP 112
+m=audio 23 RTP/AVP 112 110 3 111
 a=rtpmap:112 AMR/8000
 a=fmtp:112 octet-align=1
+a=rtpmap:110 GSM-EFR/8000
+a=rtpmap:3 GSM/8000
+a=rtpmap:111 GSM-HR-08/8000
 a=ptime:20

 - VALIDATE_SDP OK: cc_to_mncc_tx_last_sdp == t->mo_tx_sdp_mncc_rtp_create == 
AMR
@@ -4859,19 +4865,22 @@
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-14:RTP_TO_RAN:no-CI){UNINITIALIZED}:
 setting codecs to AMR:octet-align=1#112
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-14:RTP_TO_RAN:no-CI:local-10-23-23-1-23){UNINITIALIZED}:
 setting remote addr to 1.2.3.4:1234
 DCC 
rtp_stream(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ:trans-8:call-14:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}:
 Not committing: no MGW endpoint CI set up
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) codecs: 10.23.23.1:23{AMR:octet-align=1#112} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) Assignment Complete: RAN: AMR:octet-align=1#112, CN: 
AMR:octet-align=1#112
-DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) codecs: 10.23.23.1:23{AMR:octet-align=1#112} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
-DMNCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) tx MNCC_RTP_CREATE (RTP=10.23.23.1:23{AMR:octet-align=1#112})
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) codecs: 
10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) Assignment Complete: RAN: AMR:octet-align=1#112, CN: 
AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111
+DCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) codecs: 
10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} (from: 
assigned=AMR:octet-align=1#112 
MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} 
bss={GSM#3,GSM-EFR#110,AMR:octet-align=1#112,GSM-HR-08#111} 
RAN={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
+DMNCC trans(CC:INITIATED 
IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ callref-0x80000008 
tid-8) tx MNCC_RTP_CREATE 
(RTP=10.23.23.1:23{AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111})
   MSC --> MNCC: callref 0x80000008: MNCC_RTP_CREATE
 v=0
 o=OsmoMSC 0 0 IN IP4 10.23.23.1
 s=GSM Call
 c=IN IP4 10.23.23.1
 t=0 0
-m=audio 23 RTP/AVP 112
+m=audio 23 RTP/AVP 112 110 3 111
 a=rtpmap:112 AMR/8000
 a=fmtp:112 octet-align=1
+a=rtpmap:110 GSM-EFR/8000
+a=rtpmap:3 GSM/8000
+a=rtpmap:111 GSM-HR-08/8000
 a=ptime:20

 - VALIDATE_SDP OK: cc_to_mncc_tx_last_sdp == t->mo_tx_sdp_mncc_rtp_create == 
AMR

--
To view, visit https://gerrit.osmocom.org/c/osmo-msc/+/35051?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-Change-Id: I8760feaa8598047369ef8c3ab2673013bac8ac8a
Gerrit-Change-Number: 35051
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofm...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to