From 5ea1817dc299611808532eda489981f09f87cba3 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 20 Feb 2018 16:48:15 +0100 Subject: Add initial support for logging, vty, ctrl Up to this point, the logging system, vty and ctrl are initialized and can be used fine, though they don't have a lot of use yet. Depends on libosmocore Change-Id Ib79cdb62d45d8c78445c7b064e58eb7e9faeccf9 Related: OS#2184 Change-Id: I08982c37b4f873966304b3cfb38a10ee86eb3dad --- CommonLibs/Makefile.am | 9 ++- CommonLibs/debug.c | 18 +++++ CommonLibs/debug.h | 8 +++ CommonLibs/trx_vty.c | 162 ++++++++++++++++++++++++++++++++++++++++++++ CommonLibs/trx_vty.h | 13 ++++ Transceiver52M/Makefile.am | 6 +- Transceiver52M/osmo-trx.cpp | 56 ++++++++++++++- configure.ac | 3 + 8 files changed, 269 insertions(+), 6 deletions(-) create mode 100644 CommonLibs/debug.c create mode 100644 CommonLibs/debug.h create mode 100644 CommonLibs/trx_vty.c create mode 100644 CommonLibs/trx_vty.h diff --git a/CommonLibs/Makefile.am b/CommonLibs/Makefile.am index fa0b285..843bc38 100644 --- a/CommonLibs/Makefile.am +++ b/CommonLibs/Makefile.am @@ -23,6 +23,7 @@ include $(top_srcdir)/Makefile.common AM_CPPFLAGS = $(STD_DEFINES_AND_INCLUDES) AM_CXXFLAGS = -Wall -O3 -g -lpthread +AM_CFLAGS = $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOVTY_CFLAGS) EXTRA_DIST = \ example.config \ @@ -36,7 +37,9 @@ libcommon_la_SOURCES = \ Sockets.cpp \ Threads.cpp \ Timeval.cpp \ - Logger.cpp + Logger.cpp \ + trx_vty.c \ + debug.c noinst_HEADERS = \ BitVector.h \ @@ -47,4 +50,6 @@ noinst_HEADERS = \ Threads.h \ Timeval.h \ Vector.h \ - Logger.h + Logger.h \ + trx_vty.h \ + debug.h diff --git a/CommonLibs/debug.c b/CommonLibs/debug.c new file mode 100644 index 0000000..e4db2f3 --- /dev/null +++ b/CommonLibs/debug.c @@ -0,0 +1,18 @@ +#include +#include +#include "debug.h" + +/* default categories */ +static const struct log_info_cat default_categories[] = { + [DMAIN] = { + .name = "DMAIN", + .description = "Main generic category", + .color = NULL, + .enabled = 1, .loglevel = LOGL_NOTICE, + }, +}; + +const struct log_info log_info = { + .cat = default_categories, + .num_cat = ARRAY_SIZE(default_categories), +}; diff --git a/CommonLibs/debug.h b/CommonLibs/debug.h new file mode 100644 index 0000000..7038f4c --- /dev/null +++ b/CommonLibs/debug.h @@ -0,0 +1,8 @@ +#pragma once + +extern const struct log_info log_info; + +/* Debug Areas of the code */ +enum { + DMAIN, +}; diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c new file mode 100644 index 0000000..b16cd24 --- /dev/null +++ b/CommonLibs/trx_vty.c @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2012-2017 sysmocom - s.f.m.c. GmbH + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include "trx_vty.h" +#include "../config.h" + +static struct trx_ctx* g_trx_ctx; + +struct trx_ctx *trx_from_vty(struct vty *v) +{ + /* It can't hurt to force callers to continue to pass the vty instance + * to this function, in case we'd like to retrieve the global + * trx instance from the vty at some point in the future. But + * until then, just return the global pointer, which should have been + * initialized by trx_vty_init(). + */ + OSMO_ASSERT(g_trx_ctx); + return g_trx_ctx; +} + +enum trx_vty_node { + TRX_NODE = _LAST_OSMOVTY_NODE + 1, +}; + +static struct cmd_node trx_node = { + TRX_NODE, + "%s(config-trx)# ", + 1, +}; + +DEFUN(cfg_trx, cfg_trx_cmd, + "trx", + "Configure the TRX\n") +{ + struct trx_ctx *trx = trx_from_vty(vty); + + if (!trx) + return CMD_WARNING; + + vty->node = TRX_NODE; + + return CMD_SUCCESS; +} + +DEFUN(cfg_bind_ip, cfg_bind_ip_cmd, + "bind-ip A.B.C.D", + "Set the IP address for the local bind\n" + "IPv4 Address\n") +{ + struct trx_ctx *trx = trx_from_vty(vty); + + osmo_talloc_replace_string(trx, &trx->cfg.bind_addr, argv[0]); + + return CMD_SUCCESS; +} + +static int config_write_trx(struct vty *vty) +{ + struct trx_ctx *trx = trx_from_vty(vty); + + vty_out(vty, "trx%s", VTY_NEWLINE); + if (trx->cfg.bind_addr) + vty_out(vty, " bind-ip %s%s", trx->cfg.bind_addr, VTY_NEWLINE); + + return CMD_SUCCESS; +} + +DEFUN(show_trx, show_trx_cmd, + "show trx", + SHOW_STR "Display information on the TRX\n") +{ + struct trx_ctx *trx = trx_from_vty(vty); + + vty_out(vty, "TRX: Bound to %s%s", trx->cfg.bind_addr, VTY_NEWLINE); + + return CMD_SUCCESS; +} + +static int trx_vty_is_config_node(struct vty *vty, int node) +{ + switch (node) { + case TRX_NODE: + return 1; + default: + return 0; + } +} + +static int trx_vty_go_parent(struct vty *vty) +{ + switch (vty->node) { + case TRX_NODE: + vty->node = CONFIG_NODE; + vty->index = NULL; + vty->index_sub = NULL; + break; + default: + OSMO_ASSERT(0); + } + + return vty->node; +} + +static const char trx_copyright[] = + "Copyright (C) 2007-2014 Free Software Foundation, Inc.\r\n" + "Copyright (C) 2013 Thomas Tsou \r\n" + "Copyright (C) 2015 Ettus Research LLC\r\n" + "Copyright (C) 2017-2018 by sysmocom s.f.m.c. GmbH \r\n" + "License AGPLv3+: GNU AGPL version 3 or later \r\n" + "This is free software: you are free to change and redistribute it.\r\n" + "There is NO WARRANTY, to the extent permitted by law.\r\n"; + +struct vty_app_info g_vty_info = { + .name = "OsmoTRX", + .version = PACKAGE_VERSION, + .copyright = trx_copyright, + .go_parent_cb = trx_vty_go_parent, + .is_config_node = trx_vty_is_config_node, +}; + +int trx_vty_init(struct trx_ctx* trx) +{ + g_trx_ctx = trx; + install_element_ve(&show_trx_cmd); + + install_element(CONFIG_NODE, &cfg_trx_cmd); + + install_node(&trx_node, config_write_trx); + install_element(TRX_NODE, &cfg_bind_ip_cmd); + + return 0; +} diff --git a/CommonLibs/trx_vty.h b/CommonLibs/trx_vty.h new file mode 100644 index 0000000..74af31b --- /dev/null +++ b/CommonLibs/trx_vty.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +extern struct vty_app_info g_vty_info; + +struct trx_ctx { + struct { + char *bind_addr; + } cfg; +}; + +int trx_vty_init(struct trx_ctx* trx); diff --git a/Transceiver52M/Makefile.am b/Transceiver52M/Makefile.am index 21104dc..3c1b86c 100644 --- a/Transceiver52M/Makefile.am +++ b/Transceiver52M/Makefile.am @@ -22,7 +22,7 @@ include $(top_srcdir)/Makefile.common AM_CPPFLAGS = -Wall $(STD_DEFINES_AND_INCLUDES) -I${srcdir}/common -AM_CXXFLAGS = -lpthread $(LIBOSMOCORE_CFLAGS) +AM_CXXFLAGS = -lpthread $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOVTY_CFLAGS) SUBDIRS = arm x86 @@ -93,7 +93,9 @@ osmo_trx_LDADD = \ $(GSM_LA) \ $(COMMON_LA) \ $(FFTWF_LIBS) \ - $(LIBOSMOCORE_LIBS) + $(LIBOSMOCORE_LIBS) \ + $(LIBOSMOCTRL_LIBS) \ + $(LIBOSMOVTY_LIBS) if USRP1 libtransceiver_la_SOURCES += USRPDevice.cpp diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp index 069d195..8e2088d 100644 --- a/Transceiver52M/osmo-trx.cpp +++ b/Transceiver52M/osmo-trx.cpp @@ -40,8 +40,19 @@ extern "C" { #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "convolve.h" #include "convert.h" +#include "trx_vty.h" +#include "debug.h" } /* Samples-per-symbol for downlink path @@ -65,12 +76,14 @@ extern "C" { #define DEFAULT_TRX_PORT 5700 #define DEFAULT_TRX_IP "127.0.0.1" #define DEFAULT_CHANS 1 +#define DEFAULT_CONFIG_FILE "osmo-trx.cfg" struct trx_config { std::string log_level; std::string local_addr; std::string remote_addr; std::string dev_args; + char* config_file; unsigned port; unsigned tx_sps; unsigned rx_sps; @@ -93,6 +106,8 @@ struct trx_config { volatile bool gshutdown = false; static void *tall_trx_ctx; +static struct trx_ctx *g_trx_ctx; +static struct ctrl_handle *g_ctrlh; /* Setup configuration values * Don't query the existence of the Log.Level because it's a @@ -327,6 +342,7 @@ static void handle_options(int argc, char **argv, struct trx_config *config) config->log_level = "NOTICE"; config->local_addr = DEFAULT_TRX_IP; config->remote_addr = DEFAULT_TRX_IP; + config->config_file = (char *)DEFAULT_CONFIG_FILE; config->port = DEFAULT_TRX_PORT; config->tx_sps = DEFAULT_TX_SPS; config->rx_sps = DEFAULT_RX_SPS; @@ -345,7 +361,7 @@ static void handle_options(int argc, char **argv, struct trx_config *config) config->tx_paths = std::vector(DEFAULT_CHANS, ""); config->rx_paths = std::vector(DEFAULT_CHANS, ""); - while ((option = getopt(argc, argv, "ha:l:i:j:p:c:dmxgfo:s:b:r:A:R:Set:y:z:")) != -1) { + while ((option = getopt(argc, argv, "ha:l:i:j:p:c:dmxgfo:s:b:r:A:R:Set:y:z:C:")) != -1) { switch (option) { case 'h': print_help(); @@ -418,6 +434,9 @@ static void handle_options(int argc, char **argv, struct trx_config *config) config->rx_paths = comma_delimited_to_vector(optarg); rx_path_set = true; break; + case 'C': + config->config_file = optarg; + break; default: print_help(); exit(0); @@ -497,11 +516,16 @@ int main(int argc, char *argv[]) Transceiver *trx = NULL; RadioDevice::InterfaceType iface = RadioDevice::NORMAL; struct trx_config config; + int rc; tall_trx_ctx = talloc_named_const(NULL, 0, "OsmoTRX"); msgb_talloc_ctx_init(tall_trx_ctx, 0); + g_vty_info.tall_ctx = tall_trx_ctx; + setup_signal_handlers(); + g_trx_ctx = talloc_zero(tall_trx_ctx, struct trx_ctx); + #ifdef HAVE_SSE3 printf("Info: SSE3 support compiled in"); #ifdef HAVE___BUILTIN_CPU_SUPPORTS @@ -529,8 +553,36 @@ int main(int argc, char *argv[]) convolve_init(); convert_init(); + osmo_init_logging(&log_info); + osmo_stats_init(tall_trx_ctx); + vty_init(&g_vty_info); + ctrl_vty_init(tall_trx_ctx); + trx_vty_init(g_trx_ctx); + + logging_vty_add_cmds(); + osmo_talloc_vty_add_cmds(); + osmo_stats_vty_add_cmds(); + handle_options(argc, argv, &config); + rate_ctr_init(tall_trx_ctx); + + rc = vty_read_config_file(config.config_file, NULL); + if (rc < 0) { + fprintf(stderr, "Failed to open config file: '%s'\n", config.config_file); + exit(2); + } + + rc = telnet_init_dynif(tall_trx_ctx, NULL, vty_get_bind_addr(), OSMO_VTY_PORT_TRX); + if (rc < 0) + exit(1); + + g_ctrlh = ctrl_interface_setup(NULL, OSMO_CTRL_PORT_TRX, NULL); + if (!g_ctrlh) { + fprintf(stderr, "Failed to create CTRL interface.\n"); + exit(1); + } + if (config.sched_rr != -1) { if (set_sched_rr(config.sched_rr) < 0) return EXIT_FAILURE; @@ -580,7 +632,7 @@ int main(int argc, char *argv[]) << chans << " channel(s)" << std::endl; while (!gshutdown) - sleep(1); + osmo_select_main(0); shutdown: std::cout << "Shutting down transceiver..." << std::endl; diff --git a/configure.ac b/configure.ac index cba4a0c..916cf18 100644 --- a/configure.ac +++ b/configure.ac @@ -42,6 +42,7 @@ RELMAKE='-include osmo-release.mk' AC_SUBST([RELMAKE]) AM_PROG_AS +AC_PROG_CC AC_PROG_CXX AX_CXX_COMPILE_STDCXX_11 AC_PROG_LN_S @@ -74,6 +75,8 @@ AC_HEADER_TIME AC_C_BIGENDIAN PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.10.0) +PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0) +PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 0.10.0) AC_ARG_WITH(usrp1, [ AS_HELP_STRING([--with-usrp1], -- cgit v1.2.3