<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>