aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hlr.c32
-rw-r--r--src/hlr.h4
-rw-r--r--src/hlr_vty_subscr.c4
3 files changed, 40 insertions, 0 deletions
diff --git a/src/hlr.c b/src/hlr.c
index 838b1bc..4fbc268 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -46,6 +46,38 @@
static struct hlr *g_hlr;
+/* Trigger 'Insert Subscriber Data' messages to all connected GSUP clients.
+ *
+ * FIXME: In order to support large-scale networks this function should skip
+ * VLRs/SGSNs which do not currently serve the subscriber.
+ *
+ * \param[in] subscr A subscriber we have new data to send for.
+ */
+void
+osmo_hlr_subscriber_update_notify(struct hlr_subscriber *subscr)
+{
+ struct osmo_gsup_conn *co;
+
+ if (g_hlr->gs == NULL)
+ return;
+
+ llist_for_each_entry(co, &g_hlr->gs->clients, list) {
+ struct lu_operation *luop = lu_op_alloc_conn(co);
+ if (!luop) {
+ LOGP(DMAIN, LOGL_ERROR,
+ "IMSI='%s': Cannot notify GSUP client, cannot allocate lu_operation,"
+ " for %s:%u\n", subscr->imsi,
+ 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;
+ luop->state = LU_S_LU_RECEIVED; /* Pretend we received a location update. */
+ lu_op_tx_insert_subscr_data(luop);
+ lu_op_free(luop);
+ }
+}
+
/***********************************************************************
* Send Auth Info handling
***********************************************************************/
diff --git a/src/hlr.h b/src/hlr.h
index f63bc2b..368a052 100644
--- a/src/hlr.h
+++ b/src/hlr.h
@@ -38,3 +38,7 @@ struct hlr {
/* Local bind addr */
char *gsup_bind_addr;
};
+
+struct hlr_subscriber;
+
+void osmo_hlr_subscriber_update_notify(struct hlr_subscriber *subscr);
diff --git a/src/hlr_vty_subscr.c b/src/hlr_vty_subscr.c
index 7191a1c..4092a8f 100644
--- a/src/hlr_vty_subscr.c
+++ b/src/hlr_vty_subscr.c
@@ -257,6 +257,10 @@ DEFUN(subscriber_msisdn,
vty_out(vty, "%% Updated subscriber IMSI='%s' to MSISDN='%s'%s",
subscr.imsi, msisdn, VTY_NEWLINE);
+
+ if (db_subscr_get_by_msisdn(g_hlr->dbc, msisdn, &subscr) == 0)
+ osmo_hlr_subscriber_update_notify(&subscr);
+
return CMD_SUCCESS;
}