<p>keith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-msc/+/15120">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Implements 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 callwaiting" 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>The intention of this patch is for a production network<br>to remove some of the slightly unpredictable behaviour<br>of call waiting.<br><br>Change-Id: I3eb6f23f7103e3002874fb5d3a30c9de952202ae<br>---<br>M include/osmocom/msc/gsm_data.h<br>M include/osmocom/msc/transaction.h<br>M src/libmsc/gsm_04_08_cc.c<br>M src/libmsc/msc_vty.c<br>M src/libmsc/transaction.c<br>M src/osmo-msc/msc_main.c<br>6 files changed, 69 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/20/15120/1</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 e926b3f..e0d6a6c 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -253,6 +253,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%);">+      uint8_t callwaiting;</span><br><span> };</span><br><span> </span><br><span> struct osmo_esme;</span><br><span>diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h</span><br><span>index 69cd652..b173f31 100644</span><br><span>--- a/include/osmocom/msc/transaction.h</span><br><span>+++ b/include/osmocom/msc/transaction.h</span><br><span>@@ -138,7 +138,8 @@</span><br><span> };</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_trans *trans_find_cc_by_vsub(const struct gsm_network *net,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      struct vlr_subscr *vsub);</span><br><span> struct gsm_trans *trans_find_by_type(const struct msc_a *msc_a, enum trans_type type);</span><br><span> struct gsm_trans *trans_find_by_id(const struct msc_a *msc_a,</span><br><span>                                    enum trans_type type, uint8_t trans_id);</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 03830de..37d0a07 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>@@ -1803,6 +1803,7 @@</span><br><span>         int i, rc = 0;</span><br><span>       struct msc_a *msc_a = NULL;</span><br><span>  struct gsm_trans *trans = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_trans *_trans = NULL;</span><br><span>     const struct gsm_mncc *data;</span><br><span> </span><br><span>     /* handle special messages */</span><br><span>@@ -1874,6 +1875,21 @@</span><br><span>               /* update the subscriber we deal with */</span><br><span>             log_set_context(LOG_CTX_VLR_SUBSCR, vsub);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                /* If subscriber is BUSY and we do not DO call in call or "call-waiting" */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!net->callwaiting) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   _trans = trans_find_cc_by_vsub(net, vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (_trans && _trans->cc.state != GSM_CSTATE_NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               LOG_TRANS_CAT(_trans, DCC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             "rx '%s' for subscriber %s with trans state %d (%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%);">+                                      _trans->cc.state,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  gsm48_cc_state_name(_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>            /* If subscriber is not "attached" */</span><br><span>              if (!vsub->lu_complete) {</span><br><span>                         LOG_TRANS_CAT(trans, DCC, LOGL_ERROR, "rx %s for subscriber that is not attached: %s\n",</span><br><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index 5bf9701..13b9687 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -292,6 +292,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%);">+      "callwaiting",</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->callwaiting = 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 callwaiting",</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->callwaiting = 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>@@ -333,6 +356,11 @@</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->callwaiting)</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, " callwaiting%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, " no callwaiting%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>@@ -1902,6 +1930,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/libmsc/transaction.c b/src/libmsc/transaction.c</span><br><span>index ebdaced..8ffb0d7 100644</span><br><span>--- a/src/libmsc/transaction.c</span><br><span>+++ b/src/libmsc/transaction.c</span><br><span>@@ -36,6 +36,23 @@</span><br><span> void _gsm411_sms_trans_free(struct gsm_trans *trans);</span><br><span> void _gsm911_nc_ss_trans_free(struct gsm_trans *trans);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Find a Call Control transaction by Subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] net Network in which we should search</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] vsub subscriber to match</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns Matching transaction, if any</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_trans *trans_find_cc_by_vsub(const struct gsm_network *net,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       struct vlr_subscr *vsub)</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%);">+</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->vsub == vsub && trans->cc.state > 0)</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> struct gsm_trans *trans_find_by_type(const struct msc_a *msc_a, enum trans_type type)</span><br><span> {</span><br><span>      struct gsm_trans *trans;</span><br><span>diff --git a/src/osmo-msc/msc_main.c b/src/osmo-msc/msc_main.c</span><br><span>index 1083271..1a1b05b 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->callwaiting = true;</span><br><span> </span><br><span>      return net;</span><br><span> }</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: 1 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>