<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ggsn/+/15249">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ggsn: Split application lifecycle related code into ggsn_main.c<br><br>This way we further shrink ggsn.c and leave there GGSN related code.<br><br>Change-Id: I9e6a3beac7657f0a8c02d514b54c6f1caa93bba7<br>---<br>M ggsn/Makefile.am<br>M ggsn/ggsn.c<br>M ggsn/ggsn.h<br>A ggsn/ggsn_main.c<br>4 files changed, 212 insertions(+), 176 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/49/15249/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ggsn/Makefile.am b/ggsn/Makefile.am</span><br><span>index 022cdef..a8ddf1e 100644</span><br><span>--- a/ggsn/Makefile.am</span><br><span>+++ b/ggsn/Makefile.am</span><br><span>@@ -12,4 +12,4 @@</span><br><span> endif</span><br><span> </span><br><span> osmo_ggsn_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.a</span><br><span style="color: hsl(0, 100%, 40%);">-osmo_ggsn_SOURCES = ggsn_vty.c ggsn.c ggsn.h icmpv6.c icmpv6.h checksum.c checksum.h pco.c pco.h</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_ggsn_SOURCES = ggsn_main.c ggsn_vty.c ggsn.c ggsn.h icmpv6.c icmpv6.h checksum.c checksum.h pco.c pco.h</span><br><span>diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c</span><br><span>index 7832338..d519621 100644</span><br><span>--- a/ggsn/ggsn.c</span><br><span>+++ b/ggsn/ggsn.c</span><br><span>@@ -42,22 +42,8 @@</span><br><span> #include <netinet/ip.h></span><br><span> #include <netinet/ip6.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/application.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/select.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/stats.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/core/timer.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span> #include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ctrl/control_cmd.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ctrl/control_vty.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/ctrl/ports.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/logging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/stats.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/ports.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/command.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/misc.h></span><br><span> #include <osmocom/gsm/apn.h></span><br><span> </span><br><span> #include "../lib/tun.h"</span><br><span>@@ -71,19 +57,9 @@</span><br><span> #include "pco.h"</span><br><span> #include "ggsn.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void *tall_ggsn_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int end = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static int daemonize = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-static struct ctrl_handle *g_ctrlh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ul255_t qos;</span><br><span style="color: hsl(0, 100%, 40%);">-struct ul255_t apn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int ggsn_tun_fd_cb(struct osmo_fd *fd, unsigned int what);</span><br><span> static int cb_tun_ind(struct tun_t *tun, void *pack, unsigned len);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void pool_close_all_pdp(struct ippool_t *pool)</span><br><span> {</span><br><span> unsigned int i;</span><br><span>@@ -690,8 +666,6 @@</span><br><span> return tun_encaps((struct tun_t *)pdp->ipif, pack, len);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static char *config_file = "osmo-ggsn.cfg";</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* callback for tun device osmocom select loop integration */</span><br><span> static int ggsn_tun_fd_cb(struct osmo_fd *fd, unsigned int what)</span><br><span> {</span><br><span>@@ -749,29 +723,6 @@</span><br><span> ggsn_gtp_tmr_start(ggsn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* To exit gracefully. Used with GCC compilation flag -pg and gprof */</span><br><span style="color: hsl(0, 100%, 40%);">-static void signal_handler(int s)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DGGSN, LOGL_NOTICE, "signal %d received\n", s);</span><br><span style="color: hsl(0, 100%, 40%);">- switch (s) {</span><br><span style="color: hsl(0, 100%, 40%);">- case SIGINT:</span><br><span style="color: hsl(0, 100%, 40%);">- case SIGTERM:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DGGSN, LOGL_NOTICE, "SIGINT received, shutting down\n");</span><br><span style="color: hsl(0, 100%, 40%);">- end = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case SIGABRT:</span><br><span style="color: hsl(0, 100%, 40%);">- case SIGUSR1:</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_report(tall_vty_ctx, stderr);</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_report_full(tall_ggsn_ctx, stderr);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case SIGUSR2:</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_report_full(tall_vty_ctx, stderr);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* libgtp callback for confirmations */</span><br><span> static int cb_conf(int type, int cause, struct pdp_t *pdp, void *cbp)</span><br><span> {</span><br><span>@@ -882,128 +833,3 @@</span><br><span> ggsn->started = false;</span><br><span> return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_usage()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Usage: osmo-ggsn [-h] [-D] [-c configfile] [-V]\n");</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void print_help()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf( " Some useful help...\n"</span><br><span style="color: hsl(0, 100%, 40%);">- " -h --help This help text\n"</span><br><span style="color: hsl(0, 100%, 40%);">- " -D --daemonize Fork the process into a background daemon\n"</span><br><span style="color: hsl(0, 100%, 40%);">- " -c --config-file filename The config file to use\n"</span><br><span style="color: hsl(0, 100%, 40%);">- " -V --version Print the version of OsmoGGSN\n"</span><br><span style="color: hsl(0, 100%, 40%);">- );</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void handle_options(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">- int option_index = 0, c;</span><br><span style="color: hsl(0, 100%, 40%);">- static struct option long_options[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- { "help", 0, 0, 'h' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "daemonize", 0, 0, 'D' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "config-file", 1, 0, 'c' },</span><br><span style="color: hsl(0, 100%, 40%);">- { "version", 0, 0, 'V' },</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, 0, 0, 0 }</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- c = getopt_long(argc, argv, "hdc:V", long_options, &option_index);</span><br><span style="color: hsl(0, 100%, 40%);">- if (c == -1)</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (c) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 'h':</span><br><span style="color: hsl(0, 100%, 40%);">- print_usage();</span><br><span style="color: hsl(0, 100%, 40%);">- print_help();</span><br><span style="color: hsl(0, 100%, 40%);">- exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">- case 'D':</span><br><span style="color: hsl(0, 100%, 40%);">- daemonize = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 'c':</span><br><span style="color: hsl(0, 100%, 40%);">- config_file = optarg;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 'V':</span><br><span style="color: hsl(0, 100%, 40%);">- print_version(1);</span><br><span style="color: hsl(0, 100%, 40%);">- exit(0);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct ggsn_ctx *ggsn;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- tall_ggsn_ctx = talloc_named_const(NULL, 0, "OsmoGGSN");</span><br><span style="color: hsl(0, 100%, 40%);">- msgb_talloc_ctx_init(tall_ggsn_ctx, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- g_vty_info.tall_ctx = tall_ggsn_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle keyboard interrupt SIGINT */</span><br><span style="color: hsl(0, 100%, 40%);">- signal(SIGINT, &signal_handler);</span><br><span style="color: hsl(0, 100%, 40%);">- signal(SIGTERM, &signal_handler);</span><br><span style="color: hsl(0, 100%, 40%);">- signal(SIGABRT, &signal_handler);</span><br><span style="color: hsl(0, 100%, 40%);">- signal(SIGUSR1, &signal_handler);</span><br><span style="color: hsl(0, 100%, 40%);">- signal(SIGUSR2, &signal_handler);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_init_ignore_signals();</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_init_logging2(tall_ggsn_ctx, &log_info);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stats_init(tall_ggsn_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- vty_init(&g_vty_info);</span><br><span style="color: hsl(0, 100%, 40%);">- logging_vty_add_cmds();</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_talloc_vty_add_cmds();</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_stats_vty_add_cmds();</span><br><span style="color: hsl(0, 100%, 40%);">- ggsn_vty_init();</span><br><span style="color: hsl(0, 100%, 40%);">- ctrl_vty_init(tall_ggsn_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- handle_options(argc, argv);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_init(tall_ggsn_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = vty_read_config_file(config_file, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "Failed to open config file: '%s'\n", config_file);</span><br><span style="color: hsl(0, 100%, 40%);">- exit(2);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = telnet_init_dynif(tall_ggsn_ctx, NULL, vty_get_bind_addr(), OSMO_VTY_PORT_GGSN);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- g_ctrlh = ctrl_interface_setup_dynip(NULL, ctrl_vty_get_bind_addr(),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_CTRL_PORT_GGSN, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!g_ctrlh) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DGGSN, LOGL_ERROR, "Failed to create CTRL interface.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (daemonize) {</span><br><span style="color: hsl(0, 100%, 40%);">- rc = osmo_daemonize();</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- perror("Error during daemonize");</span><br><span style="color: hsl(0, 100%, 40%);">- exit(1);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#if 0</span><br><span style="color: hsl(0, 100%, 40%);">- /* qos */</span><br><span style="color: hsl(0, 100%, 40%);">- qos.l = 3;</span><br><span style="color: hsl(0, 100%, 40%);">- qos.v[2] = (args_info.qos_arg) & 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">- qos.v[1] = ((args_info.qos_arg) >> 8) & 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">- qos.v[0] = ((args_info.qos_arg) >> 16) & 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Main select loop */</span><br><span style="color: hsl(0, 100%, 40%);">- while (!end) {</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_select_main(0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(ggsn, &g_ggsn_list, list)</span><br><span style="color: hsl(0, 100%, 40%);">- ggsn_stop(ggsn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/ggsn/ggsn.h b/ggsn/ggsn.h</span><br><span>index a37381f..1bd067e 100644</span><br><span>--- a/ggsn/ggsn.h</span><br><span>+++ b/ggsn/ggsn.h</span><br><span>@@ -6,6 +6,7 @@</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span> </span><br><span> #include "../lib/tun.h"</span><br><span> #include "../lib/ippool.h"</span><br><span>@@ -135,8 +136,11 @@</span><br><span> struct apn_ctx *ggsn_find_apn(struct ggsn_ctx *ggsn, const char *name);</span><br><span> struct apn_ctx *ggsn_find_or_create_apn(struct ggsn_ctx *ggsn, const char *name);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* ggsn.c */</span><br><span style="color: hsl(120, 100%, 40%);">+/* ggsn_main.c */</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct ctrl_handle *g_ctrlh;</span><br><span> extern void *tall_ggsn_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* ggsn.c */</span><br><span> extern int ggsn_start(struct ggsn_ctx *ggsn);</span><br><span> extern int ggsn_stop(struct ggsn_ctx *ggsn);</span><br><span> extern int apn_start(struct apn_ctx *apn);</span><br><span>diff --git a/ggsn/ggsn_main.c b/ggsn/ggsn_main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..797b101</span><br><span>--- /dev/null</span><br><span>+++ b/ggsn/ggsn_main.c</span><br><span>@@ -0,0 +1,206 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * OsmoGGSN - Gateway GPRS Support Node</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2019 sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The contents of this file may be used under the terms of the GNU</span><br><span style="color: hsl(120, 100%, 40%);">+ * General Public License Version 2, provided that the above copyright</span><br><span style="color: hsl(120, 100%, 40%);">+ * notice and this permission notice is included in all copies or</span><br><span style="color: hsl(120, 100%, 40%);">+ * substantial portions of the software.</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%);">+#include "../config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_STDINT_H</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <ctype.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/ioctl.h></span><br><span style="color: hsl(120, 100%, 40%);">+</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/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_cmd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/ports.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/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/ports.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/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ggsn.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void *tall_ggsn_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int end = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+static int daemonize = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+struct ctrl_handle *g_ctrlh;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ul255_t qos;</span><br><span style="color: hsl(120, 100%, 40%);">+struct ul255_t apn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static char *config_file = "osmo-ggsn.cfg";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* To exit gracefully. Used with GCC compilation flag -pg and gprof */</span><br><span style="color: hsl(120, 100%, 40%);">+static void signal_handler(int s)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DGGSN, LOGL_NOTICE, "signal %d received\n", s);</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (s) {</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%);">+ LOGP(DGGSN, LOGL_NOTICE, "SIGINT received, shutting down\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ end = 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%);">+ case SIGUSR1:</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_report(tall_vty_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_report_full(tall_ggsn_ctx, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case SIGUSR2:</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_report_full(tall_vty_ctx, stderr);</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%);">+ 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%);">+static void print_usage()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Usage: osmo-ggsn [-h] [-D] [-c configfile] [-V]\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%);">+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 help...\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " -h --help This help text\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%);">+ " -c --config-file filename The config file to use\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " -V --version Print the version of OsmoGGSN\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_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_index = 0, c;</span><br><span style="color: hsl(120, 100%, 40%);">+ static 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%);">+ { "daemonize", 0, 0, 'D' },</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%);">+ { 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, "hdc:V", long_options, &option_index);</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_usage();</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%);">+ case 'D':</span><br><span style="color: hsl(120, 100%, 40%);">+ daemonize = 1;</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%);">+ config_file = optarg;</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%);">+ }</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%);">+ struct ggsn_ctx *ggsn;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ tall_ggsn_ctx = talloc_named_const(NULL, 0, "OsmoGGSN");</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_talloc_ctx_init(tall_ggsn_ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_vty_info.tall_ctx = tall_ggsn_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle keyboard interrupt SIGINT */</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGINT, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGTERM, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGABRT, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGUSR1, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+ signal(SIGUSR2, &signal_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_ignore_signals();</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(tall_ggsn_ctx, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stats_init(tall_ggsn_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_init(&g_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_talloc_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%);">+ ggsn_vty_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrl_vty_init(tall_ggsn_ctx);</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%);">+ rate_ctr_init(tall_ggsn_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</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) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "Failed to open config file: '%s'\n", config_file);</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%);">+ rc = telnet_init_dynif(tall_ggsn_ctx, NULL, vty_get_bind_addr(), OSMO_VTY_PORT_GGSN);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</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%);">+ g_ctrlh = ctrl_interface_setup_dynip(NULL, ctrl_vty_get_bind_addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_CTRL_PORT_GGSN, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!g_ctrlh) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DGGSN, LOGL_ERROR, "Failed to create CTRL interface.\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%);">+ 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%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+ /* qos */</span><br><span style="color: hsl(120, 100%, 40%);">+ qos.l = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+ qos.v[2] = (args_info.qos_arg) & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+ qos.v[1] = ((args_info.qos_arg) >> 8) & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+ qos.v[0] = ((args_info.qos_arg) >> 16) & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Main select loop */</span><br><span style="color: hsl(120, 100%, 40%);">+ while (!end) {</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%);">+ llist_for_each_entry(ggsn, &g_ggsn_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+ ggsn_stop(ggsn);</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/osmo-ggsn/+/15249">change 15249</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-ggsn/+/15249"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ggsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I9e6a3beac7657f0a8c02d514b54c6f1caa93bba7 </div>
<div style="display:none"> Gerrit-Change-Number: 15249 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>