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

</div><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, 54 insertions(+), 69 deletions(-)<br><br></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 6418425..3939c08 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>@@ -2744,22 +2744,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 8c8fb86..adb9ca7 100644</span><br><span>--- a/src/libmsc/msc_net_init.c</span><br><span>+++ b/src/libmsc/msc_net_init.c</span><br><span>@@ -67,9 +67,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 53d44dc..e2e892a 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -303,32 +303,44 @@</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 style="color: hsl(0, 100%, 40%);">-     struct gsm_network *net = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      int minutes = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc;</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> </span><br><span style="color: hsl(0, 100%, 40%);">-  return CMD_SUCCESS;</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 T3212 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = osmo_tdef_set(msc_tdefs_vlr, 3212, minutes, OSMO_TDEF_M);</span><br><span style="color: hsl(120, 100%, 40%);">+        return rc ? CMD_WARNING : 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 style="color: hsl(0, 100%, 40%);">-   struct gsm_network *net = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</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> </span><br><span style="color: hsl(0, 100%, 40%);">-  return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = osmo_tdef_set(msc_tdefs_vlr, 3212, 0, OSMO_TDEF_M);</span><br><span style="color: hsl(120, 100%, 40%);">+      return rc ? CMD_WARNING : CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> DEFUN(cfg_net_call_wait, cfg_net_call_wait_cmd,</span><br><span>@@ -389,11 +401,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>@@ -869,7 +876,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>@@ -943,9 +949,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 a1489f2..887ceb8 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> struct osmo_tdef msc_tdefs_vlr[] = {</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>@@ -75,6 +75,9 @@</span><br><span>  * TODO: we should start using osmo_tdef_fsm_inst_state_chg() */</span><br><span> uint32_t vlr_timer(struct vlr_instance *vlr, uint32_t timer)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* NOTE: since we usually do not need more than one instance of the VLR,</span><br><span style="color: hsl(120, 100%, 40%);">+       * and since libosmocore's osmo_tdef API does not (yet) support dynamic</span><br><span style="color: hsl(120, 100%, 40%);">+    * configuration, we always use the global instance of msc_tdefs_vlr. */</span><br><span>     return osmo_tdef_get(msc_tdefs_vlr, timer, OSMO_TDEF_S, 0);</span><br><span> }</span><br><span> </span><br><span>@@ -496,14 +499,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 +516,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>@@ -1263,6 +1261,9 @@</span><br><span>   /* defaults */</span><br><span>       vlr->cfg.assign_tmsi = true;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* reset shared timer definitions */</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_tdefs_reset(msc_tdefs_vlr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   /* osmo_auth_fsm.c */</span><br><span>        OSMO_ASSERT(osmo_fsm_register(&vlr_auth_fsm) == 0);</span><br><span>      /* osmo_lu_fsm.c */</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 b87a371..5a81c61 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>@@ -153,7 +151,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..2421144 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 T3212 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: 5 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>