[PATCH] osmo-hlr[master]: add hlr_subsrc_nam to put GSUP client notification in proper...

Neels Hofmeyr gerrit-no-reply at lists.osmocom.org
Tue Oct 17 02:28:51 UTC 2017


Hello Jenkins Builder,

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

    https://gerrit.osmocom.org/4310

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

add hlr_subsrc_nam to put GSUP client notification in proper API

This code should not live in a CTRL interface function but be proper hlr_* API.

Change-Id: I4c9b8f9ad51d49517474e8b51afc3cc2e1c9299a
---
M src/ctrl.c
M src/db.h
M src/db_hlr.c
M tests/db/db_test.c
4 files changed, 64 insertions(+), 15 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/10/4310/3

diff --git a/src/ctrl.c b/src/ctrl.c
index 74172c4..3bd4d8f 100644
--- a/src/ctrl.c
+++ b/src/ctrl.c
@@ -35,31 +35,19 @@
 
 static int handle_cmd_ps(struct hlr *ctx, struct ctrl_cmd *cmd, bool enable)
 {
-	struct lu_operation *luop = NULL;
-	struct osmo_gsup_conn *co;
+	struct hlr_subscriber subscr;
 
-	if (db_subscr_get_by_imsi(ctx->dbc, cmd->value, NULL) < 0) {
+	if (db_subscr_get_by_imsi(ctx->dbc, cmd->value, &subscr) < 0) {
 		cmd->reply = "Subscriber Unknown in HLR";
 		return CTRL_CMD_ERROR;
 	}
 
-	if (db_subscr_nam(ctx->dbc, cmd->value, enable, true) < 0) {
+	if (hlr_subscr_nam(ctx, &subscr, enable, true) < 0) {
 		cmd->reply = "Error updating DB";
 		return CTRL_CMD_ERROR;
 	}
 
-	/* FIXME: only send to single SGSN where latest update for IMSI came from */
-	if (!enable) {
-		llist_for_each_entry(co, &ctx->gs->clients, list) {
-			luop = lu_op_alloc_conn(co);
-			lu_op_fill_subscr(luop, ctx->dbc, cmd->value);
-			lu_op_tx_del_subscr_data(luop);
-			lu_op_free(luop);
-		}
-	}
-
 	cmd->reply = "OK";
-
 	return CTRL_CMD_REPLY;
 }
 
diff --git a/src/db.h b/src/db.h
index f6aaa58..35e4327 100644
--- a/src/db.h
+++ b/src/db.h
@@ -3,6 +3,8 @@
 #include <stdbool.h>
 #include <sqlite3.h>
 
+struct hlr;
+
 enum stmt_idx {
 	DB_STMT_SEL_BY_IMSI,
 	DB_STMT_SEL_BY_MSISDN,
@@ -125,3 +127,5 @@
 
 int db_subscr_purge(struct db_context *dbc, const char *by_imsi,
 		    bool purge_val, bool is_ps);
+
+int hlr_subscr_nam(struct hlr *hlr, struct hlr_subscriber *subscr, bool nam_val, bool is_ps);
diff --git a/src/db_hlr.c b/src/db_hlr.c
index cf6e4f8..e8db7d2 100644
--- a/src/db_hlr.c
+++ b/src/db_hlr.c
@@ -28,7 +28,10 @@
 #include <sqlite3.h>
 
 #include "logging.h"
+#include "hlr.h"
 #include "db.h"
+#include "gsup_server.h"
+#include "luop.h"
 
 #define LOGHLR(imsi, level, fmt, args ...)	LOGP(DAUC, level, "IMSI='%s': " fmt, imsi, ## args)
 
@@ -609,3 +612,51 @@
 
 	return ret;
 }
+
+/*! Update nam_cs/nam_ps in the db and trigger notifications to GSUP clients.
+ * \param hlr     Global hlr context.
+ * \param subscr  Subscriber from a fresh db_subscr_get_by_*() call.
+ * \param nam_val True to enable CS/PS, false to disable.
+ * \param is_ps   True to enable/disable PS, false for CS.
+ * \returns 0 on success, ENOEXEC if there is no need to change, a negative
+ *          value on error.
+ */
+int hlr_subscr_nam(struct hlr *hlr, struct hlr_subscriber *subscr, bool nam_val, bool is_ps)
+{
+	int rc;
+        struct lu_operation *luop;
+        struct osmo_gsup_conn *co;
+	bool is_val = is_ps? subscr->nam_ps : subscr->nam_cs;
+
+	if (is_val == nam_val) {
+		LOGHLR(subscr->imsi, LOGL_DEBUG, "Already has the requested value when asked to %s %s\n",
+		       nam_val ? "enable" : "disable", is_ps ? "PS" : "CS");
+		return ENOEXEC;
+	}
+
+	rc = db_subscr_nam(hlr->dbc, subscr->imsi, nam_val, is_ps);
+	if (rc)
+		return rc > 0? -rc : rc;
+
+	/* If we're disabling, send a notice out to the GSUP client that is
+	 * responsible. Otherwise no need. */
+	if (nam_val)
+		return 0;
+
+	/* FIXME: only send to single SGSN where latest update for IMSI came from */
+	llist_for_each_entry(co, &hlr->gs->clients, list) {
+		luop = lu_op_alloc_conn(co);
+		if (!luop) {
+			LOGHLR(subscr->imsi, LOGL_ERROR,
+			       "Cannot notify GSUP client, cannot allocate lu_operation,"
+			       " for %s:%u\n",
+			       co && co->conn && co->conn->server? co->conn->server->addr : "unset",
+			       co && co->conn && co->conn->server? co->conn->server->port : 0);
+			continue;
+		}
+		luop->subscr = *subscr;
+		lu_op_tx_del_subscr_data(luop);
+		lu_op_free(luop);
+	}
+	return 0;
+}
diff --git a/tests/db/db_test.c b/tests/db/db_test.c
index 591418b..0a53370 100644
--- a/tests/db/db_test.c
+++ b/tests/db/db_test.c
@@ -837,3 +837,9 @@
 			struct osmo_sub_auth_data *aud3g,
 			const uint8_t *rand_auts, const uint8_t *auts)
 { OSMO_ASSERT(false); return -1; }
+void *lu_op_alloc_conn(void *conn)
+{ OSMO_ASSERT(false); return NULL; }
+void lu_op_tx_del_subscr_data(void *luop)
+{ OSMO_ASSERT(false); }
+void lu_op_free(void *luop)
+{ OSMO_ASSERT(false); }

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I4c9b8f9ad51d49517474e8b51afc3cc2e1c9299a
Gerrit-PatchSet: 3
Gerrit-Project: osmo-hlr
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
Gerrit-Reviewer: Jenkins Builder


More information about the gerrit-log mailing list