aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libmsc/gsm_04_08_cc.c26
-rw-r--r--src/libmsc/msc_mgcp.c16
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: