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