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