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.
This commit is contained in:
Holger Hans Peter Freyther 2016-03-21 15:39:41 +01:00
parent 5b0d4618df
commit 11713d88e4
4 changed files with 210 additions and 3 deletions

View File

@ -0,0 +1,6 @@
app
mncc
socket-path /tmp/bsc_mncc
sip
local 0.0.0.0 5060
remote pbx 5060

View File

@ -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,

136
src/vty.c
View File

@ -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);
}

View File

@ -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();