<p>Stefan Sperling <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9211">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Neels Hofmeyr: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">implement periodic Location Update expiry in the VLR<br><br>Remove subscribers which fail to send periodic Location Updates from the<br>list of subscribers known to the VLR. This complements the IMSI detach<br>procedure: periodic LU expiry triggers an implicit IMSI detach.<br><br>Expired subscribers are purged from a periodic timer which iterates<br>over all subscribers once per minute.<br><br>Subscribers with an active connection do not expire. This is controlled<br>by the subscriber conn FSM which sets a subscriber's the LU expiry timeout<br>value to GSM_SUBSCRIBER_NO_EXPIRATION while a connection is active.<br><br>Add support for fake time with osmo_clock_gettime() to msc_vlr tests.<br><br>This functionality existed in OpenBSC but was lost during the nitb split.<br>This code took some inspiration from the OpenBSC implementation.<br><br>Related: OS#1976<br>Change-Id: Iebdee8b12d22acfcfb265ee41e71cfc8d9eb3ba9<br>---<br>M include/osmocom/msc/gsm_subscriber.h<br>M include/osmocom/msc/vlr.h<br>M src/libmsc/subscr_conn.c<br>M src/libvlr/vlr.c<br>M src/libvlr/vlr_lu_fsm.c<br>M tests/msc_vlr/msc_vlr_test_no_authen.c<br>M tests/msc_vlr/msc_vlr_test_no_authen.err<br>M tests/msc_vlr/msc_vlr_tests.c<br>M tests/msc_vlr/msc_vlr_tests.h<br>9 files changed, 264 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/gsm_subscriber.h b/include/osmocom/msc/gsm_subscriber.h</span><br><span>index 16e1037..01d9c58 100644</span><br><span>--- a/include/osmocom/msc/gsm_subscriber.h</span><br><span>+++ b/include/osmocom/msc/gsm_subscriber.h</span><br><span>@@ -17,8 +17,6 @@</span><br><span> #define GSM_SUBSCRIBER_FIRST_CONTACT    0x00000001</span><br><span> /* gprs_sgsn.h defines additional flags including and above bit 16 (0x10000) */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_SUBSCRIBER_NO_EXPIRATION   0x0</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum gsm_subscriber_field {</span><br><span>   GSM_SUBSCRIBER_IMSI,</span><br><span>         GSM_SUBSCRIBER_TMSI,</span><br><span>diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h</span><br><span>index 0a9ef6f..f12d758 100644</span><br><span>--- a/include/osmocom/msc/vlr.h</span><br><span>+++ b/include/osmocom/msc/vlr.h</span><br><span>@@ -20,6 +20,9 @@</span><br><span> </span><br><span> struct log_target;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define VLR_SUBSCRIBER_NO_EXPIRATION   0</span><br><span style="color: hsl(120, 100%, 40%);">+#define VLR_SUBSCRIBER_LU_EXPIRATION_INTERVAL        60      /* in seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* from 3s to 10s */</span><br><span> #define GSM_29002_TIMER_S 10</span><br><span> /* from 15s to 30s */</span><br><span>@@ -148,6 +151,7 @@</span><br><span>    struct osmo_fsm_inst *proc_arq_fsm;</span><br><span> </span><br><span>      bool lu_complete;</span><br><span style="color: hsl(120, 100%, 40%);">+     time_t expire_lu;</span><br><span> </span><br><span>        void *msc_conn_ref;</span><br><span> </span><br><span>@@ -237,6 +241,7 @@</span><br><span>        struct llist_head operations;</span><br><span>        struct gsup_client *gsup_client;</span><br><span>     struct vlr_ops ops;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_timer_list lu_expire_timer;</span><br><span>      struct {</span><br><span>             bool retrieve_imeisv_early;</span><br><span>          bool retrieve_imeisv_ciphered;</span><br><span>@@ -379,6 +384,7 @@</span><br><span>                                   enum osmo_fsm_term_cause fsm_cause,</span><br><span>                                  uint8_t gsm48_cause);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void vlr_subscr_enable_expire_lu(struct vlr_subscr *vsub);</span><br><span> </span><br><span> /* Process Acccess Request FSM */</span><br><span> </span><br><span>diff --git a/src/libmsc/subscr_conn.c b/src/libmsc/subscr_conn.c</span><br><span>index 1b3b240..c1d0e11 100644</span><br><span>--- a/src/libmsc/subscr_conn.c</span><br><span>+++ b/src/libmsc/subscr_conn.c</span><br><span>@@ -202,6 +202,15 @@</span><br><span> </span><br><span> static void subscr_conn_fsm_accepted_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_subscriber_connection *conn = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Stop Location Update expiry for this subscriber. While the subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+       * has an open connection the LU expiry timer must remain disabled.</span><br><span style="color: hsl(120, 100%, 40%);">+    * Otherwise we would kick the subscriber off the network when the timer</span><br><span style="color: hsl(120, 100%, 40%);">+       * expires e.g. during a long phone call.</span><br><span style="color: hsl(120, 100%, 40%);">+      * The LU expiry timer will restart once the connection is closed. */</span><br><span style="color: hsl(120, 100%, 40%);">+ conn->vsub->expire_lu = VLR_SUBSCRIBER_NO_EXPIRATION;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        if (!subscr_conn_fsm_has_active_transactions(fi))</span><br><span>            osmo_fsm_inst_dispatch(fi, SUBSCR_CONN_E_UNUSED, NULL);</span><br><span> }</span><br><span>@@ -278,6 +287,12 @@</span><br><span>  /* Cancel all VLR FSMs, if any */</span><br><span>    vlr_subscr_cancel_attach_fsm(conn->vsub, OSMO_FSM_TERM_ERROR, GSM48_REJECT_CONGESTION);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        if (conn->vsub) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* The subscriber has no active connection anymore.</span><br><span style="color: hsl(120, 100%, 40%);">+            * Restart the periodic Location Update expiry timer for this subscriber. */</span><br><span style="color: hsl(120, 100%, 40%);">+          vlr_subscr_enable_expire_lu(conn->vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* If we're closing in a middle of a trans, we need to clean up */</span><br><span>       trans_conn_closed(conn);</span><br><span> </span><br><span>diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c</span><br><span>index 2d232be..29098b1 100644</span><br><span>--- a/src/libvlr/vlr.c</span><br><span>+++ b/src/libvlr/vlr.c</span><br><span>@@ -22,6 +22,7 @@</span><br><span> #include <osmocom/core/linuxlist.h></span><br><span> #include <osmocom/core/fsm.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08_gprs.h></span><br><span> #include <osmocom/gsm/gsup.h></span><br><span> #include <osmocom/gsm/apn.h></span><br><span>@@ -460,6 +461,50 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void vlr_subscr_enable_expire_lu(struct vlr_subscr *vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_network *net = vsub->vlr->user_ctx; /* XXX move t3212 into struct vlr_instance? */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct timespec now;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* The T3212 timeout value field is coded as the binary representation of the timeout</span><br><span style="color: hsl(120, 100%, 40%);">+  * value for periodic updating in decihours. Mark the subscriber as inactive if it missed</span><br><span style="color: hsl(120, 100%, 40%);">+      * two consecutive location updates. Timeout is twice the t3212 value plus one minute. */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (osmo_clock_gettime(CLOCK_MONOTONIC, &now) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vsub->expire_lu = now.tv_sec + (net->t3212 * 60 * 6 * 2) + 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DVLR, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "%s: Could not enable Location Update expiry: unable to read current time\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Disable LU expiry for this subscriber. This subscriber will only be freed after an explicit IMSI detach. */</span><br><span style="color: hsl(120, 100%, 40%);">+                vsub->expire_lu = VLR_SUBSCRIBER_NO_EXPIRATION;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void vlr_subscr_expire_lu(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct vlr_instance *vlr = data;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct vlr_subscr *vsub, *vsub_tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct timespec now;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (llist_empty(&vlr->subscribers))</span><br><span style="color: hsl(120, 100%, 40%);">+            goto done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (osmo_clock_gettime(CLOCK_MONOTONIC, &now) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DVLR, LOGL_ERROR, "Skipping Location Update expiry: Could not read current time\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           goto done;</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%);">+   llist_for_each_entry_safe(vsub, vsub_tmp, &vlr->subscribers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (vsub->expire_lu == VLR_SUBSCRIBER_NO_EXPIRATION || vsub->expire_lu > now.tv_sec)</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DVLR, LOGL_DEBUG, "%s: Location Update expired\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+             vlr_subscr_rx_imsi_detach(vsub);</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%);">+done:</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_timer_schedule(&vlr->lu_expire_timer, VLR_SUBSCRIBER_LU_EXPIRATION_INTERVAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /***********************************************************************</span><br><span>  * PDP context data</span><br><span>  ***********************************************************************/</span><br><span>@@ -1093,12 +1138,14 @@</span><br><span>  return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* See TS 23.012 version 9.10.0 4.3.2.1 "Process Detach_IMSI_VLR" */</span><br><span> int vlr_subscr_rx_imsi_detach(struct vlr_subscr *vsub)</span><br><span> {</span><br><span>        /* paranoia: should any LU or PARQ FSMs still be running, stop them. */</span><br><span>      vlr_subscr_cancel_attach_fsm(vsub, OSMO_FSM_TERM_ERROR, GSM48_REJECT_CONGESTION);</span><br><span> </span><br><span>        vsub->imsi_detached_flag = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   vsub->expire_lu = VLR_SUBSCRIBER_NO_EXPIRATION;</span><br><span> </span><br><span>       /* balancing the get from vlr_lu_compl_fsm_success() */</span><br><span>      vlr_subscr_expire(vsub);</span><br><span>@@ -1165,6 +1212,8 @@</span><br><span>             return -ENOMEM;</span><br><span>      vlr->gsup_client->data = vlr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_timer_setup(&vlr->lu_expire_timer, vlr_subscr_expire_lu, vlr);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_timer_schedule(&vlr->lu_expire_timer, VLR_SUBSCRIBER_LU_EXPIRATION_INTERVAL, 0);</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c</span><br><span>index 3073bd6..bf23551 100644</span><br><span>--- a/src/libvlr/vlr_lu_fsm.c</span><br><span>+++ b/src/libvlr/vlr_lu_fsm.c</span><br><span>@@ -356,7 +356,7 @@</span><br><span>    struct vlr_subscr *vsub = lcvp->vsub;</span><br><span>     if (!vsub->lu_complete) {</span><br><span>                 vsub->lu_complete = true;</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Balanced by vlr_subscr_rx_imsi_detach() */</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Balanced by vlr_subscr_expire() */</span><br><span>                vlr_subscr_get(vsub);</span><br><span>        }</span><br><span>    _vlr_lu_compl_fsm_done(fi, VLR_FSM_RESULT_SUCCESS, 0);</span><br><span>diff --git a/tests/msc_vlr/msc_vlr_test_no_authen.c b/tests/msc_vlr/msc_vlr_test_no_authen.c</span><br><span>index cd61fa1..85c01d9 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_test_no_authen.c</span><br><span>+++ b/tests/msc_vlr/msc_vlr_test_no_authen.c</span><br><span>@@ -917,6 +917,64 @@</span><br><span>   comment_end();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void test_no_authen_subscr_expire()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct vlr_subscr *vsub;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *imsi = "901700000004620";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* No auth only works on GERAN */</span><br><span style="color: hsl(120, 100%, 40%);">+     rx_from_ran = RAN_GERAN_A;</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%);">+    fake_time_start();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* The test framework has already started the VLR before fake time was active.</span><br><span style="color: hsl(120, 100%, 40%);">+         * Manually schedule this timeout in fake time. */</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_timer_del(&net->vlr->lu_expire_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&net->vlr->lu_expire_timer, VLR_SUBSCRIBER_LU_EXPIRATION_INTERVAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Let the LU expiration timer tick once */</span><br><span style="color: hsl(120, 100%, 40%);">+   fake_time_passes(VLR_SUBSCRIBER_LU_EXPIRATION_INTERVAL + 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     btw("Location Update request causes a GSUP LU request to HLR");</span><br><span style="color: hsl(120, 100%, 40%);">+     lu_result_sent = RES_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+    gsup_expect_tx("04010809710000004026f0");</span><br><span style="color: hsl(120, 100%, 40%);">+   ms_sends_msg("050802008168000130089910070000006402");</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(gsup_tx_confirmed);</span><br><span style="color: hsl(120, 100%, 40%);">+       VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        btw("HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT");</span><br><span style="color: hsl(120, 100%, 40%);">+       gsup_rx("10010809710000004026f00804036470f1",</span><br><span style="color: hsl(120, 100%, 40%);">+               "12010809710000004026f0");</span><br><span style="color: hsl(120, 100%, 40%);">+  VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        btw("HLR also sends GSUP _UPDATE_LOCATION_RESULT");</span><br><span style="color: hsl(120, 100%, 40%);">+ expect_bssap_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+ gsup_rx("06010809710000004026f0", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  btw("LU was successful, and the conn has already been closed");</span><br><span style="color: hsl(120, 100%, 40%);">+     VERBOSE_ASSERT(lu_result_sent, == RES_ACCEPT, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+        VERBOSE_ASSERT(bssap_clear_sent, == true, "%d");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  bss_sends_clear_complete();</span><br><span style="color: hsl(120, 100%, 40%);">+   EXPECT_CONN_COUNT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       vsub = vlr_subscr_find_by_imsi(net->vlr, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+    vlr_subscr_put(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Let T3212 (periodic Location update timer) expire */</span><br><span style="color: hsl(120, 100%, 40%);">+       fake_time_passes((net->t3212 * 60 * 6 * 2) + 60*4, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* The subscriber should now be gone. */</span><br><span style="color: hsl(120, 100%, 40%);">+      vsub = vlr_subscr_find_by_imsi(net->vlr, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(vsub == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  EXPECT_CONN_COUNT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ clear_vlr();</span><br><span style="color: hsl(120, 100%, 40%);">+  comment_end();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> msc_vlr_test_func_t msc_vlr_tests[] = {</span><br><span>     test_no_authen,</span><br><span>@@ -927,5 +985,6 @@</span><br><span>        test_no_authen_imeisv_imei,</span><br><span>  test_no_authen_imeisv_tmsi,</span><br><span>  test_no_authen_imeisv_tmsi_imei,</span><br><span style="color: hsl(120, 100%, 40%);">+      test_no_authen_subscr_expire,</span><br><span>        NULL</span><br><span> };</span><br><span>diff --git a/tests/msc_vlr/msc_vlr_test_no_authen.err b/tests/msc_vlr/msc_vlr_test_no_authen.err</span><br><span>index 2890e96..8d9d497 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_test_no_authen.err</span><br><span>+++ b/tests/msc_vlr/msc_vlr_test_no_authen.err</span><br><span>@@ -2270,6 +2270,132 @@</span><br><span> full talloc report on 'msgb' (total      0 bytes in   1 blocks)</span><br><span> talloc_total_blocks(tall_bsc_ctx) == 12</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+===== test_no_authen_subscr_expire</span><br><span style="color: hsl(120, 100%, 40%);">+- Total time passed: 0.000000 s</span><br><span style="color: hsl(120, 100%, 40%);">+- Total time passed: 61.000000 s</span><br><span style="color: hsl(120, 100%, 40%);">+- Location Update request causes a GSUP LU request to HLR</span><br><span style="color: hsl(120, 100%, 40%);">+  MSC <--RAN_GERAN_A-- MS: GSM48_MT_MM_LOC_UPD_REQUEST</span><br><span style="color: hsl(120, 100%, 40%);">+  new conn</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn{SUBSCR_CONN_S_NEW}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DREF unknown: MSC conn use + compl_l3 == 1 (0x1: compl_l3)</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL Dispatching 04.08 message GSM48_MT_MM_LOC_UPD_REQUEST (0x5:0x8)</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_NEW}: Updated ID</span><br><span style="color: hsl(120, 100%, 40%);">+DMM LOCATION UPDATING REQUEST: MI(IMSI)=901700000004620 type=IMSI ATTACH</span><br><span style="color: hsl(120, 100%, 40%);">+DMM LU/new-LAC: 1/23</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: is child of Subscr_Conn(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: rev=GSM net=GERAN (no Auth)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: Received Event VLR_ULA_E_UPDATE_LA</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr unknown usage increases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR set IMSI on subscriber; IMSI=901700000004620 id=901700000004620</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR New subscr, IMSI: 901700000004620</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr IMSI:901700000004620 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr IMSI:901700000004620 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_node1()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_post_auth()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_post_ciph()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: vlr_loc_upd_node_4()</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_IDLE}: state_chg to VLR_ULA_S_WAIT_HLR_UPD</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: is child of vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: Received Event UPD_HLR_VLR_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP tx: 04010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+GSUP --> HLR: OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST: 04010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_INIT}: state_chg to UPD_HLR_VLR_S_WAIT_FOR_DATA</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_NEW}: Received Event SUBSCR_CONN_E_COMPLETE_LAYER_3</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_NEW}: state_chg to SUBSCR_CONN_S_AUTH_CIPH</span><br><span style="color: hsl(120, 100%, 40%);">+DREF IMSI:901700000004620: MSC conn use - compl_l3 == 0 (0x0: )</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: Awaiting results for Auth+Ciph, overruling event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+  lu_result_sent == 0</span><br><span style="color: hsl(120, 100%, 40%);">+- HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_INSERT_DATA_REQUEST: 10010809710000004026f00804036470f1</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP rx 17: 10010809710000004026f00804036470f1</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr IMSI:901700000004620 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR IMSI:901700000004620 has MSISDN:46071</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR SUBSCR(MSISDN:46071) VLR: update for IMSI=901700000004620 (MSISDN=46071, used=2)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP tx: 12010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+GSUP --> HLR: OSMO_GSUP_MSGT_INSERT_DATA_RESULT: 12010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_INSERT_DATA_REQUEST: vlr_gsupc_read_cb() returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+  lu_result_sent == 0</span><br><span style="color: hsl(120, 100%, 40%);">+- HLR also sends GSUP _UPDATE_LOCATION_RESULT</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT: 06010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR GSUP rx 11: 06010809710000004026f0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_HLR_UPD}: Received Event VLR_ULA_E_HLR_LU_RES</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_WAIT_FOR_DATA}: Received Event UPD_HLR_VLR_E_UPD_LOC_ACK</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_WAIT_FOR_DATA}: state_chg to UPD_HLR_VLR_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Removing from parent vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR upd_hlr_vlr_fsm(LU:901700000004620){UPD_HLR_VLR_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_HLR_UPD}: Received Event VLR_ULA_E_UPD_HLR_COMPL</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_HLR_UPD}: state_chg to VLR_ULA_S_WAIT_LU_COMPL</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: is child of vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: Received Event LU_COMPL_VLR_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_INIT}: state_chg to LU_COMPL_VLR_S_WAIT_SUB_PRES</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: Allocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: is child of lu_compl_vlr_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: Received Event SUB_PRES_VLR_E_START</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_INIT}: state_chg to SUB_PRES_VLR_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Removing from parent lu_compl_vlr_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR sub_pres_vlr_fsm(LU:901700000004620){SUB_PRES_VLR_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_WAIT_SUB_PRES}: Received Event LU_COMPL_VLR_E_SUB_PRES_COMPL</span><br><span style="color: hsl(120, 100%, 40%);">+- sending LU Accept for MSISDN:46071</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_WAIT_SUB_PRES}: state_chg to LU_COMPL_VLR_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_LU_COMPL}: Received Event VLR_ULA_E_LU_COMPL_SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Terminating (cause = OSMO_FSM_TERM_PARENT)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Removing from parent vlr_lu_fsm(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR lu_compl_vlr_fsm(LU:901700000004620){LU_COMPL_VLR_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_WAIT_LU_COMPL}: state_chg to VLR_ULA_S_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: Received Event SUBSCR_CONN_E_ACCEPTED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_AUTH_CIPH}: state_chg to SUBSCR_CONN_S_ACCEPTED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_ACCEPTED}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_ACCEPTED}: state_chg to SUBSCR_CONN_S_RELEASING</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use + release == 1 (0x100: release)</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 4</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 3</span><br><span style="color: hsl(120, 100%, 40%);">+- BSSAP Clear --RAN_GERAN_A--> MS</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+<-- GSUP rx OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT: vlr_gsupc_read_cb() returns 0</span><br><span style="color: hsl(120, 100%, 40%);">+- LU was successful, and the conn has already been closed</span><br><span style="color: hsl(120, 100%, 40%);">+  lu_result_sent == 1</span><br><span style="color: hsl(120, 100%, 40%);">+  bssap_clear_sent == 1</span><br><span style="color: hsl(120, 100%, 40%);">+- BSS sends BSSMAP Clear Complete</span><br><span style="color: hsl(120, 100%, 40%);">+DREF MSISDN:46071: MSC conn use - release == 0 (0x0: )</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASING}: Received Event SUBSCR_CONN_E_UNUSED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASING}: state_chg to SUBSCR_CONN_S_RELEASED</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASED}: Terminating (cause = OSMO_FSM_TERM_REGULAR)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Terminating (cause = OSMO_FSM_TERM_PARENT)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Removing from parent Subscr_Conn(LU:901700000004620)</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: fsm_lu_cleanup called with cause OSMO_FSM_TERM_PARENT</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR vlr_lu_fsm(LU:901700000004620){VLR_ULA_S_DONE}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+DRLL MSISDN:46071: Freeing subscriber connection</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASED}: Freeing instance</span><br><span style="color: hsl(120, 100%, 40%);">+DMM Subscr_Conn(LU:901700000004620){SUBSCR_CONN_S_RELEASED}: Deallocated</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&net->subscr_conns) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+- Total time passed: 3901.000000 s</span><br><span style="color: hsl(120, 100%, 40%);">+DVLR MSISDN:46071: Location Update expired</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage increases to: 2</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 1</span><br><span style="color: hsl(120, 100%, 40%);">+DREF VLR subscr MSISDN:46071 usage decreases to: 0</span><br><span style="color: hsl(120, 100%, 40%);">+DREF freeing VLR subscr MSISDN:46071</span><br><span style="color: hsl(120, 100%, 40%);">+  llist_count(&net->subscr_conns) == 0</span><br><span style="color: hsl(120, 100%, 40%);">+===== test_no_authen_subscr_expire: SUCCESS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+full talloc report on 'msgb' (total      0 bytes in   1 blocks)</span><br><span style="color: hsl(120, 100%, 40%);">+talloc_total_blocks(tall_bsc_ctx) == 12</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> full talloc report on 'msgb' (total      0 bytes in   1 blocks)</span><br><span> talloc_total_blocks(tall_bsc_ctx) == 12</span><br><span> </span><br><span>diff --git a/tests/msc_vlr/msc_vlr_tests.c b/tests/msc_vlr/msc_vlr_tests.c</span><br><span>index 5c01896..8910e32 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_tests.c</span><br><span>+++ b/tests/msc_vlr/msc_vlr_tests.c</span><br><span>@@ -813,8 +813,15 @@</span><br><span> </span><br><span> void fake_time_start()</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec *clock_override;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   osmo_gettimeofday_override_time = fake_time_start_time;</span><br><span>      osmo_gettimeofday_override = true;</span><br><span style="color: hsl(120, 100%, 40%);">+    clock_override = osmo_clock_override_gettimespec(CLOCK_MONOTONIC);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(clock_override);</span><br><span style="color: hsl(120, 100%, 40%);">+  clock_override->tv_sec = fake_time_start_time.tv_sec;</span><br><span style="color: hsl(120, 100%, 40%);">+      clock_override->tv_nsec = fake_time_start_time.tv_usec * 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_clock_override_enable(CLOCK_MONOTONIC, true);</span><br><span>   fake_time_passes(0, 0);</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/msc_vlr/msc_vlr_tests.h b/tests/msc_vlr/msc_vlr_tests.h</span><br><span>index a29e870..a62cffa 100644</span><br><span>--- a/tests/msc_vlr/msc_vlr_tests.h</span><br><span>+++ b/tests/msc_vlr/msc_vlr_tests.h</span><br><span>@@ -218,6 +218,7 @@</span><br><span> { \</span><br><span>       struct timeval diff; \</span><br><span>       osmo_gettimeofday_override_add(secs, usecs); \</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_clock_override_add(CLOCK_MONOTONIC, secs, usecs * 1000); \</span><br><span>      timersub(&osmo_gettimeofday_override_time, &fake_time_start_time, &diff); \</span><br><span>      btw("Total time passed: %d.%06d s", \</span><br><span>          (int)diff.tv_sec, (int)diff.tv_usec); \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9211">change 9211</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/9211"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Iebdee8b12d22acfcfb265ee41e71cfc8d9eb3ba9 </div>
<div style="display:none"> Gerrit-Change-Number: 9211 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <ssperling@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <ssperling@sysmocom.de> </div>