<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12400">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fix: incoming call during ongoing call<br><br>If a call is already busy and another call is coming in, do not try to<br>immediately assign an lchan (before this patch, it fails because there already<br>is an mgcp_ctx for the conn). Leave the second CC transaction waiting.<br><br>When a call is hung up, as soon as the old mgcp_ctx is discarded, look for<br>other CC transactions that are waiting. If there is one, trigger assignment, so<br>a new mgcp_ctx is set up for the new call.<br><br>This fixes the following scenario:<br><br>- from A, call B.<br>- from C, call B; B rings during ongoing call.<br>- in B, pick up the call, choose to drop the old call.<br><br>After this patch, and with osmo-bsc patch with change-id<br>  I0c00ec2c120e5008281755adcd4944a3ce4d8355<br>we are now able to talk to the new caller.<br><br>I currently haven't tested yet what happens if there is *three* peers trying to<br>talk to the same number, running out of lab phones (not really, just not<br>bothering now). Possibly we should be taking over the particular call indicated<br>by the CC TI; instead, the current patch version takes on whichever waiting<br>call it finds first. This is fine if *one* additional call comes in on an<br>ongoing call, and this is already a huge improvement to what we had before.<br><br>Related: OS#3735<br>Change-Id: I0ba216b737909e92080a722db26e3577726c63cb<br>---<br>M src/libmsc/msc_mgcp.c<br>1 file changed, 31 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libmsc/msc_mgcp.c b/src/libmsc/msc_mgcp.c</span><br><span>index 8e2e7a9..4c17768 100644</span><br><span>--- a/src/libmsc/msc_mgcp.c</span><br><span>+++ b/src/libmsc/msc_mgcp.c</span><br><span>@@ -962,6 +962,10 @@</span><br><span>        struct ran_conn *conn = trans->conn;</span><br><span>      if (trans->cc.assignment_started)</span><br><span>                 return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (conn->rtp.mgcp_ctx) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPFSMSL(conn->fi, DMGCP, LOGL_INFO, "Another call is already ongoing, not assigning yet\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span>    LOGPFSMSL(conn->fi, DMGCP, LOGL_INFO, "Starting call assignment\n");</span><br><span>    trans->cc.assignment_started = true;</span><br><span>      return msc_mgcp_call_assignment(trans);</span><br><span>@@ -1152,6 +1156,23 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_trans *find_waiting_call(struct ran_conn *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_trans *trans;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_network *net = conn->network;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trans, &net->trans_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (trans->conn != conn)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (trans->protocol != GSM48_PDISC_CC)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (trans->cc.assignment_started)</span><br><span style="color: hsl(120, 100%, 40%);">+                  continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             return trans;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Release ongoing call.</span><br><span>  * Parameter:</span><br><span>  * trans: connection context.</span><br><span>@@ -1160,6 +1181,7 @@</span><br><span> {</span><br><span>         struct mgcp_ctx *mgcp_ctx;</span><br><span>   struct ran_conn *conn = trans->conn;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_trans *waiting_trans;</span><br><span> </span><br><span>         OSMO_ASSERT(trans);</span><br><span> </span><br><span>@@ -1203,5 +1225,14 @@</span><br><span>      * all related context information */</span><br><span>        conn->rtp.mgcp_ctx = NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* If there is another call still waiting to be activated, this is the time when the mgcp_ctx is available again</span><br><span style="color: hsl(120, 100%, 40%);">+       * and the other call can start assigning. */</span><br><span style="color: hsl(120, 100%, 40%);">+ waiting_trans = find_waiting_call(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (waiting_trans) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DMGCP, LOGL_DEBUG, "(ti %02x %s) Call waiting: starting Assignment\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              waiting_trans->transaction_id, vlr_subscr_name(trans->vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+              msc_mgcp_try_call_assignment(waiting_trans);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12400">change 12400</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12400"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I0ba216b737909e92080a722db26e3577726c63cb </div>
<div style="display:none"> Gerrit-Change-Number: 12400 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>