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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: CBCH related tests for OsmoBTS<br><br>This introduces a set of CBCH related tests for osmo-bts.<br><br>Warning: Those tests currently require a patched trxcon to work.<br><br>Related: OS#4011<br>Change-Id: I955b4000c12180a39b0205b69b7b2c8cee8c9da3<br>---<br>M bts/BTS_Tests.cfg<br>M bts/BTS_Tests.ttcn<br>A bts/BTS_Tests_SMSCB.ttcn<br>3 files changed, 353 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests.cfg b/bts/BTS_Tests.cfg</span><br><span>index d365a06..a7ce68d 100644</span><br><span>--- a/bts/BTS_Tests.cfg</span><br><span>+++ b/bts/BTS_Tests.cfg</span><br><span>@@ -30,3 +30,4 @@</span><br><span> </span><br><span> [EXECUTE]</span><br><span> BTS_Tests.control</span><br><span style="color: hsl(120, 100%, 40%);">+BTS_Tests_SMSCB.control</span><br><span>diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn</span><br><span>index 076476f..7912ff6 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -35,6 +35,8 @@</span><br><span> import from Osmocom_VTY_Functions all;</span><br><span> import from TELNETasp_PortType all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+friend module BTS_Tests_SMSCB;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* The tests assume a BTS with the following timeslot configuration:</span><br><span>  * TS0 : Combined CCCH + SDCCH/4</span><br><span>  * TS1 : TCH/F</span><br><span>@@ -254,13 +256,13 @@</span><br><span>    f_rsl_bcch_fill_raw(rsl_si_type, si_enc);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_init_vty(charstring id) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_vty(charstring id) runs on test_CT {</span><br><span>  map(self:BTSVTY, system:BTSVTY);</span><br><span>     f_vty_set_prompts(BTSVTY);</span><br><span>   f_vty_transceive(BTSVTY, "enable");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_init_vty_bsc() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_vty_bsc() runs on test_CT {</span><br><span>        map(self:BSCVTY, system:BSCVTY);</span><br><span>     f_vty_set_prompts(BSCVTY, "OsmoBSC");</span><br><span>      f_vty_transceive(BSCVTY, "enable");</span><br><span>@@ -418,7 +420,7 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_l1_tune(L1CTL_PT L1CTL) {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_l1_tune(L1CTL_PT L1CTL) {</span><br><span>  f_L1CTL_FBSB(L1CTL, { false, mp_trx0_arfcn }, CCCH_MODE_COMBINED, mp_rxlev_exp);</span><br><span> }</span><br><span> </span><br><span>@@ -4571,9 +4573,6 @@</span><br><span> /* receptiom of SABM in multi-frame established state */</span><br><span> </span><br><span> </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> /* TODO Areas:</span><br><span> </span><br><span> * channel activation</span><br><span>diff --git a/bts/BTS_Tests_SMSCB.ttcn b/bts/BTS_Tests_SMSCB.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..6cb257c</span><br><span>--- /dev/null</span><br><span>+++ b/bts/BTS_Tests_SMSCB.ttcn</span><br><span>@@ -0,0 +1,347 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module BTS_Tests_SMSCB {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for OsmoBTS</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by Harald Welte <laforge@gnumonks.org></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%);">+ * This test suite tests the SMSCB (Cell Broadcast) related functionality of</span><br><span style="color: hsl(120, 100%, 40%);">+ * OsmoBTS by attaching to the A-bis RSL and Um interface and emulating both</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSC and MS.</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 Misc_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from L1CTL_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from L1CTL_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from LAPDm_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSL_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from BTS_Tests all;</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%);">+ * Cell Broadcast related tests</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%);">+type record CbchTestPars {</span><br><span style="color: hsl(120, 100%, 40%);">+  boolean         use_sdcch4,</span><br><span style="color: hsl(120, 100%, 40%);">+   CbchTestMsgs    msgs</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%);">+type record CbchTestMsg {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* config / input data */</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL_CbCommand   rsl_cb_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   uint2_t         last_block, /* 0..3 */</span><br><span style="color: hsl(120, 100%, 40%);">+        octetstring     payload,</span><br><span style="color: hsl(120, 100%, 40%);">+      /* computed / result data */</span><br><span style="color: hsl(120, 100%, 40%);">+  CbchBlocks      blocks optional</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of CbchTestMsg CbchTestMsgs;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* a single 22byte block within a CbchTestMsg */</span><br><span style="color: hsl(120, 100%, 40%);">+type record CbchBlock {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint4_t         seq_nr, /* as per TS 04.12 */</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean         is_last,</span><br><span style="color: hsl(120, 100%, 40%);">+      OCT22           payload,</span><br><span style="color: hsl(120, 100%, 40%);">+      boolean         seen_once</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of CbchBlock CbchBlocks;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* compute the expected blocks for given test parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbch_compute_exp_blocks(inout CbchTestPars pars) {</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          pars.msgs[i].blocks := f_comp_blocks(pars.msgs[i]);</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%);">+private function f_comp_blocks(in CbchTestMsg msg) return CbchBlocks {</span><br><span style="color: hsl(120, 100%, 40%);">+  var CbchBlocks blocks := {};</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i := 0; i <= msg.last_block; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var CbchBlock block := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      seq_nr := i,</span><br><span style="color: hsl(120, 100%, 40%);">+                  is_last := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                     payload := substr(msg.payload, 22*i, 22),</span><br><span style="color: hsl(120, 100%, 40%);">+                     seen_once := false</span><br><span style="color: hsl(120, 100%, 40%);">+                    };</span><br><span style="color: hsl(120, 100%, 40%);">+            if (msg.rsl_cb_cmd == RSL_CB_CMD_SCHEDULE and i == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       block.seq_nr := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (i == msg.last_block) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    block.is_last := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             blocks := blocks & {block};</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%);">+   return blocks;</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%);">+/* TS 48.058 Section 9.3.41 */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbch_block_nr2rsl(uint2_t nr) return uint2_t {</span><br><span style="color: hsl(120, 100%, 40%);">+       select (nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case (0) { return 1; }</span><br><span style="color: hsl(120, 100%, 40%);">+        case (1) { return 2; }</span><br><span style="color: hsl(120, 100%, 40%);">+        case (2) { return 3; }</span><br><span style="color: hsl(120, 100%, 40%);">+        case (3) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(fail, "Invalid block number");</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%);">+/* Verify the CBCH TB scheduling rules of TS 05.02 Section 6.5.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbch_fn_verify(uint32_t fn, CBCH_Block cb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer tb := (fn/51) mod 8; /* TS 05.02 Section 6.5.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cb.block_type.seq_nr == 15 /* null */) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* always permitted */</span><br><span style="color: hsl(120, 100%, 40%);">+                return;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else if (cb.block_type.seq_nr == 8 /* schedule */) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (tb != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "Schedule block at TB=", tb);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (cb.block_type.seq_nr < 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (cb.block_type.seq_nr != tb and cb.block_type.seq_nr+4 != tb) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Normal block at wrong TB=", tb, ": ", cb);</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%);">+/* shared function doing the heavy lifting for most CBCH tests */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_smscb(CbchTestPars pars) 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 boolean cmd_seen_once := false;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_cbch_compute_exp_blocks(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_vty_bsc();</span><br><span style="color: hsl(120, 100%, 40%);">+     /* ensure that a CBCH is present in channel combination */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pars.use_sdcch4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"},</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "phys_chan_config CCCH+SDCCH4+CBCH");</span><br><span style="color: hsl(120, 100%, 40%);">+               f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"},</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "phys_chan_config SDCCH8");</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"},</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "phys_chan_config CCCH+SDCCH4");</span><br><span style="color: hsl(120, 100%, 40%);">+            f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"},</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "phys_chan_config SDCCH8+CBCH");</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(BSCVTY, "drop bts connection 0 oml");</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(testcasename());</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+     /* FIXME: switch to dedicated mode for SDCCH/8 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* send SMSCB[s] via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var CbchTestMsg msg := pars.msgs[i];</span><br><span style="color: hsl(120, 100%, 40%);">+          var uint2_t rsl_last_block := f_cbch_block_nr2rsl(msg.last_block);</span><br><span style="color: hsl(120, 100%, 40%);">+            var RSL_IE_CbCommandType cmd_type :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                  valueof(ts_RSL_IE_CbCmdType(msg.rsl_cb_cmd, rsl_last_block));</span><br><span style="color: hsl(120, 100%, 40%);">+         RSL_CCHAN.send(ts_RSL_UD(ts_RSL_SMSCB_CMD(cmd_type, msg.payload)));</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%);">+      /* Expect this to show up exactly once on the basic CBCH (four blocks) */</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    /* FIXME: Channel Nr for SDCCH/8 */</span><br><span style="color: hsl(120, 100%, 40%);">+        [] L1CTL.receive(tr_L1CTL_DATA_IND(t_RslChanNr_CBCH(0))) -> value dl {</span><br><span style="color: hsl(120, 100%, 40%);">+             log("CBCH: ", dl);</span><br><span style="color: hsl(120, 100%, 40%);">+          var CBCH_Block cb := dec_CBCH_Block(dl.payload.data_ind.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* detect the proper CBCH messages; check frame number */</span><br><span style="color: hsl(120, 100%, 40%);">+             f_cbch_fn_verify(dl.dl_info.frame_nr, cb);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not match(cb, tr_CBCH_Block)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Illegal CBCH Block received: ", cb);</span><br><span style="color: hsl(120, 100%, 40%);">+              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      var boolean matched := false;</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* ignore NULL messages */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (match(cb, tr_CBCH_Block(15, ?, ?))) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+                   for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          for (j := 0; j < lengthof(pars.msgs[i].blocks); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        var CbchBlock b := pars.msgs[i].blocks[j];</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (match(cb, tr_CBCH_Block(b.seq_nr, b.is_last, b.payload))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               if (not pars.msgs[i].blocks[j].seen_once) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   pars.msgs[i].blocks[j].seen_once := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                                             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      setverdict(fail, "Received SMSCB twice! ", cb);</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                                             matched := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                                              continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (not matched) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            setverdict(fail, "Received unexpected CBCH block: ", cb);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+                     repeat;</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%);">+     [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  for (j := 0; j < lengthof(pars.msgs[i].blocks); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                var CbchBlock b := pars.msgs[i].blocks[j];</span><br><span style="color: hsl(120, 100%, 40%);">+                            if (not b.seen_once) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        setverdict(fail, "Timeout waiting for CBCH");</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%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* reset timeslot 0 channel combination to default */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"},</span><br><span style="color: hsl(120, 100%, 40%);">+                            "phys_chan_config CCCH+SDCCH4");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"},</span><br><span style="color: hsl(120, 100%, 40%);">+                            "phys_chan_config SDCCH8");</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%);">+private const CbchTestMsgs msgs_1m_1b_norm := {</span><br><span style="color: hsl(120, 100%, 40%);">+   { RSL_CB_CMD_NORMAL, 0, '001000320f1141660c344dd3cba09a0c000000000000'O, omit }</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%);">+private const CbchTestMsgs msgs_1m_2b_norm := {</span><br><span style="color: hsl(120, 100%, 40%);">+ { RSL_CB_CMD_NORMAL, 1, '001000320f1141660c344dd3cba09a0c000000000000'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                         '000102030405060708090a0b0c0d0e0f101213141516'O,</span><br><span style="color: hsl(120, 100%, 40%);">+        omit }</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%);">+private const CbchTestMsgs msgs_1m_3b_norm := {</span><br><span style="color: hsl(120, 100%, 40%);">+        { RSL_CB_CMD_NORMAL, 2, '001000320f1141660c344dd3cba09a0c000000000000'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                         '000102030405060708090a0b0c0d0e0f101213141516'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                         '101112131415161718191a1b1c1d1e1f202223242526'O,</span><br><span style="color: hsl(120, 100%, 40%);">+        omit }</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%);">+private const CbchTestMsgs msgs_1m_4b_norm := {</span><br><span style="color: hsl(120, 100%, 40%);">+        { RSL_CB_CMD_NORMAL, 3, '001000320f1141660c344dd3cba09a0c000000000000'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                         '000102030405060708090a0b0c0d0e0f101213141516'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                         '101112131415161718191a1b1c1d1e1f202223242526'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                         '202122232425262728292a2b2c2d2e2f303233343536'O,</span><br><span style="color: hsl(120, 100%, 40%);">+        omit }</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%);">+private const CbchTestMsgs msgs_1m_4b_sched := {</span><br><span style="color: hsl(120, 100%, 40%);">+       { RSL_CB_CMD_SCHEDULE, 3, '001000320f1141660c344dd3cba09a0c000000000000'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                                 '000102030405060708090a0b0c0d0e0f101213141516'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                                 '101112131415161718191a1b1c1d1e1f202223242526'O &</span><br><span style="color: hsl(120, 100%, 40%);">+                                 '202122232425262728292a2b2c2d2e2f303233343536'O,</span><br><span style="color: hsl(120, 100%, 40%);">+      omit }</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%);">+/* transmit single-block SMSCB COMMAND */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch4_1block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := true,</span><br><span style="color: hsl(120, 100%, 40%);">+           msgs := msgs_1m_1b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch8_1block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          msgs := msgs_1m_1b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</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%);">+/* transmit dual-block SMSCB COMMAND */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch4_2block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := true,</span><br><span style="color: hsl(120, 100%, 40%);">+           msgs := msgs_1m_2b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch8_2block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          msgs := msgs_1m_2b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</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%);">+/* transmit triple-block SMSCB COMMAND */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch4_3block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := true,</span><br><span style="color: hsl(120, 100%, 40%);">+           msgs := msgs_1m_3b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch8_3block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          msgs := msgs_1m_3b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</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%);">+/* transmit quad-block SMSCB COMMAND */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch4_4block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := true,</span><br><span style="color: hsl(120, 100%, 40%);">+           msgs := msgs_1m_4b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch8_4block() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          msgs := msgs_1m_4b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</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%);">+/* transmit SMSCB COMMAND with SCHEDULE payload */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch4_schedule() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := true,</span><br><span style="color: hsl(120, 100%, 40%);">+           msgs := msgs_1m_4b_sched</span><br><span style="color: hsl(120, 100%, 40%);">+      };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_sdcch8_schedule() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var CbchTestPars pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+            use_sdcch4 := false,</span><br><span style="color: hsl(120, 100%, 40%);">+          msgs := msgs_1m_4b_sched</span><br><span style="color: hsl(120, 100%, 40%);">+      };</span><br><span style="color: hsl(120, 100%, 40%);">+    f_TC_smscb(pars);</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%);">+/* SMSCB TODO:</span><br><span style="color: hsl(120, 100%, 40%);">+   * multiple SMS BC CMD at the same time: Ensure all of them are sent exactly once</span><br><span style="color: hsl(120, 100%, 40%);">+   * extended CBCH vs. normal CBCH</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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_sms_cb_cmd_sdcch4_1block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch4_2block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch4_3block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch4_4block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch4_schedule() );</span><br><span style="color: hsl(120, 100%, 40%);">+   if (false) { /* FIXME: SDCCH/8 support broken, needs trxcon + L1CTL work */</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_sms_cb_cmd_sdcch8_1block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch8_2block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch8_3block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch8_4block() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_sms_cb_cmd_sdcch8_schedule() );</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%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10983">change 10983</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/10983"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I955b4000c12180a39b0205b69b7b2c8cee8c9da3 </div>
<div style="display:none"> Gerrit-Change-Number: 10983 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>