aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac1
-rw-r--r--src/Makefile.am4
-rw-r--r--src/ctrl.c81
-rw-r--r--src/ctrl.h31
-rw-r--r--src/hlr.c13
-rw-r--r--src/hlr.h4
6 files changed, 134 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index bfda9c5..a04185f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -33,6 +33,7 @@ PKG_CHECK_MODULES(TALLOC, [talloc >= 2.0.1])
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.9.5)
PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.9.0)
PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.9.0)
+PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl)
PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.3.2)
PKG_CHECK_MODULES(SQLITE3, sqlite3)
diff --git a/src/Makefile.am b/src/Makefile.am
index 1791343..b410ff3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,6 +3,7 @@ AM_CFLAGS = \
$(LIBOSMOCORE_CFLAGS) \
$(LIBOSMOGSM_CFLAGS) \
$(LIBOSMOVTY_CFLAGS) \
+ $(LIBOSMOCTRL_CFLAGS) \
$(LIBOSMOABIS_CFLAGS) \
$(SQLITE3_CFLAGS) \
$(NULL)
@@ -20,6 +21,7 @@ noinst_HEADERS = \
gsup_server.h \
logging.h \
rand.h \
+ ctrl.h \
hlr_vty.h \
$(NULL)
@@ -33,6 +35,7 @@ noinst_PROGRAMS = \
osmo_hlr_SOURCES = \
auc.c \
+ ctrl.c \
db.c \
luop.c \
db_auc.c \
@@ -49,6 +52,7 @@ osmo_hlr_LDADD = \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOGSM_LIBS) \
$(LIBOSMOVTY_LIBS) \
+ $(LIBOSMOCTRL_LIBS) \
$(LIBOSMOABIS_LIBS) \
$(SQLITE3_LIBS) \
$(NULL)
diff --git a/src/ctrl.c b/src/ctrl.c
new file mode 100644
index 0000000..a167171
--- /dev/null
+++ b/src/ctrl.c
@@ -0,0 +1,81 @@
+/* OsmoHLR Control Interface implementation */
+
+/* (C) 2017 sysmocom s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved
+ *
+ * Author: Max Suraev <msuraev@sysmocom.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdbool.h>
+
+#include <osmocom/ctrl/control_cmd.h>
+#include <osmocom/ctrl/control_if.h>
+#include <osmocom/ctrl/ports.h>
+
+#include "gsup_server.h"
+#include "logging.h"
+#include "db.h"
+#include "hlr.h"
+#include "luop.h"
+#include "ctrl.h"
+
+CTRL_CMD_DEFINE_WO_NOVRF(status_ps, "status-ps");
+static int set_status_ps(struct ctrl_cmd *cmd, void *data)
+{
+ struct hlr *ctx = data;
+ struct lu_operation *luop = lu_op_alloc(ctx->gs);
+ if (!luop) {
+ cmd->reply = "Internal HLR error";
+ return CTRL_CMD_ERROR;
+ }
+
+ if (!lu_op_fill_subscr(luop, ctx->dbc, cmd->value)) {
+ cmd->reply = "Subscriber Unknown in HLR";
+ return CTRL_CMD_ERROR;
+ }
+
+ cmd->reply = luop->subscr.nam_ps ? "1" : "0";
+
+ return CTRL_CMD_REPLY;
+}
+
+int hlr_ctrl_cmds_install()
+{
+ int rc = 0;
+
+ rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_status_ps);
+
+ return rc;
+}
+
+struct ctrl_handle *hlr_controlif_setup(struct hlr *ctx,
+ struct osmo_gsup_server *gs)
+{
+ int rc;
+ struct ctrl_handle *hdl = ctrl_interface_setup_dynip(ctx,
+ ctx->ctrl_bind_addr,
+ OSMO_CTRL_PORT_HLR,
+ NULL);
+ if (!hdl)
+ return NULL;
+
+ rc = hlr_ctrl_cmds_install();
+ if (rc) /* FIXME: close control interface? */
+ return NULL;
+
+ return hdl;
+}
diff --git a/src/ctrl.h b/src/ctrl.h
new file mode 100644
index 0000000..663de30
--- /dev/null
+++ b/src/ctrl.h
@@ -0,0 +1,31 @@
+/* OsmoHLR Control Interface implementation */
+
+/* (C) 2017 sysmocom s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved
+ *
+ * Author: Max Suraev <msuraev@sysmocom.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/ctrl/control_if.h>
+
+#include "gsup_server.h"
+
+int hlr_ctrl_cmds_install();
+struct ctrl_handle *hlr_controlif_setup(struct hlr *ctx,
+ struct osmo_gsup_server *gs);
diff --git a/src/hlr.c b/src/hlr.c
index bb6f05a..95a565e 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -32,9 +32,11 @@
#include <osmocom/vty/command.h>
#include <osmocom/vty/telnet_interface.h>
#include <osmocom/vty/ports.h>
+#include <osmocom/ctrl/control_vty.h>
#include "db.h"
#include "hlr.h"
+#include "ctrl.h"
#include "logging.h"
#include "gsup_server.h"
#include "gsup_router.h"
@@ -393,9 +395,16 @@ static void signal_hdlr(int signal)
}
}
+static const char vlr_copyright[] =
+ "Copyright (C) 2016, 2017 by Harald Welte, sysmocom s.f.m.c. GmbH\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";
+
static struct vty_app_info vty_info = {
.name = "OsmoHLR",
.version = PACKAGE_VERSION,
+ .copyright = vlr_copyright,
.is_config_node = hlr_vty_is_config_node,
};
@@ -415,6 +424,7 @@ int main(int argc, char **argv)
}
vty_init(&vty_info);
+ ctrl_vty_init(hlr_ctx);
handle_options(argc, argv);
hlr_vty_init(&hlr_log_info);
@@ -452,6 +462,9 @@ int main(int argc, char **argv)
exit(1);
}
+ g_hlr->ctrl_bind_addr = ctrl_vty_get_bind_addr();
+ g_hlr->ctrl = hlr_controlif_setup(g_hlr, g_hlr->gs);
+
osmo_init_ignore_signals();
signal(SIGINT, &signal_hdlr);
signal(SIGUSR1, &signal_hdlr);
diff --git a/src/hlr.h b/src/hlr.h
index 77751dd..1e8eff8 100644
--- a/src/hlr.h
+++ b/src/hlr.h
@@ -30,4 +30,8 @@ struct hlr {
/* DB context */
struct db_context *dbc;
+
+ /* Control Interface */
+ struct ctrl_handle *ctrl;
+ const char *ctrl_bind_addr;
};