Neels Hofmeyr has uploaded this change for review. ( 
https://gerrit.osmocom.org/12400


Change subject: fix: incoming call during ongoing call
......................................................................

fix: incoming call during ongoing call

If a call is already busy and another call is coming in, do not try to
immediately assign an lchan (before this patch, it fails because there already
is an mgcp_ctx for the conn). Leave the second CC transaction waiting.

When a call is hung up, as soon as the old mgcp_ctx is discarded, look for
other CC transactions that are waiting. If there is one, trigger assignment, so
a new mgcp_ctx is set up for the new call.

This fixes the following scenario:

- from A, call B.
- from C, call B; B rings during ongoing call.
- in B, pick up the call, choose to drop the old call.

After this patch, and with osmo-bsc patch with change-id
  I0c00ec2c120e5008281755adcd4944a3ce4d8355
we are now able to talk to the new caller.

Related: OS#3735
Change-Id: I0ba216b737909e92080a722db26e3577726c63cb
---
M src/libmsc/msc_mgcp.c
1 file changed, 31 insertions(+), 0 deletions(-)



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

diff --git a/src/libmsc/msc_mgcp.c b/src/libmsc/msc_mgcp.c
index 8e2e7a9..4c17768 100644
--- a/src/libmsc/msc_mgcp.c
+++ b/src/libmsc/msc_mgcp.c
@@ -962,6 +962,10 @@
        struct ran_conn *conn = trans->conn;
        if (trans->cc.assignment_started)
                return 0;
+       if (conn->rtp.mgcp_ctx) {
+               LOGPFSMSL(conn->fi, DMGCP, LOGL_INFO, "Another call is already 
ongoing, not assigning yet\n");
+               return 0;
+       }
        LOGPFSMSL(conn->fi, DMGCP, LOGL_INFO, "Starting call assignment\n");
        trans->cc.assignment_started = true;
        return msc_mgcp_call_assignment(trans);
@@ -1152,6 +1156,23 @@
        return 0;
 }

+static struct gsm_trans *find_waiting_call(struct ran_conn *conn)
+{
+       struct gsm_trans *trans;
+       struct gsm_network *net = conn->network;
+
+       llist_for_each_entry(trans, &net->trans_list, entry) {
+               if (trans->conn != conn)
+                       continue;
+               if (trans->protocol != GSM48_PDISC_CC)
+                       continue;
+               if (trans->cc.assignment_started)
+                       continue;
+               return trans;
+       }
+       return NULL;
+}
+
 /* Release ongoing call.
  * Parameter:
  * trans: connection context.
@@ -1160,6 +1181,7 @@
 {
        struct mgcp_ctx *mgcp_ctx;
        struct ran_conn *conn = trans->conn;
+       struct gsm_trans *waiting_trans;

        OSMO_ASSERT(trans);

@@ -1203,5 +1225,14 @@
         * all related context information */
        conn->rtp.mgcp_ctx = NULL;

+       /* If there is another call still waiting to be activated, this is the 
time when the mgcp_ctx is available again
+        * and the other call can start assigning. */
+       waiting_trans = find_waiting_call(conn);
+       if (waiting_trans) {
+               LOGP(DMGCP, LOGL_DEBUG, "(ti %02x %s) Call waiting: starting 
Assignment\n",
+                    waiting_trans->transaction_id, 
vlr_subscr_name(trans->vsub));
+               msc_mgcp_try_call_assignment(waiting_trans);
+       }
+
        return 0;
 }

--
To view, visit https://gerrit.osmocom.org/12400
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ba216b737909e92080a722db26e3577726c63cb
Gerrit-Change-Number: 12400
Gerrit-PatchSet: 1
Gerrit-Owner: Neels Hofmeyr <[email protected]>

Reply via email to