From 11713d88e4d2e60621e7ff7032a47f29ef53a30d Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 21 Mar 2016 15:39:41 +0100 Subject: vty: Work on configuration of the MNCC to SIP gateway We will add addressing by IMSI but right now let's focus on the minimum of what needs to be there. --- doc/examples/osmo-sip-connector.cfg | 6 ++ src/main.c | 48 +++++++++++++ src/vty.c | 136 +++++++++++++++++++++++++++++++++++- src/vty.h | 23 ++++++ 4 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 doc/examples/osmo-sip-connector.cfg diff --git a/doc/examples/osmo-sip-connector.cfg b/doc/examples/osmo-sip-connector.cfg new file mode 100644 index 0000000..ad42969 --- /dev/null +++ b/doc/examples/osmo-sip-connector.cfg @@ -0,0 +1,6 @@ +app +mncc + socket-path /tmp/bsc_mncc +sip + local 0.0.0.0 5060 + remote pbx 5060 diff --git a/src/main.c b/src/main.c index 021f986..4513718 100644 --- a/src/main.c +++ b/src/main.c @@ -18,6 +18,8 @@ * */ +#define _GNU_SOURCE + #include "evpoll.h" #include "vty.h" #include "logging.h" @@ -36,9 +38,13 @@ #include #include +#include +#include void *tall_mncc_ctx; +static char *config_file = "osmo-sip-connector.cfg"; + static struct log_info_cat mncc_sip_categories[] = { [DSIP] = { .name = "DSIP", @@ -62,6 +68,39 @@ static const struct log_info mncc_sip_info = { .num_cat = ARRAY_SIZE(mncc_sip_categories), }; +static void print_help(void) +{ + printf("Osmo MNCC to SIP bridge\n"); + printf(" -h --hekp\tthis text\n"); + printf(" -c --config-file NAME\tThe config file to use [%s]\n", config_file); +} + +static void handle_options(int argc, char **argv) +{ + while (1) { + int option_index = 0, c; + static struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"config-file", 1, 0, 'c'}, + {NULL, 0, 0, 0} + }; + + c = getopt_long(argc, argv, "hc:", + long_options, &option_index); + if (c == -1) + break; + + switch (c) { + case 'h': + print_help(); + exit(0); + case 'c': + config_file = optarg; + break; + } + } +} + int main(int argc, char **argv) { int rc; @@ -84,6 +123,15 @@ int main(int argc, char **argv) sip_root = su_glib_root_create(NULL); /* parsing and setup */ + + handle_options(argc, argv); + rc = vty_read_config_file(config_file, NULL); + if (rc < 0) { + LOGP(DAPP, LOGL_ERROR, "Can not parse config: %s %d\n", + config_file, rc); + exit(1); + } + LOGP(DAPP, LOGL_NOTICE, "VTY at %s %d\n", vty_get_bind_addr(), OSMO_VTY_PORT_MNCC_SIP); rc = telnet_init_dynif(tall_mncc_ctx, NULL, diff --git a/src/vty.c b/src/vty.c index de347cd..9a2562e 100644 --- a/src/vty.c +++ b/src/vty.c @@ -20,9 +20,33 @@ #include "vty.h" +#include + +extern void *tall_mncc_ctx; + +struct app_config g_app; + static int mncc_vty_go_parent(struct vty *vty); static int mncc_vty_is_config_node(struct vty *vty, int node); +static struct cmd_node sip_node = { + SIP_NODE, + "%s(config-sip)# ", + 1, +}; + +static struct cmd_node mncc_node = { + MNCC_NODE, + "%s(config-mncc)# ", + 1, +}; + +static struct cmd_node app_node = { + APP_NODE, + "%s(config-app)# ", + 1, +}; + static struct vty_app_info vty_info = { .name = "OsmoMNCC", .version = PACKAGE_VERSION, @@ -31,18 +55,124 @@ static struct vty_app_info vty_info = { .copyright = "GNU AGPLv3+\n", }; - static int mncc_vty_go_parent(struct vty *vty) { - return 0; + switch (vty->node) { + case SIP_NODE: + case MNCC_NODE: + case APP_NODE: + vty->node = CONFIG_NODE; + vty->index = NULL; + break; + default: + if (mncc_vty_is_config_node(vty, vty->node)) + vty->node = CONFIG_NODE; + else + vty->node = ENABLE_NODE; + vty->index = NULL; + break; + } + return vty->node; } static int mncc_vty_is_config_node(struct vty *vty, int node) { - return 0; + return node >= SIP_NODE; +} + +static int config_write_sip(struct vty *vty) +{ + vty_out(vty, "sip%s", VTY_NEWLINE); + vty_out(vty, " local %s %d%s", g_app.sip.local_addr, g_app.sip.local_port, VTY_NEWLINE); + vty_out(vty, " remote %s %d%s", g_app.sip.remote_addr, g_app.sip.remote_port, VTY_NEWLINE); + return CMD_SUCCESS; +} + +static int config_write_mncc(struct vty *vty) +{ + vty_out(vty, "mncc%s", VTY_NEWLINE); + vty_out(vty, " socket-path %s%s", g_app.mncc.path, VTY_NEWLINE); + return CMD_SUCCESS; +} + +static int config_write_app(struct vty *vty) +{ + vty_out(vty, "app%s", VTY_NEWLINE); + return CMD_SUCCESS; +} + +DEFUN(cfg_sip, cfg_sip_cmd, + "sip", "SIP related commands\n") +{ + vty->node = SIP_NODE; + return CMD_SUCCESS; +} + +DEFUN(cfg_sip_local_addr, cfg_sip_local_addr_cmd, + "local A.B.C.D <1-65534>", + "Local information\nIPv4 bind address\nport\n") +{ + talloc_free((char *) g_app.sip.local_addr); + g_app.sip.local_addr = talloc_strdup(tall_mncc_ctx, argv[0]); + g_app.sip.local_port = atoi(argv[1]); + return CMD_SUCCESS; +} + +DEFUN(cfg_sip_remote_addr, cfg_sip_remote_addr_cmd, + "remote ADDR <1-65534>", + "Remore information\nSIP hostname\nport\n") +{ + talloc_free((char *) g_app.sip.remote_addr); + g_app.sip.remote_addr = talloc_strdup(tall_mncc_ctx, argv[0]); + g_app.sip.remote_port = atoi(argv[1]); + return CMD_SUCCESS; +} + +DEFUN(cfg_mncc, cfg_mncc_cmd, + "mncc", + "MNCC\n") +{ + vty->node = MNCC_NODE; + return CMD_SUCCESS; +} + +DEFUN(cfg_mncc_path, cfg_mncc_path_cmd, + "socket-path NAME", + "MNCC filepath\nFilename\n") +{ + talloc_free((char *) g_app.mncc.path); + g_app.mncc.path = talloc_strdup(tall_mncc_ctx, argv[0]); + return CMD_SUCCESS; +} + +DEFUN(cfg_app, cfg_app_cmd, + "app", "Application Handling\n") +{ + vty->node = APP_NODE; + return CMD_SUCCESS; } void mncc_sip_vty_init(void) { + /* default values */ + g_app.mncc.path = talloc_strdup(tall_mncc_ctx, "/tmp/bsc_mncc"); + g_app.sip.local_addr = talloc_strdup(tall_mncc_ctx, "127.0.0.1"); + g_app.sip.local_port = 5060; + g_app.sip.remote_addr = talloc_strdup(tall_mncc_ctx, "pbx"); + g_app.sip.remote_port = 5060; + + vty_init(&vty_info); + + install_element(CONFIG_NODE, &cfg_sip_cmd); + install_node(&sip_node, config_write_sip); + install_element(SIP_NODE, &cfg_sip_local_addr_cmd); + install_element(SIP_NODE, &cfg_sip_remote_addr_cmd); + + install_element(CONFIG_NODE, &cfg_mncc_cmd); + install_node(&mncc_node, config_write_mncc); + install_element(MNCC_NODE, &cfg_mncc_path_cmd); + + install_element(CONFIG_NODE, &cfg_app_cmd); + install_node(&app_node, config_write_app); } diff --git a/src/vty.h b/src/vty.h index 819ae8a..cf6aa55 100644 --- a/src/vty.h +++ b/src/vty.h @@ -1,5 +1,28 @@ #pragma once +#include #include +enum { + SIP_NODE = _LAST_OSMOVTY_NODE + 1, + MNCC_NODE, + APP_NODE, +}; + +struct app_config { + struct { + const char *local_addr; + int local_port; + + const char *remote_addr; + int remote_port; + } sip; + + struct { + const char *path; + } mncc; + + //int use_imsi_as_id; +}; + void mncc_sip_vty_init(); -- cgit v1.2.3