<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>