diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2017-10-17 01:43:48 +0200 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-10-17 02:28:43 +0000 |
commit | 00b1d43435dff75a4189de1db66be18b3234b552 (patch) | |
tree | 896dc5b1aaa298819ca697e9ab76e714f555e57d /src/db_hlr.c | |
parent | 7ae8d878cfb6b79218e859cde2521a3db03e3555 (diff) |
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
Diffstat (limited to 'src/db_hlr.c')
-rw-r--r-- | src/db_hlr.c | 51 |
1 files changed, 51 insertions, 0 deletions
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 @@ out: 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; +} |