pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmocom-bb/+/31107 )
Change subject: layer23: Integreate mobile further into l23_app ......................................................................
layer23: Integreate mobile further into l23_app
Several functions and data structures in mobile app are refactored to follow more closely the l23_app API and structures. These movements allow starting to use already some shared infrastructure defined under layer23/common. This is not a full migration to l23_app, since mobile still keeps a separate main() with a few extra code. This commit is rather a step towards an eventual merge of mobile's main.cpp into layer23/common/main.c
This is a preparation commit to later one adding gsmtap VTY configuration to all l23 apps.
Change-Id: I3141b6cb4a0482970f434180ef8dda3af1d4aa0c --- M src/host/layer23/include/osmocom/bb/mobile/app_mobile.h M src/host/layer23/src/mobile/app_mobile.c M src/host/layer23/src/mobile/main.c M src/host/layer23/src/mobile/vty_interface.c 4 files changed, 165 insertions(+), 91 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved
diff --git a/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h b/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h index 7a3669d..940dbce 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h +++ b/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h @@ -8,9 +8,6 @@ struct osmocom_ms; struct vty;
-int l23_app_init(const char *config_file); -int l23_app_exit(void); -int l23_app_work(int *quit); int mobile_delete(struct osmocom_ms *ms, int force); struct osmocom_ms *mobile_new(char *name); int mobile_work(struct osmocom_ms *ms); diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c index 285672d..efd3a75 100644 --- a/src/host/layer23/src/mobile/app_mobile.c +++ b/src/host/layer23/src/mobile/app_mobile.c @@ -29,6 +29,7 @@ #include <osmocom/bb/common/gps.h> #include <osmocom/bb/common/sap_interface.h> #include <osmocom/bb/common/sim.h> +#include <osmocom/bb/common/l23_app.h>
#include <osmocom/bb/mobile/gsm48_rr.h> #include <osmocom/bb/mobile/gsm480_ss.h> @@ -43,8 +44,7 @@ #include <osmocom/bb/mobile/gapk_io.h> #include <osmocom/bb/mobile/primitives.h>
-#include <osmocom/vty/ports.h> -#include <osmocom/vty/logging.h> +#include <osmocom/vty/vty.h> #include <osmocom/vty/telnet_interface.h>
#include <osmocom/core/msgb.h> @@ -58,12 +58,12 @@
extern void *l23_ctx; extern struct llist_head ms_list; -extern int vty_reading;
int mncc_recv_internal(struct osmocom_ms *ms, int msg_type, void *arg); int mncc_recv_external(struct osmocom_ms *ms, int msg_type, void *arg); int mncc_recv_dummy(struct osmocom_ms *ms, int msg_type, void *arg); -static int quit; +static int _quit; +extern int quit; /* l23 main */
/* handle ms instance */ int mobile_work(struct osmocom_ms *ms) @@ -381,20 +381,20 @@ case S_GLOBAL_SHUTDOWN: /* force to exit, if signalled */ if (signal_data && *((uint8_t *)signal_data)) - quit = 1; + _quit = 1;
llist_for_each_entry_safe(ms, ms2, &ms_list, entity) - mobile_delete(ms, quit); + mobile_delete(ms, _quit);
/* quit, after all MS processes are gone */ - quit = 1; + _quit = 1; break; } return 0; }
/* global work handler */ -int l23_app_work(int *_quit) +int _mobile_app_work(void) { struct osmocom_ms *ms, *ms2; int work = 0; @@ -424,12 +424,12 @@ }
/* return, if a shutdown was scheduled (quit = 1) */ - *_quit = quit; + quit = _quit; return work; }
/* global exit */ -int l23_app_exit(void) +int _mobile_app_exit(void) { osmo_signal_unregister_handler(SS_L1CTL, &gsm322_l1_signal, NULL); osmo_signal_unregister_handler(SS_L1CTL, &mobile_signal_cb, NULL); @@ -442,53 +442,10 @@ return 0; }
-static struct vty_app_info vty_info = { - .name = "OsmocomBB", - .version = PACKAGE_VERSION, -};
-/* global init */ -int l23_app_init(const char *config_file) +int _mobile_app_start(void) { - struct telnet_connection dummy_conn; - int rc = 0; - - osmo_gps_init(); - -#ifdef WITH_GAPK_IO - /* Init GAPK audio I/O */ - gapk_io_init(); -#endif - - vty_info.tall_ctx = l23_ctx; - vty_init(&vty_info); - logging_vty_add_cmds(); - ms_vty_init(); - dummy_conn.priv = NULL; - vty_reading = 1; - if (config_file != NULL) { - rc = vty_read_config_file(config_file, &dummy_conn); - if (rc < 0) { - LOGP(DMOB, LOGL_FATAL, "Failed to parse the configuration " - "file '%s'\n", config_file); - LOGP(DMOB, LOGL_FATAL, "Please make sure the file " - "'%s' exists, or use an example from " - "'doc/examples/mobile/'\n", config_file); - return rc; - } - LOGP(DMOB, LOGL_INFO, "Using configuration from '%s'\n", config_file); - } - vty_reading = 0; - rc = telnet_init_default(l23_ctx, NULL, OSMO_VTY_PORT_BB); - if (rc < 0) { - LOGP(DMOB, LOGL_FATAL, "Cannot init VTY on %s port %u: %s\n", - vty_get_bind_addr(), OSMO_VTY_PORT_BB, strerror(errno)); - return rc; - } - - osmo_signal_register_handler(SS_GLOBAL, &global_signal_cb, NULL); - osmo_signal_register_handler(SS_L1CTL, &mobile_signal_cb, NULL); - osmo_signal_register_handler(SS_L1CTL, &gsm322_l1_signal, NULL); + int rc;
if (llist_empty(&ms_list)) { struct osmocom_ms *ms; @@ -503,16 +460,60 @@ return rc; }
- quit = 0; + _quit = 0;
return 0; }
+/* global init */ +int l23_app_init(void) +{ + l23_app_start = _mobile_app_start; + l23_app_work = _mobile_app_work; + l23_app_exit = _mobile_app_exit; + osmo_gps_init(); + +#ifdef WITH_GAPK_IO + /* Init GAPK audio I/O */ + gapk_io_init(); +#endif + + osmo_signal_register_handler(SS_GLOBAL, &global_signal_cb, NULL); + osmo_signal_register_handler(SS_L1CTL, &mobile_signal_cb, NULL); + osmo_signal_register_handler(SS_L1CTL, &gsm322_l1_signal, NULL); + + return 0; +} + +static int _mobile_vty_init(void) +{ + return ms_vty_init(); +} + +static int l23_cfg_supported(void) +{ + return L23_OPT_TAP | L23_OPT_VTY | L23_OPT_DBG; +} + +static struct vty_app_info _mobile_vty_info = { + .name = "mobile", + .version = PACKAGE_VERSION, +}; + +static struct l23_app_info info = { + .copyright = "Copyright (C) 2010-2015 Andreas Eversberg, Sylvain Munaut, Holger Freyther, Harald Welte\n", + .contribution = "Contributions by Alex Badea, Pablo Neira, Steve Markgraf and others\n", + .cfg_supported = &l23_cfg_supported, + .vty_info = &_mobile_vty_info, + .vty_init = _mobile_vty_init, +}; + struct l23_app_info *l23_app_info(void) { - return NULL; /* TODO: implement mobile as a full l23_app. */ + return &info; }
+ void mobile_set_started(struct osmocom_ms *ms, bool state) { ms->started = state; diff --git a/src/host/layer23/src/mobile/main.c b/src/host/layer23/src/mobile/main.c index 088e6c9..4627b25 100644 --- a/src/host/layer23/src/mobile/main.c +++ b/src/host/layer23/src/mobile/main.c @@ -19,6 +19,8 @@
#include <osmocom/bb/common/osmocom_data.h> #include <osmocom/bb/common/logging.h> +#include <osmocom/bb/common/l23_app.h> +#include <osmocom/bb/common/vty.h> #include <osmocom/bb/mobile/app_mobile.h>
#include <osmocom/core/talloc.h> @@ -27,6 +29,10 @@ #include <osmocom/core/gsmtap.h> #include <osmocom/core/signal.h> #include <osmocom/core/application.h> +#include <osmocom/vty/vty.h> +#include <osmocom/vty/logging.h> +#include <osmocom/vty/telnet_interface.h> +#include <osmocom/vty/ports.h>
#include <arpa/inet.h>
@@ -42,13 +48,21 @@ #include <time.h> #include <libgen.h>
+#include "config.h" + void *l23_ctx = NULL; struct llist_head ms_list; static char *gsmtap_ip = 0; static const char *custom_cfg_file = NULL; struct gsmtap_inst *gsmtap_inst = NULL; +static char *config_file = NULL; char *config_dir = NULL; int daemonize = 0; +int quit = 0; + +int (*l23_app_start)(void) = NULL; +int (*l23_app_work)(void) = NULL; +int (*l23_app_exit)(void) = NULL;
int mobile_delete(struct osmocom_ms *ms, int force); int mobile_signal_cb(unsigned int subsys, unsigned int signal, @@ -61,12 +75,12 @@ "DCS:DNB:DPLMN:DRR:DMM:DSIM:DCC:DMNCC:DSS:DLSMS:DPAG:DSUM:DSAP:DGPS:DMOB:DPRIM:DLUA:DGAPK";
const char *openbsc_copyright = - "Copyright (C) 2010-2015 Andreas Eversberg, Sylvain Munaut, Holger Freyther, Harald Welte\n" - "Contributions by Alex Badea, Pablo Neira, Steve Markgraf and others\n\n" + "%s" + "%s\n" "License GPLv2+: GNU GPL version 2 or later " "http://gnu.org/licenses/gpl.html\n" "This is free software: you are free to change and redistribute it.\n" - "There is NO WARRANTY, to the extent permitted by law.\n"; + "There is NO WARRANTY, to the extent permitted by law.\n\n";
static void print_usage(const char *app) { @@ -198,13 +212,56 @@ } }
-int main(int argc, char **argv) +static void print_copyright(void) { - char *config_file; - int quit = 0; + struct l23_app_info *app; + app = l23_app_info(); + printf(openbsc_copyright, + app && app->copyright ? app->copyright : "", + app && app->contribution ? app->contribution : ""); +} + +static int _vty_init(struct l23_app_info *app) +{ + static struct vty_app_info l23_vty_info = { + .name = "OsmocomBB", + .version = PACKAGE_VERSION, + }; int rc;
- printf("%s\n", openbsc_copyright); + OSMO_ASSERT(app->vty_info); + app->vty_info->tall_ctx = l23_ctx; + vty_init(app->vty_info ? : &l23_vty_info); + logging_vty_add_cmds(); + if (app->vty_init) + app->vty_init(); + if (config_file) { + LOGP(DLGLOBAL, LOGL_INFO, "Using configuration from '%s'\n", config_file); + l23_vty_reading = true; + rc = vty_read_config_file(config_file, NULL); + l23_vty_reading = false; + if (rc < 0) { + LOGP(DLGLOBAL, LOGL_FATAL, + "Failed to parse the configuration file '%s'\n", config_file); + return rc; + } + } + rc = telnet_init_default(l23_ctx, NULL, OSMO_VTY_PORT_BB); + if (rc < 0) { + LOGP(DMOB, LOGL_FATAL, "Cannot init VTY on %s port %u: %s\n", + vty_get_bind_addr(), OSMO_VTY_PORT_BB, strerror(errno)); + return rc; + } + return rc; +} + +int main(int argc, char **argv) +{ + int rc; + struct l23_app_info *app; + unsigned int app_supp_opt = 0x00; + + print_copyright();
srand(time(NULL));
@@ -217,21 +274,23 @@ /* Init default stderr logging */ osmo_init_logging2(l23_ctx, &log_info);
+ rc = l23_app_init(); + if (rc < 0) { + fprintf(stderr, "Failed during l23_app_init()\n"); + exit(1); + } + + app = l23_app_info(); + if (app && app->cfg_supported != NULL) + app_supp_opt = app->cfg_supported(); + + rc = handle_options(argc, argv); if (rc) { /* Abort in case of parsing errors */ fprintf(stderr, "Error in command line options. Exiting.\n"); return 1; }
- if (gsmtap_ip) { - gsmtap_inst = gsmtap_source_init(gsmtap_ip, GSMTAP_UDP_PORT, 1); - if (!gsmtap_inst) { - fprintf(stderr, "Failed during gsmtap_init()\n"); - exit(1); - } - gsmtap_source_add_sink(gsmtap_inst); - } - if (custom_cfg_file) { /* Use full path provided by user */ config_file = talloc_strdup(l23_ctx, custom_cfg_file); @@ -250,9 +309,27 @@ config_dir = talloc_strdup(l23_ctx, config_file); config_dir = dirname(config_dir);
- rc = l23_app_init(config_file); - if (rc) - exit(rc); + if (app_supp_opt & L23_OPT_VTY) { + if (_vty_init(app) < 0) + exit(1); + } + + if (gsmtap_ip) { + gsmtap_inst = gsmtap_source_init(gsmtap_ip, GSMTAP_UDP_PORT, 1); + if (!gsmtap_inst) { + fprintf(stderr, "Failed during gsmtap_init()\n"); + exit(1); + } + gsmtap_source_add_sink(gsmtap_inst); + } + + if (l23_app_start) { + rc = l23_app_start(); + if (rc < 0) { + fprintf(stderr, "Failed during l23_app_start()\n"); + exit(1); + } + }
signal(SIGINT, sighandler); signal(SIGTSTP, sighandler); @@ -271,7 +348,7 @@ }
while (1) { - l23_app_work(&quit); + l23_app_work(); if (quit && llist_empty(&ms_list)) break; osmo_select_main(0); diff --git a/src/host/layer23/src/mobile/vty_interface.c b/src/host/layer23/src/mobile/vty_interface.c index 3ffdc54..05690ab 100644 --- a/src/host/layer23/src/mobile/vty_interface.c +++ b/src/host/layer23/src/mobile/vty_interface.c @@ -106,12 +106,11 @@ return 0; }
-int vty_reading = 0; static int hide_default = 0;
static void vty_restart(struct vty *vty, struct osmocom_ms *ms) { - if (vty_reading) + if (l23_vty_reading) return; if (ms->shutdown != MS_SHUTDOWN_NONE) return; @@ -1183,7 +1182,7 @@ }
if (!found) { - if (!vty_reading) { + if (!l23_vty_reading) { vty_out(vty, "MS name '%s' does not exits, try " "'ms %s create'%s", argv[0], argv[0], VTY_NEWLINE); @@ -2270,7 +2269,7 @@ struct gsm_support *sup = &ms->support; \ if (!sup->item) { \ vty_out(vty, desc " not supported%s", VTY_NEWLINE); \ - if (vty_reading) \ + if (l23_vty_reading) \ return CMD_SUCCESS; \ return CMD_WARNING; \ } \ @@ -2288,7 +2287,7 @@ struct gsm_support *sup = &ms->support; \ if (!sup->item) { \ vty_out(vty, desc " not supported%s", VTY_NEWLINE); \ - if (vty_reading) \ + if (l23_vty_reading) \ return CMD_SUCCESS; \ return CMD_WARNING; \ } \ @@ -2381,7 +2380,7 @@
set->class_900 = atoi(argv[0]);
- if (set->class_900 < sup->class_900 && !vty_reading) + if (set->class_900 < sup->class_900 && !l23_vty_reading) vty_out(vty, "Note: You selected a higher class than supported " " by hardware!%s", VTY_NEWLINE);
@@ -2402,7 +2401,7 @@
set->class_850 = atoi(argv[0]);
- if (set->class_850 < sup->class_850 && !vty_reading) + if (set->class_850 < sup->class_850 && !l23_vty_reading) vty_out(vty, "Note: You selected a higher class than supported " " by hardware!%s", VTY_NEWLINE);
@@ -2423,7 +2422,7 @@
set->class_400 = atoi(argv[0]);
- if (set->class_400 < sup->class_400 && !vty_reading) + if (set->class_400 < sup->class_400 && !l23_vty_reading) vty_out(vty, "Note: You selected a higher class than supported " " by hardware!%s", VTY_NEWLINE);
@@ -2443,7 +2442,7 @@ set->class_dcs = atoi(argv[0]);
if (((set->class_dcs + 1) & 3) < ((sup->class_dcs + 1) & 3) - && !vty_reading) + && !l23_vty_reading) vty_out(vty, "Note: You selected a higher class than supported " " by hardware!%s", VTY_NEWLINE);
@@ -2463,7 +2462,7 @@ set->class_pcs = atoi(argv[0]);
if (((set->class_pcs + 1) & 3) < ((sup->class_pcs + 1) & 3) - && !vty_reading) + && !l23_vty_reading) vty_out(vty, "Note: You selected a higher class than supported " " by hardware!%s", VTY_NEWLINE);
@@ -2489,7 +2488,7 @@ else ch_cap = GSM_CAP_SDCCH;
- if (ch_cap > sup->ch_cap && !vty_reading) { + if (ch_cap > sup->ch_cap && !l23_vty_reading) { vty_out(vty, "You selected an higher capability than supported " " by hardware!%s", VTY_NEWLINE); return CMD_WARNING;