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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Get rid of PCU_Tests.ttcn tests<br><br>Delete PCU_Tests.ttcn along with the configs, since they are broken and<br>we are only adding new tests to PCU_Tests_RAW.ttcn. They are broken<br>because it's not possible to run multiple tests after another.<br><br>Some components which used to be in PCU_Tests.ttcn and which were used<br>by other PCU_Tests*.ttcn files have been moved to SGSN_Components.ttcn<br><br>Selftests have been moved to PCU_selftest.ttcn.<br><br>Small placeholder for module PCU_Tests is left in PCU_Tests.ttcn to<br>still be able to compile the binary as "PCU_Tests" and avoid changing<br>that part of docker setup. We'll eventually rename RAW tests soon<br>anyway.<br><br>Change-Id: Ie862a1525e9f4f9a3f2427ac3898810e3d044d2f<br>---<br>M pcu/PCU_Tests.cfg<br>M pcu/PCU_Tests.default<br>M pcu/PCU_Tests.ttcn<br>M pcu/PCU_Tests_RAW.ttcn<br>M pcu/PCU_Tests_RAW_NS.ttcn<br>M pcu/PCU_Tests_RAW_SNS.ttcn<br>M pcu/PCU_Tests_SNS.cfg<br>A pcu/PCU_selftest.ttcn<br>M pcu/README.md<br>A pcu/SGSN_Components.ttcn<br>M pcu/gen_links.sh<br>D pcu/osmo-bsc.cfg<br>D pcu/osmo-bts.cfg<br>M pcu/regen_makefile.sh<br>14 files changed, 380 insertions(+), 990 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/PCU_Tests.cfg b/pcu/PCU_Tests.cfg</span><br><span>index 0424e4f..692ebbd 100644</span><br><span>--- a/pcu/PCU_Tests.cfg</span><br><span>+++ b/pcu/PCU_Tests.cfg</span><br><span>@@ -7,7 +7,7 @@</span><br><span> [LOGGING]</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span style="color: hsl(0, 100%, 40%);">-PCU_Tests.mp_nsconfig := {</span><br><span style="color: hsl(120, 100%, 40%);">+SGSN_Components.mp_nsconfig := {</span><br><span>       local_ip := "127.0.0.1",</span><br><span>   local_udp_port := 23000,</span><br><span>     remote_ip := "127.0.0.1",</span><br><span>diff --git a/pcu/PCU_Tests.default b/pcu/PCU_Tests.default</span><br><span>index 537744f..9d9e966 100644</span><br><span>--- a/pcu/PCU_Tests.default</span><br><span>+++ b/pcu/PCU_Tests.default</span><br><span>@@ -7,7 +7,7 @@</span><br><span> ConsoleMask := ERROR | WARNING | TESTCASE | TIMEROP_START | DEBUG_ENCDEC</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span style="color: hsl(0, 100%, 40%);">-PCU_Tests.mp_gb_cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+SGSN_Components.mp_gb_cfg := {</span><br><span>        nsei := 1234,</span><br><span>        bvci := 1234,</span><br><span>        cell_id := {</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 7ef3d0a..43a6178 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -1,706 +1,2 @@</span><br><span> module PCU_Tests {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Osmocom PCU test suite in TTCN-3</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2018-2019 Harald Welte <laforge@gnumonks.org></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%);">- * Released under the terms of GNU General Public License, Version 2 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%);">- * SPDX-License-Identifier: GPL-2.0-or-later</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%);">-import from General_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from GSM_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from GSM_RR_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from Osmocom_Gb_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from BSSGP_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from BSSGP_Emulation all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from NS_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from NS_Emulation all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from LLC_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from LLC_Templates all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from RLCMAC_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from RLCMAC_CSN1_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from LAPDm_RAW_PT all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from GPRS_Context all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from GPRS_TBF all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from L1CTL_PortType all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from MobileL3_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from MobileL3_CommonIE_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from L3_Templates all;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-modulepar {</span><br><span style="color: hsl(0, 100%, 40%);">-   BssgpConfig mp_gb_cfg := {</span><br><span style="color: hsl(0, 100%, 40%);">-              nsei := 1234,</span><br><span style="color: hsl(0, 100%, 40%);">-           bvci := 1234,</span><br><span style="color: hsl(0, 100%, 40%);">-           cell_id := {</span><br><span style="color: hsl(0, 100%, 40%);">-                    ra_id := {</span><br><span style="color: hsl(0, 100%, 40%);">-                              lai := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                        mcc_mnc := '262F42'H, lac := 13135</span><br><span style="color: hsl(0, 100%, 40%);">-                              },</span><br><span style="color: hsl(0, 100%, 40%);">-                              rac := 0</span><br><span style="color: hsl(0, 100%, 40%);">-                        },</span><br><span style="color: hsl(0, 100%, 40%);">-                      cell_id := 20960</span><br><span style="color: hsl(0, 100%, 40%);">-                },</span><br><span style="color: hsl(0, 100%, 40%);">-              sgsn_role := true,</span><br><span style="color: hsl(0, 100%, 40%);">-              depth := BSSGP_DECODE_DEPTH_BSSGP</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%);">-      NSConfiguration mp_nsconfig := {</span><br><span style="color: hsl(0, 100%, 40%);">-                local_udp_port := 23000,</span><br><span style="color: hsl(0, 100%, 40%);">-                local_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-              remote_udp_port := 21000,</span><br><span style="color: hsl(0, 100%, 40%);">-               remote_ip := "127.0.0.1",</span><br><span style="color: hsl(0, 100%, 40%);">-             nsvci := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-             nsei := 2342,</span><br><span style="color: hsl(0, 100%, 40%);">-           role_sgsn := true,</span><br><span style="color: hsl(0, 100%, 40%);">-              handle_sns := true</span><br><span style="color: hsl(0, 100%, 40%);">-      };</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-type component dummy_CT extends BSSGP_Client_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        var lapdm_CT lapdm_component;</span><br><span style="color: hsl(0, 100%, 40%);">-   port LAPDm_PT L1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var NS_CT ns_component;</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSGP_CT bssgp_component;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   var MmContext g_mmctx := {</span><br><span style="color: hsl(0, 100%, 40%);">-              tlli := 'FFFFFFFF'O,</span><br><span style="color: hsl(0, 100%, 40%);">-            n_u := 0</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%);">-      var boolean g_initialized := false;</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%);">-function f_init() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        if (g_initialized == true) {</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%);">-       g_initialized := true;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* create a new NS component */</span><br><span style="color: hsl(0, 100%, 40%);">- ns_component := NS_CT.create;</span><br><span style="color: hsl(0, 100%, 40%);">-   bssgp_component := BSSGP_CT.create;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* connect our BSSGP port to the BSSGP Emulation */</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(self:BSSGP[0], bssgp_component:BSSGP_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-        /* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/</span><br><span style="color: hsl(0, 100%, 40%);">-    connect(bssgp_component:BSCP, ns_component:NS_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */</span><br><span style="color: hsl(0, 100%, 40%);">-       map(ns_component:NSCP, system:NS_CODEC_PORT);</span><br><span style="color: hsl(0, 100%, 40%);">-   ns_component.start(NSStart(mp_nsconfig));</span><br><span style="color: hsl(0, 100%, 40%);">-       bssgp_component.start(BssgpStart(mp_gb_cfg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   lapdm_component := lapdm_CT.create;</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(self:L1, lapdm_component:LAPDM_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-     map(lapdm_component:L1CTL, system:L1CTL);</span><br><span style="color: hsl(0, 100%, 40%);">-       lapdm_component.start(LAPDmStart());</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_client_register(g_mmctx.imsi, g_mmctx.tlli, mp_gb_cfg.cell_id);</span><br><span style="color: hsl(0, 100%, 40%);">- f_bssgp_establish();</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%);">-function f_exit() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       lapdm_component.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-   ns_component.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-      bssgp_component.stop;</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%);">-function f_bssgp_dec_and_log(in octetstring inp) {</span><br><span style="color: hsl(0, 100%, 40%);">-        log("BSSGP Input: ", inp);</span><br><span style="color: hsl(0, 100%, 40%);">-    var PDU_BSSGP dec := dec_PDU_BSSGP(inp);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("BSSGP Decoded: ", dec);</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%);">-testcase TC_selftest_bssgp() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  const octetstring c_bvc_reset_pcu := '2204820000078108088832f44000c80051e0'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   const octetstring c_bvc_reset_q := '2204820000078100'O;</span><br><span style="color: hsl(0, 100%, 40%);">- const octetstring c_status_pcu := '4107810515882204820000078103'O;</span><br><span style="color: hsl(0, 100%, 40%);">-      const octetstring c_reset_ack_q := '2304820000'O;</span><br><span style="color: hsl(0, 100%, 40%);">-       const octetstring c_reset_ack_pcu := '23048200c4'O;</span><br><span style="color: hsl(0, 100%, 40%);">-     const octetstring c_unblock_pcu := '24048200c4'O;</span><br><span style="color: hsl(0, 100%, 40%);">-       const octetstring c_unblock_ack_q := '25048200c4'O;</span><br><span style="color: hsl(0, 100%, 40%);">-     const octetstring c_fc_bvc_pcu := '261e8101058200fa038200c8018200fa1c8200c806820000'O;</span><br><span style="color: hsl(0, 100%, 40%);">-  const octetstring c_fc_bvc_ack_q := '271e8101'O;</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_gmm_mo_att_req := '01bb146ddd000004088832f44000c80051e000800e003b01c001080103e5e000110a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c0002017057bf0ec'O;</span><br><span style="color: hsl(0, 100%, 40%);">-  const octetstring c_gmm_mt_ac_req := '00bb146ddd0050001682ffff0a8204030e9c41c001081200102198c72477ea104895e8b959acc58b108182f4d045'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   const octetstring c_gmm_mo_ac_resp := '01bb146ddd000004088832f44000c80051e000800e000e01c00508130122fa361f5fdd623d'O;</span><br><span style="color: hsl(0, 100%, 40%);">-    const octetstring c_gmm_mt_att_acc := '00bb146ddd0050001682ffff0a8204030e9841c005080201340432f44000c8001805f4fb146ddd0967d0'O;</span><br><span style="color: hsl(0, 100%, 40%);">-  const octetstring c_gmm_mt_det_req := '00bb146ddd0050001682ffff0a8204030e8941c00908050215f0b6'O;</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        f_bssgp_dec_and_log(c_bvc_reset_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_bssgp_dec_and_log(c_bvc_reset_q);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_dec_and_log(c_status_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-      f_bssgp_dec_and_log(c_reset_ack_q);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_dec_and_log(c_reset_ack_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_bssgp_dec_and_log(c_unblock_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_bssgp_dec_and_log(c_unblock_ack_q);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_bssgp_dec_and_log(c_fc_bvc_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-      f_bssgp_dec_and_log(c_fc_bvc_ack_q);</span><br><span style="color: hsl(0, 100%, 40%);">-    f_bssgp_dec_and_log(c_gmm_mo_att_req);</span><br><span style="color: hsl(0, 100%, 40%);">-  f_bssgp_dec_and_log(c_gmm_mt_ac_req);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_bssgp_dec_and_log(c_gmm_mo_ac_resp);</span><br><span style="color: hsl(0, 100%, 40%);">-  f_bssgp_dec_and_log(c_gmm_mt_att_acc);</span><br><span style="color: hsl(0, 100%, 40%);">-  f_bssgp_dec_and_log(c_gmm_mt_det_req);</span><br><span style="color: hsl(0, 100%, 40%);">-  f_bssgp_dec_and_log(c_gmm_mo_att_cpl);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  log(ts_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));</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%);">-function f_ns_assert_prepr(in octetstring a, in octetstring b) {</span><br><span style="color: hsl(0, 100%, 40%);">- log("NS Input: ", a);</span><br><span style="color: hsl(0, 100%, 40%);">- log("NS Expected: ", b);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (a != b) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Values mismatch", a, b);</span><br><span style="color: hsl(0, 100%, 40%);">-            mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</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%);">-function f_ns_dec_and_log(in octetstring inp) {</span><br><span style="color: hsl(0, 100%, 40%);">-       log("NS Input: ", inp);</span><br><span style="color: hsl(0, 100%, 40%);">-       var PDU_NS dec := dec_PDU_NS(inp);</span><br><span style="color: hsl(0, 100%, 40%);">-      log("NS Decoded: ", dec);</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%);">-testcase TC_selftest_ns() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_ns_reset_pcu := '000000c4271e813d'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* single byte length to two byte length */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_ns_assert_prepr('04058101'O, '0405000101'O);</span><br><span style="color: hsl(0, 100%, 40%);">-  f_ns_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* two byte length to two byte length */</span><br><span style="color: hsl(0, 100%, 40%);">-        f_ns_assert_prepr('0405000101'O, '0405000101'O);</span><br><span style="color: hsl(0, 100%, 40%);">-        /* special case: NS-UNITDATA */</span><br><span style="color: hsl(0, 100%, 40%);">- f_ns_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);</span><br><span style="color: hsl(0, 100%, 40%);">-  /* multiple TLVs */</span><br><span style="color: hsl(0, 100%, 40%);">-     f_ns_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);</span><br><span style="color: hsl(0, 100%, 40%);">-        /* zero-length */</span><br><span style="color: hsl(0, 100%, 40%);">-       f_ns_assert_prepr('230080'O, '23000000'O);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      f_ns_dec_and_log(c_ns_reset_pcu);</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%);">-const octetstring gmm_auth_req := '081200102198c72477ea104895e8b959acc58b108182'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Wrap downlink GMM into LLC, encode + send it via BSSGP to PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-function tx_gmm(BIT1 c_r, in octetstring gmm_pdu, BIT4 sapi := c_LLC_SAPI_LLGMM) runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-      var PDU_LLC llc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        //log("GMM Tx: ", dec_PDU_L3_SGSN_MS(gmm_pdu));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       log(c_r, g_mmctx.n_u, gmm_pdu, sapi);</span><br><span style="color: hsl(0, 100%, 40%);">-   llc := valueof(ts_LLC_UI(gmm_pdu, sapi, c_r, g_mmctx.n_u));</span><br><span style="color: hsl(0, 100%, 40%);">-     log(llc);</span><br><span style="color: hsl(0, 100%, 40%);">-       g_mmctx.n_u := g_mmctx.n_u + 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    BSSGP[0].send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));</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%);">-/* Establish BSSGP connection to PCU */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_bssgp_establish() runs on BSSGP_Client_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    timer T:= 10.0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- T.start</span><br><span style="color: hsl(0, 100%, 40%);">- alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSGP[0].receive { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">- [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout establishing BSSGP connection");</span><br><span style="color: hsl(0, 100%, 40%);">-            mtc.stop;</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%);">-       T.stop</span><br><span style="color: hsl(0, 100%, 40%);">-  log("BSSGP successfully initialized");</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%);">-function f_wait_paging_req_type1(template (present) MobileIdentityV mi) runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var LAPDm_ph_data ph_data;</span><br><span style="color: hsl(0, 100%, 40%);">-      timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- T.start;</span><br><span style="color: hsl(0, 100%, 40%);">-        alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1.receive(LAPDm_ph_data:{sacch:=?,sapi:=0,lapdm:={bbis:=?}}) -> value ph_data {</span><br><span style="color: hsl(0, 100%, 40%);">-          var octetstring payload := substr(ph_data.lapdm.bbis.payload, 1, lengthof(ph_data.lapdm.bbis.payload) - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-             var PDU_ML3_NW_MS pdu;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (dec_PDU_ML3_NW_MS_backtrack(payload, pdu) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   repeat;</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%);">-               if (not ischosen(pdu.msgs.rrm)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       repeat;</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%);">-               if (match(pdu, tr_PAGING_REQ1(tr_MI_LV(mi)))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        repeat;</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%);">-       [] L1.receive { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] T.timeout { setverdict(fail); }</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%);">-/* Send PS-PAGING via BSSGP to PCU, expect it to show up on L1/Um */</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_paging() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   var hexstring tmsi_hex := '01234567'H;</span><br><span style="color: hsl(0, 100%, 40%);">-  var GsmTmsi tmsi := hex2int(tmsi_hex);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  g_mmctx.imsi := '262420123456789'H;</span><br><span style="color: hsl(0, 100%, 40%);">-     g_mmctx.tlli := f_random_tlli();</span><br><span style="color: hsl(0, 100%, 40%);">-        f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var BCCH_tune_req tune_req := { { false, 871 }, true };</span><br><span style="color: hsl(0, 100%, 40%);">- L1.send(tune_req);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FIXME: wait for confirm */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Send paging on signalling BVCI 0 since osmo-pcu does not support paging on PTP yet. */</span><br><span style="color: hsl(0, 100%, 40%);">-       /*</span><br><span style="color: hsl(0, 100%, 40%);">-      TODO: Paging by IMSI does not work yet because osmo-pcu does not copy IMSI into paging requests.</span><br><span style="color: hsl(0, 100%, 40%);">-        BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_IMSI(0, g_mmctx.imsi));</span><br><span style="color: hsl(0, 100%, 40%);">-    f_wait_paging_req_type1(tr_MI_IMSI(g_mmctx.imsi));</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%);">-      /* Page by TMSI */</span><br><span style="color: hsl(0, 100%, 40%);">-      BSSGP_SIG[0].send(ts_BSSGP_PS_PAGING_PTMSI(0, g_mmctx.imsi, tmsi));</span><br><span style="color: hsl(0, 100%, 40%);">-     f_wait_paging_req_type1(t_MI_TMSI(hex2oct(tmsi_hex)));</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%);">-/* Establish an UL TBF: Tune to ARFCN, send RACH, receive AGCH, enable TBF Rx */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_establish_ul_tbf() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">- var BCCH_tune_req tune_req := { { false, 871 }, true };</span><br><span style="color: hsl(0, 100%, 40%);">- L1.send(tune_req);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FIXME: wait for confirm */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   var TBF_UL_establish_req est_req := { tbf_nr := 0, ra := hex2int('7B'H) };</span><br><span style="color: hsl(0, 100%, 40%);">-      L1.send(est_req);</span><br><span style="color: hsl(0, 100%, 40%);">-       T.start;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* FIXME: wait for confirm */</span><br><span style="color: hsl(0, 100%, 40%);">-   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1.receive(TBF_UL_establish_res:?) {}</span><br><span style="color: hsl(0, 100%, 40%);">-        [] L1.receive { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout establishing UL TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</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%);">-       T.stop;</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%);">-/* compute a random TLLI; FIXME: what about TLLI prefix / local/foreign/...? */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_random_tlli() return GprsTlli {</span><br><span style="color: hsl(0, 100%, 40%);">-       var GprsTlli tlli := f_rnd_octstring(4);</span><br><span style="color: hsl(0, 100%, 40%);">-        return tlli;</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%);">-/* Compute the frame number of the uplink block based on current fn + rrbp */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_rrbp_fn(GsmFrameNumber fn, MacRrbp rrbp) return GsmFrameNumber {</span><br><span style="color: hsl(0, 100%, 40%);">-   var integer add;</span><br><span style="color: hsl(0, 100%, 40%);">-        select (rrbp) {</span><br><span style="color: hsl(0, 100%, 40%);">- case (RRBP_Nplus13_mod_2715648) {</span><br><span style="color: hsl(0, 100%, 40%);">-               add := 13;</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span style="color: hsl(0, 100%, 40%);">-       case (RRBP_Nplus17_or_18_mod_2715648) {</span><br><span style="color: hsl(0, 100%, 40%);">-         add := 17; /* FIXME: What about 'or 18'? */</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       case (RRBP_Nplus21_or_22_mod_2715648) {</span><br><span style="color: hsl(0, 100%, 40%);">-         add := 21; /* FIXME: What about 'or 22'? */</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-       case (RRBP_Nplus26_mod_2715648) {</span><br><span style="color: hsl(0, 100%, 40%);">-               add := 26;</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%);">-       return (fn + add) mod 2715648;</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%);">-function f_bssgp_wait_ul_ud(template PDU_BSSGP exp) runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">- T.start;</span><br><span style="color: hsl(0, 100%, 40%);">-        alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSGP[0].receive(exp) {</span><br><span style="color: hsl(0, 100%, 40%);">-              log("found matching BSSGP UL-UNITDATA PDU");</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout waiting for ", exp);</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-function f_ul_tbf(inout UlTbfState us) runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var RLCMAC_ph_data_ind dl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Establish an UL-TBF */</span><br><span style="color: hsl(0, 100%, 40%);">-       f_establish_ul_tbf();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   while (true) {</span><br><span style="color: hsl(0, 100%, 40%);">-          var RlcmacUlBlock blk;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (f_ul_tbf_get_next_block(blk, us, g_mmctx, true) == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 break;</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%);">-               /* Send the block to L1 for transmission */</span><br><span style="color: hsl(0, 100%, 40%);">-             log("L1=", blk);</span><br><span style="color: hsl(0, 100%, 40%);">-              L1.send(RLCMAC_ph_data_req:{dyn:={tbf_id := 0, cs := us.tbf.initial_cs, block := blk}});</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%);">-       alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1.receive(RLCMAC_ph_data_ind:{cs:=?, ts_nr:=?, fn:=?, block:=tr_RLCMAC_UL_ACK_NACK(0, g_mmctx.tlli)}) -> value dl {</span><br><span style="color: hsl(0, 100%, 40%);">-              log("found matching ACK/NACK");</span><br><span style="color: hsl(0, 100%, 40%);">-               /* send CTRL ACK in uplink */</span><br><span style="color: hsl(0, 100%, 40%);">-           var GsmFrameNumber ul_fn := f_rrbp_fn(dl.fn, dl.block.ctrl.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-               var RlcmacUlCtrlMsg ctrl_ack := valueof(ts_RlcMacUlCtrl_PKT_CTRL_ACK(g_mmctx.tlli));</span><br><span style="color: hsl(0, 100%, 40%);">-            var RlcmacUlBlock ul_block := valueof(ts_RLC_UL_CTRL_ACK(ctrl_ack));</span><br><span style="color: hsl(0, 100%, 40%);">-            L1.send(ts_PH_DATA_ABS(0, CS1, dl.ts_nr, ul_fn, {false, 871}, ul_block));</span><br><span style="color: hsl(0, 100%, 40%);">-               /* wait for the final ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (dl.block.ctrl.payload.u.ul_ack_nack.gprs.ack_nack_desc.final_ack == '0'B) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 repeat;</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%);">-       [] L1.receive { repeat; }</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%);">-       for (var integer i := 0; i < sizeof(us.tbf.llc_pdus_enc); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                f_bssgp_wait_ul_ud(tr_BSSGP_UL_UD(g_mmctx.tlli, ?, us.tbf.llc_pdus_enc[i]));</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       L1.send(DCCH_release_req:{});</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%);">-testcase TC_rach() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     var BssgpBvci bvci := 196;</span><br><span style="color: hsl(0, 100%, 40%);">-      g_mmctx.imsi := '262420123456789'H;</span><br><span style="color: hsl(0, 100%, 40%);">-     g_mmctx.tlli := f_random_tlli();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       f_bssgp_client_register(g_mmctx.imsi, g_mmctx.tlli, mp_gb_cfg.cell_id);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- f_bssgp_establish();</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-function f_llc_dec_and_log(in octetstring inp) {</span><br><span style="color: hsl(0, 100%, 40%);">-   log("LLC Input: ", inp);</span><br><span style="color: hsl(0, 100%, 40%);">-      var PDU_LLC dec := dec_PDU_LLC(inp);</span><br><span style="color: hsl(0, 100%, 40%);">-    log("LLC Decoded: ", dec);</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%);">-function f_llc_assert(in octetstring a, in octetstring b) {</span><br><span style="color: hsl(0, 100%, 40%);">-        log("LLC Input: ", a);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("LLC Expected: ", b);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (a != b) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "LLC input ", b, " != expected ", a);</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_selftest_llc() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- const octetstring c_gmm_att_pcu := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c00020170580460b'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   const octetstring c_gmm_att_pcu_nofcs := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c000201705'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   f_llc_dec_and_log(c_gmm_att_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       //f_llc_assert(f_LLC_append_fcs(c_gmm_att_pcu_nofcs), c_gmm_att_pcu);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   log(valueof(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u)));</span><br><span style="color: hsl(0, 100%, 40%);">-    log(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u));</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%);">-testcase TC_selftest_rlcmac() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    var RlcmacDlCtrlBlock dcb;</span><br><span style="color: hsl(0, 100%, 40%);">-      var RlcmacUlCtrlBlock ucb;</span><br><span style="color: hsl(0, 100%, 40%);">-      const octetstring c_dl_ul_ack_nack := '40240080400000000000000077628dbba14b2b2b2b2b2b'O;</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_dl_data := '0f00007341c001081200102198c72477ea104895e8b959acc58b108182f4d0454300'O;</span><br><span style="color: hsl(0, 100%, 40%);">- const octetstring c_dl_data2 := '070002165dc0012b2b2b43c0012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_ul_ctrl_ack := '4006ec51b7772b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b'O;</span><br><span style="color: hsl(0, 100%, 40%);">-   const octetstring c_ul_dl_ack_nack := '4008004000000000000000701000edc0000b2b2b2b2b2b'O;</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_dl_ul_assign := '482857628dbbaf0126e68800082b2b2b2b2b2b2b2b2b2b'O;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  log(c_dl_ul_ack_nack);</span><br><span style="color: hsl(0, 100%, 40%);">-  dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_ack_nack);</span><br><span style="color: hsl(0, 100%, 40%);">- log(dcb);</span><br><span style="color: hsl(0, 100%, 40%);">-       //log(dec_RlcmacDlCtrlMsg(dcb.payload));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        f_rlcmac_dld_decenc(c_dl_data);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- f_rlcmac_dld_decenc(c_dl_data2);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        log(c_ul_ctrl_ack);</span><br><span style="color: hsl(0, 100%, 40%);">-     ucb := dec_RlcmacUlCtrlBlock(c_ul_ctrl_ack);</span><br><span style="color: hsl(0, 100%, 40%);">-    log(ucb);</span><br><span style="color: hsl(0, 100%, 40%);">-       //log(dec_RlcmacUlCtrlMsg(ucb.payload));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        log(c_ul_dl_ack_nack);</span><br><span style="color: hsl(0, 100%, 40%);">-  ucb := dec_RlcmacUlCtrlBlock(c_ul_dl_ack_nack);</span><br><span style="color: hsl(0, 100%, 40%);">- log(ucb);</span><br><span style="color: hsl(0, 100%, 40%);">-       //log(dec_RlcmacUlCtrlMsg(ucb.payload));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        log(c_dl_ul_assign);</span><br><span style="color: hsl(0, 100%, 40%);">-    dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_assign);</span><br><span style="color: hsl(0, 100%, 40%);">-   log(dcb);</span><br><span style="color: hsl(0, 100%, 40%);">-       //log(dec_RlcmacDlCtrlMsg(dcb.payload));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        const octetstring c_uld_tlli_noext := '080101a61cab5201c001080103e5e000310a0005f4e61cab5232f44000c8001d1b00'O;</span><br><span style="color: hsl(0, 100%, 40%);">-  f_rlcmac_uld_decenc(c_uld_tlli_noext);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  const octetstring c_uld_tlli_ext7pad := '0001041da61cab5200201705a96e102b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;</span><br><span style="color: hsl(0, 100%, 40%);">-        log("ULD_decenc");</span><br><span style="color: hsl(0, 100%, 40%);">-    f_rlcmac_uld_decenc(c_uld_tlli_ext7pad);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("UL_decenc");</span><br><span style="color: hsl(0, 100%, 40%);">-     f_rlcmac_ul_decenc(c_uld_tlli_ext7pad);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- f_rlcmac_ul_decenc(c_ul_dl_ack_nack);</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%);">-function f_rlcmac_ul_decenc(in octetstring buf) {</span><br><span style="color: hsl(0, 100%, 40%);">- log("==================================");</span><br><span style="color: hsl(0, 100%, 40%);">-    log("In: ", buf);</span><br><span style="color: hsl(0, 100%, 40%);">-     var RlcmacUlBlock udb := dec_RlcmacUlBlock(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("Dec: ", udb);</span><br><span style="color: hsl(0, 100%, 40%);">-    var octetstring enc := enc_RlcmacUlBlock(udb);</span><br><span style="color: hsl(0, 100%, 40%);">-  log("Enc: ", enc);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (enc != buf) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Re-encoded data doesn't equal input data");</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</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%);">-function f_rlcmac_uld_decenc(in octetstring buf) {</span><br><span style="color: hsl(0, 100%, 40%);">-    log("==================================");</span><br><span style="color: hsl(0, 100%, 40%);">-    log("In: ", buf);</span><br><span style="color: hsl(0, 100%, 40%);">-     var RlcmacUlDataBlock udb := dec_RlcmacUlDataBlock(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("Dec: ", udb);</span><br><span style="color: hsl(0, 100%, 40%);">-    var octetstring enc := enc_RlcmacUlDataBlock(udb);</span><br><span style="color: hsl(0, 100%, 40%);">-      log("Enc: ", enc);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (enc != buf) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Re-encoded data doesn't equal input data");</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</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%);">-function f_rlcmac_dld_decenc(in octetstring buf) {</span><br><span style="color: hsl(0, 100%, 40%);">-    log("==================================");</span><br><span style="color: hsl(0, 100%, 40%);">-    log("In: ", buf);</span><br><span style="color: hsl(0, 100%, 40%);">-     var RlcmacDlDataBlock udb := dec_RlcmacDlDataBlock(buf);</span><br><span style="color: hsl(0, 100%, 40%);">-        log("Dec: ", udb);</span><br><span style="color: hsl(0, 100%, 40%);">-    var octetstring enc := enc_RlcmacDlDataBlock(udb);</span><br><span style="color: hsl(0, 100%, 40%);">-      log("Enc: ", enc);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (enc != buf) {</span><br><span style="color: hsl(0, 100%, 40%);">-               setverdict(fail, "Re-encoded data doesn't equal input data");</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_selftest_rr() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  //const octetstring c_paging_none := '06210001F02B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O</span><br><span style="color: hsl(0, 100%, 40%);">-    const octetstring c_paging_none := '1506210001F0'O;</span><br><span style="color: hsl(0, 100%, 40%);">-     const octetstring c_ia_tbf := '2d063f100fe3677bd8440000c800100b2b2b2b2b2b2b2b'O</span><br><span style="color: hsl(0, 100%, 40%);">- log(c_paging_none);</span><br><span style="color: hsl(0, 100%, 40%);">-     log(dec_GsmRrMessage(c_paging_none));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   log(c_ia_tbf);</span><br><span style="color: hsl(0, 100%, 40%);">-  log(dec_GsmRrMessage(c_ia_tbf));</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%);">-function f_seq_octstr(integer len) return octetstring {</span><br><span style="color: hsl(0, 100%, 40%);">-        var octetstring payload := ''O;</span><br><span style="color: hsl(0, 100%, 40%);">- for (var integer i := 0; i < len; i := i+1 ) {</span><br><span style="color: hsl(0, 100%, 40%);">-               payload := payload & int2oct(i mod 256, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       return payload;</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%);">-testcase TC_ul_tbf_single_llc_sizes() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-        g_mmctx.imsi := '262420123456789'H;</span><br><span style="color: hsl(0, 100%, 40%);">-     g_mmctx.tlli := f_random_tlli();</span><br><span style="color: hsl(0, 100%, 40%);">-        f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (var integer len := 1; len <= 1560; len := len+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              log("Testing Uplink TBF with single LLC-PDU of ", len, " bytes");</span><br><span style="color: hsl(0, 100%, 40%);">-           var octetstring payload := f_seq_octstr(len);</span><br><span style="color: hsl(0, 100%, 40%);">-           var UlTbfPars ul_tbf_pars := {</span><br><span style="color: hsl(0, 100%, 40%);">-                  ack_mode := true,</span><br><span style="color: hsl(0, 100%, 40%);">-                       initial_cs := CS1,</span><br><span style="color: hsl(0, 100%, 40%);">-                      llc_pdus := {</span><br><span style="color: hsl(0, 100%, 40%);">-                           valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u))</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%);">-               var UlTbfState ul_tbf_state;</span><br><span style="color: hsl(0, 100%, 40%);">-            f_UlTbfState_init(ul_tbf_state, ul_tbf_pars);</span><br><span style="color: hsl(0, 100%, 40%);">-           f_ul_tbf(ul_tbf_state);</span><br><span style="color: hsl(0, 100%, 40%);">-         f_sleep(1.0);</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%);">-       f_exit();</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%);">-testcase TC_ul_tbf() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       g_mmctx.imsi := '262420123456789'H;</span><br><span style="color: hsl(0, 100%, 40%);">-     g_mmctx.tlli := f_random_tlli();</span><br><span style="color: hsl(0, 100%, 40%);">-        f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var octetstring payload := f_seq_octstr(1023);</span><br><span style="color: hsl(0, 100%, 40%);">-  var UlTbfPars ul_tbf_pars := {</span><br><span style="color: hsl(0, 100%, 40%);">-          ack_mode := true,</span><br><span style="color: hsl(0, 100%, 40%);">-               initial_cs := CS1,</span><br><span style="color: hsl(0, 100%, 40%);">-              llc_pdus := { </span><br><span style="color: hsl(0, 100%, 40%);">-                  valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u)),</span><br><span style="color: hsl(0, 100%, 40%);">-                       valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+1)),</span><br><span style="color: hsl(0, 100%, 40%);">-                     valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+2)),</span><br><span style="color: hsl(0, 100%, 40%);">-                     valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+3)),</span><br><span style="color: hsl(0, 100%, 40%);">-                     valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+4)),</span><br><span style="color: hsl(0, 100%, 40%);">-                     valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+5))</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%);">-      var UlTbfState ul_tbf_state;</span><br><span style="color: hsl(0, 100%, 40%);">-    f_UlTbfState_init(ul_tbf_state, ul_tbf_pars);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_ul_tbf(ul_tbf_state);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- f_exit();</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%);">-testcase TC_dl_tbf() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       g_mmctx.imsi := '262420123456789'H;</span><br><span style="color: hsl(0, 100%, 40%);">-     g_mmctx.tlli := f_random_tlli();</span><br><span style="color: hsl(0, 100%, 40%);">-        f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       f_establish_dl_tbf();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   f_exit();</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%);">-function f_wait_tbf_dl(TbfNr tbf_nr, GprsTlli tlli) runs on dummy_CT return ImmediateAssignment {</span><br><span style="color: hsl(0, 100%, 40%);">-     var template PacketDlAssign dl_ass := tr_PacketDlAssign(tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-  var template IaRestOctets rest := tr_IaRestOctets_DLAss(dl_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-        var LAPDm_ph_data ph_data;</span><br><span style="color: hsl(0, 100%, 40%);">-      var GsmRrMessage rr;</span><br><span style="color: hsl(0, 100%, 40%);">-    timer T := 10.0;</span><br><span style="color: hsl(0, 100%, 40%);">-        T.start;</span><br><span style="color: hsl(0, 100%, 40%);">-        alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1.receive(LAPDm_ph_data:{sacch:=?,sapi:=0,lapdm:={bbis:=?}}) -> value ph_data {</span><br><span style="color: hsl(0, 100%, 40%);">-          rr := dec_GsmRrMessage(ph_data.lapdm.bbis.payload);</span><br><span style="color: hsl(0, 100%, 40%);">-             log("PCH/AGCH DL RR: ", rr);</span><br><span style="color: hsl(0, 100%, 40%);">-          if (match(rr, tr_IMM_TBF_ASS(dl := true, rest := rest))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      var TbfPars tbf_pars := valueof(t_TbfParsInit);</span><br><span style="color: hsl(0, 100%, 40%);">-                 log("Received IMM.ASS for our TLLI!");</span><br><span style="color: hsl(0, 100%, 40%);">-                        tbf_pars.tfi[rr.payload.imm_ass.pkt_chan_desc.tn] :=</span><br><span style="color: hsl(0, 100%, 40%);">-                            rr.payload.imm_ass.rest_octets.hh.pa.uldl.ass.dl.group1.tfi_assignment;</span><br><span style="color: hsl(0, 100%, 40%);">-                 L1.send(TBF_DL_establish_req:{tbf_nr, tbf_pars});</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        repeat;</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%);">-       [] L1.receive { repeat };</span><br><span style="color: hsl(0, 100%, 40%);">-       [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          setverdict(fail, "Timeout waiting for IMM ASS")</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</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%);">-       T.stop;</span><br><span style="color: hsl(0, 100%, 40%);">- return rr.payload.imm_ass;</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%);">-/* Establish an UL TBF: Tune to ARFCN, send RACH, receive AGCH, enable TBF Rx */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_establish_dl_tbf() runs on dummy_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-     timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">- var BCCH_tune_req tune_req := { { false, 871 }, true };</span><br><span style="color: hsl(0, 100%, 40%);">- L1.send(tune_req);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FIXME: wait for confirm */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* sending a GMM PDU as DL-UNITDATA should trigger Paging + DL TBF Assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-        tx_gmm('1'B, '01020304'O, c_LLC_SAPI_LLGMM);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* Expect an IMM.ASS for PDCH on the AGCH */</span><br><span style="color: hsl(0, 100%, 40%);">-    f_wait_tbf_dl(0, g_mmctx.tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- var RLCMAC_ph_data_ind dl;</span><br><span style="color: hsl(0, 100%, 40%);">-      alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1.receive(RLCMAC_ph_data_ind:{cs:=?, ts_nr:=?, fn:=?, block:=tr_RLCMAC_DATA_RRBP}) -> value dl {</span><br><span style="color: hsl(0, 100%, 40%);">-         var uint6_t tfi := dl.block.data.mac_hdr.hdr_ext.tfi;</span><br><span style="color: hsl(0, 100%, 40%);">-           var GsmFrameNumber ul_fn := f_rrbp_fn(dl.fn, dl.block.data.mac_hdr.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-               var AckNackDescription an_desc := { /* FIXME: compute this based on state */</span><br><span style="color: hsl(0, 100%, 40%);">-                    final_ack := '1'B,</span><br><span style="color: hsl(0, 100%, 40%);">-                      starting_seq_nr := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                   receive_block_bitmap := '0000000000000000000000000000000000000000000000000000000000000001'B</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-               var RlcmacUlCtrlMsg ctrl_ack;</span><br><span style="color: hsl(0, 100%, 40%);">-           ctrl_ack := valueof(ts_RlcMacUlCtrl_PKT_DL_ACK(tfi, an_desc));</span><br><span style="color: hsl(0, 100%, 40%);">-          var RlcmacUlBlock ul_block := valueof(ts_RLC_UL_CTRL_ACK(ctrl_ack));</span><br><span style="color: hsl(0, 100%, 40%);">-            L1.send(ts_PH_DATA_ABS(0, CS1, dl.ts_nr, ul_fn, {false, 871}, ul_block));</span><br><span style="color: hsl(0, 100%, 40%);">-               log("Sent DL ACK: ", ul_block);</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] L1.receive { repeat; }</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%);">-       f_sleep(10.0);</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%);">-/* FIXME: merge this into BSSGP_Client_CT ? */</span><br><span style="color: hsl(0, 100%, 40%);">-type component bssgp_CT extends BSSGP_Client_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  var NS_CT ns_component;</span><br><span style="color: hsl(0, 100%, 40%);">- var BSSGP_CT bssgp_component;</span><br><span style="color: hsl(0, 100%, 40%);">-   var boolean g_initialized := false;</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%);">-/* FIXME: merge this into BSSGP_Client_CT ? */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_init_bssgp() runs on bssgp_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    var MmContext mmctx := {</span><br><span style="color: hsl(0, 100%, 40%);">-                imsi := '262420000000001'H,</span><br><span style="color: hsl(0, 100%, 40%);">-             tlli := 'FFFFFFFF'O,</span><br><span style="color: hsl(0, 100%, 40%);">-            n_u := 0</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%);">-      if (g_initialized == true) {</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%);">-       g_initialized := true;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* create a new NS component */</span><br><span style="color: hsl(0, 100%, 40%);">- ns_component := NS_CT.create;</span><br><span style="color: hsl(0, 100%, 40%);">-   bssgp_component := BSSGP_CT.create;</span><br><span style="color: hsl(0, 100%, 40%);">-     /* connect our BSSGP port to the BSSGP Emulation */</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(self:BSSGP[0], bssgp_component:BSSGP_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-        /* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/</span><br><span style="color: hsl(0, 100%, 40%);">-    connect(bssgp_component:BSCP, ns_component:NS_SP);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */</span><br><span style="color: hsl(0, 100%, 40%);">-       map(ns_component:NSCP, system:NS_CODEC_PORT);</span><br><span style="color: hsl(0, 100%, 40%);">-   ns_component.start(NSStart(mp_nsconfig));</span><br><span style="color: hsl(0, 100%, 40%);">-       bssgp_component.start(BssgpStart(mp_gb_cfg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   f_bssgp_client_register(mmctx.imsi, mmctx.tlli, mp_gb_cfg.cell_id);</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-control {</span><br><span style="color: hsl(0, 100%, 40%);">-   execute(TC_selftest_ns());</span><br><span style="color: hsl(0, 100%, 40%);">-      execute(TC_ul_tbf_single_llc_sizes());</span><br><span style="color: hsl(0, 100%, 40%);">-  execute(TC_ul_tbf());</span><br><span style="color: hsl(0, 100%, 40%);">-   execute(TC_paging());</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>diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn</span><br><span>index 524dfb7..1348a8e 100644</span><br><span>--- a/pcu/PCU_Tests_RAW.ttcn</span><br><span>+++ b/pcu/PCU_Tests_RAW.ttcn</span><br><span>@@ -46,7 +46,7 @@</span><br><span> import from PCUIF_RAW_Components all;</span><br><span> import from IPL4asp_Types all;</span><br><span> import from Native_Functions all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCU_Tests all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGSN_Components all;</span><br><span> </span><br><span> modulepar {</span><br><span>     charstring mp_pcu_sock_path := PCU_SOCK_DEFAULT;</span><br><span>diff --git a/pcu/PCU_Tests_RAW_NS.ttcn b/pcu/PCU_Tests_RAW_NS.ttcn</span><br><span>index b1b19bb..81b60c3 100644</span><br><span>--- a/pcu/PCU_Tests_RAW_NS.ttcn</span><br><span>+++ b/pcu/PCU_Tests_RAW_NS.ttcn</span><br><span>@@ -12,8 +12,8 @@</span><br><span> </span><br><span> import from General_Types all;</span><br><span> import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCU_Tests all;</span><br><span> import from PCU_Tests_RAW all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGSN_Components all;</span><br><span> import from Osmocom_Gb_Types all;</span><br><span> import from NS_CodecPort all;</span><br><span> import from NS_Types all;</span><br><span>diff --git a/pcu/PCU_Tests_RAW_SNS.ttcn b/pcu/PCU_Tests_RAW_SNS.ttcn</span><br><span>index 1a8c30f..1690ad4 100644</span><br><span>--- a/pcu/PCU_Tests_RAW_SNS.ttcn</span><br><span>+++ b/pcu/PCU_Tests_RAW_SNS.ttcn</span><br><span>@@ -11,8 +11,8 @@</span><br><span>  */</span><br><span> </span><br><span> import from Osmocom_Types all;</span><br><span style="color: hsl(0, 100%, 40%);">-import from PCU_Tests all;</span><br><span> import from PCU_Tests_RAW_NS all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SGSN_Components all;</span><br><span> import from Osmocom_Gb_Types all;</span><br><span> import from NS_CodecPort all;</span><br><span> import from NS_Types all;</span><br><span>diff --git a/pcu/PCU_Tests_SNS.cfg b/pcu/PCU_Tests_SNS.cfg</span><br><span>index 1419e1e..0368f36 100644</span><br><span>--- a/pcu/PCU_Tests_SNS.cfg</span><br><span>+++ b/pcu/PCU_Tests_SNS.cfg</span><br><span>@@ -7,7 +7,7 @@</span><br><span> [LOGGING]</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span style="color: hsl(0, 100%, 40%);">-PCU_Tests.mp_nsconfig := {</span><br><span style="color: hsl(120, 100%, 40%);">+SGSN_Components.mp_nsconfig := {</span><br><span>      local_ip := "127.0.0.1",</span><br><span>   local_udp_port := 23000,</span><br><span>     remote_ip := "127.0.0.1",</span><br><span>diff --git a/pcu/PCU_selftest.ttcn b/pcu/PCU_selftest.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..3cdb4f4</span><br><span>--- /dev/null</span><br><span>+++ b/pcu/PCU_selftest.ttcn</span><br><span>@@ -0,0 +1,267 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module PCU_selftest {</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Osmocom PCU test suite in TTCN-3, selftest procedures</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</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%);">+import from BSSGP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSGP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GPRS_Context all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Gb_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from LLC_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from LLC_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from L3_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_RR_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RLCMAC_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RLCMAC_CSN1_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component dummy_CT extends BSSGP_Client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var NS_CT ns_component;</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSGP_CT bssgp_component;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var MmContext g_mmctx := {</span><br><span style="color: hsl(120, 100%, 40%);">+            tlli := 'FFFFFFFF'O,</span><br><span style="color: hsl(120, 100%, 40%);">+          n_u := 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%);">+  var boolean g_initialized := 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+///////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+// BSSGP selftest</span><br><span style="color: hsl(120, 100%, 40%);">+///////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+function f_bssgp_dec_and_log(in octetstring inp) {</span><br><span style="color: hsl(120, 100%, 40%);">+   log("BSSGP Input: ", inp);</span><br><span style="color: hsl(120, 100%, 40%);">+  var PDU_BSSGP dec := dec_PDU_BSSGP(inp);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("BSSGP Decoded: ", dec);</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%);">+testcase TC_selftest_bssgp() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  const octetstring c_bvc_reset_pcu := '2204820000078108088832f44000c80051e0'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_bvc_reset_q := '2204820000078100'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring c_status_pcu := '4107810515882204820000078103'O;</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_reset_ack_q := '2304820000'O;</span><br><span style="color: hsl(120, 100%, 40%);">+     const octetstring c_reset_ack_pcu := '23048200c4'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   const octetstring c_unblock_pcu := '24048200c4'O;</span><br><span style="color: hsl(120, 100%, 40%);">+     const octetstring c_unblock_ack_q := '25048200c4'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   const octetstring c_fc_bvc_pcu := '261e8101058200fa038200c8018200fa1c8200c806820000'O;</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring c_fc_bvc_ack_q := '271e8101'O;</span><br><span style="color: hsl(120, 100%, 40%);">+      const octetstring c_gmm_mo_att_req := '01bb146ddd000004088832f44000c80051e000800e003b01c001080103e5e000110a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c0002017057bf0ec'O;</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring c_gmm_mt_ac_req := '00bb146ddd0050001682ffff0a8204030e9c41c001081200102198c72477ea104895e8b959acc58b108182f4d045'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_gmm_mo_ac_resp := '01bb146ddd000004088832f44000c80051e000800e000e01c00508130122fa361f5fdd623d'O;</span><br><span style="color: hsl(120, 100%, 40%);">+  const octetstring c_gmm_mt_att_acc := '00bb146ddd0050001682ffff0a8204030e9841c005080201340432f44000c8001805f4fb146ddd0967d0'O;</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring c_gmm_mt_det_req := '00bb146ddd0050001682ffff0a8204030e8941c00908050215f0b6'O;</span><br><span style="color: hsl(120, 100%, 40%);">+      const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssgp_dec_and_log(c_bvc_reset_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssgp_dec_and_log(c_bvc_reset_q);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_dec_and_log(c_status_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssgp_dec_and_log(c_reset_ack_q);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_dec_and_log(c_reset_ack_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssgp_dec_and_log(c_unblock_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_bssgp_dec_and_log(c_unblock_ack_q);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssgp_dec_and_log(c_fc_bvc_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_bssgp_dec_and_log(c_fc_bvc_ack_q);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_bssgp_dec_and_log(c_gmm_mo_att_req);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssgp_dec_and_log(c_gmm_mt_ac_req);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssgp_dec_and_log(c_gmm_mo_ac_resp);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssgp_dec_and_log(c_gmm_mt_att_acc);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssgp_dec_and_log(c_gmm_mt_det_req);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_bssgp_dec_and_log(c_gmm_mo_att_cpl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      log(ts_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));</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%);">+// NS selftest</span><br><span style="color: hsl(120, 100%, 40%);">+/////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ns_assert_prepr(in octetstring a, in octetstring b) {</span><br><span style="color: hsl(120, 100%, 40%);">+   log("NS Input: ", a);</span><br><span style="color: hsl(120, 100%, 40%);">+       log("NS Expected: ", b);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (a != b) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Values mismatch", a, b);</span><br><span style="color: hsl(120, 100%, 40%);">+          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</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%);">+function f_ns_dec_and_log(in octetstring inp) {</span><br><span style="color: hsl(120, 100%, 40%);">+       log("NS Input: ", inp);</span><br><span style="color: hsl(120, 100%, 40%);">+     var PDU_NS dec := dec_PDU_NS(inp);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("NS Decoded: ", dec);</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%);">+testcase TC_selftest_ns() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring c_ns_reset_pcu := '000000c4271e813d'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* single byte length to two byte length */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ns_assert_prepr('04058101'O, '0405000101'O);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ns_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* two byte length to two byte length */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ns_assert_prepr('0405000101'O, '0405000101'O);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* special case: NS-UNITDATA */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ns_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* multiple TLVs */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_ns_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* zero-length */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_ns_assert_prepr('230080'O, '23000000'O);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ns_dec_and_log(c_ns_reset_pcu);</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%);">+// LLC selftest</span><br><span style="color: hsl(120, 100%, 40%);">+/////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+function f_llc_dec_and_log(in octetstring inp) {</span><br><span style="color: hsl(120, 100%, 40%);">+       log("LLC Input: ", inp);</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_LLC dec := dec_PDU_LLC(inp);</span><br><span style="color: hsl(120, 100%, 40%);">+  log("LLC Decoded: ", dec);</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%);">+function f_llc_assert(in octetstring a, in octetstring b) {</span><br><span style="color: hsl(120, 100%, 40%);">+        log("LLC Input: ", a);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("LLC Expected: ", b);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (a != b) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "LLC input ", b, " != expected ", a);</span><br><span style="color: hsl(120, 100%, 40%);">+            mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</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%);">+testcase TC_selftest_llc() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_gmm_att_pcu := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c00020170580460b'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_gmm_att_pcu_nofcs := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c000201705'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring gmm_auth_req := '081200102198c72477ea104895e8b959acc58b108182'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_llc_dec_and_log(c_gmm_att_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   //f_llc_assert(f_LLC_append_fcs(c_gmm_att_pcu_nofcs), c_gmm_att_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       log(valueof(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u)));</span><br><span style="color: hsl(120, 100%, 40%);">+  log(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u));</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%);">+///////////////////</span><br><span style="color: hsl(120, 100%, 40%);">+// RLCMAC selftest</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%);">+function f_rlcmac_ul_decenc(in octetstring buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log("==================================");</span><br><span style="color: hsl(120, 100%, 40%);">+  log("In: ", buf);</span><br><span style="color: hsl(120, 100%, 40%);">+   var RlcmacUlBlock udb := dec_RlcmacUlBlock(buf);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("Dec: ", udb);</span><br><span style="color: hsl(120, 100%, 40%);">+  var octetstring enc := enc_RlcmacUlBlock(udb);</span><br><span style="color: hsl(120, 100%, 40%);">+        log("Enc: ", enc);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (enc != buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Re-encoded data doesn't equal input data");</span><br><span style="color: hsl(120, 100%, 40%);">+           mtc.stop;</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%);">+function f_rlcmac_uld_decenc(in octetstring buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+    log("==================================");</span><br><span style="color: hsl(120, 100%, 40%);">+  log("In: ", buf);</span><br><span style="color: hsl(120, 100%, 40%);">+   var RlcmacUlDataBlock udb := dec_RlcmacUlDataBlock(buf);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("Dec: ", udb);</span><br><span style="color: hsl(120, 100%, 40%);">+  var octetstring enc := enc_RlcmacUlDataBlock(udb);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("Enc: ", enc);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (enc != buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Re-encoded data doesn't equal input data");</span><br><span style="color: hsl(120, 100%, 40%);">+           mtc.stop;</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%);">+function f_rlcmac_dld_decenc(in octetstring buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+    log("==================================");</span><br><span style="color: hsl(120, 100%, 40%);">+  log("In: ", buf);</span><br><span style="color: hsl(120, 100%, 40%);">+   var RlcmacDlDataBlock udb := dec_RlcmacDlDataBlock(buf);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("Dec: ", udb);</span><br><span style="color: hsl(120, 100%, 40%);">+  var octetstring enc := enc_RlcmacDlDataBlock(udb);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("Enc: ", enc);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (enc != buf) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Re-encoded data doesn't equal input data");</span><br><span style="color: hsl(120, 100%, 40%);">+           mtc.stop;</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%);">+testcase TC_selftest_rlcmac() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      const octetstring c_gmm_att_pcu := '402400804000000000000000'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var RlcmacDlCtrlBlock dcb;</span><br><span style="color: hsl(120, 100%, 40%);">+    var RlcmacUlCtrlBlock ucb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  // Some octstrings are concatenated to avoid Atom editor hanging: https://github.com/karolwiniarski/language-ttcn-3/issues/3</span><br><span style="color: hsl(120, 100%, 40%);">+  const octetstring c_dl_ul_ack_nack := '402400804000000000000000'O & '77628dbba14b2b2b2b2b2b'O;</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_dl_data := '0f00007341c001081200102198c72477ea104895e8b959acc58b108182f4d0454300'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring c_dl_data2 := '070002165dc0012b2b2b43c0012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;</span><br><span style="color: hsl(120, 100%, 40%);">+      const octetstring c_ul_ctrl_ack := '4006ec51b7772b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_ul_dl_ack_nack := '4008004000000000000000'O & '701000edc0000b2b2b2b2b2b'O;</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_dl_ul_assign := '482857628dbbaf0126e68800082b2b2b2b2b2b2b2b2b2b'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      log(c_dl_ul_ack_nack);</span><br><span style="color: hsl(120, 100%, 40%);">+        dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_ack_nack);</span><br><span style="color: hsl(120, 100%, 40%);">+       log(dcb);</span><br><span style="color: hsl(120, 100%, 40%);">+     //log(dec_RlcmacDlCtrlMsg(dcb.payload));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rlcmac_dld_decenc(c_dl_data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rlcmac_dld_decenc(c_dl_data2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    log(c_ul_ctrl_ack);</span><br><span style="color: hsl(120, 100%, 40%);">+   ucb := dec_RlcmacUlCtrlBlock(c_ul_ctrl_ack);</span><br><span style="color: hsl(120, 100%, 40%);">+  log(ucb);</span><br><span style="color: hsl(120, 100%, 40%);">+     //log(dec_RlcmacUlCtrlMsg(ucb.payload));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    log(c_ul_dl_ack_nack);</span><br><span style="color: hsl(120, 100%, 40%);">+        ucb := dec_RlcmacUlCtrlBlock(c_ul_dl_ack_nack);</span><br><span style="color: hsl(120, 100%, 40%);">+       log(ucb);</span><br><span style="color: hsl(120, 100%, 40%);">+     //log(dec_RlcmacUlCtrlMsg(ucb.payload));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    log(c_dl_ul_assign);</span><br><span style="color: hsl(120, 100%, 40%);">+  dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_assign);</span><br><span style="color: hsl(120, 100%, 40%);">+ log(dcb);</span><br><span style="color: hsl(120, 100%, 40%);">+     //log(dec_RlcmacDlCtrlMsg(dcb.payload));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_uld_tlli_noext := '080101a61cab5201c001080103e5e000310a0005f4e61cab5232f44000c8001d1b00'O;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rlcmac_uld_decenc(c_uld_tlli_noext);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      const octetstring c_uld_tlli_ext7pad := '0001041da61cab5200201705a96e102b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;</span><br><span style="color: hsl(120, 100%, 40%);">+      log("ULD_decenc");</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rlcmac_uld_decenc(c_uld_tlli_ext7pad);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("UL_decenc");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rlcmac_ul_decenc(c_uld_tlli_ext7pad);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rlcmac_ul_decenc(c_ul_dl_ack_nack);</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%);">+// RR selftest</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%);">+testcase TC_selftest_rr() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  //const octetstring c_paging_none := '06210001F02B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O</span><br><span style="color: hsl(120, 100%, 40%);">+  const octetstring c_paging_none := '1506210001F0'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   const octetstring c_ia_tbf := '2d063f100fe3677bd8440000c800100b2b2b2b2b2b2b2b'O</span><br><span style="color: hsl(120, 100%, 40%);">+       log(c_paging_none);</span><br><span style="color: hsl(120, 100%, 40%);">+   log(dec_GsmRrMessage(c_paging_none));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       log(c_ia_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+        log(dec_GsmRrMessage(c_ia_tbf));</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>diff --git a/pcu/README.md b/pcu/README.md</span><br><span>index a2e439a..a711410 100644</span><br><span>--- a/pcu/README.md</span><br><span>+++ b/pcu/README.md</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-# PCU_Tests.ttcn</span><br><span style="color: hsl(120, 100%, 40%);">+# PCU_Tests_RAW.ttcn</span><br><span> </span><br><span> * external interfaces</span><br><span>     * Gb (emulates SGSN side NS/BSSGP)</span><br><span>diff --git a/pcu/SGSN_Components.ttcn b/pcu/SGSN_Components.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..4bbd18c</span><br><span>--- /dev/null</span><br><span>+++ b/pcu/SGSN_Components.ttcn</span><br><span>@@ -0,0 +1,104 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module SGSN_Components {</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Osmocom PCU test suite in TTCN-3, components for BSSGP handlng</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2019 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</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%);">+import from BSSGP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSGP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from NS_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GPRS_Context all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+  BssgpConfig mp_gb_cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+            nsei := 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         bvci := 1234,</span><br><span style="color: hsl(120, 100%, 40%);">+         cell_id := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  ra_id := {</span><br><span style="color: hsl(120, 100%, 40%);">+                            lai := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      mcc_mnc := '262F42'H, lac := 13135</span><br><span style="color: hsl(120, 100%, 40%);">+                            },</span><br><span style="color: hsl(120, 100%, 40%);">+                            rac := 0</span><br><span style="color: hsl(120, 100%, 40%);">+                      },</span><br><span style="color: hsl(120, 100%, 40%);">+                    cell_id := 20960</span><br><span style="color: hsl(120, 100%, 40%);">+              },</span><br><span style="color: hsl(120, 100%, 40%);">+            sgsn_role := true,</span><br><span style="color: hsl(120, 100%, 40%);">+            depth := BSSGP_DECODE_DEPTH_BSSGP</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%);">+  NSConfiguration mp_nsconfig := {</span><br><span style="color: hsl(120, 100%, 40%);">+              local_udp_port := 23000,</span><br><span style="color: hsl(120, 100%, 40%);">+              local_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+            remote_udp_port := 21000,</span><br><span style="color: hsl(120, 100%, 40%);">+             remote_ip := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+           nsvci := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+           nsei := 2342,</span><br><span style="color: hsl(120, 100%, 40%);">+         role_sgsn := true,</span><br><span style="color: hsl(120, 100%, 40%);">+            handle_sns := true</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%);">+/* FIXME: merge this into BSSGP_Client_CT ? */</span><br><span style="color: hsl(120, 100%, 40%);">+type component bssgp_CT extends BSSGP_Client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var NS_CT ns_component;</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSGP_CT bssgp_component;</span><br><span style="color: hsl(120, 100%, 40%);">+ var boolean g_initialized := 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%);">+/* FIXME: merge this into BSSGP_Client_CT ? */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init_bssgp() runs on bssgp_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var MmContext mmctx := {</span><br><span style="color: hsl(120, 100%, 40%);">+              imsi := '262420000000001'H,</span><br><span style="color: hsl(120, 100%, 40%);">+           tlli := 'FFFFFFFF'O,</span><br><span style="color: hsl(120, 100%, 40%);">+          n_u := 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (g_initialized == true) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     g_initialized := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* create a new NS component */</span><br><span style="color: hsl(120, 100%, 40%);">+       ns_component := NS_CT.create;</span><br><span style="color: hsl(120, 100%, 40%);">+ bssgp_component := BSSGP_CT.create;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* connect our BSSGP port to the BSSGP Emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(self:BSSGP[0], bssgp_component:BSSGP_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+     connect(self:BSSGP_SIG[0], bssgp_component:BSSGP_SP_SIG);</span><br><span style="color: hsl(120, 100%, 40%);">+     connect(self:BSSGP_PROC[0], bssgp_component:BSSGP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/</span><br><span style="color: hsl(120, 100%, 40%);">+  connect(bssgp_component:BSCP, ns_component:NS_SP);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */</span><br><span style="color: hsl(120, 100%, 40%);">+     map(ns_component:NSCP, system:NS_CODEC_PORT);</span><br><span style="color: hsl(120, 100%, 40%);">+ ns_component.start(NSStart(mp_nsconfig));</span><br><span style="color: hsl(120, 100%, 40%);">+     bssgp_component.start(BssgpStart(mp_gb_cfg));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_bssgp_client_register(mmctx.imsi, mmctx.tlli, mp_gb_cfg.cell_id);</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%);">+/* Establish BSSGP connection to PCU */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_bssgp_establish() runs on BSSGP_Client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T:= 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     T.start</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSGP[0].receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSGP[0].receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+       [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout establishing BSSGP connection");</span><br><span style="color: hsl(120, 100%, 40%);">+          mtc.stop;</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%);">+     T.stop</span><br><span style="color: hsl(120, 100%, 40%);">+        log("BSSGP successfully initialized");</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>diff --git a/pcu/gen_links.sh b/pcu/gen_links.sh</span><br><span>index 9ad318c..da035cb 100755</span><br><span>--- a/pcu/gen_links.sh</span><br><span>+++ b/pcu/gen_links.sh</span><br><span>@@ -49,7 +49,7 @@</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> DIR=../library</span><br><span style="color: hsl(0, 100%, 40%);">-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc GSM_Types.ttcn GSM_RR_Types.ttcn Osmocom_Types.ttcn RLCMAC_Types.ttcn RLCMAC_CSN1_Types.ttcn RLCMAC_EncDec.cc L1CTL_Types.ttcn L1CTL_PortType.ttcn L1CTL_PortType_CtrlFunct.ttcn L1CTL_PortType_CtrlFunctDef.cc LAPDm_RAW_PT.ttcn LAPDm_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc GSM_Types.ttcn GSM_RR_Types.ttcn Osmocom_Types.ttcn RLCMAC_Types.ttcn RLCMAC_CSN1_Types.ttcn RLCMAC_EncDec.cc "</span><br><span> FILES+="NS_Emulation.ttcn NS_CodecPort.ttcn NS_CodecPort_CtrlFunct.ttcn NS_CodecPort_CtrlFunctDef.cc "</span><br><span> FILES+="BSSGP_Emulation.ttcn Osmocom_Gb_Types.ttcn "</span><br><span> FILES+="LLC_Templates.ttcn L3_Templates.ttcn L3_Common.ttcn "</span><br><span>diff --git a/pcu/osmo-bsc.cfg b/pcu/osmo-bsc.cfg</span><br><span>deleted file mode 100644</span><br><span>index c561955..0000000</span><br><span>--- a/pcu/osmo-bsc.cfg</span><br><span>+++ /dev/null</span><br><span>@@ -1,194 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-! OsmoBSC (1.1.2.236-5f22) configuration saved from vty</span><br><span style="color: hsl(0, 100%, 40%);">-!!</span><br><span style="color: hsl(0, 100%, 40%);">-password foo</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-log gsmtap 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">- logging level set-all debug</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%);">-log stderr</span><br><span style="color: hsl(0, 100%, 40%);">- logging color 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging filter all 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging print level 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging print category 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging print category-hex 0</span><br><span style="color: hsl(0, 100%, 40%);">- logging print file basename last</span><br><span style="color: hsl(0, 100%, 40%);">- logging print extended-timestamp 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging level set-all debug</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level hodec info</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level ho info</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level nm info</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level meas info</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level lmi info</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level linp notice</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level lss7 notice</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level lsccp notice</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level lsua notice</span><br><span style="color: hsl(0, 100%, 40%);">- #~ logging level lm3ua notice</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-stats interval 5</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-line vty</span><br><span style="color: hsl(0, 100%, 40%);">- no login</span><br><span style="color: hsl(0, 100%, 40%);">- bind 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-e1_input</span><br><span style="color: hsl(0, 100%, 40%);">- e1_line 0 driver ipa</span><br><span style="color: hsl(0, 100%, 40%);">- e1_line 0 port 0</span><br><span style="color: hsl(0, 100%, 40%);">- no e1_line 0 keepalive</span><br><span style="color: hsl(0, 100%, 40%);">- ipa bind 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">-cs7 instance 0</span><br><span style="color: hsl(0, 100%, 40%);">- point-code 0.23.3</span><br><span style="color: hsl(0, 100%, 40%);">- asp asp-clnt-msc-0 2905 0 m3ua</span><br><span style="color: hsl(0, 100%, 40%);">- as as-clnt-msc-0 m3ua</span><br><span style="color: hsl(0, 100%, 40%);">-  asp asp-clnt-msc-0</span><br><span style="color: hsl(0, 100%, 40%);">-  routing-key 2 0.23.3</span><br><span style="color: hsl(0, 100%, 40%);">-network</span><br><span style="color: hsl(0, 100%, 40%);">- network country code 262</span><br><span style="color: hsl(0, 100%, 40%);">- mobile network code 42</span><br><span style="color: hsl(0, 100%, 40%);">- encryption a5 0</span><br><span style="color: hsl(0, 100%, 40%);">- neci 1</span><br><span style="color: hsl(0, 100%, 40%);">- paging any use tch 0</span><br><span style="color: hsl(0, 100%, 40%);">- handover 0</span><br><span style="color: hsl(0, 100%, 40%);">- handover1 window rxlev averaging 10</span><br><span style="color: hsl(0, 100%, 40%);">- handover1 window rxqual averaging 1</span><br><span style="color: hsl(0, 100%, 40%);">- handover1 window rxlev neighbor averaging 10</span><br><span style="color: hsl(0, 100%, 40%);">- handover1 power budget interval 6</span><br><span style="color: hsl(0, 100%, 40%);">- handover1 power budget hysteresis 3</span><br><span style="color: hsl(0, 100%, 40%);">- handover1 maximum distance 9999</span><br><span style="color: hsl(0, 100%, 40%);">- periodic location update 30</span><br><span style="color: hsl(0, 100%, 40%);">- bts 0</span><br><span style="color: hsl(0, 100%, 40%);">-  type sysmobts</span><br><span style="color: hsl(0, 100%, 40%);">-  band DCS1800</span><br><span style="color: hsl(0, 100%, 40%);">-  cell_identity 20960</span><br><span style="color: hsl(0, 100%, 40%);">-  location_area_code 13135</span><br><span style="color: hsl(0, 100%, 40%);">-  dtx uplink force</span><br><span style="color: hsl(0, 100%, 40%);">-  dtx downlink</span><br><span style="color: hsl(0, 100%, 40%);">-  base_station_id_code 63</span><br><span style="color: hsl(0, 100%, 40%);">-  ms max power 15</span><br><span style="color: hsl(0, 100%, 40%);">-  cell reselection hysteresis 4</span><br><span style="color: hsl(0, 100%, 40%);">-  rxlev access min 0</span><br><span style="color: hsl(0, 100%, 40%);">-  radio-link-timeout 32</span><br><span style="color: hsl(0, 100%, 40%);">-  channel allocator ascending</span><br><span style="color: hsl(0, 100%, 40%);">-  rach tx integer 9</span><br><span style="color: hsl(0, 100%, 40%);">-  rach max transmission 7</span><br><span style="color: hsl(0, 100%, 40%);">-  channel-descrption attach 1</span><br><span style="color: hsl(0, 100%, 40%);">-  channel-descrption bs-pa-mfrms 5</span><br><span style="color: hsl(0, 100%, 40%);">-  channel-descrption bs-ag-blks-res 1</span><br><span style="color: hsl(0, 100%, 40%);">-  early-classmark-sending forbidden</span><br><span style="color: hsl(0, 100%, 40%);">-  early-classmark-sending-3g allowed</span><br><span style="color: hsl(0, 100%, 40%);">-  ip.access unit_id 1234 0</span><br><span style="color: hsl(0, 100%, 40%);">-  ip.access rsl-ip 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">-  oml ip.access stream_id 255 line 0</span><br><span style="color: hsl(0, 100%, 40%);">-  neighbor-list mode manual-si5</span><br><span style="color: hsl(0, 100%, 40%);">-  neighbor-list add arfcn 100</span><br><span style="color: hsl(0, 100%, 40%);">-  neighbor-list add arfcn 200</span><br><span style="color: hsl(0, 100%, 40%);">-  si5 neighbor-list add arfcn 10</span><br><span style="color: hsl(0, 100%, 40%);">-  si5 neighbor-list add arfcn 20</span><br><span style="color: hsl(0, 100%, 40%);">-  codec-support fr</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs mode gprs</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs 11bit_rach_support_for_egprs 0</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs routing area 0</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs network-control-order nc0</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell bvci 1234</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer blocking-timer 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer blocking-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer unblocking-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer reset-timer 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer reset-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer suspend-timer 10</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer suspend-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer resume-timer 10</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer resume-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer capability-update-timer 10</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs cell timer capability-update-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs nsei 1234</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-block 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-block-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-reset 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-reset-retries 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-test 30</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-alive 3</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs ns timer tns-alive-retries 10</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs nsvc 0 nsvci 1234</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs nsvc 0 local udp port 22000</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs nsvc 0 remote udp port 23000</span><br><span style="color: hsl(0, 100%, 40%);">-  gprs nsvc 0 remote ip 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">-  no force-combined-si</span><br><span style="color: hsl(0, 100%, 40%);">-  trx 0</span><br><span style="color: hsl(0, 100%, 40%);">-   rf_locked 0</span><br><span style="color: hsl(0, 100%, 40%);">-   arfcn 871</span><br><span style="color: hsl(0, 100%, 40%);">-   nominal power 23</span><br><span style="color: hsl(0, 100%, 40%);">-   max_power_red 20</span><br><span style="color: hsl(0, 100%, 40%);">-   rsl e1 tei 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 0</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config CCCH+SDCCH4</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 1</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 2</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 3</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 4</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 5</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 6</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   timeslot 7</span><br><span style="color: hsl(0, 100%, 40%);">-    phys_chan_config PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-    hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 1</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config TCH/F</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 2</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config TCH/F</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 3</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config TCH/F_PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 4</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config TCH/F_TCH/H_PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 5</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config TCH/H</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 6</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config SDCCH8</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-   #~ timeslot 7</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ phys_chan_config PDCH</span><br><span style="color: hsl(0, 100%, 40%);">-    #~ hopping enabled 0</span><br><span style="color: hsl(0, 100%, 40%);">-msc 0</span><br><span style="color: hsl(0, 100%, 40%);">- core-location-area-code 666</span><br><span style="color: hsl(0, 100%, 40%);">- core-cell-identity 333</span><br><span style="color: hsl(0, 100%, 40%);">- ip.access rtp-base 4000</span><br><span style="color: hsl(0, 100%, 40%);">- timeout-ping 12</span><br><span style="color: hsl(0, 100%, 40%);">- timeout-pong 14</span><br><span style="color: hsl(0, 100%, 40%);">- no timeout-ping advanced</span><br><span style="color: hsl(0, 100%, 40%);">- no bsc-welcome-text</span><br><span style="color: hsl(0, 100%, 40%);">- no bsc-msc-lost-text</span><br><span style="color: hsl(0, 100%, 40%);">- no bsc-grace-text</span><br><span style="color: hsl(0, 100%, 40%);">- codec-list fr1 fr2 fr3</span><br><span style="color: hsl(0, 100%, 40%);">- type normal</span><br><span style="color: hsl(0, 100%, 40%);">- allow-emergency allow</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 12_2k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 10_2k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 7_95k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 7_40k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 6_70k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 5_90k allowed</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 5_15k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">- amr-config 4_75k forbidden</span><br><span style="color: hsl(0, 100%, 40%);">-bsc</span><br><span style="color: hsl(0, 100%, 40%);">- mid-call-timeout 0</span><br><span style="color: hsl(0, 100%, 40%);">- no missing-msc-text</span><br><span style="color: hsl(0, 100%, 40%);">- access-list-name bsc-list</span><br><span>diff --git a/pcu/osmo-bts.cfg b/pcu/osmo-bts.cfg</span><br><span>deleted file mode 100644</span><br><span>index 7f36f87..0000000</span><br><span>--- a/pcu/osmo-bts.cfg</span><br><span>+++ /dev/null</span><br><span>@@ -1,83 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-! OsmoBTS (0.4.0.446-e0fb) configuration saved from vty</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%);">-log gsmtap 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">- logging level set-all debug</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-log stderr</span><br><span style="color: hsl(0, 100%, 40%);">- logging filter all 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging color 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging print category 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging timestamp 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging print extended-timestamp 1</span><br><span style="color: hsl(0, 100%, 40%);">- logging level rsl info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level oml info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level rll notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level rr notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level meas info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level pag info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level l1c info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level l1p notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level dsp info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level pcu debug</span><br><span style="color: hsl(0, 100%, 40%);">- logging level ho notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level trx info</span><br><span style="color: hsl(0, 100%, 40%);">- logging level loop notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level abis notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level rtp notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level sum notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lglobal notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level llapd notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level linp notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lmux notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lmi notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lmib debug</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lsms notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lctrl notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lgtp notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lstats notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lgsup notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level loap notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lss7 notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lsccp notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lsua notice</span><br><span style="color: hsl(0, 100%, 40%);">- logging level lm3ua notice</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-line vty</span><br><span style="color: hsl(0, 100%, 40%);">- no login</span><br><span style="color: hsl(0, 100%, 40%);">- bind 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">-!</span><br><span style="color: hsl(0, 100%, 40%);">-e1_input</span><br><span style="color: hsl(0, 100%, 40%);">- e1_line 0 driver ipa</span><br><span style="color: hsl(0, 100%, 40%);">- e1_line 0 port 0</span><br><span style="color: hsl(0, 100%, 40%);">- no e1_line 0 keepalive</span><br><span style="color: hsl(0, 100%, 40%);">-phy 0</span><br><span style="color: hsl(0, 100%, 40%);">- !virtual-um ms-multicast-group 239.193.23.1</span><br><span style="color: hsl(0, 100%, 40%);">- !virtual-um bts-multicast-group 239.193.23.2</span><br><span style="color: hsl(0, 100%, 40%);">- instance 0</span><br><span style="color: hsl(0, 100%, 40%);">-bts 0</span><br><span style="color: hsl(0, 100%, 40%);">- band DCS1800</span><br><span style="color: hsl(0, 100%, 40%);">- ipa unit-id 1234 0</span><br><span style="color: hsl(0, 100%, 40%);">- oml remote-ip 127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">- rtp jitter-buffer 100</span><br><span style="color: hsl(0, 100%, 40%);">- paging queue-size 200</span><br><span style="color: hsl(0, 100%, 40%);">- paging lifetime 0</span><br><span style="color: hsl(0, 100%, 40%);">- uplink-power-target -75</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap-sapi rach</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap-sapi agch</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap-sapi bcch</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap-sapi pch</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap-sapi sdcch</span><br><span style="color: hsl(0, 100%, 40%);">- gsmtap-sapi sacch</span><br><span style="color: hsl(0, 100%, 40%);">- min-qual-rach 50</span><br><span style="color: hsl(0, 100%, 40%);">- min-qual-norm -5</span><br><span style="color: hsl(0, 100%, 40%);">- pcu-socket /tmp/pcu_bts</span><br><span style="color: hsl(0, 100%, 40%);">- trx 0</span><br><span style="color: hsl(0, 100%, 40%);">-  power-ramp max-initial 0 mdBm</span><br><span style="color: hsl(0, 100%, 40%);">-  power-ramp step-size 2000 mdB</span><br><span style="color: hsl(0, 100%, 40%);">-  power-ramp step-interval 1</span><br><span style="color: hsl(0, 100%, 40%);">-  ms-power-control dsp</span><br><span style="color: hsl(0, 100%, 40%);">-  phy 0 instance 0</span><br><span style="color: hsl(0, 100%, 40%);">-ctrl</span><br><span style="color: hsl(0, 100%, 40%);">- bind 127.0.0.1</span><br><span>diff --git a/pcu/regen_makefile.sh b/pcu/regen_makefile.sh</span><br><span>index c2f636d..6fd000e 100755</span><br><span>--- a/pcu/regen_makefile.sh</span><br><span>+++ b/pcu/regen_makefile.sh</span><br><span>@@ -1,5 +1,5 @@</span><br><span> #!/bin/sh</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-FILES="*.ttcn BSSGP_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc UD_PT.cc RLCMAC_EncDec.cc LLC_EncDec.cc L1CTL_PortType_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn BSSGP_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc NS_CodecPort_CtrlFunctDef.cc UD_PT.cc RLCMAC_EncDec.cc LLC_EncDec.cc TELNETasp_PT.cc Native_FunctionDefs.cc"</span><br><span> </span><br><span> ../regen-makefile.sh PCU_Tests.ttcn $FILES</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16321">change 16321</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-ttcn3-hacks/+/16321"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie862a1525e9f4f9a3f2427ac3898810e3d044d2f </div>
<div style="display:none"> Gerrit-Change-Number: 16321 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </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: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>