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.orgHello 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