<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/16764">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">db v6: determine 3G AUC IND from VLR name<br><br>Each VLR requesting auth tuples should use a distinct IND pool for 3G auth. So<br>far we tied the IND to the GSUP peer connection; MSC and SGSN were always<br>distinct GSUP peers, they ended up using distinct INDs.<br><br>However, we have implemented a GSUP proxy, so that, in a distributed setup, a<br>remotely roaming subscriber has only one direct GSUP peer proxying for both<br>remote MSC and SGSN. That means as soon as a subscriber roams to a different<br>site, we would use the GSUP proxy name to determine the IND instead of the<br>separate MSC and SGSN. The site's MSC and SGSN appear as the same client, get<br>the same IND bucket, waste SQNs rapidly and cause auth tuple generation load.<br><br>So instead of using the local client as IND, persistently keep a list of VLR<br>names and assign a different IND to each. Use the gsup_req->source_name as<br>indicator, which reflects the actual remote VLR's name (remote MSC or SGSN).<br><br>Persist the site <-> IND assignments in the database.<br><br>Add an IND test to db_test.c<br><br>There was an earlier patch version that separated the IND pools by cn_domain,<br>but it turned out to add complex semantics, while only solving one aspect of<br>the "adjacent VLR" problem. We need a solution not only for CS vs PS, but also<br>for 2,3G vs 4G, and for sites that are physically adjacent to each other. This<br>patch version does not offer any automatic solution for that -- as soon as more<br>than 2^IND_bitlen (usually 32) VLRs show up, it is the responsibility of the<br>admin to ensure the 'ind' table in the hlr.db does not have unfortunate IND<br>assignments. So far no VTY commands exist for that, they may be added in the<br>future.<br><br>Related: OS#4319<br>Change-Id: I6f0a6bbef3a27507605c3b4a0e1a89bdfd468374<br>---<br>M include/osmocom/hlr/db.h<br>M sql/hlr.sql<br>M src/db.c<br>M src/db_hlr.c<br>M src/gsupclient/gsup_peer_id.c<br>M src/hlr.c<br>M tests/db/db_test.c<br>M tests/db/db_test.err<br>M tests/db_upgrade/db_upgrade_test.ok<br>9 files changed, 296 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/64/16764/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/hlr/db.h b/include/osmocom/hlr/db.h</span><br><span>index 9309b8f..1f1bacb 100644</span><br><span>--- a/include/osmocom/hlr/db.h</span><br><span>+++ b/include/osmocom/hlr/db.h</span><br><span>@@ -4,6 +4,7 @@</span><br><span> #include <sqlite3.h></span><br><span> </span><br><span> #include <osmocom/gsupclient/gsup_peer_id.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsup.h></span><br><span> </span><br><span> struct hlr;</span><br><span> </span><br><span>@@ -33,6 +34,9 @@</span><br><span> DB_STMT_SET_LAST_LU_SEEN_PS,</span><br><span> DB_STMT_EXISTS_BY_IMSI,</span><br><span> DB_STMT_EXISTS_BY_MSISDN,</span><br><span style="color: hsl(120, 100%, 40%);">+ DB_STMT_IND_ADD,</span><br><span style="color: hsl(120, 100%, 40%);">+ DB_STMT_IND_SELECT,</span><br><span style="color: hsl(120, 100%, 40%);">+ DB_STMT_IND_DEL,</span><br><span> _NUM_DB_STMT</span><br><span> };</span><br><span> </span><br><span>@@ -163,6 +167,9 @@</span><br><span> int db_subscr_purge(struct db_context *dbc, const char *by_imsi,</span><br><span> bool purge_val, bool is_ps);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int db_ind(struct db_context *dbc, const struct osmo_gsup_peer_id *vlr, unsigned int *ind);</span><br><span style="color: hsl(120, 100%, 40%);">+int db_ind_del(struct db_context *dbc, const struct osmo_gsup_peer_id *vlr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Call sqlite3_column_text() and copy result to a char[].</span><br><span> * \param[out] buf A char[] used as sizeof() arg(!) and osmo_strlcpy() target.</span><br><span> * \param[in] stmt An sqlite3_stmt*.</span><br><span>diff --git a/sql/hlr.sql b/sql/hlr.sql</span><br><span>index 98e586d..e855a6c 100644</span><br><span>--- a/sql/hlr.sql</span><br><span>+++ b/sql/hlr.sql</span><br><span>@@ -79,8 +79,16 @@</span><br><span> ind_bitlen INTEGER NOT NULL DEFAULT 5</span><br><span> );</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE ind (</span><br><span style="color: hsl(120, 100%, 40%);">+ -- 3G auth IND pool to be used for this VLR</span><br><span style="color: hsl(120, 100%, 40%);">+ ind INTEGER PRIMARY KEY,</span><br><span style="color: hsl(120, 100%, 40%);">+ -- VLR identification, usually the GSUP source_name</span><br><span style="color: hsl(120, 100%, 40%);">+ vlr TEXT NOT NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+ UNIQUE (vlr)</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> CREATE UNIQUE INDEX idx_subscr_imsi ON subscriber (imsi);</span><br><span> </span><br><span> -- Set HLR database schema version number</span><br><span> -- Note: This constant is currently duplicated in src/db.c and must be kept in sync!</span><br><span style="color: hsl(0, 100%, 40%);">-PRAGMA user_version = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+PRAGMA user_version = 6;</span><br><span>diff --git a/src/db.c b/src/db.c</span><br><span>index 3cbd9c9..c265ffa 100644</span><br><span>--- a/src/db.c</span><br><span>+++ b/src/db.c</span><br><span>@@ -30,7 +30,7 @@</span><br><span> #include "db_bootstrap.h"</span><br><span> </span><br><span> /* This constant is currently duplicated in sql/hlr.sql and must be kept in sync! */</span><br><span style="color: hsl(0, 100%, 40%);">-#define CURRENT_SCHEMA_VERSION 5</span><br><span style="color: hsl(120, 100%, 40%);">+#define CURRENT_SCHEMA_VERSION 6</span><br><span> </span><br><span> #define SEL_COLUMNS \</span><br><span> "id," \</span><br><span>@@ -87,6 +87,9 @@</span><br><span> [DB_STMT_SET_LAST_LU_SEEN_PS] = "UPDATE subscriber SET last_lu_seen_ps = datetime($val, 'unixepoch') WHERE id = $subscriber_id",</span><br><span> [DB_STMT_EXISTS_BY_IMSI] = "SELECT 1 FROM subscriber WHERE imsi = $imsi",</span><br><span> [DB_STMT_EXISTS_BY_MSISDN] = "SELECT 1 FROM subscriber WHERE msisdn = $msisdn",</span><br><span style="color: hsl(120, 100%, 40%);">+ [DB_STMT_IND_ADD] = "INSERT INTO ind (vlr) VALUES ($vlr)",</span><br><span style="color: hsl(120, 100%, 40%);">+ [DB_STMT_IND_SELECT] = "SELECT ind FROM ind WHERE vlr = $vlr",</span><br><span style="color: hsl(120, 100%, 40%);">+ [DB_STMT_IND_DEL] = "DELETE FROM ind WHERE vlr = $vlr",</span><br><span> };</span><br><span> </span><br><span> static void sql3_error_log_cb(void *arg, int err_code, const char *msg)</span><br><span>@@ -481,6 +484,29 @@</span><br><span> return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int db_upgrade_v6(struct db_context *dbc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *statements[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ "CREATE TABLE ind (\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " -- 3G auth IND pool to be used for this VLR\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " ind INTEGER PRIMARY KEY,\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " -- VLR identification, usually the GSUP source_name\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " vlr TEXT NOT NULL,\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ " UNIQUE (vlr)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ ")"</span><br><span style="color: hsl(120, 100%, 40%);">+ ,</span><br><span style="color: hsl(120, 100%, 40%);">+ "PRAGMA user_version = 6",</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = db_run_statements(dbc, statements, ARRAY_SIZE(statements));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc != SQLITE_DONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_ERROR, "Unable to update HLR database schema to version 6\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> typedef int (*db_upgrade_func_t)(struct db_context *dbc);</span><br><span> static db_upgrade_func_t db_upgrade_path[] = {</span><br><span> db_upgrade_v1,</span><br><span>@@ -488,6 +514,7 @@</span><br><span> db_upgrade_v3,</span><br><span> db_upgrade_v4,</span><br><span> db_upgrade_v5,</span><br><span style="color: hsl(120, 100%, 40%);">+ db_upgrade_v6,</span><br><span> };</span><br><span> </span><br><span> static int db_get_user_version(struct db_context *dbc)</span><br><span>diff --git a/src/db_hlr.c b/src/db_hlr.c</span><br><span>index 030a6a7..b13763a 100644</span><br><span>--- a/src/db_hlr.c</span><br><span>+++ b/src/db_hlr.c</span><br><span>@@ -884,3 +884,106 @@</span><br><span> </span><br><span> return ret;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int _db_ind_run(struct db_context *dbc, sqlite3_stmt *stmt, const char *vlr, bool reset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!db_bind_text(stmt, "$vlr", vlr))</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* execute the statement */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = sqlite3_step(stmt);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (reset)</span><br><span style="color: hsl(120, 100%, 40%);">+ db_remove_reset(stmt);</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int _db_ind_add(struct db_context *dbc, const char *vlr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ sqlite3_stmt *stmt = dbc->stmt[DB_STMT_IND_ADD];</span><br><span style="color: hsl(120, 100%, 40%);">+ if (_db_ind_run(dbc, stmt, vlr, true) != SQLITE_DONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_ERROR, "Cannot create IND entry for %s\n", osmo_quote_str_c(OTC_SELECT, vlr, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int _db_ind_del(struct db_context *dbc, const char *vlr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ sqlite3_stmt *stmt = dbc->stmt[DB_STMT_IND_DEL];</span><br><span style="color: hsl(120, 100%, 40%);">+ _db_ind_run(dbc, stmt, vlr, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We don't really care about the result. If it didn't exist, then that was the goal anyway. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int _db_ind_get(struct db_context *dbc, const char *vlr, unsigned int *ind)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ sqlite3_stmt *stmt = dbc->stmt[DB_STMT_IND_SELECT];</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = _db_ind_run(dbc, stmt, vlr, false);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc == SQLITE_DONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Does not exist yet */</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = -ENOENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ goto out;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (rc != SQLITE_ROW) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_ERROR, "Error executing SQL: %d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+ goto out;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ *ind = sqlite3_column_int64(stmt, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+out:</span><br><span style="color: hsl(120, 100%, 40%);">+ db_remove_reset(stmt);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int _db_ind(struct db_context *dbc, const struct osmo_gsup_peer_id *vlr,</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int *ind, bool del)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *vlr_name = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (vlr->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case OSMO_GSUP_PEER_ID_IPA_NAME:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vlr->ipa_name.len < 2 || vlr->ipa_name.val[vlr->ipa_name.len - 1] != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_ERROR, "Expecting VLR ipa_name to be zero terminated; found %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_ipa_name_to_str(&vlr->ipa_name));</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ vlr_name = (const char*)vlr->ipa_name.val;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_ERROR, "Unsupported osmo_gsup_peer_id type: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gsup_peer_id_type_name(vlr->type));</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (del)</span><br><span style="color: hsl(120, 100%, 40%);">+ return _db_ind_del(dbc, vlr_name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = _db_ind_get(dbc, vlr_name, ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!rc)</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Does not exist yet, create. */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = _db_ind_add(dbc, vlr_name);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_ERROR, "Error creating IND entry for %s\n", osmo_quote_str_c(OTC_SELECT, vlr_name, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* To be sure, query again from scratch. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return _db_ind_get(dbc, vlr_name, ind);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int db_ind(struct db_context *dbc, const struct osmo_gsup_peer_id *vlr, unsigned int *ind)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return _db_ind(dbc, vlr, ind, false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int db_ind_del(struct db_context *dbc, const struct osmo_gsup_peer_id *vlr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return _db_ind(dbc, vlr, NULL, true);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/gsupclient/gsup_peer_id.c b/src/gsupclient/gsup_peer_id.c</span><br><span>index 9ac3af9..0a7bd73 100644</span><br><span>--- a/src/gsupclient/gsup_peer_id.c</span><br><span>+++ b/src/gsupclient/gsup_peer_id.c</span><br><span>@@ -132,8 +132,11 @@</span><br><span> va_list ap;</span><br><span> int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ *gsup_peer_id = (struct osmo_gsup_peer_id){};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> switch (type) {</span><br><span> case OSMO_GSUP_PEER_ID_IPA_NAME:</span><br><span style="color: hsl(120, 100%, 40%);">+ gsup_peer_id->type = OSMO_GSUP_PEER_ID_IPA_NAME;</span><br><span> va_start(ap, str_fmt);</span><br><span> rc = osmo_ipa_name_set_str_va(&gsup_peer_id->ipa_name, str_fmt, ap);</span><br><span> va_end(ap);</span><br><span>diff --git a/src/hlr.c b/src/hlr.c</span><br><span>index 79b50c2..215c0e8 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -280,12 +280,13 @@</span><br><span> ***********************************************************************/</span><br><span> </span><br><span> /* process an incoming SAI request */</span><br><span style="color: hsl(0, 100%, 40%);">-static int rx_send_auth_info(unsigned int auc_3g_ind, struct osmo_gsup_req *req)</span><br><span style="color: hsl(120, 100%, 40%);">+static int rx_send_auth_info(struct osmo_gsup_req *req)</span><br><span> {</span><br><span> struct osmo_gsup_message gsup_out = {</span><br><span> .message_type = OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT,</span><br><span> };</span><br><span> bool separation_bit = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int auc_3g_ind;</span><br><span> int rc;</span><br><span> </span><br><span> subscr_create_on_demand(req->gsup.imsi);</span><br><span>@@ -293,6 +294,15 @@</span><br><span> if (req->gsup.current_rat_type == OSMO_RAT_EUTRAN_SGS)</span><br><span> separation_bit = true;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rc = db_ind(g_hlr->dbc, &req->source_name, &auc_3g_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_GSUP_REQ(req, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Unable to determine 3G auth IND for source %s (rc=%d),"</span><br><span style="color: hsl(120, 100%, 40%);">+ " generating tuples with IND = 0\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_gsup_peer_id_to_str(&req->source_name), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ auc_3g_ind = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> rc = db_get_auc(g_hlr->dbc, req->gsup.imsi, auc_3g_ind,</span><br><span> gsup_out.auth_vectors,</span><br><span> ARRAY_SIZE(gsup_out.auth_vectors),</span><br><span>@@ -511,7 +521,7 @@</span><br><span> switch (req->gsup.message_type) {</span><br><span> /* requests sent to us */</span><br><span> case OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST:</span><br><span style="color: hsl(0, 100%, 40%);">- rx_send_auth_info(conn->auc_3g_ind, req);</span><br><span style="color: hsl(120, 100%, 40%);">+ rx_send_auth_info(req);</span><br><span> break;</span><br><span> case OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST:</span><br><span> rx_upd_loc_req(conn, req);</span><br><span>diff --git a/tests/db/db_test.c b/tests/db/db_test.c</span><br><span>index 4a0f3e8..bbc728e 100644</span><br><span>--- a/tests/db/db_test.c</span><br><span>+++ b/tests/db/db_test.c</span><br><span>@@ -918,6 +918,50 @@</span><br><span> comment_end();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void test_ind()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ comment_start();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define ASSERT_IND(VLR, IND) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int ind; \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_gsup_peer_id vlr; \</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(!osmo_gsup_peer_id_set_str(&vlr, OSMO_GSUP_PEER_ID_IPA_NAME, VLR)); \</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_RC(db_ind(dbc, &vlr, &ind), 0); \</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "%s ind = %u\n\n", osmo_quote_str((char*)vlr.ipa_name.val, vlr.ipa_name.len), ind); \</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ind != (IND)) \</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, " ERROR: expected " #IND "\n"); \</span><br><span style="color: hsl(120, 100%, 40%);">+ } while (0)</span><br><span style="color: hsl(120, 100%, 40%);">+#define IND_DEL(VLR) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_gsup_peer_id vlr; \</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(!osmo_gsup_peer_id_set_str(&vlr, OSMO_GSUP_PEER_ID_IPA_NAME, VLR)); \</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_RC(db_ind_del(dbc, &vlr), 0); \</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "%s ind deleted\n\n", osmo_quote_str((char*)vlr.ipa_name.val, vlr.ipa_name.len)); \</span><br><span style="color: hsl(120, 100%, 40%);">+ } while (0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-23", 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-11", 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-42", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-22", 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-0x17", 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-0xaa", 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-42", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-22", 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-0x17", 5);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-0xaa", 6);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-0xbb", 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-0x2a", 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-42", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-22", 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-23", 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("sgsn-11", 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ IND_DEL("msc-0x17"); /* dropped IND == 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("msc-0x2a", 8); /* known CS remains where it is */</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT_IND("any-unknown", 9); /* new VLR takes a new IND from the end */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ comment_end();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static struct {</span><br><span> bool verbose;</span><br><span> } cmdline_opts = {</span><br><span>@@ -998,6 +1042,7 @@</span><br><span> test_subscr_aud();</span><br><span> test_subscr_aud_invalid_len();</span><br><span> test_subscr_sqn();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_ind();</span><br><span> </span><br><span> printf("Done\n");</span><br><span> db_close(dbc);</span><br><span>diff --git a/tests/db/db_test.err b/tests/db/db_test.err</span><br><span>index 871e722..ddf6d00 100644</span><br><span>--- a/tests/db/db_test.err</span><br><span>+++ b/tests/db/db_test.err</span><br><span>@@ -1613,3 +1613,83 @@</span><br><span> </span><br><span> ===== test_subscr_sqn: SUCCESS</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_ind</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-23\0" ind = 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-11\0" ind = 2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-42\0" ind = 3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-22\0" ind = 4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-0x17\0" ind = 5</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-0xaa\0" ind = 6</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-42\0" ind = 3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-22\0" ind = 4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-0x17\0" ind = 5</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-0xaa\0" ind = 6</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-0xbb\0" ind = 7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-0x2a\0" ind = 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-42\0" ind = 3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-22\0" ind = 4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-23\0" ind = 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"sgsn-11\0" ind = 2</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind_del(dbc, &vlr) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-0x17\0" ind deleted</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"msc-0x2a\0" ind = 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_ind(dbc, &vlr, &ind) --> 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+"any-unknown\0" ind = 9</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_ind: SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/db_upgrade/db_upgrade_test.ok b/tests/db_upgrade/db_upgrade_test.ok</span><br><span>index 2bc6a39..0a45f7c 100644</span><br><span>--- a/tests/db_upgrade/db_upgrade_test.ok</span><br><span>+++ b/tests/db_upgrade/db_upgrade_test.ok</span><br><span>@@ -85,6 +85,7 @@</span><br><span> DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 3</span><br><span> DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 4</span><br><span> DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 5</span><br><span style="color: hsl(120, 100%, 40%);">+DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 6</span><br><span> DMAIN Cmdline option --db-check: Database was opened successfully, quitting.</span><br><span> </span><br><span> Resulting db:</span><br><span>@@ -117,6 +118,13 @@</span><br><span> 5|5|44444444444444444444444444444444|44444444444444444444444444444444||0|5</span><br><span> 5|5|55555555555555555555555555555555||55555555555555555555555555555555|0|6</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+Table: ind</span><br><span style="color: hsl(120, 100%, 40%);">+name|type|notnull|dflt_value|pk</span><br><span style="color: hsl(120, 100%, 40%);">+ind|INTEGER|0||1</span><br><span style="color: hsl(120, 100%, 40%);">+vlr|TEXT|1||0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Table ind contents:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> Table: subscriber</span><br><span> name|type|notnull|dflt_value|pk</span><br><span> ggsn_number|VARCHAR(15)|0||0</span><br><span>@@ -171,5 +179,5 @@</span><br><span> rc = 0</span><br><span> DMAIN hlr starting</span><br><span> DDB using database: <PATH>test.db</span><br><span style="color: hsl(0, 100%, 40%);">-DDB Database <PATH>test.db' has HLR DB schema version 5</span><br><span style="color: hsl(120, 100%, 40%);">+DDB Database <PATH>test.db' has HLR DB schema version 6</span><br><span> DMAIN Cmdline option --db-check: Database was opened successfully, quitting.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hlr/+/16764">change 16764</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-hlr/+/16764"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6f0a6bbef3a27507605c3b4a0e1a89bdfd468374 </div>
<div style="display:none"> Gerrit-Change-Number: 16764 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>