<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12131">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add VTY commands: mncc internal / external (== -M)<br><br>So far the only way to use external MNCC is to pass the -M cmdline arg:<br><br>  osmo-msc -M /path/to/socket<br><br>However, the osmo-msc.service file for systemd is installed by 'make install',<br>and hence it is quite impractical to depend on such a config item to be<br>required in the service file:<br><br>- It defies any scheme an operator may have in place to compose the<br>  osmo-msc.cfg file -- this option doesn't go in the .cfg file but needs<br>  separate action to add to the installed service file.<br><br>- After a make install or package upgrades / re-installations, this option will<br>  be plain overwritten silently, or lead to the need for resolving file<br>  conflicts.<br><br>The initial spark for this came from configuring the 35c3 GSM from cfg<br>templates.<br><br>Change-Id: I2ec59d5eba407f83295528b51b93678d446b9cee<br>---<br>M include/osmocom/msc/gsm_data.h<br>M include/osmocom/msc/msc_common.h<br>M src/libmsc/msc_vty.c<br>M src/libmsc/osmo_msc.c<br>M src/osmo-msc/msc_main.c<br>M tests/test_nodes.vty<br>6 files changed, 68 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/31/12131/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 d3cb7d8..63af3e7 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -140,6 +140,7 @@</span><br><span>      struct osmo_counter *active_nc_ss;</span><br><span> </span><br><span>       /* layer 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+ char *mncc_sock_path;</span><br><span>        struct mncc_sock_state *mncc_state;</span><br><span>  mncc_recv_cb_t mncc_recv;</span><br><span>    struct llist_head upqueue;</span><br><span>diff --git a/include/osmocom/msc/msc_common.h b/include/osmocom/msc/msc_common.h</span><br><span>index ffe8902..3ca3469 100644</span><br><span>--- a/include/osmocom/msc/msc_common.h</span><br><span>+++ b/include/osmocom/msc/msc_common.h</span><br><span>@@ -15,6 +15,7 @@</span><br><span> typedef int (*mncc_recv_cb_t)(struct gsm_network *, struct msgb *);</span><br><span> </span><br><span> struct gsm_network *gsm_network_init(void *ctx, mncc_recv_cb_t mncc_recv);</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_network_set_mncc_sock_path(struct gsm_network *net, const char *mncc_sock_path);</span><br><span> </span><br><span> int msc_vlr_alloc(struct gsm_network *net);</span><br><span> int msc_vlr_start(struct gsm_network *net);</span><br><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index d9e57a7..e1d1b40 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -339,6 +339,25 @@</span><br><span> #define MNCC_GUARD_TIMEOUT_STR "Set global guard timer for mncc interface activity\n"</span><br><span> #define MNCC_GUARD_TIMEOUT_VALUE_STR "guard timer value (sec.)\n"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_msc_mncc_internal,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_msc_mncc_internal_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "mncc internal",</span><br><span style="color: hsl(120, 100%, 40%);">+      MNCC_STR "Use internal MNCC handler (default; changes need a program restart)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   gsm_network_set_mncc_sock_path(gsmnet, NULL);</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_msc_mncc_external,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_msc_mncc_external_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "mncc external MNCC_SOCKET_PATH",</span><br><span style="color: hsl(120, 100%, 40%);">+      MNCC_STR "Use external MNCC handler (changes need a program restart)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "File system path to create the MNCC unix domain socket at\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       gsm_network_set_mncc_sock_path(gsmnet, argv[0]);</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> DEFUN(cfg_msc_mncc_guard_timeout,</span><br><span>       cfg_msc_mncc_guard_timeout_cmd,</span><br><span>       "mncc guard-timeout <0-255>",</span><br><span>@@ -442,6 +461,8 @@</span><br><span> static int config_write_msc(struct vty *vty)</span><br><span> {</span><br><span>     vty_out(vty, "msc%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gsmnet->mncc_sock_path)</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, " mncc external %s%s", gsmnet->mncc_sock_path, VTY_NEWLINE);</span><br><span>       vty_out(vty, " mncc guard-timeout %i%s",</span><br><span>           gsmnet->mncc_guard_timeout, VTY_NEWLINE);</span><br><span>         vty_out(vty, " %sassign-tmsi%s",</span><br><span>@@ -1451,6 +1472,8 @@</span><br><span>   install_element(CONFIG_NODE, &cfg_msc_cmd);</span><br><span>      install_node(&msc_node, config_write_msc);</span><br><span>       install_element(MSC_NODE, &cfg_msc_assign_tmsi_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(MSC_NODE, &cfg_msc_mncc_internal_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+    install_element(MSC_NODE, &cfg_msc_mncc_external_cmd);</span><br><span>   install_element(MSC_NODE, &cfg_msc_mncc_guard_timeout_cmd);</span><br><span>      install_element(MSC_NODE, &cfg_msc_deprecated_mncc_guard_timeout_cmd);</span><br><span>   install_element(MSC_NODE, &cfg_msc_no_assign_tmsi_cmd);</span><br><span>diff --git a/src/libmsc/osmo_msc.c b/src/libmsc/osmo_msc.c</span><br><span>index 52277b7..37c1d15 100644</span><br><span>--- a/src/libmsc/osmo_msc.c</span><br><span>+++ b/src/libmsc/osmo_msc.c</span><br><span>@@ -76,6 +76,13 @@</span><br><span>    return net;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_network_set_mncc_sock_path(struct gsm_network *net, const char *mncc_sock_path)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (net->mncc_sock_path)</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(net->mncc_sock_path);</span><br><span style="color: hsl(120, 100%, 40%);">+  net->mncc_sock_path = mncc_sock_path ? talloc_strdup(net, mncc_sock_path) : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Receive a SAPI-N-REJECT from BSC */</span><br><span> void ran_conn_sapi_n_reject(struct ran_conn *conn, int dlci)</span><br><span> {</span><br><span>diff --git a/src/osmo-msc/msc_main.c b/src/osmo-msc/msc_main.c</span><br><span>index 4434056..a192b64 100644</span><br><span>--- a/src/osmo-msc/msc_main.c</span><br><span>+++ b/src/osmo-msc/msc_main.c</span><br><span>@@ -573,11 +573,20 @@</span><br><span>            return 1;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Initialize MNCC socket if appropriate */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Initialize MNCC socket if appropriate. If the cmdline option -M is present, it overrides the .cfg file</span><br><span style="color: hsl(120, 100%, 40%);">+      * setting 'msc' / 'mncc external MNCC_SOCKET_PATH'. Note that when -M is given, it "bleeds" back into the vty</span><br><span style="color: hsl(120, 100%, 40%);">+       * 'write' command and is reflected in the written out 'mncc external' cfg. */</span><br><span>       if (msc_cmdline_config.mncc_sock_path) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMNCC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                   "MNCC socket path is configured from commandline argument -M."</span><br><span style="color: hsl(120, 100%, 40%);">+              " This affects a written-back config file. Instead consider using the config file directly"</span><br><span style="color: hsl(120, 100%, 40%);">+                 " ('msc' / 'mncc external MNCC_SOCKET_PATH').\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             gsm_network_set_mncc_sock_path(msc_network, msc_cmdline_config.mncc_sock_path);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (msc_network->mncc_sock_path) {</span><br><span>                msc_network->mncc_recv = mncc_sock_from_cc;</span><br><span>               rc = mncc_sock_init(msc_network,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    msc_cmdline_config.mncc_sock_path);</span><br><span style="color: hsl(120, 100%, 40%);">+                                   msc_network->mncc_sock_path);</span><br><span>                 if (rc) {</span><br><span>                    fprintf(stderr, "MNCC socket initialization failed. exiting.\n");</span><br><span>                  exit(1);</span><br><span>diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty</span><br><span>index 6a55e1b..c6902da 100644</span><br><span>--- a/tests/test_nodes.vty</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -30,6 +30,8 @@</span><br><span> OsmoMSC(config-msc)# list</span><br><span> ...</span><br><span>   assign-tmsi</span><br><span style="color: hsl(120, 100%, 40%);">+  mncc internal</span><br><span style="color: hsl(120, 100%, 40%);">+  mncc external MNCC_SOCKET_PATH</span><br><span>   mncc guard-timeout <0-255></span><br><span>   no assign-tmsi</span><br><span>   auth-tuple-max-reuse-count <-1-2147483647></span><br><span>@@ -48,6 +50,29 @@</span><br><span>   asn1 debug (1|0)</span><br><span>   asn1 xer-print (1|0)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC(config-msc)# mncc?</span><br><span style="color: hsl(120, 100%, 40%);">+  mncc  Configure Mobile Network Call Control</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC(config-msc)# mncc ?</span><br><span style="color: hsl(120, 100%, 40%);">+  internal       Use internal MNCC handler (default; changes need a program restart)</span><br><span style="color: hsl(120, 100%, 40%);">+  external       Use external MNCC handler (changes need a program restart)</span><br><span style="color: hsl(120, 100%, 40%);">+  guard-timeout  Set global guard timer for mncc interface activity</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC(config-msc)# mncc external ?</span><br><span style="color: hsl(120, 100%, 40%);">+  MNCC_SOCKET_PATH  File system path to create the MNCC unix domain socket at</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC(config-msc)# mncc external /path/not/used</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC(config-msc)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+msc</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+ mncc external /path/not/used</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%);">+OsmoMSC(config-msc)# mncc internal</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoMSC(config-msc)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... ! mncc external</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoMSC(config-msc)# exit</span><br><span> OsmoMSC(config)# mncc-int</span><br><span> OsmoMSC(config-mncc-int)# list</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12131">change 12131</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/12131"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I2ec59d5eba407f83295528b51b93678d446b9cee </div>
<div style="display:none"> Gerrit-Change-Number: 12131 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>