summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-03-21 15:39:41 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-03-21 15:39:41 +0100
commit11713d88e4d2e60621e7ff7032a47f29ef53a30d (patch)
tree1fc8ead1ec915a4666536cfd4398f3e080160c17
parent5b0d4618df1f187dc42520e6cfe9391b2fac34d4 (diff)
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.
-rw-r--r--doc/examples/osmo-sip-connector.cfg6
-rw-r--r--src/main.c48
-rw-r--r--src/vty.c136
-rw-r--r--src/vty.h23
4 files changed, 210 insertions, 3 deletions
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 <sofia-sip/su_glib.h>
#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
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 <talloc.h>
+
+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 <osmocom/vty/command.h>
#include <osmocom/vty/vty.h>
+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();