<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/16764">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  daniel: Looks good to me, but someone else must approve
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><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<br>auth.  So far we tied the IND to the GSUP peer connection; MSC and SGSN<br>were always distinct GSUP peers, they ended up using distinct INDs.<br><br>However, we have implemented a GSUP proxy, so that, in a distributed<br>setup, a remotely roaming subscriber has only one direct GSUP peer<br>proxying for both remote MSC and SGSN. That means as soon as a<br>subscriber roams to a different site, we would use the GSUP proxy name<br>to determine the IND instead of the separate MSC and SGSN. The site's<br>MSC and SGSN appear as the same client, get the same IND bucket, waste<br>SQNs rapidly and cause auth tuple generation load.<br><br>So instead of using the local client as IND, persistently keep a list of<br>VLR names and assign a different IND to each. Use the<br>gsup_req->source_name as indicator, which reflects the actual remote<br>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<br>cn_domain, but it turned out to add complex semantics, while only<br>solving one aspect of the "adjacent VLR" problem. We need a solution not<br>only for CS vs PS, but also for 2,3G vs 4G, and for sites that are<br>physically adjacent to each other. This patch version does not offer any<br>automatic solution for that -- as soon as more than 2^IND_bitlen<br>(usually 32) VLRs show up, it is the responsibility of the admin to<br>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<br>the future.<br><br>Related: OS#4319<br>Change-Id: I6f0a6bbef3a27507605c3b4a0e1a89bdfd468374<br>---<br>M configure.ac<br>M include/osmocom/hlr/db.h<br>M include/osmocom/hlr/gsup_server.h<br>M sql/hlr.sql<br>M src/db.c<br>M src/db_hlr.c<br>M src/gsup_server.c<br>M src/hlr.c<br>M src/hlr_vty.c<br>M tests/Makefile.am<br>M tests/db/db_test.c<br>M tests/db/db_test.err<br>M tests/db_upgrade/db_upgrade_test.ok<br>D tests/gsup_server/Makefile.am<br>D tests/gsup_server/gsup_server_test.c<br>D tests/gsup_server/gsup_server_test.err<br>D tests/gsup_server/gsup_server_test.ok<br>M tests/testsuite.at<br>18 files changed, 296 insertions(+), 341 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index c496409..d1c14a0 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -206,7 +206,6 @@</span><br><span>       tests/Makefile</span><br><span>       tests/auc/Makefile</span><br><span>   tests/auc/gen_ts_55_205_test_sets/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">-      tests/gsup_server/Makefile</span><br><span>   tests/gsup/Makefile</span><br><span>  tests/db/Makefile</span><br><span>    tests/db_upgrade/Makefile</span><br><span>diff --git a/include/osmocom/hlr/db.h b/include/osmocom/hlr/db.h</span><br><span>index a771409..c43aa4f 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/cni_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>@@ -40,6 +41,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>@@ -173,6 +177,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_cni_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_cni_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/include/osmocom/hlr/gsup_server.h b/include/osmocom/hlr/gsup_server.h</span><br><span>index ce7556e..9c562e2 100644</span><br><span>--- a/include/osmocom/hlr/gsup_server.h</span><br><span>+++ b/include/osmocom/hlr/gsup_server.h</span><br><span>@@ -42,8 +42,6 @@</span><br><span>      //struct oap_state oap_state;</span><br><span>        struct tlv_parsed ccm;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int auc_3g_ind; /*!< IND index used for UMTS AKA SQN */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  /* Set when Location Update is received: */</span><br><span>  bool supports_cs; /* client supports OSMO_GSUP_CN_DOMAIN_CS */</span><br><span>       bool supports_ps; /* client supports OSMO_GSUP_CN_DOMAIN_PS */</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 4fd2654..23dcbbc 100644</span><br><span>--- a/src/db.c</span><br><span>+++ b/src/db.c</span><br><span>@@ -28,7 +28,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>@@ -93,6 +93,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>@@ -487,6 +490,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>@@ -494,6 +520,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 e88b5fc..591908f 100644</span><br><span>--- a/src/db_hlr.c</span><br><span>+++ b/src/db_hlr.c</span><br><span>@@ -972,3 +972,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_cni_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_CNI_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_cni_peer_id type: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_cni_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_cni_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_cni_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/gsup_server.c b/src/gsup_server.c</span><br><span>index 756473a..f0d8101 100644</span><br><span>--- a/src/gsup_server.c</span><br><span>+++ b/src/gsup_server.c</span><br><span>@@ -317,43 +317,6 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Add conn to the clients list in a way that conn->auc_3g_ind takes the lowest</span><br><span style="color: hsl(0, 100%, 40%);">- * unused integer and the list of clients remains sorted by auc_3g_ind.</span><br><span style="color: hsl(0, 100%, 40%);">- * Keep this function non-static to allow linking in a unit test. */</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsup_server_add_conn(struct llist_head *clients,</span><br><span style="color: hsl(0, 100%, 40%);">-                              struct osmo_gsup_conn *conn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_gsup_conn *c;</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_gsup_conn *prev_conn;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       c = llist_first_entry_or_null(clients, struct osmo_gsup_conn, list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Is the first index, 0, unused? */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!c || c->auc_3g_ind > 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-            conn->auc_3g_ind = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                llist_add(&conn->list, clients);</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Look for a gap later on */</span><br><span style="color: hsl(0, 100%, 40%);">-   prev_conn = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry(c, clients, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* skip first item, we know it has auc_3g_ind == 0. */</span><br><span style="color: hsl(0, 100%, 40%);">-          if (!prev_conn) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       prev_conn = c;</span><br><span style="color: hsl(0, 100%, 40%);">-                  continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (c->auc_3g_ind > prev_conn->auc_3g_ind + 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                 break;</span><br><span style="color: hsl(0, 100%, 40%);">-          prev_conn = c;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(prev_conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- conn->auc_3g_ind = prev_conn->auc_3g_ind + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-     llist_add(&conn->list, &prev_conn->list);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void update_fd_settings(int fd)</span><br><span> {</span><br><span>      int ret;</span><br><span>@@ -386,10 +349,9 @@</span><br><span> </span><br><span>  /* link data structure with server structure */</span><br><span>      conn->server = gsups;</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_gsup_server_add_conn(&gsups->clients, conn);</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_add_tail(&conn->list, &gsups->clients);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLGSUP, LOGL_INFO, "New GSUP client %s:%d (IND=%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-        conn->conn->addr, conn->conn->port, conn->auc_3g_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DLGSUP, LOGL_INFO, "New GSUP client %s:%d\n", conn->conn->addr, conn->conn->port);</span><br><span> </span><br><span>    update_fd_settings(fd);</span><br><span> </span><br><span>diff --git a/src/hlr.c b/src/hlr.c</span><br><span>index 45d0b90..294da23 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -281,13 +281,14 @@</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>         int num_auth_vectors = OSMO_GSUP_MAX_NUM_AUTH_INFO;</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>@@ -298,6 +299,14 @@</span><br><span>   if (req->gsup.num_auth_vectors > 0 &&</span><br><span>                  req->gsup.num_auth_vectors <= OSMO_GSUP_MAX_NUM_AUTH_INFO)</span><br><span>             num_auth_vectors = req->gsup.num_auth_vectors;</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_cni_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> </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>@@ -517,7 +526,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/src/hlr_vty.c b/src/hlr_vty.c</span><br><span>index df2270b..2fd4783 100644</span><br><span>--- a/src/hlr_vty.c</span><br><span>+++ b/src/hlr_vty.c</span><br><span>@@ -116,8 +116,8 @@</span><br><span>    rc = osmo_gsup_conn_ccm_get(conn, (uint8_t **) &name, IPAC_IDTAG_SERNR);</span><br><span>         OSMO_ASSERT(rc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    vty_out(vty, " '%s' from %s:%5u, CS=%u, PS=%u, 3G_IND=%u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-          name, isc->addr, isc->port, conn->supports_cs, conn->supports_ps, conn->auc_3g_ind,</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, " '%s' from %s:%5u, CS=%u, PS=%u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+           name, isc->addr, isc->port, conn->supports_cs, conn->supports_ps,</span><br><span>                VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 9015494..9270efa 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -1,6 +1,5 @@</span><br><span> SUBDIRS = \</span><br><span>     auc \</span><br><span style="color: hsl(0, 100%, 40%);">-   gsup_server \</span><br><span>        db \</span><br><span>         gsup \</span><br><span>       db_upgrade \</span><br><span>diff --git a/tests/db/db_test.c b/tests/db/db_test.c</span><br><span>index 0c68238..00434cf 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_cni_peer_id vlr; \</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(!osmo_cni_peer_id_set_str(&vlr, OSMO_CNI_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_cni_peer_id vlr; \</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(!osmo_cni_peer_id_set_str(&vlr, OSMO_CNI_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>@@ -1002,6 +1046,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>diff --git a/tests/gsup_server/Makefile.am b/tests/gsup_server/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index 34acd30..0000000</span><br><span>--- a/tests/gsup_server/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,44 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CPPFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(all_includes) \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-    -Wall \</span><br><span style="color: hsl(0, 100%, 40%);">- -ggdb3 \</span><br><span style="color: hsl(0, 100%, 40%);">-        -I$(top_srcdir)/include \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AM_LDFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">-   -no-install \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-EXTRA_DIST = \</span><br><span style="color: hsl(0, 100%, 40%);">-   gsup_server_test.ok \</span><br><span style="color: hsl(0, 100%, 40%);">-   gsup_server_test.err \</span><br><span style="color: hsl(0, 100%, 40%);">-  $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_PROGRAMS = \</span><br><span style="color: hsl(0, 100%, 40%);">-      gsup_server_test \</span><br><span style="color: hsl(0, 100%, 40%);">-      $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-gsup_server_test_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">-     gsup_server_test.c \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-gsup_server_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(top_srcdir)/src/gsup_server.c \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(top_srcdir)/src/gsup_router.c \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(top_srcdir)/src/gsup_send.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_srcdir)/src/gsupclient/cni_peer_id.c \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(top_srcdir)/src/gsupclient/gsup_req.c \</span><br><span style="color: hsl(0, 100%, 40%);">-       $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-    $(LIBOSMOABIS_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">-   $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-.PHONY: update_exp</span><br><span style="color: hsl(0, 100%, 40%);">-update_exp:</span><br><span style="color: hsl(0, 100%, 40%);">-    $(builddir)/gsup_server_test >"$(srcdir)/gsup_server_test.ok" 2>"$(srcdir)/gsup_server_test.err"</span><br><span>diff --git a/tests/gsup_server/gsup_server_test.c b/tests/gsup_server/gsup_server_test.c</span><br><span>deleted file mode 100644</span><br><span>index 4aec69b..0000000</span><br><span>--- a/tests/gsup_server/gsup_server_test.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,145 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2017 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Author: Neels Hofmeyr <nhofmeyr@sysmocom.de></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdio.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/hlr/gsup_server.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define comment_start() printf("\n===== %s\n", __func__)</span><br><span style="color: hsl(0, 100%, 40%);">-#define comment_end() printf("===== %s: SUCCESS\n\n", __func__)</span><br><span style="color: hsl(0, 100%, 40%);">-#define btw(fmt, args...) printf("\n" fmt "\n", ## args)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define VERBOSE_ASSERT(val, expect_op, fmt) \</span><br><span style="color: hsl(0, 100%, 40%);">-   do { \</span><br><span style="color: hsl(0, 100%, 40%);">-          printf(#val " == " fmt "\n", (val)); \</span><br><span style="color: hsl(0, 100%, 40%);">-              OSMO_ASSERT((val) expect_op); \</span><br><span style="color: hsl(0, 100%, 40%);">- } while (0)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void osmo_gsup_server_add_conn(struct llist_head *clients,</span><br><span style="color: hsl(0, 100%, 40%);">-                          struct osmo_gsup_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void test_add_conn(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct llist_head _list;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct llist_head *clients = &_list;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_gsup_conn conn_inst[23] = {};</span><br><span style="color: hsl(0, 100%, 40%);">-       struct osmo_gsup_conn *conn;</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- comment_start();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        INIT_LLIST_HEAD(clients);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("Add 10 items");</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i = 0; i < 10; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_gsup_server_add_conn(clients, &conn_inst[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-          printf("conn_inst[%u].auc_3g_ind == %u\n", i, conn_inst[i].auc_3g_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_ASSERT(clients->next == &conn_inst[0].list);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("Expecting a list of 0..9");</span><br><span style="color: hsl(0, 100%, 40%);">-      i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry(conn, clients, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("conn[%u].auc_3g_ind == %u\n", i, conn->auc_3g_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(conn->auc_3g_ind == i);</span><br><span style="color: hsl(0, 100%, 40%);">-          OSMO_ASSERT(conn == &conn_inst[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-         i++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("Punch two holes in the sequence in arbitrary order,"</span><br><span style="color: hsl(0, 100%, 40%);">-         " a larger one from 2..4 and a single one at 7.");</span><br><span style="color: hsl(0, 100%, 40%);">-        llist_del(&conn_inst[4].list);</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_del(&conn_inst[2].list);</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_del(&conn_inst[3].list);</span><br><span style="color: hsl(0, 100%, 40%);">-      llist_del(&conn_inst[7].list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      btw("Expecting a list of 0,1, 5,6, 8,9");</span><br><span style="color: hsl(0, 100%, 40%);">-     i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry(conn, clients, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("conn[%u].auc_3g_ind == %u\n", i, conn->auc_3g_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-                i++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("Add conns, expecting them to take the open slots");</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_gsup_server_add_conn(clients, &conn_inst[12]);</span><br><span style="color: hsl(0, 100%, 40%);">- VERBOSE_ASSERT(conn_inst[12].auc_3g_ind, == 2, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_gsup_server_add_conn(clients, &conn_inst[13]);</span><br><span style="color: hsl(0, 100%, 40%);">- VERBOSE_ASSERT(conn_inst[13].auc_3g_ind, == 3, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_gsup_server_add_conn(clients, &conn_inst[14]);</span><br><span style="color: hsl(0, 100%, 40%);">- VERBOSE_ASSERT(conn_inst[14].auc_3g_ind, == 4, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_gsup_server_add_conn(clients, &conn_inst[17]);</span><br><span style="color: hsl(0, 100%, 40%);">- VERBOSE_ASSERT(conn_inst[17].auc_3g_ind, == 7, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_gsup_server_add_conn(clients, &conn_inst[18]);</span><br><span style="color: hsl(0, 100%, 40%);">- VERBOSE_ASSERT(conn_inst[18].auc_3g_ind, == 10, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        btw("Expecting a list of 0..10");</span><br><span style="color: hsl(0, 100%, 40%);">-     i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry(conn, clients, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("conn[%u].auc_3g_ind == %u\n", i, conn->auc_3g_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(conn->auc_3g_ind == i);</span><br><span style="color: hsl(0, 100%, 40%);">-          i++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("Does it also work for the first item?");</span><br><span style="color: hsl(0, 100%, 40%);">- llist_del(&conn_inst[0].list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      btw("Expecting a list of 1..10");</span><br><span style="color: hsl(0, 100%, 40%);">-     i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry(conn, clients, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("conn[%u].auc_3g_ind == %u\n", i, conn->auc_3g_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(conn->auc_3g_ind == i + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-              i++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("Add another conn, should take auc_3g_ind == 0");</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_gsup_server_add_conn(clients, &conn_inst[20]);</span><br><span style="color: hsl(0, 100%, 40%);">- VERBOSE_ASSERT(conn_inst[20].auc_3g_ind, == 0, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- btw("Expecting a list of 0..10");</span><br><span style="color: hsl(0, 100%, 40%);">-     i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_for_each_entry(conn, clients, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-             printf("conn[%u].auc_3g_ind == %u\n", i, conn->auc_3g_ind);</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(conn->auc_3g_ind == i);</span><br><span style="color: hsl(0, 100%, 40%);">-          i++;</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       btw("If a client reconnects, it will (likely) get the same auc_3g_ind");</span><br><span style="color: hsl(0, 100%, 40%);">-      VERBOSE_ASSERT(conn_inst[5].auc_3g_ind, == 5, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-  llist_del(&conn_inst[5].list);</span><br><span style="color: hsl(0, 100%, 40%);">-      conn_inst[5].auc_3g_ind = 423;</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_gsup_server_add_conn(clients, &conn_inst[5]);</span><br><span style="color: hsl(0, 100%, 40%);">-  VERBOSE_ASSERT(conn_inst[5].auc_3g_ind, == 5, "%u");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  comment_end();</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int main(int argc, char **argv)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- printf("test_gsup_server.c\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       test_add_conn();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("Done\n");</span><br><span style="color: hsl(0, 100%, 40%);">-     return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/tests/gsup_server/gsup_server_test.err b/tests/gsup_server/gsup_server_test.err</span><br><span>deleted file mode 100644</span><br><span>index e69de29..0000000</span><br><span>--- a/tests/gsup_server/gsup_server_test.err</span><br><span>+++ /dev/null</span><br><span>diff --git a/tests/gsup_server/gsup_server_test.ok b/tests/gsup_server/gsup_server_test.ok</span><br><span>deleted file mode 100644</span><br><span>index 80d944c..0000000</span><br><span>--- a/tests/gsup_server/gsup_server_test.ok</span><br><span>+++ /dev/null</span><br><span>@@ -1,94 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-test_gsup_server.c</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===== test_add_conn</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Add 10 items</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[0].auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[1].auc_3g_ind == 1</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[2].auc_3g_ind == 2</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[3].auc_3g_ind == 3</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[4].auc_3g_ind == 4</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[5].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[6].auc_3g_ind == 6</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[7].auc_3g_ind == 7</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[8].auc_3g_ind == 8</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[9].auc_3g_ind == 9</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Expecting a list of 0..9</span><br><span style="color: hsl(0, 100%, 40%);">-conn[0].auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-conn[1].auc_3g_ind == 1</span><br><span style="color: hsl(0, 100%, 40%);">-conn[2].auc_3g_ind == 2</span><br><span style="color: hsl(0, 100%, 40%);">-conn[3].auc_3g_ind == 3</span><br><span style="color: hsl(0, 100%, 40%);">-conn[4].auc_3g_ind == 4</span><br><span style="color: hsl(0, 100%, 40%);">-conn[5].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn[6].auc_3g_ind == 6</span><br><span style="color: hsl(0, 100%, 40%);">-conn[7].auc_3g_ind == 7</span><br><span style="color: hsl(0, 100%, 40%);">-conn[8].auc_3g_ind == 8</span><br><span style="color: hsl(0, 100%, 40%);">-conn[9].auc_3g_ind == 9</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Punch two holes in the sequence in arbitrary order, a larger one from 2..4 and a single one at 7.</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Expecting a list of 0,1, 5,6, 8,9</span><br><span style="color: hsl(0, 100%, 40%);">-conn[0].auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-conn[1].auc_3g_ind == 1</span><br><span style="color: hsl(0, 100%, 40%);">-conn[2].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn[3].auc_3g_ind == 6</span><br><span style="color: hsl(0, 100%, 40%);">-conn[4].auc_3g_ind == 8</span><br><span style="color: hsl(0, 100%, 40%);">-conn[5].auc_3g_ind == 9</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Add conns, expecting them to take the open slots</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[12].auc_3g_ind == 2</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[13].auc_3g_ind == 3</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[14].auc_3g_ind == 4</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[17].auc_3g_ind == 7</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[18].auc_3g_ind == 10</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Expecting a list of 0..10</span><br><span style="color: hsl(0, 100%, 40%);">-conn[0].auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-conn[1].auc_3g_ind == 1</span><br><span style="color: hsl(0, 100%, 40%);">-conn[2].auc_3g_ind == 2</span><br><span style="color: hsl(0, 100%, 40%);">-conn[3].auc_3g_ind == 3</span><br><span style="color: hsl(0, 100%, 40%);">-conn[4].auc_3g_ind == 4</span><br><span style="color: hsl(0, 100%, 40%);">-conn[5].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn[6].auc_3g_ind == 6</span><br><span style="color: hsl(0, 100%, 40%);">-conn[7].auc_3g_ind == 7</span><br><span style="color: hsl(0, 100%, 40%);">-conn[8].auc_3g_ind == 8</span><br><span style="color: hsl(0, 100%, 40%);">-conn[9].auc_3g_ind == 9</span><br><span style="color: hsl(0, 100%, 40%);">-conn[10].auc_3g_ind == 10</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Does it also work for the first item?</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Expecting a list of 1..10</span><br><span style="color: hsl(0, 100%, 40%);">-conn[0].auc_3g_ind == 1</span><br><span style="color: hsl(0, 100%, 40%);">-conn[1].auc_3g_ind == 2</span><br><span style="color: hsl(0, 100%, 40%);">-conn[2].auc_3g_ind == 3</span><br><span style="color: hsl(0, 100%, 40%);">-conn[3].auc_3g_ind == 4</span><br><span style="color: hsl(0, 100%, 40%);">-conn[4].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn[5].auc_3g_ind == 6</span><br><span style="color: hsl(0, 100%, 40%);">-conn[6].auc_3g_ind == 7</span><br><span style="color: hsl(0, 100%, 40%);">-conn[7].auc_3g_ind == 8</span><br><span style="color: hsl(0, 100%, 40%);">-conn[8].auc_3g_ind == 9</span><br><span style="color: hsl(0, 100%, 40%);">-conn[9].auc_3g_ind == 10</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Add another conn, should take auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[20].auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Expecting a list of 0..10</span><br><span style="color: hsl(0, 100%, 40%);">-conn[0].auc_3g_ind == 0</span><br><span style="color: hsl(0, 100%, 40%);">-conn[1].auc_3g_ind == 1</span><br><span style="color: hsl(0, 100%, 40%);">-conn[2].auc_3g_ind == 2</span><br><span style="color: hsl(0, 100%, 40%);">-conn[3].auc_3g_ind == 3</span><br><span style="color: hsl(0, 100%, 40%);">-conn[4].auc_3g_ind == 4</span><br><span style="color: hsl(0, 100%, 40%);">-conn[5].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn[6].auc_3g_ind == 6</span><br><span style="color: hsl(0, 100%, 40%);">-conn[7].auc_3g_ind == 7</span><br><span style="color: hsl(0, 100%, 40%);">-conn[8].auc_3g_ind == 8</span><br><span style="color: hsl(0, 100%, 40%);">-conn[9].auc_3g_ind == 9</span><br><span style="color: hsl(0, 100%, 40%);">-conn[10].auc_3g_ind == 10</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-If a client reconnects, it will (likely) get the same auc_3g_ind</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[5].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-conn_inst[5].auc_3g_ind == 5</span><br><span style="color: hsl(0, 100%, 40%);">-===== test_add_conn: SUCCESS</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Done</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 956ef87..65f90b4 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -22,13 +22,6 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/gsup/gsup_test], [], [expout], [experr])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-AT_SETUP([gsup_server])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_KEYWORDS([gsup_server])</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/gsup_server/gsup_server_test.ok > expout</span><br><span style="color: hsl(0, 100%, 40%);">-cat $abs_srcdir/gsup_server/gsup_server_test.err > experr</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CHECK([$abs_top_builddir/tests/gsup_server/gsup_server_test], [], [expout], [experr])</span><br><span style="color: hsl(0, 100%, 40%);">-AT_CLEANUP</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> AT_SETUP([db])</span><br><span> AT_KEYWORDS([db])</span><br><span> cat $abs_srcdir/db/db_test.ok > expout</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: 16 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>