<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15792">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS_Tests.ttcn: add a test case for PTCCH/D and PTCCH/U<br><br>This test case is aimed to verify handling of both PTCCH/U and<br>PTCCH/D logical channels, recently implemented in [1]. This is<br>done by sending 16 Access Bursts on PTCCH/U, and then by<br>sending a random data block on PTCCH/D.<br><br>The existing TC_pcu_data_req_ptcch does not cover PTCCH/U, and<br>moreover involves TBF handling which has nothing to do with<br>PTCCH. Let's keep it anyway.<br><br>[1] I232e5f514fbad2c51daaa59ff516004aba97c8a3<br><br>Change-Id: I011ffdfa63b698ce6085968d15ffb4ff4bd23ee5<br>Related: OS#4102<br>---<br>M bts/BTS_Tests.ttcn<br>M library/GSM_Types.ttcn<br>2 files changed, 105 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/92/15792/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn</span><br><span>index 2c11ca2..2d0115b 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -4143,6 +4143,7 @@</span><br><span>     f_pcu_to_l1(0, 0, 7, PCU_IF_SAPI_PDTCH, data); //c_PCU_DATA);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* FIXME: PTTCH has nothing to do with TBFs */</span><br><span> testcase TC_pcu_data_req_ptcch() runs on test_CT {</span><br><span>         var TfiUsfArr tua := f_TfiUsfArrInit();</span><br><span>      var octetstring data := '0000'O & f_rnd_octstring(21);</span><br><span>@@ -4157,6 +4158,94 @@</span><br><span>  f_pcu_to_l1(0, 0, 7, PCU_IF_SAPI_PTCCH, data);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_pcu_ptcch_ul(uint16_t ra)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var template PCUIF_Message pcu_rach_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+      var PCUIF_send_data sd;</span><br><span style="color: hsl(120, 100%, 40%);">+       var GsmFrameNumber fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Send an Access Burst on PTCCH/U over the Um-interface */</span><br><span style="color: hsl(120, 100%, 40%);">+   fn := f_L1CTL_RACH(L1CTL, ra := ra, combined := 0, offset := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                          chan_nr := ts_RslChanNr_PDCH(7),</span><br><span style="color: hsl(120, 100%, 40%);">+                      link_id := ts_RslLinkID_OSMO_PTCCH(0));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TODO: check time-slot and TRX number as soon as we extend the PCU interface */</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_rach_ind := tr_PCUIF_RACH_IND(ra := ra, fn := fn, sapi := PCU_IF_SAPI_PTCCH);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Expect a RACH.ind on the PCU interface (timeout is one multi-frame) */</span><br><span style="color: hsl(120, 100%, 40%);">+     T.start(52.0 * 4.615 / 1000.0);</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, pcu_rach_ind)) -> value sd {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("Rx an Access Burst on the PCU interface: ", sd.data);</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] PCU.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 waiting for RACH.ind on the PCU interface");</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Keep going, that's not the end of the world */</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%);">+testcase TC_pcu_ptcch() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var L1ctlDlMessage dl;</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_pcu_test();</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_l1ctl();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_l1_tune(L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Activate PDCH channel on TS7 */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_pcu_act_req(0, 0, 7, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Tune trxcon to that PDCH channel */</span><br><span style="color: hsl(120, 100%, 40%);">+        L1CTL.send(ts_L1CTL_DM_EST_REQ(arfcn := { false, mp_trx0_arfcn },</span><br><span style="color: hsl(120, 100%, 40%);">+                                    chan_nr := valueof(ts_RslChanNr_PDCH(7)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                     tsc := 7));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Verify PTCCH/U: send several access bursts, make sure they're received */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer i := 0; i < 16; i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             log("Sending an Access Burst towards the L1CTL interface");</span><br><span style="color: hsl(120, 100%, 40%);">+         f_TC_pcu_ptcch_ul(oct2int(f_rnd_ra_ps()));</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%);">+   /* Generate a random payload for PTCCH/D (23 octets, CS-1) */</span><br><span style="color: hsl(120, 100%, 40%);">+ data := f_rnd_octstring(23);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Verify PTCCH/D: send a random data block, make sure it's received */</span><br><span style="color: hsl(120, 100%, 40%);">+   log("Sending a PTCCH/D block towards the PCU interface: ", data);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_pcu_wait_rts_and_data_req(0, 0, 7, PCU_IF_SAPI_PTCCH, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* PTCCH/D period is 2 multi-frames (2 * 52 * 4.615 ms), but</span><br><span style="color: hsl(120, 100%, 40%);">+   * let's give it more time in case if we miss the beginning. */</span><br><span style="color: hsl(120, 100%, 40%);">+   T.start(2.0 * 2.0 * 52.0 * 4.615 / 1000.0);</span><br><span style="color: hsl(120, 100%, 40%);">+   alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* PDCH is considered as traffic in trxcon => expect TRAFFIC.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+        [] L1CTL.receive(tr_L1CTL_TRAFFIC_IND(chan_nr := t_RslChanNr_PDCH(7),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       link_id := tr_RslLinkID_OSMO_PTCCH(?),</span><br><span style="color: hsl(120, 100%, 40%);">+                                        frame := data)) -> value dl {</span><br><span style="color: hsl(120, 100%, 40%);">+                log("Rx PTCCH/D data (traffic) block on L1CTL: ", dl);</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Other PHYs (e.g. virt_phy) may consider PDCH as data => expect DATA.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+      [] L1CTL.receive(tr_L1CTL_DATA_IND(chan_nr := t_RslChanNr_PDCH(7),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       link_id := tr_RslLinkID_OSMO_PTCCH(?),</span><br><span style="color: hsl(120, 100%, 40%);">+                                        l2_data := data)) -> value dl {</span><br><span style="color: hsl(120, 100%, 40%);">+         log("Rx PTCCH/D data block on L1CTL: ", dl);</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] L1CTL.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 waiting for DATA.ind on L1CTL");</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> /* Send AGCH from PCU; check it appears on Um side */</span><br><span> testcase TC_pcu_data_req_agch() runs on test_CT {</span><br><span>         timer T := 3.0;</span><br><span>@@ -6251,6 +6340,7 @@</span><br><span>              execute( TC_pcu_deact_req_wrong_ts() );</span><br><span>              execute( TC_pcu_ver_si13() );</span><br><span>                if (mp_l1_supports_gprs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    execute( TC_pcu_ptcch() );</span><br><span>                   execute( TC_pcu_data_req_pdtch() );</span><br><span>                  execute( TC_pcu_data_req_ptcch() );</span><br><span>                  execute( TC_pcu_data_req_wrong_bts() );</span><br><span>diff --git a/library/GSM_Types.ttcn b/library/GSM_Types.ttcn</span><br><span>index ec74ce5..ee6d132 100644</span><br><span>--- a/library/GSM_Types.ttcn</span><br><span>+++ b/library/GSM_Types.ttcn</span><br><span>@@ -158,7 +158,8 @@</span><br><span>   /* TS 48.058 9.3.2 Link ID */</span><br><span>        type enumerated RslLinkIdC {</span><br><span>                 FACCH_SDCCH     (0),</span><br><span style="color: hsl(0, 100%, 40%);">-            SACCH           (1)</span><br><span style="color: hsl(120, 100%, 40%);">+           SACCH           (1),</span><br><span style="color: hsl(120, 100%, 40%);">+          OSMO_PTCCH      (2) /* Osmocom (trxcon) specific extension */</span><br><span>        } with { variant "FIELDLENGTH(2)" };</span><br><span> </span><br><span>   type enumerated RslSapi0Prio {</span><br><span>@@ -195,6 +196,12 @@</span><br><span>                sapi := sapi</span><br><span>         };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        template RslLinkId tr_RslLinkID_OSMO_PTCCH(template GsmSapi sapi) modifies tr_RslLinkId := {</span><br><span style="color: hsl(120, 100%, 40%);">+          c := OSMO_PTCCH,</span><br><span style="color: hsl(120, 100%, 40%);">+              na := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          sapi := sapi</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         template (value) RslLinkId ts_RslLinkID_DCCH(GsmSapi sapi) := {</span><br><span>              c := FACCH_SDCCH,</span><br><span>            na := false,</span><br><span>@@ -209,6 +216,13 @@</span><br><span>          sapi := sapi</span><br><span>         };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        template (value) RslLinkId ts_RslLinkID_OSMO_PTCCH(GsmSapi sapi) := {</span><br><span style="color: hsl(120, 100%, 40%);">+         c := OSMO_PTCCH,</span><br><span style="color: hsl(120, 100%, 40%);">+              na := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          prio := SAPI0_PRIO_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+            sapi := sapi</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         function f_hex_is_odd_length(hexstring digits) return bitstring {</span><br><span>            if (lengthof(digits) rem 2 == 1) {</span><br><span>                   return '1'B;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15792">change 15792</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/+/15792"/><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: I011ffdfa63b698ce6085968d15ffb4ff4bd23ee5 </div>
<div style="display:none"> Gerrit-Change-Number: 15792 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>