aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2018-02-20 16:48:15 +0100
committerHarald Welte <laforge@gnumonks.org>2018-02-27 07:10:50 +0000
commit5ea1817dc299611808532eda489981f09f87cba3 (patch)
treee92846654f2071526d08112dc4abb55dcd397340
parent49d42e979eb08cef124e8ceab7d402bed204c015 (diff)
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
-rw-r--r--CommonLibs/Makefile.am9
-rw-r--r--CommonLibs/debug.c18
-rw-r--r--CommonLibs/debug.h8
-rw-r--r--CommonLibs/trx_vty.c162
-rw-r--r--CommonLibs/trx_vty.h13
-rw-r--r--Transceiver52M/Makefile.am6
-rw-r--r--Transceiver52M/osmo-trx.cpp56
-rw-r--r--configure.ac3
8 files changed, 269 insertions, 6 deletions
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 <osmocom/core/logging.h>
+#include <osmocom/core/utils.h>
+#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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <string.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/rate_ctr.h>
+
+#include <osmocom/vty/command.h>
+#include <osmocom/vty/vty.h>
+#include <osmocom/vty/misc.h>
+
+#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 <tom@tsou.cc>\r\n"
+ "Copyright (C) 2015 Ettus Research LLC\r\n"
+ "Copyright (C) 2017-2018 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>\r\n"
+ "License AGPLv3+: GNU AGPL version 3 or later <http://gnu.org/licenses/agpl-3.0.html>\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 <osmocom/vty/command.h>
+
+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 <osmocom/core/talloc.h>
#include <osmocom/core/application.h>
#include <osmocom/core/msgb.h>
+#include <osmocom/core/stats.h>
+#include <osmocom/vty/logging.h>
+#include <osmocom/vty/ports.h>
+#include <osmocom/vty/misc.h>
+#include <osmocom/vty/telnet_interface.h>
+#include <osmocom/ctrl/control_vty.h>
+#include <osmocom/ctrl/ports.h>
+#include <osmocom/ctrl/control_if.h>
+#include <osmocom/vty/stats.h>
#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<std::string>(DEFAULT_CHANS, "");
config->rx_paths = std::vector<std::string>(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],