<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17970">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Support retrieving BSN and TFI in tests from data_egprs blocks<br><br>function helpers are slightly modified or added to accomodate for fields<br>in egprs data blocks being in different places.<br><br>Change-Id: I570fb7346519b2a161515e0ec40bd1870a89d673<br>---<br>M pcu/PCU_Tests_RAW.ttcn<br>1 file changed, 97 insertions(+), 24 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/70/17970/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn</span><br><span>index d491f48..0f565b9 100644</span><br><span>--- a/pcu/PCU_Tests_RAW.ttcn</span><br><span>+++ b/pcu/PCU_Tests_RAW.ttcn</span><br><span>@@ -219,11 +219,28 @@</span><br><span>    receive_block_bitmap := '0000000000000000000000000000000000000000000000000000000000000000'B</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_get_tfi(RlcmacDlBlock dl_block) return uint5_t {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return dl_block.data.mac_hdr.hdr_ext.tfi;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              return dl_block.data_egprs.mac_hdr.tfi;</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> /* TS 44.060 sec 12.3 Ack/Nack Description */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_acknackdesc_ack_block(inout AckNackDescription desc, uint7_t bsn, BIT1 final_ack := '0'B)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_acknackdesc_ack_block(inout AckNackDescription desc, RlcmacDlBlock dl_block, BIT1 final_ack := '0'B)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint7_t bsn;</span><br><span>     var integer i;</span><br><span style="color: hsl(0, 100%, 40%);">-  var integer inc := bsn - desc.starting_seq_nr + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer inc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                bsn := dl_block.data.mac_hdr.hdr_ext.bsn;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              bsn := dl_block.data_egprs.mac_hdr.bsn1;</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%);">+   inc := bsn - desc.starting_seq_nr + 1;</span><br><span>       /* Filling hole? */</span><br><span>  if (bsn < desc.starting_seq_nr) {</span><br><span>                 desc.receive_block_bitmap[lengthof(desc.receive_block_bitmap) - (desc.starting_seq_nr - bsn)] := int2bit(1, 1);</span><br><span>@@ -530,18 +547,9 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-      var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(0, 100%, 40%);">-      var uint32_t dl_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-     var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP;</span><br><span style="color: hsl(0, 100%, 40%);">-  dl_template.data.blocks := ?;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        log("verifying dl data block (gprs): ", dl_block);</span><br><span> </span><br><span>     ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp);</span><br><span> </span><br><span>@@ -571,6 +579,71 @@</span><br><span>            setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</span><br><span>           mtc.stop;</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TODO: check exp_cs */</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_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint14_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  log("verifying dl data block (egprs): ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data_egprs.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block.data_egprs.mac_hdr.bsn1, exp_bsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                           dl_block.data_egprs.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</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 (lengthof(dl_block.data_egprs.blocks) < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "DL block has no LLC payload: ", dl_block);</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%);">+   if (ispresent(dl_block.data_egprs.blocks[0].hdr) and dl_block.data_egprs.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data));</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%);">+   if (dl_block.data_egprs.blocks[0].payload != data) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</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%);">+   /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lengthof(dl_block.data_egprs.blocks) > 1 and substr(dl_block.data_egprs.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</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%);">+   /* TODO: Check exp_cs. In the case of EGPRS, first check mac_hdr.header_type and then decode CPS = exp_cs based on mac_hdr.header_type.</span><br><span style="color: hsl(120, 100%, 40%);">+               See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */</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_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint32_t dl_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean is_egprs := false;</span><br><span style="color: hsl(120, 100%, 40%);">+        var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP;</span><br><span style="color: hsl(120, 100%, 40%);">+        dl_template.data.blocks := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               dl_template := tr_RLCMAC_DATA_EGPRS;</span><br><span style="color: hsl(120, 100%, 40%);">+          dl_template.data_egprs.blocks := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (not match(dl_block, dl_template)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);</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%);">+             is_egprs := 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%);">+   if (is_egprs) {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_rlcmac_dl_block_verify_data_egprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_rlcmac_dl_block_verify_data_gprs(dl_block, dl_fn, ack_fn, data, exp_bsn, exp_cs);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> }</span><br><span> </span><br><span> testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {</span><br><span>@@ -1203,8 +1276,8 @@</span><br><span>  f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span> </span><br><span>      /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span>        /* we are done with the DL-TBF here so far, let's clean up our local state: */</span><br><span>   ack_nack_desc := valueof(t_AckNackDescription_init)</span><br><span> </span><br><span>@@ -1217,8 +1290,8 @@</span><br><span> </span><br><span>  /* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */</span><br><span>       f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-     f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span> }</span><br><span> </span><br><span> /* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span>@@ -1294,8 +1367,8 @@</span><br><span>   f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span> </span><br><span>  /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span> }</span><br><span> </span><br><span> /* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span>@@ -1358,8 +1431,8 @@</span><br><span>   f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span> </span><br><span>  /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span> </span><br><span>    /* Now MS wants to answer the DL data, Establish an Uplink TBF */</span><br><span>    ok := f_establish_tbf(rr_imm_ass);</span><br><span>@@ -1450,8 +1523,8 @@</span><br><span>   f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span> </span><br><span>      /* ACK the DL block */</span><br><span style="color: hsl(0, 100%, 40%);">-  f_acknackdesc_ack_block(ack_nack_desc, dl_block.data.mac_hdr.hdr_ext.bsn, '1'B);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(dl_block.data.mac_hdr.hdr_ext.tfi, ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span> }</span><br><span> </span><br><span> private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17970">change 17970</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17970"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I570fb7346519b2a161515e0ec40bd1870a89d673 </div>
<div style="display:none"> Gerrit-Change-Number: 17970 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>