<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12398">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;">remove code dup: add msc_mgcp_try_call_assignment()<br><br>Various places in the code check a flag whether assignment was started and<br>launch it. To fix incoming-call-during-ongoing-call, I will tweak that logic.<br>To be able to do that only in one place, remove code dup.<br><br>Cosmetic preparation for I1f8746e7babfcd3028a4d2c0ba260c608c686c76 and<br>I0ba216b737909e92080a722db26e3577726c63cb/<br><br>Depends: I11b182a03f5ecb6df7cd8f260757d3626c8e945d (libosmocore: LOGPFSMSL)<br>Change-Id: I11c0b7dc3f1a747028629b48e522bb3b864884ba<br>---<br>M include/osmocom/msc/msc_mgcp.h<br>M src/libmsc/gsm_04_08_cc.c<br>M src/libmsc/msc_mgcp.c<br>M tests/msc_vlr/Makefile.am<br>M tests/msc_vlr/msc_vlr_tests.c<br>5 files changed, 24 insertions(+), 27 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/msc_mgcp.h b/include/osmocom/msc/msc_mgcp.h</span><br><span>index 9d8b01d..f7cc932 100644</span><br><span>--- a/include/osmocom/msc/msc_mgcp.h</span><br><span>+++ b/include/osmocom/msc/msc_mgcp.h</span><br><span>@@ -57,6 +57,7 @@</span><br><span>      mgcp_trans_id_t mgw_pending_trans;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int msc_mgcp_try_call_assignment(struct gsm_trans *trans);</span><br><span> int msc_mgcp_call_assignment(struct gsm_trans *trans);</span><br><span> int msc_mgcp_ass_complete(struct ran_conn *conn, uint16_t port, char *addr);</span><br><span> int msc_mgcp_call_complete(struct gsm_trans *trans, uint16_t port, char *addr);</span><br><span>diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c</span><br><span>index 5567da9..be9a451 100644</span><br><span>--- a/src/libmsc/gsm_04_08_cc.c</span><br><span>+++ b/src/libmsc/gsm_04_08_cc.c</span><br><span>@@ -736,12 +736,7 @@</span><br><span>        new_cc_state(trans, GSM_CSTATE_MO_TERM_CALL_CONF);</span><br><span> </span><br><span>       /* Assign call (if not done yet) */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (trans->assignment_done == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = msc_mgcp_call_assignment(trans);</span><br><span style="color: hsl(0, 100%, 40%);">-           trans->assignment_done = true;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = msc_mgcp_try_call_assignment(trans);</span><br><span> </span><br><span>        /* don't continue, if there were problems with</span><br><span>    * the call assignment. */</span><br><span>@@ -780,14 +775,7 @@</span><br><span>            return rc;</span><br><span> </span><br><span>       /* Assign call (if not done yet) */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (trans->assignment_done == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = msc_mgcp_call_assignment(trans);</span><br><span style="color: hsl(0, 100%, 40%);">-           trans->assignment_done = true;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    return msc_mgcp_try_call_assignment(trans);</span><br><span> }</span><br><span> </span><br><span> static int gsm48_cc_rx_alerting(struct gsm_trans *trans, struct msgb *msg)</span><br><span>@@ -1706,7 +1694,6 @@</span><br><span> static int tch_rtp_create(struct gsm_network *net, uint32_t callref)</span><br><span> {</span><br><span>      struct gsm_trans *trans;</span><br><span style="color: hsl(0, 100%, 40%);">-        int rc;</span><br><span> </span><br><span>  /* Find callref */</span><br><span>   trans = trans_find_by_callref(net, callref);</span><br><span>@@ -1737,14 +1724,7 @@</span><br><span>        trans->tch_rtp_create = true;</span><br><span> </span><br><span>         /* Assign call (if not done yet) */</span><br><span style="color: hsl(0, 100%, 40%);">-     if (trans->assignment_done == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = msc_mgcp_call_assignment(trans);</span><br><span style="color: hsl(0, 100%, 40%);">-           trans->assignment_done = true;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    return msc_mgcp_try_call_assignment(trans);</span><br><span> }</span><br><span> </span><br><span> /* Trigger TCH_RTP_CREATE acknowledgement */</span><br><span>diff --git a/src/libmsc/msc_mgcp.c b/src/libmsc/msc_mgcp.c</span><br><span>index 23e68e7..5a8ee79 100644</span><br><span>--- a/src/libmsc/msc_mgcp.c</span><br><span>+++ b/src/libmsc/msc_mgcp.c</span><br><span>@@ -951,6 +951,22 @@</span><br><span>         .event_names = msc_mgcp_fsm_evt_names,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Try to invoke call assignment and set trans->assignment_done flag if invoked.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This is relevant for already ongoing calls -- scenario:</span><br><span style="color: hsl(120, 100%, 40%);">+ *  - subscriber is in an active voice call,</span><br><span style="color: hsl(120, 100%, 40%);">+ *  - another call is coming in.</span><br><span style="color: hsl(120, 100%, 40%);">+ * For the second call coming in, we must wait to establish RTP and assignment until the first call is CC-Disconnected.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int msc_mgcp_try_call_assignment(struct gsm_trans *trans)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ran_conn *conn = trans->conn;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (trans->assignment_done)</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPFSMSL(conn->fi, DMGCP, LOGL_INFO, "Starting call assignment\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     trans->assignment_done = true;</span><br><span style="color: hsl(120, 100%, 40%);">+     return msc_mgcp_call_assignment(trans);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Notify that a new call begins. This will create a connection for the</span><br><span>  * RAN and the CN on the MGW.</span><br><span>  * Parameter:</span><br><span>diff --git a/tests/msc_vlr/Makefile.am b/tests/msc_vlr/Makefile.am</span><br><span>index bdb8f44..8a5e719 100644</span><br><span>--- a/tests/msc_vlr/Makefile.am</span><br><span>+++ b/tests/msc_vlr/Makefile.am</span><br><span>@@ -32,7 +32,7 @@</span><br><span>       -Wl,--wrap=gsm340_gen_scts \</span><br><span>         -Wl,--wrap=osmo_get_rand_id \</span><br><span>        -Wl,--wrap=msc_mgcp_call_release \</span><br><span style="color: hsl(0, 100%, 40%);">-      -Wl,--wrap=msc_mgcp_call_assignment \</span><br><span style="color: hsl(120, 100%, 40%);">+ -Wl,--wrap=msc_mgcp_try_call_assignment \</span><br><span>    -Wl,--wrap=a_iface_tx_cipher_mode \</span><br><span>  -Wl,--wrap=ranap_iu_tx_sec_mode_cmd \</span><br><span>        -Wl,--wrap=osmo_sccp_tx_data_msg \</span><br><span>diff --git a/tests/msc_vlr/msc_vlr_tests.c b/tests/msc_vlr/msc_vlr_tests.c</span><br><span>index 8ae559e..de7600c 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_tests.c</span><br><span>+++ b/tests/msc_vlr/msc_vlr_tests.c</span><br><span>@@ -652,9 +652,9 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* override, requires '-Wl,--wrap=msc_mgcp_call_assignment' */</span><br><span style="color: hsl(0, 100%, 40%);">-int __real_msc_mgcp_call_assignment(struct gsm_trans *trans);</span><br><span style="color: hsl(0, 100%, 40%);">-int __wrap_msc_mgcp_call_assignment(struct gsm_trans *trans)</span><br><span style="color: hsl(120, 100%, 40%);">+/* override, requires '-Wl,--wrap=msc_mgcp_try_call_assignment' */</span><br><span style="color: hsl(120, 100%, 40%);">+int __real_msc_mgcp_try_call_assignment(struct gsm_trans *trans);</span><br><span style="color: hsl(120, 100%, 40%);">+int __wrap_msc_mgcp_try_call_assignment(struct gsm_trans *trans)</span><br><span> {</span><br><span>      log("MS <--Call Assignment-- MSC: subscr=%s callref=0x%x",</span><br><span>          vlr_subscr_name(trans->vsub), trans->callref);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12398">change 12398</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/12398"/><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: I11c0b7dc3f1a747028629b48e522bb3b864884ba </div>
<div style="display:none"> Gerrit-Change-Number: 12398 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </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>
<div style="display:none"> Gerrit-CC: Vadim Yanitskiy <axilirator@gmail.com> </div>