<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-msc/+/16934">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc: move subscriber expiration timer T3212 to libvlr<br><br>Since the split of OsmoNiTB, OsmoMSC does not deal with the radio<br>access network directly. Therefore the only purpose of T3212 is to<br>control subscriber expiration in the local VLR. The timeout value<br>indicated in System Information Type 3 needs to be configured<br>separately in the BSC/RNC.<br><br>This means that we don't need to store it in deci-hours anymore.<br>Let's move T3212 to the group of VLR specific timers, so it can<br>be configured and introspected using the generic 'timer' command,<br>and deprecate the old '[no] periodic location update' command.<br><br>It should be also noted that in the old code subscriber expiration<br>timeout was actually set to twice the T3212 value plus one minute.<br>After this change, we apply the configured value 'as-is', but<br>keep the old behaviour for 'periodic location update' command.<br><br>Change-Id: I9b12066599a7c834a53a93acf5902d91273bc74f<br>---<br>M doc/manuals/vty/msc_vty_reference.xml<br>M include/osmocom/msc/gsm_data.h<br>M src/libmsc/msc_net_init.c<br>M src/libmsc/msc_vty.c<br>M src/libvlr/vlr.c<br>M tests/msc_vlr/msc_vlr_test_no_authen.c<br>M tests/test_nodes.vty<br>M tests/vty_test_runner.py<br>8 files changed, 47 insertions(+), 65 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/34/16934/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/manuals/vty/msc_vty_reference.xml b/doc/manuals/vty/msc_vty_reference.xml</span><br><span>index aed52ee..d5273d4 100644</span><br><span>--- a/doc/manuals/vty/msc_vty_reference.xml</span><br><span>+++ b/doc/manuals/vty/msc_vty_reference.xml</span><br><span>@@ -2790,22 +2790,6 @@</span><br><span>         <param name='timezone' doc='Disable network timezone override, use system tz' /></span><br><span>       </params></span><br><span>     </command></span><br><span style="color: hsl(0, 100%, 40%);">-    <command id='periodic location update &lt;6-1530&gt;'></span><br><span style="color: hsl(0, 100%, 40%);">-      <params></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='periodic' doc='Periodic Location Updating Interval' /></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='location' doc='Periodic Location Updating Interval' /></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='update' doc='Periodic Location Updating Interval' /></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='&lt;6-1530&gt;' doc='Periodic Location Updating Interval in Minutes' /></span><br><span style="color: hsl(0, 100%, 40%);">-      </params></span><br><span style="color: hsl(0, 100%, 40%);">-    </command></span><br><span style="color: hsl(0, 100%, 40%);">-    <command id='no periodic location update'></span><br><span style="color: hsl(0, 100%, 40%);">-      <params></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='no' doc='Negate a command or set its defaults' /></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='periodic' doc='Periodic Location Updating Interval' /></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='location' doc='Periodic Location Updating Interval' /></span><br><span style="color: hsl(0, 100%, 40%);">-        <param name='update' doc='Periodic Location Updating Interval' /></span><br><span style="color: hsl(0, 100%, 40%);">-      </params></span><br><span style="color: hsl(0, 100%, 40%);">-    </command></span><br><span>     <command id='call-waiting'></span><br><span>       <params></span><br><span>         <param name='call-waiting' doc='Enable Call Waiting on the Network' /></span><br><span>diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h</span><br><span>index 3459d15..2122d4b 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -205,9 +205,6 @@</span><br><span> </span><br><span>    struct vlr_instance *vlr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Periodic location update default value */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t t3212;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>       /* Global MNCC guard timer value */</span><br><span>  int mncc_guard_timeout;</span><br><span>      /* Global guard timer value for NCSS sessions */</span><br><span>diff --git a/src/libmsc/msc_net_init.c b/src/libmsc/msc_net_init.c</span><br><span>index 91b6165..6c44820 100644</span><br><span>--- a/src/libmsc/msc_net_init.c</span><br><span>+++ b/src/libmsc/msc_net_init.c</span><br><span>@@ -51,9 +51,6 @@</span><br><span>        net->a5_encryption_mask = (1 << 3) | (1 << 1);</span><br><span>        net->uea_encryption = true;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Use 30 min periodic update interval as sane default */</span><br><span style="color: hsl(0, 100%, 40%);">-       net->t3212 = 5;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   net->mncc_guard_timeout = 180;</span><br><span>    net->ncss_guard_timeout = 30;</span><br><span> </span><br><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index f6dfaaa..e7bea92 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -303,30 +303,45 @@</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_net_per_loc_upd, cfg_net_per_loc_upd_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "periodic location update <6-1530>",</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval in Minutes\n")</span><br><span style="color: hsl(120, 100%, 40%);">+/* NOTE: actually this is subscriber expiration timeout */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PER_LOC_UPD_STR "Periodic Location Updating Interval\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_DEPRECATED(cfg_net_per_loc_upd, cfg_net_per_loc_upd_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+             "periodic location update <6-1530>",</span><br><span style="color: hsl(120, 100%, 40%);">+          PER_LOC_UPD_STR PER_LOC_UPD_STR PER_LOC_UPD_STR</span><br><span style="color: hsl(120, 100%, 40%);">+               "Periodic Location Updating Interval in Minutes\n")</span><br><span> {</span><br><span>  struct gsm_network *net = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct vlr_instance *vlr = net->vlr;</span><br><span style="color: hsl(120, 100%, 40%);">+       int minutes = atoi(argv[0]);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        net->t3212 = atoi(argv[0]) / 6;</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "%% 'periodic location update' is now deprecated: "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "use 'timer T3212' to change subscriber expiration "</span><br><span style="color: hsl(120, 100%, 40%);">+                "timeout.%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* We used to double this value and add a minute when scheduling the</span><br><span style="color: hsl(120, 100%, 40%);">+   * expiration timer. Let's emulate the old behaviour here. */</span><br><span style="color: hsl(120, 100%, 40%);">+     minutes = minutes * 2 + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "%% Setting T2312 to %d minutes "</span><br><span style="color: hsl(120, 100%, 40%);">+                   "(emulating the old behaviour).%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 minutes, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_tdef_set(vlr->cfg.tdefs, 3212, minutes, OSMO_TDEF_M);</span><br><span> </span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_net_no_per_loc_upd, cfg_net_no_per_loc_upd_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "no periodic location update",</span><br><span style="color: hsl(0, 100%, 40%);">-      NO_STR</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval\n"</span><br><span style="color: hsl(0, 100%, 40%);">-      "Periodic Location Updating Interval\n")</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_DEPRECATED(cfg_net_no_per_loc_upd, cfg_net_no_per_loc_upd_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            "no periodic location update",</span><br><span style="color: hsl(120, 100%, 40%);">+              NO_STR PER_LOC_UPD_STR PER_LOC_UPD_STR PER_LOC_UPD_STR)</span><br><span> {</span><br><span>        struct gsm_network *net = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct vlr_instance *vlr = net->vlr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     net->t3212 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "%% 'periodic location update' is now deprecated: "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "use 'timer T3212' to change subscriber expiration "</span><br><span style="color: hsl(120, 100%, 40%);">+                "timeout.%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_tdef_set(vlr->cfg.tdefs, 3212, 0, OSMO_TDEF_M);</span><br><span> </span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -389,11 +404,6 @@</span><br><span>                      vty_out(vty, " timezone %d %d%s",</span><br><span>                          gsmnet->tz.hr, gsmnet->tz.mn, VTY_NEWLINE);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (gsmnet->t3212 == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, " no periodic location update%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-  else</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, " periodic location update %u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                        gsmnet->t3212 * 6, VTY_NEWLINE);</span><br><span> </span><br><span>      if (gsmnet->emergency.route_to_msisdn) {</span><br><span>          vty_out(vty, " emergency-call route-to-msisdn %s%s",</span><br><span>@@ -1015,7 +1025,6 @@</span><br><span> static void vty_dump_one_subscr(struct vty *vty, struct vlr_subscr *vsub,</span><br><span>                          int offset, uint8_t dump_flags)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_network *net;</span><br><span>     struct timespec now;</span><br><span>         char buf[128];</span><br><span> </span><br><span>@@ -1089,9 +1098,7 @@</span><br><span>                        VTY_NEWLINE);</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* XXX move t3212 into struct vlr_instance? */</span><br><span style="color: hsl(0, 100%, 40%);">-  net = vsub->vlr->user_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!net->t3212) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!vlr_timer(vsub->vlr, 3212)) {</span><br><span>                MSC_VTY_DUMP(vty, offset, "Expires: never (T3212 is disabled)%s",</span><br><span>                       VTY_NEWLINE);</span><br><span>   } else if (vsub->expire_lu == VLR_SUBSCRIBER_NO_EXPIRATION) {</span><br><span>diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c</span><br><span>index 0e7cfe8..6ab059b 100644</span><br><span>--- a/src/libvlr/vlr.c</span><br><span>+++ b/src/libvlr/vlr.c</span><br><span>@@ -64,7 +64,7 @@</span><br><span> </span><br><span> /* 3GPP TS 24.008, table 11.2 Mobility management timers (network-side) */</span><br><span> static struct osmo_tdef vlr_instance_tdefs[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: also define T3212 here */</span><br><span style="color: hsl(120, 100%, 40%);">+    { .T = 3212, .default_val = 60, .unit = OSMO_TDEF_M, .desc = "Subscriber expiration timeout" },</span><br><span>    { .T = 3250, .default_val = 12, .desc = "TMSI Reallocation procedure" },</span><br><span>   { .T = 3260, .default_val = 12, .desc = "Authentication procedure" },</span><br><span>      { .T = 3270, .default_val = 12, .desc = "Identification procedure" },</span><br><span>@@ -496,14 +496,11 @@</span><br><span> </span><br><span> void vlr_subscr_enable_expire_lu(struct vlr_subscr *vsub)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_network *net = vsub->vlr->user_ctx; /* XXX move t3212 into struct vlr_instance? */</span><br><span>  struct timespec now;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* The T3212 timeout value field is coded as the binary representation of the timeout</span><br><span style="color: hsl(0, 100%, 40%);">-    * value for periodic updating in decihours. Mark the subscriber as inactive if it missed</span><br><span style="color: hsl(0, 100%, 40%);">-        * two consecutive location updates. Timeout is twice the t3212 value plus one minute. */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Mark the subscriber as inactive if it stopped to do periodical location updates. */</span><br><span>       if (osmo_clock_gettime(CLOCK_MONOTONIC, &now) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               vsub->expire_lu = now.tv_sec + (net->t3212 * 60 * 6 * 2) + 60;</span><br><span style="color: hsl(120, 100%, 40%);">+          vsub->expire_lu = now.tv_sec + vlr_timer(vsub->vlr, 3212);</span><br><span>     } else {</span><br><span>             LOGP(DVLR, LOGL_ERROR,</span><br><span>                    "%s: Could not enable Location Update expiry: unable to read current time\n", vlr_subscr_name(vsub));</span><br><span>@@ -516,13 +513,11 @@</span><br><span> {</span><br><span>    struct vlr_instance *vlr = data;</span><br><span>     struct vlr_subscr *vsub, *vsub_tmp;</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_network *net;</span><br><span>     struct timespec now;</span><br><span> </span><br><span>     /* Periodic location update might be disabled from the VTY,</span><br><span>   * so we shall not expire subscribers until explicit IMSI Detach. */</span><br><span style="color: hsl(0, 100%, 40%);">-    net = vlr->user_ctx; /* XXX move t3212 into struct vlr_instance? */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!net->t3212)</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!vlr_timer(vlr, 3212))</span><br><span>           goto done;</span><br><span> </span><br><span>       if (llist_empty(&vlr->subscribers))</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 7b684fe..5d3db69 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>@@ -941,7 +941,7 @@</span><br><span>        vlr_subscr_put(vsub, __func__);</span><br><span> </span><br><span>  /* Let T3212 (periodic Location update timer) expire */</span><br><span style="color: hsl(0, 100%, 40%);">- fake_time_passes((net->t3212 * 60 * 6 * 2) + 60*4, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     fake_time_passes(vlr_timer(net->vlr, 3212) + 60 * 4, 0);</span><br><span> </span><br><span>      /* The subscriber should now be gone. */</span><br><span>     vsub = vlr_subscr_find_by_imsi(net->vlr, imsi, __func__);</span><br><span>diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty</span><br><span>index 39755c3..0edd350 100644</span><br><span>--- a/tests/test_nodes.vty</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -24,8 +24,6 @@</span><br><span>   timezone <-19-19> (0|15|30|45)</span><br><span>   timezone <-19-19> (0|15|30|45) <0-2></span><br><span>   no timezone</span><br><span style="color: hsl(0, 100%, 40%);">-  periodic location update <6-1530></span><br><span style="color: hsl(0, 100%, 40%);">-  no periodic location update</span><br><span>   call-waiting</span><br><span>   no call-waiting</span><br><span> </span><br><span>@@ -154,7 +152,6 @@</span><br><span>  authentication optional</span><br><span>  rrlp mode none</span><br><span>  mm info 1</span><br><span style="color: hsl(0, 100%, 40%);">- periodic location update 30</span><br><span> msc</span><br><span>  mncc guard-timeout 180</span><br><span>  ncss guard-timeout 30</span><br><span>diff --git a/tests/vty_test_runner.py b/tests/vty_test_runner.py</span><br><span>index f954b5d..b2a2fb4 100755</span><br><span>--- a/tests/vty_test_runner.py</span><br><span>+++ b/tests/vty_test_runner.py</span><br><span>@@ -198,17 +198,22 @@</span><br><span>         self.vty.verify("periodic location update 5", ['% Unknown command.'])</span><br><span>         self.vty.verify("periodic location update 1531", ['% Unknown command.'])</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        # Enable periodic lu..</span><br><span style="color: hsl(0, 100%, 40%);">-        self.vty.verify("periodic location update 60", [''])</span><br><span style="color: hsl(120, 100%, 40%);">+        depr_str = "% 'periodic location update' is now deprecated: " \</span><br><span style="color: hsl(120, 100%, 40%);">+                   "use 'timer T3212' to change subscriber expiration timeout."</span><br><span style="color: hsl(120, 100%, 40%);">+        set_str  = "% Setting T2312 to 121 minutes (emulating the old behaviour)."</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Enable periodic LU (deprecated command)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.vty.verify("periodic location update 60", [depr_str, set_str])</span><br><span>         res = self.vty.command("write terminal")</span><br><span style="color: hsl(0, 100%, 40%);">-        self.assertTrue(res.find('periodic location update 60') > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertTrue(res.find('timer vlr T3212 121') > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(res.find('periodic location update 60'), -1)</span><br><span>         self.assertEqual(res.find('no periodic location update'), -1)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        # Now disable it..</span><br><span style="color: hsl(0, 100%, 40%);">-        self.vty.verify("no periodic location update", [''])</span><br><span style="color: hsl(120, 100%, 40%);">+        # Now disable it (deprecated command)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.vty.verify("no periodic location update", [depr_str])</span><br><span>         res = self.vty.command("write terminal")</span><br><span style="color: hsl(0, 100%, 40%);">-        self.assertEqual(res.find('periodic location update 60'), -1)</span><br><span style="color: hsl(0, 100%, 40%);">-        self.assertTrue(res.find('no periodic location update') > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(res.find('no periodic location update'), -1)</span><br><span style="color: hsl(120, 100%, 40%);">+        self.assertEqual(res.find('timer vlr T3212 121'), -1)</span><br><span> </span><br><span>     def testShowNetwork(self):</span><br><span>         res = self.vty.command("show network")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-msc/+/16934">change 16934</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-msc/+/16934"/><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-Change-Id: I9b12066599a7c834a53a93acf5902d91273bc74f </div>
<div style="display:none"> Gerrit-Change-Number: 16934 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>