<p>keith <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-msc/+/15120">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  neels: Looks good to me, but someone else must approve
  fixeria: Looks good to me, but someone else must approve
  keith: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Implement a global switch on the network to disable call waiting.<br><br>Add a network -> callwaiting VTY command as boolean.<br><br>When this is enabled (default) there is no change to<br>operation previous to this commit.<br><br>When this switch is disabled with "no call-waiting" in vty<br>then when a call arrives, we will check if we have an active<br>call transaction for this subscriber, no matter if it is<br>establishing, established, or alerting, in any of these cases we<br>will return USER BUSY to the calling party.<br><br>Change-Id: I3eb6f23f7103e3002874fb5d3a30c9de952202ae<br>---<br>M include/osmocom/msc/gsm_data.h<br>M src/libmsc/gsm_04_08_cc.c<br>M src/libmsc/msc_vty.c<br>M src/osmo-msc/msc_main.c<br>M tests/test_nodes.vty<br>5 files changed, 53 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h</span><br><span>index a90b732..11b6e82 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -258,6 +258,9 @@</span><br><span> </span><br><span>    /* Whether we want to use Osmux against BSCs. Controlled via VTY */</span><br><span>  enum osmux_usage use_osmux;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Whether to use call waiting on the network */</span><br><span style="color: hsl(120, 100%, 40%);">+      bool call_waiting;</span><br><span> };</span><br><span> </span><br><span> struct osmo_esme;</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 e83caa2..ed74e88 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>@@ -1909,6 +1909,25 @@</span><br><span>                                          GSM48_CAUSE_LOC_PRN_S_LU,</span><br><span>                                            GSM48_CC_CAUSE_DEST_OOO);</span><br><span>            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Find valid conn */</span><br><span style="color: hsl(120, 100%, 40%);">+         msc_a = msc_a_for_vsub(vsub, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* If subscriber is BUSY and we do not DO call in call aka "call-waiting" */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!net->call_waiting && msc_a) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 struct gsm_trans *existing_cc_trans = trans_find_by_type(msc_a, TRANS_CC);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (existing_cc_trans && existing_cc_trans->cc.state != GSM_CSTATE_NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         LOG_TRANS_CAT(existing_cc_trans, DCC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          "rx '%s' for subscriber %s with trans state (%s)"</span><br><span style="color: hsl(120, 100%, 40%);">+                                           " rejecting with USER_BUSY\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                        get_mncc_name(msg->msg_type), data->called.number,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      gsm48_cc_state_name(existing_cc_trans->cc.state));</span><br><span style="color: hsl(120, 100%, 40%);">+                         return mncc_release_ind(net, NULL, data->callref,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  GSM48_CAUSE_LOC_PRN_S_LU,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     GSM48_CC_CAUSE_USER_BUSY);</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          /* Create transaction */</span><br><span>             trans = trans_alloc(net, vsub, TRANS_CC,</span><br><span>                                 TRANS_ID_UNASSIGNED, data->callref);</span><br><span>@@ -1922,9 +1941,6 @@</span><br><span>                  return -ENOMEM;</span><br><span>              }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           /* Find valid conn */</span><br><span style="color: hsl(0, 100%, 40%);">-           msc_a = msc_a_for_vsub(vsub, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>          /* If subscriber has no conn */</span><br><span>              if (!msc_a) {</span><br><span> </span><br><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index 4674e2e..09aef91 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -330,6 +330,29 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_net_call_wait, cfg_net_call_wait_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "call-waiting",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Enable Call Waiting on the Network\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_network *net = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    net->call_waiting = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_net_no_call_wait, cfg_net_no_call_wait_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no call-waiting",</span><br><span style="color: hsl(120, 100%, 40%);">+      NO_STR</span><br><span style="color: hsl(120, 100%, 40%);">+      "Disable Call Waiting on the Network\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_network *net = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    net->call_waiting = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int config_write_net(struct vty *vty)</span><br><span> {</span><br><span>        int i;</span><br><span>@@ -376,6 +399,9 @@</span><br><span>                         gsmnet->emergency.route_to_msisdn, VTY_NEWLINE);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!gsmnet->call_waiting)</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, " no call-waiting%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -1946,6 +1972,8 @@</span><br><span>         install_element(GSMNET_NODE, &cfg_net_no_timezone_cmd);</span><br><span>  install_element(GSMNET_NODE, &cfg_net_per_loc_upd_cmd);</span><br><span>  install_element(GSMNET_NODE, &cfg_net_no_per_loc_upd_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(GSMNET_NODE, &cfg_net_call_wait_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(GSMNET_NODE, &cfg_net_no_call_wait_cmd);</span><br><span> </span><br><span>     install_element(CONFIG_NODE, &cfg_msc_cmd);</span><br><span>      install_node(&msc_node, config_write_msc);</span><br><span>diff --git a/src/osmo-msc/msc_main.c b/src/osmo-msc/msc_main.c</span><br><span>index 1083271..3860589 100644</span><br><span>--- a/src/osmo-msc/msc_main.c</span><br><span>+++ b/src/osmo-msc/msc_main.c</span><br><span>@@ -216,6 +216,7 @@</span><br><span> </span><br><span>    mgcp_client_conf_init(&net->mgw.conf);</span><br><span>        net->mgw.tdefs = g_mgw_tdefs;</span><br><span style="color: hsl(120, 100%, 40%);">+      net->call_waiting = true;</span><br><span> </span><br><span>     return net;</span><br><span> }</span><br><span>diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty</span><br><span>index 0ad390f..a4e0e15 100644</span><br><span>--- a/tests/test_nodes.vty</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -26,6 +26,8 @@</span><br><span>   no timezone</span><br><span>   periodic location update <6-1530></span><br><span>   no periodic location update</span><br><span style="color: hsl(120, 100%, 40%);">+  call-waiting</span><br><span style="color: hsl(120, 100%, 40%);">+  no call-waiting</span><br><span> </span><br><span> OsmoMSC(config-net)# encryption?</span><br><span>   encryption  Encryption options</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-msc/+/15120">change 15120</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/c/osmo-msc/+/15120"/><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-Change-Id: I3eb6f23f7103e3002874fb5d3a30c9de952202ae </div>
<div style="display:none"> Gerrit-Change-Number: 15120 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>