do CN CRCX first

In order to send the MSC's RTP endpoint IP address+port in the inital
SDP, move the MGCP CRCX up to an earlier point in the sequence of
establishing a voice call.

Update the voice call sequence chart to show the effects.

Related: SYS#5066
Change-Id: Ie433db1ba0c46d4b97538a969233c155cefac21c
neels/codecs_fmtp
Neels Hofmeyr 11 months ago
parent d109d953ad
commit 2b8ae17aa2
  1. 79
      doc/sequence_charts/voice_call_full.msc
  2. 5
      include/osmocom/msc/gsm_04_08.h
  3. 1
      include/osmocom/msc/msc_a.h
  4. 165
      src/libmsc/gsm_04_08_cc.c
  5. 187
      src/libmsc/msc_a.c
  6. 131
      tests/msc_vlr/msc_vlr_test_call.c
  7. 272
      tests/msc_vlr/msc_vlr_test_call.err

@ -11,22 +11,22 @@ moms =>> momsc [label="RR CIPH_M_COMPL"];
moms =>> momsc [label="CC SETUP"];
momsc note momsc [label="CC starts guard timer (180s)"];
momsc abox momsc [label="CC state:\nINITIATED"];
momgw <<= momsc [label="for CN: CRCX\nrtpbridge/*@msc"];
momgw =>> momsc [label="for CN: CRCX OK\nEP-1 CI-1"];
momgw <<= momsc [label="for RAN: CRCX\nEP-1"];
momsc =>> sip [label="MNCC_SETUP_IND"];
momsc <<= sip [label="MNCC_RTP_CREATE"];
momgw <<= momsc [label="for RAN: CRCX\nrtpbridge/*@msc"];
momgw =>> momsc [label="for RAN: CRCX OK\nEP-1 CI-1"];
momgw =>> momsc [label="for RAN: CRCX OK\nEP-1 CI-2"];
moms <<= momsc [label="(BSSMAP) ASSIGNMENT_COMMAND"];
momsc <<= sip [label="MNCC_RTP_CREATE"];
moms =>> momsc [label="(BSSMAP) Assignment Complete"];
momgw <<= momsc [label="for RAN: MDCX\nEP-1 CI-1"];
momgw =>> momsc [label="for RAN: MDCX OK\nEP-1 CI-1"];
momgw <<= momsc [label="for CN: CRCX\nEP-1"];
momgw =>> momsc [label="for CN: CRCX OK\nEP-1 CI-2"];
momgw <<= momsc [label="for RAN: MDCX\nEP-1 CI-2"];
momsc =>> sip [label="MNCC_RTP_CREATE\nIP:port-1"];
momsc <<= sip [label="MNCC_CALL_PROC_REQ"];
momsc note momsc [label="CC stops guard timer"];
momsc note momsc [label="CC starts guard timer (180s)"];
momsc abox momsc [label="CC state:\nMO_CALL_PROC"];
moms <<= momsc [label="CC CALL_PROC"];
momgw =>> momsc [label="for RAN: MDCX OK\nEP-1 CI-2"];
mtmsc <<= sip [label="MNCC_SETUP_REQ"];
mtms <<= mtmsc [label="Paging"];
mtms =>> mtmsc [label="RR PAG_RESP"];
@ -36,24 +36,25 @@ mtms =>> mtmsc [label="MM AUTH_RESP"];
mtms <<= mtmsc [label="(RANAP) SecurityModeCommand"];
mtms =>> mtmsc [label="(RANAP) SecurityModeControl successfulOutcome"];
mtms <<= mtmsc [label="(RANAP) CommonId"];
mtmsc note mtmsc [label="CC starts timer T303 (30s)"];
mtmsc abox mtmsc [label="CC state:\nCALL_PRESENT"];
mtmsc note mtmsc [label="CC starts timer T303 (30s)"];
mtms <<= mtmsc [label="CC SETUP"];
mtms =>> mtmsc [label="CC CALL_CONF"];
mtmsc note mtmsc [label="CC stops timer T303"];
mtmsc note mtmsc [label="CC starts timer T310 (30s)"];
mtmgw <<= mtmsc [label="for CN: CRCX\nrtpbridge/*@msc"];
mtmsc abox mtmsc [label="CC state:\nMO_TERM_CALL_CONF"];
mtmgw <<= mtmsc [label="for RAN: CRCX\nrtpbridge/*@msc"];
mtmsc =>> sip [label="MNCC_CALL_CONF_IND"];
mtmsc <<= sip [label="MNCC_RTP_CREATE"];
mtmgw =>> mtmsc [label="for RAN: CRCX OK\nEP-2 CI-3"];
mtmgw =>> mtmsc [label="for CN: CRCX OK\nEP-2 CI-3"];
mtmgw <<= mtmsc [label="for RAN: CRCX\nEP-2"];
mtmsc =>> sip [label="MNCC_RTP_CREATE\nIP:port-2"];
mtmgw =>> mtmsc [label="for RAN: CRCX OK\nEP-2 CI-4"];
mtms <<= mtmsc [label="(RANAP) RAB AssignmentRequest"];
mtms =>> mtmsc [label="(RANAP) RAB Assignment Response"];
mtmgw <<= mtmsc [label="for RAN: MDCX\nEP-2 CI-3"];
mtmgw =>> mtmsc [label="for RAN: MDCX OK\nEP-2 CI-3"];
mtmgw <<= mtmsc [label="for CN: CRCX\nEP-2"];
mtmgw =>> mtmsc [label="for CN: CRCX OK\nEP-2 CI-4"];
mtmgw <<= mtmsc [label="for RAN: MDCX\nEP-2 CI-4"];
mtmsc =>> sip [label="MNCC_RTP_CREATE\nIP:port-2"];
mtmgw =>> mtmsc [label="for RAN: MDCX OK\nEP-2 CI-4"];
mtms =>> mtmsc [label="CC ALERTING"];
mtmsc note mtmsc [label="CC stops timer T310"];
mtmsc note mtmsc [label="CC starts timer T301 (180s)"];
@ -68,55 +69,55 @@ mtms =>> mtmsc [label="CC CONNECT"];
mtmsc note mtmsc [label="CC stops timer T301"];
mtmsc abox mtmsc [label="CC state:\nCONNECT_REQUEST"];
mtmsc =>> sip [label="MNCC_SETUP_CNF"];
mtmsc <<= sip [label="MNCC_RTP_CONNECT\nIP:port-1"];
mtmgw <<= mtmsc [label="for CN: MDCX\nEP-2 CI-4"];
mtmsc <<= sip [label="MNCC_RTP_CONNECT"];
mtmgw <<= mtmsc [label="for CN: MDCX\nEP-2 CI-3"];
mtmsc <<= sip [label="MNCC_SETUP_COMPL_REQ"];
mtmsc note mtmsc [label="CC starts guard timer (180s)"];
mtmsc abox mtmsc [label="CC state:\nACTIVE"];
mtmsc note mtmsc [label="CC stops guard timer"];
mtms <<= mtmsc [label="CC CONNECT_ACK"];
mtmgw =>> mtmsc [label="for CN: MDCX OK\nEP-2 CI-4"];
momsc <<= sip [label="MNCC_RTP_CONNECT\nIP:port-2"];
momgw <<= momsc [label="for CN: MDCX\nEP-1 CI-2"];
mtmgw =>> mtmsc [label="for CN: MDCX OK\nEP-2 CI-3"];
momsc <<= sip [label="MNCC_RTP_CONNECT"];
momgw <<= momsc [label="for CN: MDCX\nEP-1 CI-1"];
momsc <<= sip [label="MNCC_SETUP_RSP"];
momsc note momsc [label="CC stops guard timer"];
momsc note momsc [label="CC starts guard timer (180s)"];
momsc note momsc [label="CC starts timer T313 (30s)"];
momsc abox momsc [label="CC state:\nCONNECT_IND"];
moms <<= momsc [label="CC CONNECT"];
momgw =>> momsc [label="for CN: MDCX OK\nEP-1 CI-2"];
momgw =>> momsc [label="for CN: MDCX OK\nEP-1 CI-1"];
moms =>> momsc [label="CC CONNECT_ACK"];
momsc note momsc [label="CC stops timer T313"];
momsc abox momsc [label="CC state:\nACTIVE"];
momsc note momsc [label="CC stops guard timer"];
momsc =>> sip [label="MNCC_SETUP_COMPL_IND"];
moms =>> momsc [label="CC DISCONNECT"];
momsc abox momsc [label="CC state:\nDISCONNECT_IND"];
momsc =>> sip [label="MNCC_DISC_IND"];
momsc <<= sip [label="MNCC_REL_REQ"];
momsc note momsc [label="CC starts guard timer (180s)"];
momsc note momsc [label="CC starts timer T308 (10s)"];
momsc abox momsc [label="CC state:\nRELEASE_REQ"];
moms <<= momsc [label="CC RELEASE"];
mtmsc <<= sip [label="MNCC_DISC_REQ"];
mtmsc note mtmsc [label="CC starts guard timer (180s)"];
mtmsc note mtmsc [label="CC starts timer T306 (30s)"];
mtms =>> mtmsc [label="CC DISCONNECT"];
mtmsc abox mtmsc [label="CC state:\nDISCONNECT_IND"];
mtms <<= mtmsc [label="CC DISCONNECT"];
moms =>> momsc [label="CC RELEASE_COMPL"];
momsc note momsc [label="CC stops timer T308"];
mtmsc =>> sip [label="MNCC_DISC_IND"];
mtmsc <<= sip [label="MNCC_REL_REQ"];
mtmsc note mtmsc [label="CC starts guard timer (180s)"];
mtmsc note mtmsc [label="CC starts timer T308 (10s)"];
mtmsc abox mtmsc [label="CC state:\nRELEASE_REQ"];
mtms <<= mtmsc [label="CC RELEASE"];
momsc <<= sip [label="MNCC_DISC_REQ"];
momsc note momsc [label="CC starts guard timer (180s)"];
momsc note momsc [label="CC starts timer T306 (30s)"];
momsc abox momsc [label="CC state:\nDISCONNECT_IND"];
moms <<= momsc [label="CC DISCONNECT"];
moms =>> momsc [label="CC RELEASE"];
momsc note momsc [label="CC stops timer T306"];
moms <<= momsc [label="CC RELEASE_COMPL"];
momsc abox momsc [label="CC state:\nNULL"];
momsc note momsc [label="CC stops guard timer"];
moms <<= momsc [label="(BSSMAP) CLEAR_COMMAND"];
momsc =>> sip [label="MNCC_REL_CNF"];
momsc =>> sip [label="MNCC_REL_IND"];
moms =>> momsc [label="(BSSMAP) Clear Complete"];
mtms =>> mtmsc [label="CC RELEASE"];
mtmsc note mtmsc [label="CC stops timer T306"];
mtms <<= mtmsc [label="CC RELEASE_COMPL"];
mtms =>> mtmsc [label="CC RELEASE_COMPL"];
mtmsc note mtmsc [label="CC stops timer T308"];
mtmsc abox mtmsc [label="CC state:\nNULL"];
mtmsc note mtmsc [label="CC stops guard timer"];
mtms <<= mtmsc [label="(RANAP) Iu Release"];
mtmsc =>> sip [label="MNCC_REL_IND"];
mtmsc =>> sip [label="MNCC_REL_CNF"];
mtms =>> mtmsc [label="(RANAP) Iu Release successfulOutcome"];
moms =>> momsc [label="IMSI Detach"];
mtms =>> mtmsc [label="IMSI Detach"];

