<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10983">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: CBCH related tests for BTS<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>Change-Id: I955b4000c12180a39b0205b69b7b2c8cee8c9da3<br>---<br>M bts/BTS_Tests.ttcn<br>1 file changed, 260 insertions(+), 0 deletions(-)<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/83/10983/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 aa402d1..4fafe0e 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -4079,7 +4079,261 @@</span><br><span> /*  receptiom of SABM in multi-frame established state */</span><br><span> </span><br><span> </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> </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%);">+</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%);">+ [] 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%);">+ f_shutdown();</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_cbch_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 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     { RSL_CB_CMD_NORMAL, 0, '001000320f1141660c344dd3cba09a0c000000000000'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%);">+    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_cbch_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 := {</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%);">+    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_cbch_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 := {</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%);">+    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%);">+</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_cbch_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 := {</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%);">+    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_cbch_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 := {</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%);">+    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 DEFAULT message */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_sms_cb_cmd_cbch_sdcch4_default() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> </span><br><span> /* TODO Areas:</span><br><span>@@ -4204,6 +4458,12 @@</span><br><span> </span><br><span>  execute( TC_tch_sign_l2_fill_frame() );</span><br><span>      execute( TC_tch_sign_l2_fill_frame_dtxd() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_sms_cb_cmd_cbch_sdcch4_1block() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_sms_cb_cmd_cbch_sdcch4_2block() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_sms_cb_cmd_cbch_sdcch4_3block() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_sms_cb_cmd_cbch_sdcch4_4block() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_sms_cb_cmd_cbch_sdcch4_schedule() );</span><br><span> }</span><br><span> </span><br><span> </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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>