<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21701">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">utils: add osmo-ns-dummy<br><br>A dummy client to do integration tests of the ns2 layer.<br>It drop all unit data. But allows vty tests.<br><br>Change-Id: I127c178426bc1a3da8de251740eda93853030d6d<br>---<br>M tests/Makefile.am<br>A tests/gb/gprs_ns2_vty.vty<br>M utils/Makefile.am<br>A utils/osmo-ns-dummy.c<br>4 files changed, 334 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index cb683f7..33b42df 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -320,6 +320,7 @@</span><br><span>              gsm0808/gsm0808_test.ok gb/bssgp_fc_tests.err               \</span><br><span>              gb/bssgp_fc_tests.ok gb/bssgp_fc_tests.sh                     \</span><br><span>              gb/gprs_bssgp_test.ok gb/gprs_ns_test.ok gea/gea_test.ok      \</span><br><span style="color: hsl(120, 100%, 40%);">+             gb/gprs_ns2_vty.vty                                     \</span><br><span>              gprs/gprs_test.ok kasumi/kasumi_test.ok                       \</span><br><span>              msgfile/msgfile_test.ok msgfile/msgconfig.cfg         \</span><br><span>              logging/logging_test.ok logging/logging_test.err              \</span><br><span>@@ -430,6 +431,13 @@</span><br><span> # pass -u to osmo_verify_transcript_vty.py by doing:</span><br><span> #   make vty-test U=-u</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+vty-test-ns2:</span><br><span style="color: hsl(120, 100%, 40%);">+ $(MAKE) -C $(top_builddir)/utils osmo-ns-dummy</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_verify_transcript_vty.py -v \</span><br><span style="color: hsl(120, 100%, 40%);">+            -p 42042 \</span><br><span style="color: hsl(120, 100%, 40%);">+            -r "$(top_builddir)/utils/osmo-ns-dummy -p 42042" \</span><br><span style="color: hsl(120, 100%, 40%);">+         $(U) $(srcdir)/gb/gprs_ns2*.vty</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> vty-test-logging:</span><br><span>       osmo_verify_transcript_vty.py -v \</span><br><span>           -p 42042 \</span><br><span>@@ -461,6 +469,7 @@</span><br><span>     $(MAKE) vty-test-logging</span><br><span>     $(MAKE) vty-test-vty</span><br><span>         $(MAKE) vty-test-tdef</span><br><span style="color: hsl(120, 100%, 40%);">+ $(MAKE) vty-test-ns2</span><br><span> </span><br><span> ctrl-test:</span><br><span>       echo "No CTRL tests exist currently"</span><br><span>diff --git a/tests/gb/gprs_ns2_vty.vty b/tests/gb/gprs_ns2_vty.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..397ec26</span><br><span>--- /dev/null</span><br><span>+++ b/tests/gb/gprs_ns2_vty.vty</span><br><span>@@ -0,0 +1,33 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy> list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  show ns binds [stats]</span><br><span style="color: hsl(120, 100%, 40%);">+  show ns entities [stats]</span><br><span style="color: hsl(120, 100%, 40%);">+  show ns persistent</span><br><span style="color: hsl(120, 100%, 40%);">+  show ns (nsei|nsvc) <0-65535> [stats]</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  logging filter nse nsei <0-65535></span><br><span style="color: hsl(120, 100%, 40%);">+  logging filter nsvc nsvci <0-65535></span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config)# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  ns</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config)# ns</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config-ns)# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  timer (tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries|tsns-prov|tsns-size-retries|tsns-config-retries) <0-65535></span><br><span style="color: hsl(120, 100%, 40%);">+  nse <0-65535></span><br><span style="color: hsl(120, 100%, 40%);">+  no nse <0-65535></span><br><span style="color: hsl(120, 100%, 40%);">+  bind (fr|udp) ID</span><br><span style="color: hsl(120, 100%, 40%);">+  no bind ID</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config-ns)# bind udp abc</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config-ns-bind)# fr eta0 frnet</span><br><span style="color: hsl(120, 100%, 40%);">+fr can be only used with frame relay bind</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config-ns-bind)# listen 127.0.0.14 42999</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy(config-ns-bind)# end</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoNSdummy# show ns</span><br><span style="color: hsl(120, 100%, 40%);">+UDP bind: 127.0.0.14:42999 DSCP: 0</span><br><span style="color: hsl(120, 100%, 40%);">+  0 NS-VC: </span><br><span>diff --git a/utils/Makefile.am b/utils/Makefile.am</span><br><span>index 653b719..4fac477 100644</span><br><span>--- a/utils/Makefile.am</span><br><span>+++ b/utils/Makefile.am</span><br><span>@@ -1,11 +1,14 @@</span><br><span style="color: hsl(0, 100%, 40%);">-if ENABLE_UTILITIES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS =</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS =</span><br><span> AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(TALLOC_CFLAGS)</span><br><span> AM_CFLAGS = -Wall $(PTHREAD_CFLAGS)</span><br><span> LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la $(PTHREAD_LIBS)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_UTILITIES</span><br><span> EXTRA_DIST = conv_gen.py conv_codes_gsm.py</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bin_PROGRAMS = osmo-arfcn osmo-auc-gen osmo-config-merge</span><br><span style="color: hsl(120, 100%, 40%);">+bin_PROGRAMS += osmo-arfcn osmo-auc-gen osmo-config-merge</span><br><span> </span><br><span> osmo_arfcn_SOURCES = osmo-arfcn.c</span><br><span> </span><br><span>@@ -16,9 +19,21 @@</span><br><span> osmo_config_merge_CFLAGS = $(TALLOC_CFLAGS)</span><br><span> </span><br><span> if ENABLE_PCSC</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_PROGRAMS = osmo-sim-test</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS += osmo-sim-test</span><br><span> osmo_sim_test_SOURCES = osmo-sim-test.c</span><br><span> osmo_sim_test_LDADD = $(LDADD) $(top_builddir)/src/sim/libosmosim.la $(PCSC_LIBS)</span><br><span> osmo_sim_test_CFLAGS = $(PCSC_CFLAGS)</span><br><span> endif</span><br><span> endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_EXT_TESTS</span><br><span style="color: hsl(120, 100%, 40%);">+if ENABLE_GB</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS += osmo-ns-dummy</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_SOURCES = osmo-ns-dummy.c</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_LDADD = $(LDADD) $(TALLOC_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+                     $(top_builddir)/src/gb/libosmogb.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                 $(top_builddir)/src/vty/libosmovty.la \</span><br><span style="color: hsl(120, 100%, 40%);">+                       $(top_builddir)/src/gsm/libosmogsm.la</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ns_dummy_CFLAGS = $(TALLOC_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span>diff --git a/utils/osmo-ns-dummy.c b/utils/osmo-ns-dummy.c</span><br><span>new file mode 100644</span><br><span>index 0000000..6790b4c</span><br><span>--- /dev/null</span><br><span>+++ b/utils/osmo-ns-dummy.c</span><br><span>@@ -0,0 +1,274 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gprs/gprs_ns2.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/ports.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/tdef_vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void *tall_nsdummy_ctx  = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct log_info log_info = {};</span><br><span style="color: hsl(120, 100%, 40%);">+static bool quit = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static bool config_given = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static bool daemonize = false;</span><br><span style="color: hsl(120, 100%, 40%);">+static int vty_port = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+static char *config_file = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const char vty_copyright[] =</span><br><span style="color: hsl(120, 100%, 40%);">+       "Copyright (C) 2020 by by sysmocom - s.f.m.c. GmbH\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     "Author: Alexander Couzens <lynxis@fe80.eu>\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "License GNU GPL version 2 or later\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "This is free software: you are free to change and redistribute it.\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "There is NO WARRANTY, to the extent permitted by law.\r\n";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct vty_app_info vty_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .name           = "OsmoNSdummy",</span><br><span style="color: hsl(120, 100%, 40%);">+    .version        = PACKAGE_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+    .copyright      = vty_copyright,</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%);">+static void print_help()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   printf( "Some useful options:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+            "  -h      --help                  This text\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "  -c      --config-file           Specify the filename of the config file\n"</span><br><span style="color: hsl(120, 100%, 40%);">+               "  -V      --version               Print version\n"</span><br><span style="color: hsl(120, 100%, 40%);">+         "  -D      --daemonize             Fork the process into a background daemon\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "  -p   --vty-port PORT            Set the vty port to listen on.\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "\nVTY reference generation:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "          --vty-ref-mode MODE     VTY reference generation mode (e.g. 'expert').\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "          --vty-ref-xml           Generate the VTY reference XML output and exit.\n"</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 style="color: hsl(120, 100%, 40%);">+static void handle_long_options(const char *prog_name, const int long_option)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     static int vty_ref_mode = VTY_REF_GEN_MODE_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (long_option) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_ref_mode = get_string_value(vty_ref_gen_mode_names, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (vty_ref_mode < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    fprintf(stderr, "%s: Unknown VTY reference generation "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "mode '%s'\n", prog_name, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                  exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Generating the VTY reference in mode '%s' (%s)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 get_value_string(vty_ref_gen_mode_names, vty_ref_mode),</span><br><span style="color: hsl(120, 100%, 40%);">+                       get_value_string(vty_ref_gen_mode_desc, vty_ref_mode));</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_dump_xml_ref_mode(stdout, (enum vty_ref_gen_mode) vty_ref_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "%s: error parsing cmdline options\n", prog_name);</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(2);</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 style="color: hsl(120, 100%, 40%);">+static void handle_options(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int option_idx = 0, c;</span><br><span style="color: hsl(120, 100%, 40%);">+                static int long_option = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+           static const struct option long_options[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                 { "help", 0, 0, 'h' },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { "config-file", 1, 0, 'c' },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "version", 0, 0, 'V' },</span><br><span style="color: hsl(120, 100%, 40%);">+                   { "daemonize", 0, 0, 'D' },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { "vty-port", 1, 0, 'p' },</span><br><span style="color: hsl(120, 100%, 40%);">+                  { "vty-ref-mode", 1, &long_option, 1 },</span><br><span style="color: hsl(120, 100%, 40%);">+                 { "vty-ref-xml", 0, &long_option, 2 },</span><br><span style="color: hsl(120, 100%, 40%);">+                  { 0, 0, 0, 0 }</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%);">+          c = getopt_long(argc, argv, "hc:p:VD",</span><br><span style="color: hsl(120, 100%, 40%);">+                              long_options, &option_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (c == -1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'h':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_help();</span><br><span style="color: hsl(120, 100%, 40%);">+                 exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       handle_long_options(argv[0], long_option);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'c':</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+                              free(config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+                    config_file = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                 config_given = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'p':</span><br><span style="color: hsl(120, 100%, 40%);">+                     vty_port = atoi(optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (vty_port < 0 || vty_port > 65535) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         fprintf(stderr, "Invalid port %d given!\n", vty_port);</span><br><span style="color: hsl(120, 100%, 40%);">+                              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'V':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_version(1);</span><br><span style="color: hsl(120, 100%, 40%);">+                     exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'D':</span><br><span style="color: hsl(120, 100%, 40%);">+                     daemonize = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "Unknown option '%c'\n", c);</span><br><span style="color: hsl(120, 100%, 40%);">+                        exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</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 style="color: hsl(120, 100%, 40%);">+   if (!config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+             config_file = "osmo-ns-dummy.cfg";</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!vty_port) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "A vty port need to be specified (-p)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(1);</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 style="color: hsl(120, 100%, 40%);">+void sighandler(int sigset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (sigset == SIGPIPE)</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     fprintf(stderr, "Signal %d received.\n", sigset);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (sigset) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case SIGINT:</span><br><span style="color: hsl(120, 100%, 40%);">+  case SIGTERM:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* If another signal is received afterwards, the program</span><br><span style="color: hsl(120, 100%, 40%);">+               * is terminated without finishing shutdown process.</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span style="color: hsl(120, 100%, 40%);">+           signal(SIGINT, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+              signal(SIGTERM, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGPIPE, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGABRT, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGUSR1, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             signal(SIGUSR2, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           quit = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGABRT:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* in case of abort, we want to obtain a talloc report and</span><br><span style="color: hsl(120, 100%, 40%);">+             * then run default SIGABRT handler, who will generate coredump</span><br><span style="color: hsl(120, 100%, 40%);">+                * and abort the process. abort() should do this for us after we</span><br><span style="color: hsl(120, 100%, 40%);">+               * return, but program wouldn't exit if an external SIGABRT is</span><br><span style="color: hsl(120, 100%, 40%);">+             * received.</span><br><span style="color: hsl(120, 100%, 40%);">+           */</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_report_full(tall_nsdummy_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+         signal(SIGABRT, SIG_DFL);</span><br><span style="color: hsl(120, 100%, 40%);">+             raise(SIGABRT);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIGUSR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ case SIGUSR2:</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_report_full(tall_nsdummy_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</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 style="color: hsl(120, 100%, 40%);">+/* called by the ns layer */</span><br><span style="color: hsl(120, 100%, 40%);">+int gprs_ns_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</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%);">+int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</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 style="color: hsl(120, 100%, 40%);">+int main (int argc, char *argv[])</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        void *ctx = tall_nsdummy_ctx = talloc_named_const(NULL, 0, "osmo-ns-dummy");</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gprs_ns2_inst *nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+       log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_log_level(osmo_stderr_target, LOGL_INFO);</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_talloc_ctx_init(ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stats_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_info.tall_ctx = ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_init(&vty_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      logging_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_stats_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_talloc_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ handle_options(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ nsi = gprs_ns2_instantiate(ctx, gprs_ns_prim_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!nsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DLNS, LOGL_ERROR, "Failed to create NS instance\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           exit(1);</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%);">+   gprs_ns2_vty2_init(nsi);</span><br><span style="color: hsl(120, 100%, 40%);">+      rc = vty_read_config_file(config_file, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0 && config_given) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Failed to parse the config file: '%s'\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+         exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                fprintf(stderr, "No config file: '%s' Using default config.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = telnet_init_dynif(ctx, NULL, vty_get_bind_addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                               vty_port);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fprintf(stderr, "Error initializing telnet\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             exit(1);</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%);">+   signal(SIGINT, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+   signal(SIGTERM, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGPIPE, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGABRT, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGUSR1, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  signal(SIGUSR2, sighandler);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_init_ignore_signals();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (daemonize) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_daemonize();</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      perror("Error during daemonize");</span><br><span style="color: hsl(120, 100%, 40%);">+                   exit(1);</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 style="color: hsl(120, 100%, 40%);">+   while (!quit) {</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_select_main(0);</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%);">+   telnet_exit();</span><br><span style="color: hsl(120, 100%, 40%);">+        gprs_ns2_free(nsi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_report_full(tall_nsdummy_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(tall_nsdummy_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21701">change 21701</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/libosmocore/+/21701"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I127c178426bc1a3da8de251740eda93853030d6d </div>
<div style="display:none"> Gerrit-Change-Number: 21701 </div>
<div style="display:none"> Gerrit-PatchSet: 23 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>