@ -45,6 +45,11 @@ int gsm48_send_rr_app_info(struct msc_a *msc_a, uint8_t apdu_id, uint8_t apdu_le
int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, uint8_t power_class);
int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan, uint8_t power_command, uint8_t ho_ref);
void gsm48_cc_rx_setup_cn_local_rtp_port_known(struct gsm_trans *trans);
void gsm48_cc_rx_call_conf_cn_local_rtp_port_known(struct gsm_trans *trans);
int cc_cn_local_rtp_port_known(struct gsm_trans *trans);
int cc_assignment_done(struct gsm_trans *trans);
int mncc_tx_to_cc(struct gsm_network *net, void *arg);
/* convert a ASCII phone number to call-control BCD */

@ -207,6 +207,7 @@ void msc_a_up_ciph_res(struct msc_a *msc_a, bool success, const char *imeisv);
bool msc_a_is_accepted(const struct msc_a *msc_a);
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);
const char *msc_a_cm_service_type_to_use(enum osmo_cm_service_type cm_service_type);

@ -513,10 +513,6 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
unsigned int payload_len = msgb_l3len(msg) - sizeof(*gh);
struct tlv_parsed tp;
struct gsm_mncc setup;
struct osmo_sockaddr_str *rtp_cn_local;
struct sdp_msg *sdp;
struct msc_a *msc_a = trans->msc_a;
int rc;
gsm48_start_guard_timer(trans);
@ -541,6 +537,8 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
msgb_free(gcr_msg);
}
OSMO_ASSERT(trans->msc_a);
tlv_parse(&tp, &gsm48_att_tlvdef, gh->data, payload_len, 0, 0);
/* emergency setup is identified by msg_type */
if (msg_type == GSM48_MT_CC_EMERG_SETUP) {
@ -610,8 +608,6 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
TLVP_VAL(&tp, GSM48_IE_CC_CAP)-1);
}
new_cc_state(trans, GSM_CSTATE_INITIATED);
/* MO call leg starting, gather all codec information so far known: */
codec_filter_init(&trans->cc.codecs);
codec_filter_set_ran(&trans->cc.codecs, trans->msc_a->c.ran->type);
@ -626,15 +622,53 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
rate_ctr_inc(rate_ctr_group_get_ctr(trans->net->msc_ctrs, MSC_CTR_CALL_MO_SETUP));
new_cc_state(trans, GSM_CSTATE_INITIATED);
/* To complete the MNCC_SETUP_IND, we need to provide an RTP address and port. First instruct the MGW to create
* a CN-side RTP conn, and continue with MNCC_SETUP_IND once that is done. Leave trans.cc in GSM_CSTATE_NULL and
* note down the msg_type to indicate that we indeed composed an MNCC_SETUP_IND for later. */
setup.msg_type = MNCC_SETUP_IND;
trans->cc.msg = setup;
return msc_a_try_call_assignment(trans);
/* continue in gsm48_cc_rx_setup_cn_local_rtp_port_known() */
}
/* Callback for MNCC_SETUP_IND waiting for the core network RTP port to be established by the MGW (via msc_a) */
void gsm48_cc_rx_setup_cn_local_rtp_port_known(struct gsm_trans *trans)
{
struct msc_a *msc_a = trans->msc_a;
struct gsm_mncc setup = trans->cc.msg;
struct osmo_sockaddr_str *rtp_cn_local;
struct sdp_msg *sdp;
int rc;
if (trans->cc.state != GSM_CSTATE_INITIATED
|| setup.msg_type != MNCC_SETUP_IND) {
LOG_TRANS(trans, LOGL_ERROR,
"Unexpected CC state. Expected GSM_CSTATE_NULL and a buffered MNCC_SETUP_IND message,"
" found CC state %d and msg_type %s\n",
trans->cc.state, get_mncc_name(setup.msg_type));
trans->callref = 0;
trans_free(trans);
return;
}
if (!msc_a) {
LOG_TRANS(trans, LOGL_ERROR, "No connection for CC trans\n");
trans->callref = 0;
trans_free(trans);
return;
}
/* 'setup' above has taken the value of trans->cc.msg, we can now clear that. */
trans->cc.msg = (struct gsm_mncc){};
/* Insert the CN side RTP port now available into SDP and compose SDP string */
rtp_cn_local = call_leg_local_ip(msc_a->cc.call_leg, RTP_TO_CN);
if (!osmo_sockaddr_str_is_nonzero(rtp_cn_local)) {
LOG_TRANS(trans, LOGL_ERROR, "Cannot compose SDP for MNCC_SETUP_IND: no RTP set up for the CN side\n");
/* FIXME: re-add below two lines as soon as CN CRCX is done first
* (see Change-Id Ie433db1ba0c46d4b97538a969233c155cefac21c).
* keeping it non-fatal for the moment, for tests to continue succeeding. */
//trans_free(trans);
//return -EINVAL;
trans_free(trans);
return;
}
codec_filter_set_local_rtp(&trans->cc.codecs, rtp_cn_local);
@ -644,16 +678,11 @@ static int gsm48_cc_rx_setup(struct gsm_trans *trans, struct msgb *msg)
if (rc >= sizeof(setup.sdp)) {
LOG_TRANS(trans, LOGL_ERROR, "MNCC_SETUP_IND: SDP too long (%d > %zu bytes)\n", rc, sizeof(setup.sdp));
trans_free(trans);
return -EINVAL;
return;
}
/* indicate setup to MNCC */
mncc_recvmsg(trans->net, trans, MNCC_SETUP_IND, &setup);
/* MNCC code will modify the channel asynchronously, we should
* ipaccess-bind only after the modification has been made to the
* lchan->tch_mode */
return 0;
}
static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
@ -696,8 +725,6 @@ static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
gh->msg_type = GSM48_MT_CC_SETUP;
gsm48_start_cc_timer(trans, 0x303, GSM48_T303);
/* MT call leg is starting. Gather all codecs information so far known.
* (Usually) paging has succeeded, and now we're processing the MNCC Setup from the remote MO call leg.
* Initialize the codecs filter with this side's BSS' codec list, received at Complete Layer 3.
@ -786,6 +813,8 @@ static int gsm48_cc_tx_setup(struct gsm_trans *trans, void *arg)
rate_ctr_inc(rate_ctr_group_get_ctr(trans->net->msc_ctrs, MSC_CTR_CALL_MT_SETUP));
gsm48_start_cc_timer(trans, 0x303, GSM48_T303);
return trans_tx_gsm48(trans, msg);
}
@ -844,8 +873,6 @@ static int gsm48_cc_rx_call_conf(struct gsm_trans *trans, struct msgb *msg)
/* IMSI of called subscriber */
OSMO_STRLCPY_ARRAY(call_conf.imsi, trans->vsub->imsi);
new_cc_state(trans, GSM_CSTATE_MO_TERM_CALL_CONF);
/* Assign call (if not done yet) */
rc = msc_a_try_call_assignment(trans);
@ -854,8 +881,45 @@ static int gsm48_cc_rx_call_conf(struct gsm_trans *trans, struct msgb *msg)
if (rc)
return rc;
return mncc_recvmsg(trans->net, trans, MNCC_CALL_CONF_IND,
&call_conf);
/* Directly ack with MNCC_CALL_CONF_IND, not yet containing SDP or RTP IP:port information. */
new_cc_state(trans, GSM_CSTATE_MO_TERM_CALL_CONF);
return mncc_recvmsg(trans->net, trans, MNCC_CALL_CONF_IND, &call_conf);
}
static int mncc_recv_rtp(struct gsm_network *net, struct gsm_trans *trans, uint32_t callref,
int cmd, struct osmo_sockaddr_str *rtp_addr, uint32_t payload_type,
uint32_t payload_msg_type, const struct sdp_msg *sdp);
int gsm48_cc_mt_rtp_port_and_codec_known(struct gsm_trans *trans)
{
struct msc_a *msc_a = trans->msc_a;
struct osmo_sockaddr_str *rtp_cn_local;
struct gsm_mncc_rtp;
if (!msc_a) {
LOG_TRANS(trans, LOGL_ERROR, "No connection for CC trans\n");
trans->callref = 0;
trans_free(trans);
return -EINVAL;
}
/* Insert the CN side RTP port now available into SDP */
rtp_cn_local = call_leg_local_ip(msc_a->cc.call_leg, RTP_TO_CN);
if (!rtp_cn_local) {
LOG_TRANS(trans, LOGL_ERROR, "Cannot compose SDP for MNCC_RTP_CREATE: no RTP set up for the CN side\n");
trans_free(trans);
return -EINVAL;
}
codec_filter_set_local_rtp(&trans->cc.codecs, rtp_cn_local);
codec_filter_run(&trans->cc.codecs);
LOG_TRANS(trans, LOGL_DEBUG, "codecs: %s\n", codec_filter_to_str(&trans->cc.codecs));
if (!sdp_audio_codec_is_set(&trans->cc.codecs.assignment))
return 0;
return mncc_recv_rtp(msc_a_net(msc_a), trans, trans->callref, MNCC_RTP_CREATE, rtp_cn_local, 0, 0,
&trans->cc.codecs.result);
}
static int gsm48_cc_tx_call_proc_and_assign(struct gsm_trans *trans, void *arg)
@ -1837,6 +1901,61 @@ static int tch_rtp_create(struct gsm_network *net, uint32_t callref)
return msc_a_try_call_assignment(trans);
}
int cc_cn_local_rtp_port_known(struct gsm_trans *cc_trans)
{
switch(cc_trans->cc.state) {
case GSM_CSTATE_INITIATED:
if (cc_trans->cc.msg.msg_type != MNCC_SETUP_IND) {
LOG_TRANS(cc_trans, LOGL_ERROR, "Assuming MO call, expected MNCC_SETUP_IND to be prepared\n");
return -EINVAL;
}
/* This is the MO call leg, waiting for a CN RTP be able to send initial MNCC_SETUP_IND. */
gsm48_cc_rx_setup_cn_local_rtp_port_known(cc_trans);
return 0;
case GSM_CSTATE_MO_TERM_CALL_CONF:
/* This is the MT call leg, waiting for a CN RTP to be able to send MNCC_CALL_CONF_IND. */
return gsm48_cc_mt_rtp_port_and_codec_known(cc_trans);
default:
LOG_TRANS(cc_trans, LOGL_ERROR, "CN RTP address available, but in unexpected state %d\n",
cc_trans->cc.state);
return -EINVAL;
}
}
int cc_assignment_done(struct gsm_trans *trans)
{
struct msc_a *msc_a = trans->msc_a;
switch (trans->cc.state) {
case GSM_CSTATE_INITIATED:
case GSM_CSTATE_MO_CALL_PROC:
/* MO call */
break;
case GSM_CSTATE_CALL_RECEIVED:
case GSM_CSTATE_MO_TERM_CALL_CONF:
/* MT call */
break;
case GSM_CSTATE_ACTIVE:
/* already active. MNCC finished before Abis completed the Assignment. */
break;
default:
LOG_TRANS(trans, LOGL_ERROR, "Assignment done in unexpected CC state: %d\n", trans->cc.state);
return -EINVAL;
}
if (!call_leg_local_ip(msc_a->cc.call_leg, RTP_TO_CN)) {
LOG_TRANS(trans, LOGL_DEBUG,
"Assignment complete, but still waiting for the CRCX OK on the CN side RTP\n");
return 0;
}
return gsm48_tch_rtp_create(trans);
}
/* Trigger TCH_RTP_CREATE acknowledgement */
int gsm48_tch_rtp_create(struct gsm_trans *trans)
{

@ -552,12 +552,87 @@ static void msc_a_fsm_authenticated(struct osmo_fsm_inst *fi, uint32_t event, vo
}
}
static struct call_leg *msc_a_ensure_call_leg(struct msc_a *msc_a, struct gsm_trans *for_cc_trans)
{
struct call_leg *cl = msc_a->cc.call_leg;
struct gsm_network *net = msc_a_net(msc_a);
/* Ensure that events about RTP endpoints coming from the msc_a->cc.call_leg know which gsm_trans to abort on
* error */
if (!msc_a->cc.active_trans)
msc_a->cc.active_trans = for_cc_trans;
if (msc_a->cc.active_trans != for_cc_trans) {
LOG_TRANS(for_cc_trans, LOGL_ERROR,
"Cannot create call leg, another trans is already active for this conn\n");
return NULL;
}
if (!cl) {
cl = msc_a->cc.call_leg = call_leg_alloc(msc_a->c.fi,
MSC_EV_CALL_LEG_TERM,
MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE,
MSC_EV_CALL_LEG_RTP_COMPLETE);
OSMO_ASSERT(cl);
/* HACK: We put the connection in loopback mode at the beginnig to
* trick the hNodeB into doing the IuUP negotiation with itself.
* This is a hack we need because osmo-mgw does not support IuUP yet, see OS#2459. */
if (msc_a->c.ran->type == OSMO_RAT_UTRAN_IU)
cl->crcx_conn_mode[RTP_TO_RAN] = MGCP_CONN_LOOPBACK;
if (net->use_osmux != OSMUX_USAGE_OFF) {
struct msc_i *msc_i = msc_a_msc_i(msc_a);
if (msc_i->c.remote_to) {
/* TODO: investigate what to do in this case */
LOG_MSC_A(msc_a, LOGL_ERROR, "Osmux not yet supported for inter-MSC");
} else {
cl->ran_peer_supports_osmux = msc_i->ran_conn->ran_peer->remote_supports_osmux;
}
}
}
return cl;
}
int msc_a_ensure_cn_local_rtp(struct msc_a *msc_a, struct gsm_trans *cc_trans)
{
struct call_leg *cl;
struct rtp_stream *rtp_to_ran;
cl = msc_a_ensure_call_leg(msc_a, cc_trans);
if (!cl)
return -EINVAL;
rtp_to_ran = cl->rtp[RTP_TO_RAN];
if (call_leg_local_ip(cl, RTP_TO_CN)) {
/* Already has an RTP address and port towards the CN, continue right away. */
return osmo_fsm_inst_dispatch(msc_a->c.fi, MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE, cl->rtp[RTP_TO_CN]);
}
/* No CN RTP address available yet, ask the MGW to create one.
* Set a codec to be used: if Assignment on the RAN side is already done, take the same codec as the RTP_TO_RAN.
* If no RAN side RTP is established, try to guess a preliminary codec from SDP -- before Assignment, picking a
* codec from the SDP is more politeness/avoiding confusion than necessity. The actual codec to be used would be
* determined later. If no codec could be determined, pass none for the time being. */
return call_leg_ensure_ci(cl, RTP_TO_CN, cc_trans->callref, cc_trans,
rtp_to_ran->codecs_known ? &rtp_to_ran->codecs : NULL, NULL);
}
static void msc_a_call_leg_cn_local_addr_available(struct msc_a *msc_a, struct gsm_trans *cc_trans)
{
cc_cn_local_rtp_port_known(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)
{
struct ran_msg msg;
struct gsm_trans *cc_trans = msc_a->cc.active_trans;
struct gsm0808_channel_type channel_type;
struct gsm0808_channel_type channel_type = {
.ch_indctr = GSM0808_CHAN_SPEECH,
.ch_rate_type = GSM0808_SPEECH_FULL_PREF,
};
if (!cc_trans) {
LOG_MSC_A(msc_a, LOGL_ERROR, "No CC transaction active\n");
@ -567,9 +642,22 @@ static void msc_a_call_leg_ran_local_addr_available(struct msc_a *msc_a)
/* Once a CI is known, we could also CRCX the CN side of the MGW endpoint, but it makes sense to wait for the
* codec to be determined by the Assignment Complete message, first. */
codec_filter_run(&cc_trans->cc.codecs);
LOG_TRANS(cc_trans, LOGL_DEBUG, "Sending Assignment Command with codecs: %s\n",
codec_filter_to_str(&cc_trans->cc.codecs));
if (!cc_trans->cc.codecs.result.audio_codecs.count) {
LOG_TRANS(cc_trans, LOGL_ERROR, "Assignment not possible, no matching codec: %s\n",
codec_filter_to_str(&cc_trans->cc.codecs));
call_leg_release(msc_a->cc.call_leg);
return;
}
if (mncc_bearer_cap_to_channel_type(&channel_type, &cc_trans->bearer_cap)) {
LOG_MSC_A(msc_a, LOGL_ERROR, "Cannot compose Channel Type from bearer capabilities\n");
/* Compose 48.008 Channel Type from the current set of codecs determined from both local and remote codec
* capabilities. */
if (sdp_audio_codecs_to_gsm0808_channel_type(&channel_type, &cc_trans->cc.codecs.result.audio_codecs)) {
LOG_MSC_A(msc_a, LOGL_ERROR, "Cannot compose Channel Type (Permitted Speech) from codecs: %s\n",
codec_filter_to_str(&cc_trans->cc.codecs));
trans_free(cc_trans);
return;
}
@ -594,15 +682,6 @@ static void msc_a_call_leg_ran_local_addr_available(struct msc_a *msc_a)
}
}
static void msc_a_call_leg_cn_local_addr_available(struct msc_a *msc_a, struct gsm_trans *cc_trans)
{
if (gsm48_tch_rtp_create(cc_trans)) {
LOG_MSC_A(msc_a, LOGL_ERROR, "Cannot inform MNCC of RTP address\n");
trans_free(cc_trans);
return;
}
}
static struct gsm_trans *find_waiting_call(struct msc_a *msc_a)
{
struct gsm_trans *trans;
@ -1315,7 +1394,6 @@ static void msc_a_up_call_assignment_complete(struct msc_a *msc_a, const struct
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;
struct sdp_audio_codecs *codecs;
const struct codec_mapping *m;
if (!rtps_to_ran) {
@ -1345,29 +1423,23 @@ static void msc_a_up_call_assignment_complete(struct msc_a *msc_a, const struct
/* Update RAN-side endpoint CI: */
rtp_stream_set_one_codec(rtps_to_ran, &m->sdp);
/* Update codecs filter with the codec chosen by Assignment */
cc_trans->cc.codecs.assignment = m->sdp;
}
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,
ac->assignment_complete.osmux_cid);
rtp_stream_commit(rtps_to_ran);
/* Remember the Codec List (BSS Supported) */
if (ac->assignment_complete.codec_list_bss_supported)
codec_filter_set_bss(&cc_trans->cc.codecs, ac->assignment_complete.codec_list_bss_supported);
/* Setup CN side endpoint CI:
* Now that
* - the first CI has been created and a definitive endpoint name is assigned to the call_leg's MGW
* endpoint,
* - the Assignment has chosen a speech codec
* go on to create the CN side RTP stream's CI. */
codecs = cc_trans->cc.codecs.result.audio_codecs.count ? &cc_trans->cc.codecs.result.audio_codecs : NULL;
if (call_leg_ensure_ci(msc_a->cc.call_leg, RTP_TO_CN, cc_trans->callref, cc_trans,
codecs, NULL)) {
LOG_MSC_A_CAT(msc_a, DCC, LOGL_ERROR, "Error creating MGW CI towards CN\n");
if (cc_assignment_done(cc_trans)) {
/* If an error occured, it was logged in cc_assignment_done() */
call_leg_release(msc_a->cc.call_leg);
return;
}
@ -1755,55 +1827,50 @@ int msc_tx_common_id(struct msc_a *msc_a, enum msc_role to_role)
static int msc_a_start_assignment(struct msc_a *msc_a, struct gsm_trans *cc_trans)
{
struct call_leg *cl = msc_a->cc.call_leg;
struct msc_i *msc_i = msc_a_msc_i(msc_a);
struct gsm_network *net = msc_a_net(msc_a);
struct call_leg *cl;
bool cn_rtp_available;
bool ran_rtp_available;
struct sdp_audio_codecs *codecs;
struct sdp_audio_codecs _codecs;
OSMO_ASSERT(!msc_a->cc.active_trans);
msc_a->cc.active_trans = cc_trans;
OSMO_ASSERT(cc_trans && cc_trans->type == TRANS_CC);
cl = msc_a_ensure_call_leg(msc_a, cc_trans);
if (!cl)
return -EINVAL;
if (!cl) {
cl = msc_a->cc.call_leg = call_leg_alloc(msc_a->c.fi,
MSC_EV_CALL_LEG_TERM,
MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE,
MSC_EV_CALL_LEG_RTP_COMPLETE);
OSMO_ASSERT(cl);
/* See if we can set a preliminary codec. If not, pass none for the time being. */
codec_filter_run(&cc_trans->cc.codecs);
codecs = cc_trans->cc.codecs.result.audio_codecs.count ? &cc_trans->cc.codecs.result.audio_codecs : NULL;
/* HACK: We put the connection in loopback mode at the beginning to
* trick the hNodeB into doing the IuUP negotiation with itself.
* This is a hack we need because osmo-mgw does not support IuUP yet, see OS#2459. */
if (msc_a->c.ran->type == OSMO_RAT_UTRAN_IU)
cl->crcx_conn_mode[RTP_TO_RAN] = MGCP_CONN_LOOPBACK;
}
cn_rtp_available = call_leg_local_ip(cl, RTP_TO_CN);
ran_rtp_available = call_leg_local_ip(cl, RTP_TO_RAN);
if (net->use_osmux != OSMUX_USAGE_OFF) {
msc_i = msc_a_msc_i(msc_a);
if (msc_i->c.remote_to) {
/* TODO: investigate what to do in this case */
LOG_MSC_A(msc_a, LOGL_ERROR, "Osmux not yet supported for inter-MSC");
} else {
cl->ran_peer_supports_osmux = msc_i->ran_conn->ran_peer->remote_supports_osmux;
/* Set up RTP ports for both RAN and CN side. Even though we ask for both at the same time, the
* osmo_mgcpc_ep_fsm automagically waits for the first CRCX to complete before firing the second CRCX. The one
* issued first here will also be the first CRCX sent to the MGW. Usually both still need to be set up. */
if (!cn_rtp_available)
call_leg_ensure_ci(cl, RTP_TO_CN, cc_trans->callref, cc_trans, codecs, NULL);
if (!ran_rtp_available) {
struct sdp_audio_codecs iufp;
if (msc_a->c.ran->type == OSMO_RAT_UTRAN_IU) {
/* On Iu, the hNodeB facing side of RTP talks IuUP. Hard code the RAN facing codec to "IUFP". */
iufp = (struct sdp_audio_codecs){0};
sdp_audio_codecs_add_mgcp_codec(&iufp, CODEC_IUFP);
codecs = &iufp;
}
call_leg_ensure_ci(cl, RTP_TO_RAN, cc_trans->callref, cc_trans, codecs, NULL);
}
/* This will lead to either MSC_EV_CALL_LEG_LOCAL_ADDR_AVAILABLE or MSC_EV_CALL_LEG_TERM.
* If the local address is already known, then immediately trigger. */
if (call_leg_local_ip(cl, RTP_TO_RAN))
/* Should these already be set up, immediately continue by retriggering the events signalling that the RTP
* ports are available. The ordering is: first CN, then RAN. */
if (cn_rtp_available && ran_rtp_available)
return osmo_fsm_inst_dispatch(msc_a->c.fi, MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE, cl->rtp[RTP_TO_RAN]);
if (msc_a->c.ran->type == OSMO_RAT_UTRAN_IU) {
/* The hNodeB facing side of RTP talks IuUP. Hard code the RAN facing codec to "IUFP". */
_codecs = (struct sdp_audio_codecs){0};
sdp_audio_codecs_add_mgcp_codec(&_codecs, CODEC_IUFP);
codecs = &_codecs;
} else {
codecs = cc_trans->cc.codecs.result.audio_codecs.count ? &cc_trans->cc.codecs.result.audio_codecs : NULL;
}
return call_leg_ensure_ci(msc_a->cc.call_leg, RTP_TO_RAN, cc_trans->callref, cc_trans, codecs, NULL);
else if (cn_rtp_available)
return osmo_fsm_inst_dispatch(msc_a->c.fi, MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE, cl->rtp[RTP_TO_CN]);
/* Otherwise wait for MGCP response and continue from there. */
return 0;
}
int msc_a_try_call_assignment(struct gsm_trans *cc_trans)

@ -202,8 +202,9 @@ static void test_call_mo()
BTW("a call is initiated");
btw("SETUP gets forwarded to MNCC");
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
btw("CC SETUP causes CRCX towards CN");
expect_crcx(RTP_TO_CN);
expect_crcx(RTP_TO_RAN);
ms_sends_msg("0385" /* CC, seq = 2 -> 0x80 | CC Setup = 0x5 */
"0406600402000581" /* Bearer Capability */
"5e038121f3" /* Called Number BCD */
@ -212,27 +213,27 @@ static void test_call_mo()
"04026000" /* UMTS: AMR 2 | AMR */
"00021f00" /* GSM: HR AMR | FR AMR | GSM EFR | GSM HR | GSM FR */
);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
btw("As soon as the MGW port towards CN is created, MNCC_SETUP_IND is triggered");
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
crcx_ok(RTP_TO_CN);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
mncc.callref = cc_to_mncc_tx_got_callref;
btw("MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN");
expect_crcx(RTP_TO_RAN);
mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
btw("MGW acknowledges the CRCX, triggering Assignment");
expect_iu_rab_assignment();
crcx_ok(RTP_TO_RAN);
OSMO_ASSERT(iu_rab_assignment_sent);
btw("Assignment succeeds, triggering CRCX to CN");
expect_crcx(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
btw("CN RTP address is available, trigger MNCC_RTP_CREATE");
btw("Assignment succeeds, triggering MNCC_RTP_CREATE ack to MNCC");
cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
crcx_ok(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
btw("MNCC says that's fine");
dtap_expect_tx("8302" /* CC: Call Proceeding */);
@ -285,6 +286,25 @@ static void test_call_mt()
struct gsm_mncc mncc = {
.imsi = IMSI,
.callref = 0x423,
.fields = MNCC_F_BEARER_CAP,
.bearer_cap = {
.speech_ver = {
GSM48_BCAP_SV_AMR_F,
GSM48_BCAP_SV_EFR,
GSM48_BCAP_SV_FR,
GSM48_BCAP_SV_AMR_H,
GSM48_BCAP_SV_HR,
-1 },
},
.sdp = "v=0\r\n"
"o=OsmoMSC 0 0 IN IP4 10.23.23.1\r\n"
"s=GSM Call\r\n"
"c=IN IP4 10.23.23.1\r\n"
"t=0 0\r\n"
"m=audio 23 RTP/AVP 112\r\n"
"a=rtpmap:112 AMR/8000\r\n"
"a=fmtp:112 octet-align=1\r\n"
"a=ptime:20\r\n",
};
comment_start();
@ -298,6 +318,7 @@ static void test_call_mt()
paging_expect_imsi(IMSI);
paging_sent = false;
mncc_sends_to_cc(MNCC_SETUP_REQ, &mncc);
mncc.sdp[0] = '\0';
VERBOSE_ASSERT(paging_sent, == true, "%d");
@ -316,22 +337,21 @@ static void test_call_mt()
VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
btw("MS sends SecurityModeControl acceptance, VLR accepts, sends CC Setup");
dtap_expect_tx("0305" /* CC: Setup */ "04 07 60 04 05 0b 06 08 87" /* Bearer Cap */);
dtap_expect_tx("0305" /* CC: Setup */ "04 04 60 04 05 8b" /* Bearer Cap */);
ms_sends_security_mode_complete(1);
btw("MS confirms call, we create a RAN-side RTP and forward MNCC_CALL_CONF_IND");
expect_crcx(RTP_TO_CN);
expect_crcx(RTP_TO_RAN);
cc_to_mncc_expect_tx(IMSI, MNCC_CALL_CONF_IND);
ms_sends_msg("8348" /* CC: Call Confirmed */
"0406600402000581" /* Bearer Capability */
"15020100" /* Call Control Capabilities */
"40080402600400021f00" /* Supported Codec List */);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
btw("MNCC sends MNCC_RTP_CREATE");
mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
btw("MGW acknowledges the CRCX to RAN, triggering Assignment");
expect_iu_rab_assignment();
crcx_ok(RTP_TO_RAN);
@ -340,21 +360,26 @@ static void test_call_mt()
btw("Assignment completes, triggering CRCX to CN");
expect_crcx(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
btw("When the CN side RTP address is known, send MNCC_RTP_CREATE");
btw("MNCC sends MNCC_RTP_CREATE, which first waits for the CN side RTP");
mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
btw("When the CN side RTP address is known, ack MNCC_RTP_CREATE with full SDP");
cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
crcx_ok(RTP_TO_CN);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
fake_time_passes(1, 23);
cc_to_mncc_expect_tx("", MNCC_ALERT_IND);
ms_sends_msg("8381" /* CC: Alerting */);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
fake_time_passes(1, 23);
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_CNF);
ms_sends_msg("83c7" /* CC: Connect */);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
dtap_expect_tx("030f" /* CC: Connect Acknowledge */);
mncc_sends_to_cc(MNCC_SETUP_COMPL_REQ, &mncc);
@ -388,6 +413,19 @@ static void test_call_mt2()
struct gsm_mncc mncc = {
.imsi = IMSI,
.callref = 0x423,
.fields = MNCC_F_BEARER_CAP,
.bearer_cap = {
.speech_ver = { GSM48_BCAP_SV_FR, -1, },
},
.sdp = "v=0\r\n"
"o=OsmoMSC 0 0 IN IP4 10.23.23.1\r\n"
"s=GSM Call\r\n"
"c=IN IP4 10.23.23.1\r\n"
"t=0 0\r\n"
"m=audio 23 RTP/AVP 112\r\n"
"a=rtpmap:112 AMR/8000\r\n"
"a=fmtp:112 octet-align=1\r\n"
"a=ptime:20\r\n",
};
comment_start();
@ -419,20 +457,22 @@ static void test_call_mt2()
VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
btw("MS sends SecurityModeControl acceptance, VLR accepts, sends CC Setup");
dtap_expect_tx("0305" /* CC: Setup */ "04 07 60 04 05 0b 06 08 87" /* Bearer Cap */);
dtap_expect_tx("0305" /* CC: Setup */ "04 04 60 04 05 8b" /* Bearer Cap */);
ms_sends_security_mode_complete(1);
btw("MS confirms call, we create a RAN-side RTP and forward MNCC_CALL_CONF_IND");
expect_crcx(RTP_TO_CN);
expect_crcx(RTP_TO_RAN);
cc_to_mncc_expect_tx(IMSI, MNCC_CALL_CONF_IND);
ms_sends_msg("8348" /* CC: Call Confirmed */
"0406600402000581" /* Bearer Capability */
"15020100" /* Call Control Capabilities */
"40080402600400021f00" /* Supported Codec List */);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
btw("MNCC sends MNCC_RTP_CREATE");
btw("MNCC sends MNCC_RTP_CREATE, which first waits for the CN side RTP");
mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
btw("MGW acknowledges the CRCX to RAN, triggering Assignment");
@ -441,13 +481,13 @@ static void test_call_mt2()
OSMO_ASSERT(iu_rab_assignment_sent);
btw("Assignment completes, triggering CRCX to CN");
expect_crcx(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
btw("When the CN side RTP address is known, send MNCC_RTP_CREATE");
btw("When the CN side RTP address is known, ack MNCC_RTP_CREATE with full SDP");
cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
crcx_ok(RTP_TO_CN);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
fake_time_passes(1, 23);
cc_to_mncc_expect_tx("", MNCC_ALERT_IND);
@ -514,8 +554,9 @@ static void test_call_mo_to_unknown()
BTW("a call is initiated");
btw("SETUP gets forwarded to MNCC");
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
btw("CC SETUP causes CRCX towards CN");
expect_crcx(RTP_TO_CN);
expect_crcx(RTP_TO_RAN);
ms_sends_msg("0385" /* CC, seq = 2 -> 0x80 | CC Setup = 0x5 */
"0406600402000581" /* Bearer Capability */
"5e038121f3" /* Called Number BCD */
@ -524,27 +565,27 @@ static void test_call_mo_to_unknown()
"04026000" /* UMTS: AMR 2 | AMR */
"00021f00" /* GSM: HR AMR | FR AMR | GSM EFR | GSM HR | GSM FR */
);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
btw("As soon as the MGW port towards CN is created, MNCC_SETUP_IND is triggered");
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
crcx_ok(RTP_TO_CN);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
mncc.callref = cc_to_mncc_tx_got_callref;
btw("MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN");
expect_crcx(RTP_TO_RAN);
mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
btw("MGW acknowledges the CRCX, triggering Assignment");
expect_iu_rab_assignment();
crcx_ok(RTP_TO_RAN);
OSMO_ASSERT(iu_rab_assignment_sent);
btw("Assignment succeeds, triggering CRCX to CN");
expect_crcx(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
btw("CN RTP address is available, trigger MNCC_RTP_CREATE");
btw("Assignment succeeds, triggering MNCC_RTP_CREATE ack to MNCC");
cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
crcx_ok(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
btw("MNCC says that's fine");
dtap_expect_tx("8302" /* CC: Call Proceeding */);
@ -561,7 +602,6 @@ static void test_call_mo_to_unknown()
expect_iu_release();
cc_to_mncc_expect_tx("", MNCC_REL_CNF);
ms_sends_msg("036a" /* CC: Release Complete */);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
OSMO_ASSERT(iu_release_sent);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
@ -610,8 +650,9 @@ static void test_call_mo_to_unknown_timeout()
BTW("a call is initiated");
btw("SETUP gets forwarded to MNCC");
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
btw("CC SETUP causes CRCX towards CN");
expect_crcx(RTP_TO_CN);
expect_crcx(RTP_TO_RAN);
ms_sends_msg("0385" /* CC, seq = 2 -> 0x80 | CC Setup = 0x5 */
"0406600402000581" /* Bearer Capability */
"5e038121f3" /* Called Number BCD */
@ -620,27 +661,27 @@ static void test_call_mo_to_unknown_timeout()
"04026000" /* UMTS: AMR 2 | AMR */
"00021f00" /* GSM: HR AMR | FR AMR | GSM EFR | GSM HR | GSM FR */
);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
btw("As soon as the MGW port towards CN is created, MNCC_SETUP_IND is triggered");
cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
crcx_ok(RTP_TO_CN);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
mncc.callref = cc_to_mncc_tx_got_callref;
btw("MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN");
expect_crcx(RTP_TO_RAN);
mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
OSMO_ASSERT(crcx_scheduled(RTP_TO_RAN));
btw("MGW acknowledges the CRCX, triggering Assignment");
expect_iu_rab_assignment();
crcx_ok(RTP_TO_RAN);
OSMO_ASSERT(iu_rab_assignment_sent);
btw("Assignment succeeds, triggering CRCX to CN");
expect_crcx(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(crcx_scheduled(RTP_TO_CN));
btw("CN RTP address is available, trigger MNCC_RTP_CREATE");
btw("Assignment succeeds, triggering MNCC_RTP_CREATE ack to MNCC");
cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
crcx_ok(RTP_TO_CN);
ms_sends_assignment_complete(CODEC_AMR_8000_1);
OSMO_ASSERT(cc_to_mncc_tx_confirmed);
btw("MNCC says that's fine");
dtap_expect_tx("8302" /* CC: Call Proceeding */);

@ -275,7 +275,7 @@ DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE
- a call is initiated
- SETUP gets forwarded to MNCC
- CC SETUP causes CRCX towards CN
MSC <--UTRAN-Iu-- MS: GSM48_MT_CC_SETUP
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_AUTHENTICATED}: + rx_from_ms: now used by 2 (cm_service_cc,rx_from_ms)
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_AUTHENTICATED}: RAN decode: DTAP
@ -288,49 +288,50 @@ DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: - cm_service_cc: now used by 2 (rx_from_ms,cc)
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) rx SETUP in state NULL
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) starting guard timer with 180 seconds
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) SETUP to 123
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} result=:0{AMR:octet-align=1#112}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) new state NULL -> INITIATED
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) SETUP to 123
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} result=:0{AMR:octet-align=1#112}
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) Cannot compose SDP for MNCC_SETUP_IND: no RTP set up for the CN side
DMNCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) tx MNCC_SETUP_IND
MSC --> MNCC: callref 0x80000001: MNCC_SETUP_IND
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: - rx_from_ms: now used by 1 (cc)
- MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN
MSC <-- MNCC: callref 0x80000001: MNCC_RTP_CREATE
DMNCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) rx MNCC_RTP_CREATE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: Starting call assignment
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){ESTABLISHING}: Allocated
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){ESTABLISHING}: is child of msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
MGW <--CRCX to RTP_TO_CN-- MSC: callref=0x80000001 codecs=AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
MGW <--CRCX to RTP_TO_RAN-- MSC: callref=0x80000001 codecs=VND.3GPP.IUFP#96
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_RAN:no-CI){UNINITIALIZED}: setting codecs to VND.3GPP.IUFP#96
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: - rx_from_ms: now used by 1 (cc)
- As soon as the MGW port towards CN is created, MNCC_SETUP_IND is triggered
MGW --CRCX OK to RTP_TO_CN--> MSC
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){ESTABLISHING}: Received Event CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: Received Event MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: MGW endpoint's RTP address available for the CI RTP_TO_CN: 10.23.23.1:23 (osmux=no:-2)
DMNCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) tx MNCC_SETUP_IND
MSC --> MNCC: callref 0x80000001: MNCC_SETUP_IND
- MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN
MSC <-- MNCC: callref 0x80000001: MNCC_RTP_CREATE
DMNCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) rx MNCC_RTP_CREATE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: Assignment for this trans already started earlier
- MGW acknowledges the CRCX, triggering Assignment
MGW --CRCX OK to RTP_TO_RAN--> MSC
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){ESTABLISHING}: Received Event CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: Received Event MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: MGW endpoint's RTP address available for the CI RTP_TO_RAN: 10.23.23.1:23 (osmux=no:-2)
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) Sending Assignment Command with codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} result=10.23.23.1:23{AMR:octet-align=1#112}
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: RAN encode: ASSIGNMENT_COMMAND on UTRAN-Iu
DMSC dummy_msc_i(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){0}: Received Event MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST
- Assignment succeeds, triggering CRCX to CN
- Assignment succeeds, triggering MNCC_RTP_CREATE ack to MNCC
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: RAN decode: ASSIGNMENT_COMPLETE
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_RAN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649: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-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649: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
MGW <--CRCX to RTP_TO_CN-- MSC: callref=0x80000001 codecs=AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
- CN RTP address is available, trigger MNCC_RTP_CREATE
MGW --CRCX OK to RTP_TO_CN--> MSC
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){ESTABLISHING}: Received Event CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: Received Event MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_COMMUNICATING}: MGW endpoint's RTP address available for the CI RTP_TO_CN: 10.23.23.1:23 (osmux=no:-2)
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} result=:0{AMR:octet-align=1#112}
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} assigned=AMR:octet-align=1#112 result=10.23.23.1:23{AMR:octet-align=1#112}
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: no change: codecs already set to AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Not committing: no remote RTP address known
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) MNCC_RTP_CREATE SDP: :0{AMR:octet-align=1#112}
DCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) MNCC_RTP_CREATE SDP: 10.23.23.1:23{AMR:octet-align=1#112}
DMNCC trans(CC:INITIATED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ callref-0x80000001 tid-8) tx MNCC_RTP_CREATE
MSC --> MNCC: callref 0x80000001: MNCC_RTP_CREATE
- MNCC says that's fine
@ -436,12 +437,12 @@ DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 + vlr_subscr_c
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 - vlr_subscr_cancel_attach_fsm: now used by 3 (attached,active-conn,msc_a_fsm_releasing_onenter)
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){ESTABLISHING}: state_chg to RELEASING
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){RELEASING}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ))
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Removing from parent call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Deferring: will deallocate with call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ))
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}: Removing from parent call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}: Deferring: will deallocate with call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ))
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Removing from parent call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ:trans-8:call-2147483649:RTP_TO_CN:no-CI){UNINITIALIZED}: Deferring: will deallocate with call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){RELEASING}: Removing from parent msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ)
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){MSC_A_ST_RELEASING}: Received Event MSC_EV_CALL_LEG_TERM
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:CM_SERVICE_REQ){RELEASING}: Deallocated, including all deferred deallocations
@ -674,6 +675,15 @@ DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 - lu_utran_tms
- after a while, MNCC asks us to setup a call, causing Paging
MSC <-- MNCC: callref 0x423: MNCC_SETUP_REQ
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
a=rtpmap:112 AMR/8000
a=fmtp:112 octet-align=1
a=ptime:20
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 + mncc_tx_to_gsm_cc: now used by 2 (attached,mncc_tx_to_gsm_cc)
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 + CC: now used by 3 (attached,mncc_tx_to_gsm_cc,CC)
@ -765,14 +775,13 @@ DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 callref-0x42
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_AUTHENTICATED}: + cc: now used by 2 (paging-response,cc)
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_AUTHENTICATED}: Received Event MSC_A_EV_TRANSACTION_ACCEPTED
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_AUTHENTICATED}: state_chg to MSC_A_ST_COMMUNICATING
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T303 with 30 seconds
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} result=:0{(no-codecs)}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) Got no information of remote audio codecs: neither SDP nor Bearer Capability. Trying anyway.
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} result=:0{AMR:octet-align=1#112,AMR-WB:octet-align=1#113}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} remote=10.23.23.1:23{AMR:octet-align=1#112} result=:0{(no-codecs)}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} remote=10.23.23.1:23{AMR:octet-align=1#112} result=:0{AMR:octet-align=1#112}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state NULL -> CALL_PRESENT
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T303 with 30 seconds
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Sending DTAP: CC GSM48_MT_CC_SETUP
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: RAN encode: DTAP on UTRAN-Iu
- DTAP --UTRAN-Iu--> MS: GSM48_MT_CC_SETUP: 030504076004050b060887
- DTAP --UTRAN-Iu--> MS: GSM48_MT_CC_SETUP: 030504046004058b
- DTAP matches expected message
DMSC dummy_msc_i(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){0}: Received Event MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 - Paging: now used by 3 (attached,CC,active-conn)
@ -785,27 +794,27 @@ DRLL msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RES
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) rx CALL_CONF in state CALL_PRESENT
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) stopping pending timer T303
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T310 with 30 seconds
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state CALL_PRESENT -> MO_TERM_CALL_CONF
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Starting call assignment
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: Allocated
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: is child of msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
MGW <--CRCX to RTP_TO_CN-- MSC: callref=0x423 codecs=AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
MGW <--CRCX to RTP_TO_RAN-- MSC: callref=0x423 codecs=VND.3GPP.IUFP#96
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI){UNINITIALIZED}: setting codecs to VND.3GPP.IUFP#96
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state CALL_PRESENT -> MO_TERM_CALL_CONF
DMNCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) tx MNCC_CALL_CONF_IND
MSC --> MNCC: callref 0x423: MNCC_CALL_CONF_IND
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: - rx_from_ms: now used by 1 (cc)
- MNCC sends MNCC_RTP_CREATE
MSC <-- MNCC: callref 0x423: MNCC_RTP_CREATE
DMNCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) rx MNCC_RTP_CREATE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Assignment for this trans already started earlier
- MGW acknowledges the CRCX to RAN, triggering Assignment
MGW --CRCX OK to RTP_TO_RAN--> MSC
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: Received Event CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Received Event MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: MGW endpoint's RTP address available for the CI RTP_TO_RAN: 10.23.23.1:23 (osmux=no:-2)
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) Sending Assignment Command with codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} remote=10.23.23.1:23{AMR:octet-align=1#112} result=:0{AMR:octet-align=1#112}
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: RAN encode: ASSIGNMENT_COMMAND on UTRAN-Iu
DMSC dummy_msc_i(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){0}: Received Event MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST
- Assignment completes, triggering CRCX to CN
@ -813,19 +822,19 @@ DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RE
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059: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-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059: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
MGW <--CRCX to RTP_TO_CN-- MSC: callref=0x423 codecs=AMR:octet-align=1#112,AMR-WB:octet-align=1#113
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112,AMR-WB:octet-align=1#113
- When the CN side RTP address is known, send MNCC_RTP_CREATE
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) Assignment complete, but still waiting for the CRCX OK on the CN side RTP
- MNCC sends MNCC_RTP_CREATE, which first waits for the CN side RTP
MSC <-- MNCC: callref 0x423: MNCC_RTP_CREATE
DMNCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) rx MNCC_RTP_CREATE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Assignment for this trans already started earlier
- When the CN side RTP address is known, ack MNCC_RTP_CREATE with full SDP
MGW --CRCX OK to RTP_TO_CN--> MSC
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: Received Event CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Received Event MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: MGW endpoint's RTP address available for the CI RTP_TO_CN: 10.23.23.1:23 (osmux=no:-2)
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} result=:0{AMR:octet-align=1#112}
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI:local-10-23-23-1-23){UNINITIALIZED}: Not committing: no remote RTP address known
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) MNCC_RTP_CREATE SDP: :0{AMR:octet-align=1#112}
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} remote=10.23.23.1:23{AMR:octet-align=1#112} assigned=AMR:octet-align=1#112 result=10.23.23.1:23{AMR:octet-align=1#112}
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) MNCC_RTP_CREATE SDP: 10.23.23.1:23{AMR:octet-align=1#112}
DMNCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) tx MNCC_RTP_CREATE
MSC --> MNCC: callref 0x423: MNCC_RTP_CREATE
- Total time passed: 1.000023 s
@ -837,7 +846,7 @@ DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) stopping pending timer T310
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T301 with 180 seconds
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state MO_TERM_CALL_CONF -> CALL_RECEIVED
DCC trans(CC:CALL_RECEIVED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} result=:0{AMR:octet-align=1#112}
DCC trans(CC:CALL_RECEIVED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} remote=10.23.23.1:23{AMR:octet-align=1#112} assigned=AMR:octet-align=1#112 result=10.23.23.1:23{AMR:octet-align=1#112}
DMNCC trans(CC:CALL_RECEIVED IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) tx MNCC_ALERT_IND
MSC --> MNCC: callref 0x423: MNCC_ALERT_IND
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: - rx_from_ms: now used by 1 (cc)
@ -914,12 +923,12 @@ DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 + vlr_subscr_c
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 - vlr_subscr_cancel_attach_fsm: now used by 3 (attached,active-conn,msc_a_fsm_releasing_onenter)
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: state_chg to RELEASING
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){RELEASING}: Terminating (cause = OSMO_FSM_TERM_REGULAR)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI:local-10-23-23-1-23){UNINITIALIZED}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP))
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI:local-10-23-23-1-23){UNINITIALIZED}: Removing from parent call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI:local-10-23-23-1-23){UNINITIALIZED}: Deferring: will deallocate with call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP))
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}: Removing from parent call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI:local-10-23-23-1-23:remote-1-2-3-4-1234){UNINITIALIZED}: Deferring: will deallocate with call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: Terminating in cascade, depth 2 (cause = OSMO_FSM_TERM_PARENT, caused by: call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP))
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: Removing from parent call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: Deferring: will deallocate with call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){RELEASING}: Removing from parent msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_RELEASING}: Received Event MSC_EV_CALL_LEG_TERM
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){RELEASING}: Deallocated, including all deferred deallocations
@ -1152,6 +1161,15 @@ DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 - lu_utran_tms
- after a while, MNCC asks us to setup a call, causing Paging
MSC <-- MNCC: callref 0x423: MNCC_SETUP_REQ
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
a=rtpmap:112 AMR/8000
a=fmtp:112 octet-align=1
a=ptime:20
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 + mncc_tx_to_gsm_cc: now used by 2 (attached,mncc_tx_to_gsm_cc)
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 + CC: now used by 3 (attached,mncc_tx_to_gsm_cc,CC)
@ -1243,14 +1261,13 @@ DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 callref-0x42
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_AUTHENTICATED}: + cc: now used by 2 (paging-response,cc)
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_AUTHENTICATED}: Received Event MSC_A_EV_TRANSACTION_ACCEPTED
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_AUTHENTICATED}: state_chg to MSC_A_ST_COMMUNICATING
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T303 with 30 seconds
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} result=:0{(no-codecs)}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) Got no information of remote audio codecs: neither SDP nor Bearer Capability. Trying anyway.
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} result=:0{AMR:octet-align=1#112,AMR-WB:octet-align=1#113}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} remote=10.23.23.1:23{AMR:octet-align=1#112} result=:0{(no-codecs)}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} remote=10.23.23.1:23{AMR:octet-align=1#112} result=:0{AMR:octet-align=1#112}
DCC trans(CC:NULL IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state NULL -> CALL_PRESENT
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T303 with 30 seconds
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Sending DTAP: CC GSM48_MT_CC_SETUP
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: RAN encode: DTAP on UTRAN-Iu
- DTAP --UTRAN-Iu--> MS: GSM48_MT_CC_SETUP: 030504076004050b060887
- DTAP --UTRAN-Iu--> MS: GSM48_MT_CC_SETUP: 030504046004058b
- DTAP matches expected message
DMSC dummy_msc_i(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){0}: Received Event MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST
DREF VLR subscr IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100 - Paging: now used by 3 (attached,CC,active-conn)
@ -1263,19 +1280,32 @@ DRLL msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RES
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) rx CALL_CONF in state CALL_PRESENT
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) stopping pending timer T303
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) starting timer T310 with 30 seconds
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state CALL_PRESENT -> MO_TERM_CALL_CONF
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Starting call assignment
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: Allocated
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: is child of msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
MGW <--CRCX to RTP_TO_CN-- MSC: callref=0x423 codecs=AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_CN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
MGW <--CRCX to RTP_TO_RAN-- MSC: callref=0x423 codecs=VND.3GPP.IUFP#96
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI){UNINITIALIZED}: setting codecs to VND.3GPP.IUFP#96
DCC trans(CC:CALL_PRESENT IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) new state CALL_PRESENT -> MO_TERM_CALL_CONF
DMNCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) tx MNCC_CALL_CONF_IND
MSC --> MNCC: callref 0x423: MNCC_CALL_CONF_IND
DREF msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: - rx_from_ms: now used by 1 (cc)
- MNCC sends MNCC_RTP_CREATE
- MNCC sends MNCC_RTP_CREATE, which first waits for the CN side RTP
MSC <-- MNCC: callref 0x423: 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
a=rtpmap:112 AMR/8000
a=fmtp:112 octet-align=1
a=ptime:20
DMNCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) rx MNCC_RTP_CREATE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Assignment for this trans already started earlier
@ -1284,6 +1314,7 @@ DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RE
DCC call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){ESTABLISHING}: Received Event CALL_LEG_EV_RTP_STREAM_ADDR_AVAILABLE
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: Received Event MSC_EV_CALL_LEG_RTP_LOCAL_ADDR_AVAILABLE
DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: MGW endpoint's RTP address available for the CI RTP_TO_RAN: 10.23.23.1:23 (osmux=no:-2)
DCC trans(CC:MO_TERM_CALL_CONF IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP callref-0x423 tid-0) Sending Assignment Command with codecs: RAN={AMR:octet-align=1#112,AMR-WB:octet-align=1#113} MS={AMR:octet-align=1#112,GSM-EFR#110,GSM#3,GSM-HR-08#111} remote=10.23.23.1:23{AMR:octet-align=1#112} result=:0{AMR:octet-align=1#112}
DMSC msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){MSC_A_ST_COMMUNICATING}: RAN encode: ASSIGNMENT_COMMAND on UTRAN-Iu
DMSC dummy_msc_i(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){0}: Received Event MSC_I_EV_FROM_A_FORWARD_ACCESS_SIGNALLING_REQUEST
- Assignment completes, triggering CRCX to CN
@ -1291,19 +1322,14 @@ DIUCS msc_a(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RE
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059:RTP_TO_RAN:no-CI){UNINITIALIZED}: setting codecs to AMR:octet-align=1#112
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059: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-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP:trans-0:call-1059: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
MGW <--CRCX to RTP_TO_CN-- MSC: callref=0x423 codecs=AMR:octet-align=1#112,AMR-WB:octet-align=1#113
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: Allocated
DCC rtp_stream(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP){UNINITIALIZED}: is child of call_leg(IMSI-901700000010650:MSISDN-42342:TMSI-0x03020100:UTRAN-Iu:PAGING_RESP)