diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libmsc/gsm_04_08_cc.c | 26 | ||||
-rw-r--r-- | src/libmsc/msc_mgcp.c | 16 |
2 files changed, 19 insertions, 23 deletions
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c index 5567da9d0..be9a451a3 100644 --- a/src/libmsc/gsm_04_08_cc.c +++ b/src/libmsc/gsm_04_08_cc.c @@ -736,12 +736,7 @@ static int gsm48_cc_rx_call_conf(struct gsm_trans *trans, struct msgb *msg) new_cc_state(trans, GSM_CSTATE_MO_TERM_CALL_CONF); /* Assign call (if not done yet) */ - if (trans->assignment_done == false) { - rc = msc_mgcp_call_assignment(trans); - trans->assignment_done = true; - } - else - rc = 0; + rc = msc_mgcp_try_call_assignment(trans); /* don't continue, if there were problems with * the call assignment. */ @@ -780,14 +775,7 @@ static int gsm48_cc_tx_call_proc_and_assign(struct gsm_trans *trans, void *arg) return rc; /* Assign call (if not done yet) */ - if (trans->assignment_done == false) { - rc = msc_mgcp_call_assignment(trans); - trans->assignment_done = true; - } - else - rc = 0; - - return rc; + return msc_mgcp_try_call_assignment(trans); } static int gsm48_cc_rx_alerting(struct gsm_trans *trans, struct msgb *msg) @@ -1706,7 +1694,6 @@ static void mncc_recv_rtp_err(struct gsm_network *net, uint32_t callref, int cmd static int tch_rtp_create(struct gsm_network *net, uint32_t callref) { struct gsm_trans *trans; - int rc; /* Find callref */ trans = trans_find_by_callref(net, callref); @@ -1737,14 +1724,7 @@ static int tch_rtp_create(struct gsm_network *net, uint32_t callref) trans->tch_rtp_create = true; /* Assign call (if not done yet) */ - if (trans->assignment_done == false) { - rc = msc_mgcp_call_assignment(trans); - trans->assignment_done = true; - } - else - rc = 0; - - return rc; + return msc_mgcp_try_call_assignment(trans); } /* Trigger TCH_RTP_CREATE acknowledgement */ diff --git a/src/libmsc/msc_mgcp.c b/src/libmsc/msc_mgcp.c index 23e68e7b4..5a8ee7960 100644 --- a/src/libmsc/msc_mgcp.c +++ b/src/libmsc/msc_mgcp.c @@ -951,6 +951,22 @@ static struct osmo_fsm fsm_msc_mgcp = { .event_names = msc_mgcp_fsm_evt_names, }; +/* Try to invoke call assignment and set trans->assignment_done flag if invoked. + * This is relevant for already ongoing calls -- scenario: + * - subscriber is in an active voice call, + * - another call is coming in. + * For the second call coming in, we must wait to establish RTP and assignment until the first call is CC-Disconnected. + */ +int msc_mgcp_try_call_assignment(struct gsm_trans *trans) +{ + struct ran_conn *conn = trans->conn; + if (trans->assignment_done) + return 0; + LOGPFSMSL(conn->fi, DMGCP, LOGL_INFO, "Starting call assignment\n"); + trans->assignment_done = true; + return msc_mgcp_call_assignment(trans); +} + /* Notify that a new call begins. This will create a connection for the * RAN and the CN on the MGW. * Parameter: |