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. 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
This commit is contained in:
parent
cefe594c72
commit
d767c73a1f
|
@ -216,6 +216,7 @@ bool msc_a_is_establishing_auth_ciph(const struct msc_a *msc_a);
|
|||
|
||||
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_cmd(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);
|
||||
|
||||
|
|
|
@ -98,46 +98,16 @@ int codec_filter_run(struct codec_filter *codec_filter, struct sdp_msg *result,
|
|||
if (remote->audio_codecs.count)
|
||||
sdp_audio_codecs_intersection(r, &remote->audio_codecs, true);
|
||||
|
||||
#if 0
|
||||
/* 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
|
||||
* codec, because we have no way to deal with the remote side picking a different codec.
|
||||
* Another approach would be to postpone assignment until we know the codecs from the remote side. */
|
||||
if (sdp_audio_codec_is_set(a)) {
|
||||
/* 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. */
|
||||
* If present, make sure this is listed in first place.
|
||||
* If 'select' is NULL, the assigned codec is not present in the intersection of possible choices for
|
||||
* TFO. Just omit the assigned codec from the filter result, and it is the CC code's responsibility to
|
||||
* detect this and assign a working codec instead. */
|
||||
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);
|
||||
}
|
||||
#else
|
||||
/* Currently, osmo-msc does not trigger re-assignment if the remote side has picked a codec that is different
|
||||
* from the already assigned codec.
|
||||
* So, if locally, Assignment has already chosen a codec, this is the single definitive result to be used
|
||||
* towards the CN. */
|
||||
if (sdp_audio_codec_is_set(a)) {
|
||||
/* Assignment has completed, the chosen codec should be the the only possible one. */
|
||||
*r = (struct sdp_audio_codecs){};
|
||||
sdp_audio_codecs_add_copy(r, a);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -270,7 +270,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),
|
||||
|
@ -748,6 +757,7 @@ void gsm48_cc_rx_setup_cn_local_rtp_port_known(struct gsm_trans *trans)
|
|||
static void rx_mncc_sdp(struct gsm_trans *trans, uint32_t mncc_msg_type, const char *sdp,
|
||||
const struct gsm_mncc_bearer_cap *bcap)
|
||||
{
|
||||
struct codec_filter *codecs = &trans->cc.codecs;
|
||||
struct call_leg *cl = trans->msc_a ? trans->msc_a->cc.call_leg : NULL;
|
||||
struct rtp_stream *rtp_cn = cl ? cl->rtp[RTP_TO_CN] : NULL;
|
||||
|
||||
|
@ -775,6 +785,30 @@ static void rx_mncc_sdp(struct gsm_trans *trans, uint32_t mncc_msg_type, const c
|
|||
rtp_stream_set_remote_addr_and_codecs(rtp_cn, &trans->cc.remote);
|
||||
rtp_stream_commit(rtp_cn);
|
||||
}
|
||||
|
||||
/* See if we need to switch codecs to maintain TFO: has the remote side changed the codecs information? If we
|
||||
* have already assigned a specific codec here, but the remote call leg has now chosen a different codec, we
|
||||
* need to re-assign this call leg to match the remote leg. */
|
||||
if (!sdp_audio_codec_is_set(&codecs->assignment)) {
|
||||
/* Voice channel assignment has not completed. Do not interfere. */
|
||||
return;
|
||||
}
|
||||
if (!trans->cc.remote.audio_codecs.count) {
|
||||
/* Don't know remote codecs, nothing to do. */
|
||||
return;
|
||||
}
|
||||
if (sdp_audio_codecs_by_descr(&trans->cc.remote.audio_codecs, &codecs->assignment)) {
|
||||
/* The assigned codec is part of the remote codec set. All is well. */
|
||||
/* TODO: maybe this should require exactly the *first* remote codec to match, because we cannot flexibly
|
||||
* transcode, and assume the actual payload we will receive is listed in the first place? */
|
||||
return;
|
||||
}
|
||||
|
||||
/* We've already completed Assignment of a voice channel (some time ago), and now the remote side has changed
|
||||
* to a mismatching codec (list). Try to re-assign this side to a matching codec. */
|
||||
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_cmd(trans->msc_a);
|
||||
}
|
||||
|
||||
static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
|
||||
|
@ -2049,17 +2083,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);
|
||||
|
|
|
@ -636,7 +636,7 @@ int msc_a_ensure_cn_local_rtp(struct msc_a *msc_a, struct gsm_trans *cc_trans)
|
|||
}
|
||||
|
||||
/* 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_cmd(struct msc_a *msc_a)
|
||||
{
|
||||
struct ran_msg msg;
|
||||
struct gsm_trans *cc_trans = msc_a->cc.active_trans;
|
||||
|
@ -804,7 +804,7 @@ static void msc_a_fsm_communicating(struct osmo_fsm_inst *fi, uint32_t event, vo
|
|||
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_cmd(msc_a);
|
||||
return;
|
||||
case RTP_TO_CN:
|
||||
cc_on_cn_local_rtp_port_known(rtps->for_trans);
|
||||
|
|
|
@ -380,7 +380,7 @@ static void msc_ho_send_handover_request(struct msc_a *msc_a)
|
|||
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 @@ static void msc_ho_send_handover_request(struct msc_a *msc_a)
|
|||
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");
|
||||
|
|
|
@ -1083,6 +1083,9 @@ static bool validate_sdp(const char *func, const char *desc,
|
|||
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);
|
||||
|
|
|
@ -2636,19 +2636,22 @@ DBSSAP msc_a(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ){MSC_A_ST_
|
|||
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
|
||||
|
@ -4457,19 +4460,22 @@ DBSSAP msc_a(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ){MSC_A_ST_
|
|||
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 @@ DBSSAP msc_a(IMSI-901700000010650:MSISDN-46071:GERAN-A:CM_SERVICE_REQ){MSC_A_ST_
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue