[PATCH] osmo-hlr[master]: Add CTRL interface

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Max gerrit-no-reply at lists.osmocom.org
Wed Feb 15 15:08:48 UTC 2017


Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/1827

to look at the new patch set (#2).

Add CTRL interface

Add command to query Packet Services (GPRS etc.) for particular IMSI.

Change-Id: Id787ef4aa88473c3bbde6ee25117b1fd99dc8fcb
Related: OS#1645
---
M configure.ac
M src/Makefile.am
A src/ctrl.c
A src/ctrl.h
M src/gsup_server.c
M src/gsup_server.h
M src/hlr.c
7 files changed, 172 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/27/1827/2

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(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 56a5670..ad744c6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,6 +3,7 @@
 	$(LIBOSMOCORE_CFLAGS) \
 	$(LIBOSMOGSM_CFLAGS) \
 	$(LIBOSMOVTY_CFLAGS) \
+	$(LIBOSMOCTRL_CFLAGS) \
 	$(LIBOSMOABIS_CFLAGS) \
 	$(SQLITE3_CFLAGS) \
 	$(NULL)
@@ -19,6 +20,7 @@
 	gsup_server.h \
 	logging.h \
 	rand.h \
+	ctrl.h \
 	hlr_vty.h \
 	$(NULL)
 
@@ -32,6 +34,7 @@
 
 osmo_hlr_SOURCES = \
 	auc.c \
+	ctrl.c \
 	db.c \
 	luop.c \
 	db_auc.c \
@@ -48,6 +51,7 @@
 	$(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..a0fcfb3
--- /dev/null
+++ b/src/ctrl.c
@@ -0,0 +1,88 @@
+/* OsmoHLR Control Interface implementation */
+
+/* (C) 2017 sysmocom s.f.m.c. GmbH <info at sysmocom.de>
+ * All Rights Reserved
+ *
+ * Author: Max Suraev <msuraev at 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 "luop.h"
+#include "ctrl.h"
+
+static int handle_cmd_ps(struct osmo_gsup_server *gs, struct ctrl_cmd *cmd)
+{
+	struct lu_operation *luop = lu_op_alloc(gs);
+
+	DEBUGP(DMAIN, "Checking status for IMSI %s among %u subscribers\n",
+	       cmd->value, llist_count(gs->luop));
+
+	if (!luop) {
+		cmd->reply = "Internal HLR error";
+		return CTRL_CMD_ERROR;
+	}
+
+	/* check if subscriber is known at all */
+	if (!lu_op_fill_subscr(luop, gs->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;
+}
+
+CTRL_CMD_DEFINE_WO_NOVRF(status_ps, "status-ps");
+static int set_status_ps(struct ctrl_cmd *cmd, void *data)
+{
+	return handle_cmd_ps(data, cmd);
+}
+
+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(const char *addr,
+					struct osmo_gsup_server *gs)
+{
+	int rc;
+	struct ctrl_handle *hdl = ctrl_interface_setup_dynip(gs, 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..95b58be
--- /dev/null
+++ b/src/ctrl.h
@@ -0,0 +1,31 @@
+/* OsmoHLR Control Interface implementation */
+
+/* (C) 2017 sysmocom s.f.m.c. GmbH <info at sysmocom.de>
+ * All Rights Reserved
+ *
+ * Author: Max Suraev <msuraev at 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(const char *addr,
+					struct osmo_gsup_server *gs);
diff --git a/src/gsup_server.c b/src/gsup_server.c
index ea51f7d..90742c5 100644
--- a/src/gsup_server.c
+++ b/src/gsup_server.c
@@ -27,6 +27,7 @@
 
 #include "gsup_server.h"
 #include "gsup_router.h"
+#include "ctrl.h"
 
 static void osmo_gsup_server_send(struct osmo_gsup_conn *conn,
 			     int proto_ext, struct msgb *msg_tx)
@@ -245,9 +246,10 @@
 }
 
 struct osmo_gsup_server *
-osmo_gsup_server_create(void *ctx, const char *ip_addr,
-			uint16_t tcp_port,
-			osmo_gsup_read_cb_t read_cb)
+osmo_gsup_server_create(void *ctx, const char *ip_addr, uint16_t tcp_port,
+			osmo_gsup_read_cb_t read_cb,
+			const char *ctrl_addr, struct db_context *dbc,
+			struct llist_head *lu_op_lst)
 {
 	struct osmo_gsup_server *gsups;
 	int rc;
@@ -272,6 +274,15 @@
 	if (rc < 0)
 		goto failed;
 
+	gsups->dbc = dbc;
+	gsups->luop = lu_op_lst;
+
+	if (ctrl_addr)
+		gsups->ctrl = hlr_controlif_setup(ctrl_addr, gsups);
+	else
+		LOGP(DLGSUP, LOGL_NOTICE, "Control Interface is NOT created: "
+		     "bind address missing\n");
+
 	return gsups;
 
 failed:
@@ -286,5 +297,8 @@
 		ipa_server_link_destroy(gsups->link);
 		gsups->link = NULL;
 	}
+
+	db_close(gsups->dbc);
+
 	talloc_free(gsups);
 }
diff --git a/src/gsup_server.h b/src/gsup_server.h
index 484a0d7..ae303f5 100644
--- a/src/gsup_server.h
+++ b/src/gsup_server.h
@@ -5,6 +5,8 @@
 #include <osmocom/abis/ipa.h>
 #include <osmocom/abis/ipaccess.h>
 
+#include "db.h"
+
 struct osmo_gsup_conn;
 
 /* Expects message in msg->l2h */
@@ -14,9 +16,18 @@
 	/* list of osmo_gsup_conn */
 	struct llist_head clients;
 
+	/* DB context */
+	struct db_context *dbc;
+
+	/* lu_operations list */
+	struct llist_head *luop;
+
 	struct ipa_server_link *link;
 	osmo_gsup_read_cb_t read_cb;
 	struct llist_head routes;
+
+	/* Control Interface handle */
+	struct ctrl_handle *ctrl;
 };
 
 
@@ -35,10 +46,12 @@
 int osmo_gsup_conn_ccm_get(const struct osmo_gsup_conn *clnt, uint8_t **addr,
 			   uint8_t tag);
 
-struct osmo_gsup_server *osmo_gsup_server_create(void *ctx,
-					const char *ip_addr,
-					uint16_t tcp_port,
-					osmo_gsup_read_cb_t read_cb);
+struct osmo_gsup_server *osmo_gsup_server_create(void *ctx, const char *ip_addr,
+						 uint16_t tcp_port,
+						 osmo_gsup_read_cb_t read_cb,
+						 const char *ctrl_addr,
+						 struct db_context *dbc,
+						 struct llist_head *lu_op_lst);
 
 void osmo_gsup_server_destroy(struct osmo_gsup_server *gsups);
 
diff --git a/src/hlr.c b/src/hlr.c
index 36d84b4..f2f6ceb 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -34,6 +34,7 @@
 #include <osmocom/vty/ports.h>
 
 #include "db.h"
+#include "ctrl.h"
 #include "logging.h"
 #include "gsup_server.h"
 #include "gsup_router.h"
@@ -210,8 +211,8 @@
 	bool is_ps = false;
 	int rc;
 
-	LOGP(DAUC, LOGL_INFO, "%s: Purge MS (%s)\n", gsup->imsi,
-		is_ps ? "PS" : "CS");
+	LOGP(DAUC, LOGL_INFO, "%s: Purge MS (%s), %u subscribers left\n",
+	     gsup->imsi, is_ps ? "PS" : "CS", llist_count(&g_lu_ops));
 
 	memcpy(gsup_reply.imsi, gsup->imsi, sizeof(gsup_reply.imsi));
 
@@ -302,16 +303,19 @@
 	printf("  -s --disable-color         Do not print ANSI colors in the log\n");
 	printf("  -T --timestamp             Prefix every log line with a timestamp.\n");
 	printf("  -e --log-level number      Set a global loglevel.\n");
+	printf("  -i --ctrl address          Set address to which Control Interface should be bound, defaults to 127.0.0.1.\n");
 	printf("  -V --version               Print the version of OsmoHLR.\n");
 }
 
 static struct {
 	const char *config_file;
 	const char *db_file;
+	const char *addr;
 	bool daemonize;
 } cmdline_opts = {
 	.config_file = "osmo-hlr.cfg",
 	.db_file = "hlr.db",
+	.addr = "127.0.0.1",
 	.daemonize = false,
 };
 
@@ -327,12 +331,13 @@
 			{"daemonize", 0, 0, 'D'},
 			{"disable-color", 0, 0, 's'},
 			{"log-level", 1, 0, 'e'},
+			{"ctrl", 1, 0, 'i'},
 			{"timestamp", 0, 0, 'T'},
 			{"version", 0, 0, 'V' },
 			{0, 0, 0, 0}
 		};
 
-		c = getopt_long(argc, argv, "hc:l:d:Dse:TV",
+		c = getopt_long(argc, argv, "hc:l:d:Dse:i:TV",
 				long_options, &option_index);
 		if (c == -1)
 			break;
@@ -347,6 +352,9 @@
 			break;
 		case 'l':
 			cmdline_opts.db_file = optarg;
+			break;
+		case 'i':
+			cmdline_opts.addr = optarg;
 			break;
 		case 'd':
 			log_parse_category_mask(osmo_stderr_target, optarg);
@@ -385,7 +393,6 @@
 	case SIGINT:
 		LOGP(DMAIN, LOGL_NOTICE, "Terminating due to SIGINT\n");
 		osmo_gsup_server_destroy(gs);
-		db_close(g_dbc);
 		log_fini();
 		talloc_report_full(hlr_ctx, stderr);
 		exit(0);
@@ -448,7 +455,8 @@
 		exit(1);
 	}
 
-	gs = osmo_gsup_server_create(hlr_ctx, NULL, 2222, read_cb);
+	gs = osmo_gsup_server_create(hlr_ctx, NULL, 2222, read_cb,
+				     cmdline_opts.addr, g_dbc, &g_lu_ops);
 	if (!gs) {
 		LOGP(DMAIN, LOGL_FATAL, "Error starting GSUP server\n");
 		exit(1);
@@ -470,7 +478,7 @@
 		osmo_select_main(0);
 	}
 
-	db_close(g_dbc);
+	osmo_gsup_server_destroy(gs);
 
 	log_fini();
 

-- 
To view, visit https://gerrit.osmocom.org/1827
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Id787ef4aa88473c3bbde6ee25117b1fd99dc8fcb
Gerrit-PatchSet: 2
Gerrit-Project: osmo-hlr
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list