<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/14107">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: Refactor code to support mixed DEFAULT + NORMAL and EXTENDED CBCH<br><br>The existing code structure could only test for normal messages with a<br>NULL default, but didn't handle situations where normal and/or schedule<br>messages were superimposed on top of DEFAULT messages.<br><br>Also, prepare the infrastructure for testing both CBCH BASIC and CBCH<br>EXTENDED.<br><br>No new tests are introduced, the code should behave identical before<br>and after this patch.<br><br>Change-Id: I144c7d833b79c648b1ac69a6155f3603025ede5c<br>Related: OS#4011<br>---<br>M bts/BTS_Tests_SMSCB.ttcn<br>M library/RSL_Types.ttcn<br>2 files changed, 220 insertions(+), 62 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests_SMSCB.ttcn b/bts/BTS_Tests_SMSCB.ttcn</span><br><span>index c991877..e1efd63 100644</span><br><span>--- a/bts/BTS_Tests_SMSCB.ttcn</span><br><span>+++ b/bts/BTS_Tests_SMSCB.ttcn</span><br><span>@@ -30,9 +30,28 @@</span><br><span>  * Cell Broadcast related tests</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Test parameters for one channel (e.g. Basic, Extended) */</span><br><span style="color: hsl(120, 100%, 40%);">+type record CbchTestParsChan {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* list of "normal" (sent-once) SMSCB messages */</span><br><span style="color: hsl(120, 100%, 40%);">+   CbchTestMsgs    msgs,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* default message, if any */</span><br><span style="color: hsl(120, 100%, 40%);">+ CbchTestMsg     default_msg optional</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 template (value) CbchTestParsChan</span><br><span style="color: hsl(120, 100%, 40%);">+t_CbchPC(template (value) CbchTestMsgs msgs, template (omit) CbchTestMsg def := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      msgs := msgs,</span><br><span style="color: hsl(120, 100%, 40%);">+ default_msg := def</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%);">+/* CBCH test parameters for most of our tests */</span><br><span> type record CbchTestPars {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* should we execute on SDCCH4 (true) or SDCCH8 (false) ? */</span><br><span>         boolean         use_sdcch4,</span><br><span style="color: hsl(0, 100%, 40%);">-     CbchTestMsgs    msgs</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parameters for BASIC CBCH */</span><br><span style="color: hsl(120, 100%, 40%);">+       CbchTestParsChan basic,</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Parameters for EXTENDED CBCH */</span><br><span style="color: hsl(120, 100%, 40%);">+    CbchTestParsChan extended optional</span><br><span> };</span><br><span> </span><br><span> type record CbchTestMsg {</span><br><span>@@ -56,10 +75,18 @@</span><br><span> </span><br><span> /* compute the expected blocks for given test parameters */</span><br><span> private function f_cbch_compute_exp_blocks(inout CbchTestPars pars) {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_cbch_compute_exp_blocks_chan(pars.basic);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ispresent(pars.extended)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_cbch_compute_exp_blocks_chan(pars.extended);</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_cbch_compute_exp_blocks_chan(inout CbchTestParsChan pars_chan) {</span><br><span>    var integer i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            pars.msgs[i].blocks := f_comp_blocks(pars.msgs[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i := 0; i < lengthof(pars_chan.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             pars_chan.msgs[i].blocks := f_comp_blocks(pars_chan.msgs[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ispresent(pars_chan.default_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               pars_chan.default_msg.blocks := f_comp_blocks(pars_chan.default_msg);</span><br><span>        }</span><br><span> }</span><br><span> private function f_comp_blocks(in CbchTestMsg msg) return CbchBlocks {</span><br><span>@@ -127,8 +154,39 @@</span><br><span>      RSL_CCHAN.send(ts_RSL_UD(ts_RSL_SMSCB_CMD(cmd_type, ''O)));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_smscb_setup(inout CbchTestPars pars) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+template RSL_IE t_RSL_IE_SMSCB_EXT := t_RSL_IE(RSL_IE_SMSCB_CHAN_INDICATOR, {smscb_chan_ind := 1});</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_smscb_setup_rsl_chan(inout CbchTestParsChan pars_chan, boolean extd := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span>    var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+        var CbchTestMsg msg;</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint2_t rsl_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%);">+    var RSL_Message rsl;</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_chan.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             msg := pars_chan.msgs[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             rsl_last_block := f_cbch_block_nr2rsl(msg.last_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                cmd_type := valueof(ts_RSL_IE_CbCmdType(msg.rsl_cb_cmd, rsl_last_block));</span><br><span style="color: hsl(120, 100%, 40%);">+             rsl := valueof(ts_RSL_SMSCB_CMD(cmd_type, msg.payload));</span><br><span style="color: hsl(120, 100%, 40%);">+              if (extd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   rsl.ies := rsl.ies & { valueof(t_RSL_IE_SMSCB_EXT) };</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL_CCHAN.send(ts_RSL_UD(rsl));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ispresent(pars_chan.default_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               msg := pars_chan.default_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+         rsl_last_block := f_cbch_block_nr2rsl(msg.last_block);</span><br><span style="color: hsl(120, 100%, 40%);">+                cmd_type := valueof(ts_RSL_IE_CbCmdType(msg.rsl_cb_cmd, rsl_last_block, false));</span><br><span style="color: hsl(120, 100%, 40%);">+              rsl := valueof(ts_RSL_SMSCB_CMD(cmd_type, msg.payload));</span><br><span style="color: hsl(120, 100%, 40%);">+              if (extd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   rsl.ies := rsl.ies & { valueof(t_RSL_IE_SMSCB_EXT) };</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL_CCHAN.send(ts_RSL_UD(rsl));</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_smscb_setup(inout CbchTestPars pars) runs on test_CT {</span><br><span> </span><br><span>  f_cbch_compute_exp_blocks(pars);</span><br><span> </span><br><span>@@ -154,12 +212,9 @@</span><br><span>  /* FIXME: switch to dedicated mode for SDCCH/8 */</span><br><span> </span><br><span>        /* send SMSCB[s] via RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            var CbchTestMsg msg := pars.msgs[i];</span><br><span style="color: hsl(0, 100%, 40%);">-            var uint2_t rsl_last_block := f_cbch_block_nr2rsl(msg.last_block);</span><br><span style="color: hsl(0, 100%, 40%);">-              var RSL_IE_CbCommandType cmd_type :=</span><br><span style="color: hsl(0, 100%, 40%);">-                                    valueof(ts_RSL_IE_CbCmdType(msg.rsl_cb_cmd, rsl_last_block));</span><br><span style="color: hsl(0, 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%);">+   f_smscb_setup_rsl_chan(pars.basic, false);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ispresent(pars.extended)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_smscb_setup_rsl_chan(pars.extended, true);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span>@@ -171,59 +226,141 @@</span><br><span>                          "phys_chan_config SDCCH8");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* construct a receive/match template for given block_nr in given msg */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_get_block_template(CbchTestMsg msg, integer block_nr) return template CBCH_Block {</span><br><span style="color: hsl(120, 100%, 40%);">+       var template CBCH_Block tr;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (block_nr < lengthof(msg.blocks)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             var CbchBlock b := msg.blocks[block_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+              tr := tr_CBCH_Block(b.seq_nr, b.is_last, b.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              tr := tr_CBCH_Block(15, ?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return tr;</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%);">+/* the heart of the CBCH test case matching engine for one channel (basic, extended) */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbch_match(inout CbchTestParsChan pars_chan, CBCH_Block cb, integer tb)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer block_nr := tb mod 4;</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%);">+      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%);">+         /* check if it's any of our expected blocks */</span><br><span style="color: hsl(120, 100%, 40%);">+            for (i := 0; i < lengthof(pars_chan.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (block_nr < lengthof(pars_chan.msgs[i].blocks)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               if (match(cb, f_get_block_template(pars_chan.msgs[i], block_nr))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   log("Found block_nr ", block_nr, " of msg ", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                                  if (not pars_chan.msgs[i].blocks[block_nr].seen_once) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                               pars_chan.msgs[i].blocks[block_nr].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%);">+                                      break;</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%);">+                    var template CBCH_Block tr;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (ispresent(pars_chan.default_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               /* it must be a block of the default message */</span><br><span style="color: hsl(120, 100%, 40%);">+                               tr := f_get_block_template(pars_chan.default_msg, block_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* it must be a NULL block */</span><br><span style="color: hsl(120, 100%, 40%);">+                         tr := tr_CBCH_Block(15, ?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (not match(cb, tr)) {</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%);">+                   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              log("Found block_nr ", block_nr, " of DEFAULT/NULL");</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (ispresent(pars_chan.default_msg) and</span><br><span style="color: hsl(120, 100%, 40%);">+                                  block_nr < lengthof(pars_chan.default_msg.blocks)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   pars_chan.default_msg.blocks[block_nr].seen_once := 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%);">+     }</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%);">+/* Report/Evaluate the per-channel CBCH test results */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbch_report(CbchTestParsChan pars_chan, charstring id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* verify that each block of each message has been seen once */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i := 0; i < lengthof(pars_chan.msgs); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             for (j := 0; j < lengthof(pars_chan.msgs[i].blocks); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   var CbchBlock b := pars_chan.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 ", id, " CBCH block ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                         j, " of msg ", 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%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ispresent(pars_chan.default_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* verify that each block of default message has been seen at least once */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (j := 0; j < lengthof(pars_chan.default_msg.blocks); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       var CbchBlock b := pars_chan.default_msg.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 at leaset one instance of ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                     "CBCH block ", j, " of DEFAULT msg");</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> /* shared function doing the heavy lifting for most CBCH tests */</span><br><span> private function f_TC_smscb(CbchTestPars pars) runs on test_CT {</span><br><span>      var L1ctlDlMessage dl;</span><br><span style="color: hsl(0, 100%, 40%);">-  var integer i, j;</span><br><span style="color: hsl(0, 100%, 40%);">-       timer T := 5.0 * int2float(lengthof(pars.msgs));</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer msg_count;</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%);">+    msg_count := lengthof(pars.basic.msgs);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ispresent(pars.basic.default_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              msg_count := msg_count + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ispresent(pars.extended)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               msg_count := msg_count + lengthof(pars.extended.msgs);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ispresent(pars.extended.default_msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg_count := msg_count + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        f_smscb_setup(pars);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* dynamically adjust timeout based on number of messages */</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start(5.0 + 3.0 * int2float(msg_count));</span><br><span>   /* Expect this to show up exactly once on the basic CBCH (four blocks) */</span><br><span>    alt {</span><br><span>                                           /* FIXME: Channel Nr for SDCCH/8 */</span><br><span>       [] L1CTL.receive(tr_L1CTL_DATA_IND(t_RslChanNr_CBCH(0))) -> value dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               log("CBCH: ", dl);</span><br><span style="color: hsl(120, 100%, 40%);">+          var integer tb := f_cbch_fn2tb(dl.dl_info.frame_nr);</span><br><span>                 var CBCH_Block cb := dec_CBCH_Block(dl.payload.data_ind.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+             log("Tb=", tb, ", CBCH: ", dl, ", block: ", cb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             /* detect the proper CBCH messages; check frame number */</span><br><span>            f_cbch_fn_verify(dl.dl_info.frame_nr, cb);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (not match(cb, tr_CBCH_Block)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(fail, "Illegal CBCH Block received: ", cb);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (tb < 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_cbch_match(pars.basic, cb, tb);</span><br><span>            } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        var boolean matched := false;</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* ignore NULL messages */</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (match(cb, tr_CBCH_Block(15, ?, ?))) { repeat; }</span><br><span style="color: hsl(0, 100%, 40%);">-                     for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            for (j := 0; j < lengthof(pars.msgs[i].blocks); j := j+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  var CbchBlock b := pars.msgs[i].blocks[j];</span><br><span style="color: hsl(0, 100%, 40%);">-                                      if (match(cb, tr_CBCH_Block(b.seq_nr, b.is_last, b.payload))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                         if (not pars.msgs[i].blocks[j].seen_once) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     pars.msgs[i].blocks[j].seen_once := true;</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%);">-                                                        setverdict(fail, "Received SMSCB twice! ", cb);</span><br><span style="color: hsl(0, 100%, 40%);">-                                               }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               matched := true;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (not ispresent(pars.extended)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           /* no parameters for ext. BCCH given: ignore */</span><br><span style="color: hsl(120, 100%, 40%);">+                               repeat;</span><br><span>                      }</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (not matched) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              setverdict(fail, "Received unexpected CBCH block: ", cb);</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(0, 100%, 40%);">-                       repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_cbch_match(pars.extended, cb, tb);</span><br><span>                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</span><br><span>              }</span><br><span>    [] L1CTL.receive { repeat; }</span><br><span>         [] T.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-          for (i := 0; i < lengthof(pars.msgs); i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    for (j := 0; j < lengthof(pars.msgs[i].blocks); j := j+1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          var CbchBlock b := pars.msgs[i].blocks[j];</span><br><span style="color: hsl(0, 100%, 40%);">-                              if (not b.seen_once) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                  setverdict(fail, "Timeout waiting for CBCH");</span><br><span style="color: hsl(0, 100%, 40%);">-                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_cbch_report(pars.basic, "Basic");</span><br><span style="color: hsl(120, 100%, 40%);">+         if (ispresent(pars.extended)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_cbch_report(pars.extended, "Extended");</span><br><span>          }</span><br><span>            }</span><br><span>    }</span><br><span>@@ -259,8 +396,8 @@</span><br><span>              } else {</span><br><span>                     var uint4_t rx_seq_nr := cb.block_type.seq_nr;</span><br><span>                       var template CBCH_Block tr;</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (rx_seq_nr < lengthof(pars.msgs[0].blocks)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                             var CbchBlock b := pars.msgs[0].blocks[rx_seq_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (rx_seq_nr < lengthof(pars.basic.msgs[0].blocks)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             var CbchBlock b := pars.basic.msgs[0].blocks[rx_seq_nr];</span><br><span>                             tr := tr_CBCH_Block(b.seq_nr, b.is_last, b.payload);</span><br><span>                         } else {</span><br><span>                             tr := tr_CBCH_Block(15, ?, ?);</span><br><span>@@ -338,19 +475,25 @@</span><br><span>                               '101112131415161718191a1b1c1d1e1f202223242526'O,</span><br><span>       omit }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+private const CbchTestMsg msg_default := {</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL_CB_CMD_DEFAULT, 0, '010203040506070708090a0b0c0d0e0f101112131415'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* transmit single-block SMSCB COMMAND */</span><br><span> testcase TC_sms_cb_cmd_sdcch4_1block() runs on test_CT {</span><br><span>         var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_1b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_1b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span> testcase TC_sms_cb_cmd_sdcch8_1block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := false,</span><br><span style="color: hsl(0, 100%, 40%);">-            msgs := msgs_1m_1b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_1b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span>@@ -359,14 +502,16 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_2block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_2b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_2b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span> testcase TC_sms_cb_cmd_sdcch8_2block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := false,</span><br><span style="color: hsl(0, 100%, 40%);">-            msgs := msgs_1m_2b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_2b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span>@@ -375,14 +520,16 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_3block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_3b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_3b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span> testcase TC_sms_cb_cmd_sdcch8_3block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := false,</span><br><span style="color: hsl(0, 100%, 40%);">-            msgs := msgs_1m_3b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_3b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span>@@ -391,14 +538,16 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_4block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_4b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_4b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span> testcase TC_sms_cb_cmd_sdcch8_4block() runs on test_CT {</span><br><span>   var CbchTestPars pars := {</span><br><span>           use_sdcch4 := false,</span><br><span style="color: hsl(0, 100%, 40%);">-            msgs := msgs_1m_4b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_1m_4b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span>@@ -407,14 +556,16 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_multi() runs on test_CT {</span><br><span>    var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_3m_4b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_3m_4b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span> testcase TC_sms_cb_cmd_sdcch8_multi() runs on test_CT {</span><br><span>    var CbchTestPars pars := {</span><br><span>           use_sdcch4 := false,</span><br><span style="color: hsl(0, 100%, 40%);">-            msgs := msgs_3m_4b_norm</span><br><span style="color: hsl(120, 100%, 40%);">+               basic := valueof(t_CbchPC(msgs_3m_4b_norm)),</span><br><span style="color: hsl(120, 100%, 40%);">+          extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span>@@ -423,14 +574,16 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_schedule() runs on test_CT {</span><br><span>         var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_4b_sched</span><br><span style="color: hsl(120, 100%, 40%);">+              basic := valueof(t_CbchPC(msgs_1m_4b_sched)),</span><br><span style="color: hsl(120, 100%, 40%);">+         extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span> testcase TC_sms_cb_cmd_sdcch8_schedule() runs on test_CT {</span><br><span>         var CbchTestPars pars := {</span><br><span>           use_sdcch4 := false,</span><br><span style="color: hsl(0, 100%, 40%);">-            msgs := msgs_1m_4b_sched</span><br><span style="color: hsl(120, 100%, 40%);">+              basic := valueof(t_CbchPC(msgs_1m_4b_sched)),</span><br><span style="color: hsl(120, 100%, 40%);">+         extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb(pars);</span><br><span> }</span><br><span>@@ -439,7 +592,8 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_default_only() runs on test_CT {</span><br><span>       var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_3b_default</span><br><span style="color: hsl(120, 100%, 40%);">+            basic := valueof(t_CbchPC(msgs_1m_3b_default)),</span><br><span style="color: hsl(120, 100%, 40%);">+               extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb_default_only(pars);</span><br><span>       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);</span><br><span>@@ -447,7 +601,8 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch8_default_only() runs on test_CT {</span><br><span>  var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_3b_default</span><br><span style="color: hsl(120, 100%, 40%);">+            basic := valueof(t_CbchPC(msgs_1m_3b_default)),</span><br><span style="color: hsl(120, 100%, 40%);">+               extended := omit</span><br><span>     };</span><br><span>   f_TC_smscb_default_only(pars);</span><br><span>       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);</span><br><span>@@ -457,7 +612,8 @@</span><br><span> testcase TC_sms_cb_cmd_sdcch4_default_then_null() runs on test_CT {</span><br><span>     var CbchTestPars pars := {</span><br><span>           use_sdcch4 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-             msgs := msgs_1m_3b_default</span><br><span style="color: hsl(120, 100%, 40%);">+            basic := valueof(t_CbchPC(msgs_1m_3b_default)),</span><br><span style="color: hsl(120, 100%, 40%);">+               extended := omit</span><br><span>     };</span><br><span>   var L1ctlDlMessage dl;</span><br><span>       timer T := 5.0;</span><br><span>diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn</span><br><span>index 955e92c..74de46a 100644</span><br><span>--- a/library/RSL_Types.ttcn</span><br><span>+++ b/library/RSL_Types.ttcn</span><br><span>@@ -766,6 +766,7 @@</span><br><span> </span><br><span>               RSL_IE_StartingTime     starting_time,</span><br><span>               RSL_IE_EncryptionInfo   encr_info,</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t                 smscb_chan_ind,</span><br><span>              RSL_IE_RequestRef       req_ref,</span><br><span>             RSL_LV                  full_imm_ass_info,</span><br><span>           RSL_LV                  ms_identity,</span><br><span>@@ -818,6 +819,7 @@</span><br><span>                                   sacch_info, iei = RSL_IE_SACCH_INFO;</span><br><span>                                         starting_time, iei = RSL_IE_STARTNG_TIME;</span><br><span>                                    encr_info, iei = RSL_IE_ENCR_INFO;</span><br><span style="color: hsl(120, 100%, 40%);">+                                    smscb_chan_ind, iei = RSL_IE_SMSCB_CHAN_INDICATOR;</span><br><span> </span><br><span>                                       req_ref, iei = RSL_IE_REQ_REFERENCE;</span><br><span>                                         full_imm_ass_info, iei = RSL_IE_FULL_IMM_ASS_INFO;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14107">change 14107</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/14107"/><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: I144c7d833b79c648b1ac69a6155f3603025ede5c </div>
<div style="display:none"> Gerrit-Change-Number: 14107 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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>