<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18186">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">PCU: refactor and simplify f_rx_rlcmac_dl_block_exp_data()<br><br>This function was written in a way that it tries to do as<br>many different (but related) things as possible:<br><br>  a) send an RTS.req to the IUT, expect a DATA.ind in return,<br>  b) decode RLC/MAC message contained in the received DATA.ind,<br>  c) make sure that it's either GPRS or EGPRS data block,<br>  d) calculate the last TDMA frame number of RRBP using<br>     f_rrbp_ack_fn() regardless of its validity,<br>  e) make sure that the block contains a given LLC payload.<br><br>Everything is ok except point d). The problem is that this is<br>only the case for the first block of RRBP, and not applicable<br>to the rest having 'rrbp_valid' flag unset. Furthermore, this<br>function did not match GPRS DL blocks with 'rrbp_valid' flag<br>unset, for some odd reason.<br><br>Let's move RRBP calculation into a separate function called<br>f_dl_block_ack_fn() and return TDMA frame number of the<br>received DATA.ind message instead.<br><br>Among with that, there are more little changes:<br><br>  - simplify matching of (E)GPRS DL data blocks,<br>  - use 'in' qualifier in parameter list where possible,<br>  - turn parameter 'data' into a template (present).<br><br>Change-Id: I1528408b4399d0a149a23961805277eaab90d407<br>Signed-off-by: Vadim Yanitskiy <axilirator@gmail.com><br>---<br>M library/RLCMAC_Templates.ttcn<br>M pcu/PCU_Tests.ttcn<br>2 files changed, 95 insertions(+), 72 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/RLCMAC_Templates.ttcn b/library/RLCMAC_Templates.ttcn</span><br><span>index 675a081..dd1371f 100644</span><br><span>--- a/library/RLCMAC_Templates.ttcn</span><br><span>+++ b/library/RLCMAC_Templates.ttcn</span><br><span>@@ -497,6 +497,9 @@</span><br><span>             }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Either GPRS or EGPRS data block with arbitrary contents */</span><br><span style="color: hsl(120, 100%, 40%);">+ template RlcmacDlBlock tr_RLCMAC_DATA := (tr_RLCMAC_DATA_GPRS, tr_RLCMAC_DATA_EGPRS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      template RlcmacDlBlock tr_RLCMAC_DATA_GPRS(template (present) boolean rrbp_valid := ?,</span><br><span>                                                  template (present) MacRrbp rrbp := ?,</span><br><span>                                                template (present) uint3_t usf := ?) := {</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 3d194a9..0a6b410 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -599,78 +599,64 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                               out uint32_t ack_fn, octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+/* This function does what could probably be done with templates */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_verify_data_gprs(in RlcmacDlDataBlock data_block,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (present) octetstring data := ?,</span><br><span>                                                    template (present) uint7_t exp_bsn := ?,</span><br><span>                                                     template (present) CodingScheme exp_cs := ?)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-   log("verifying dl data block (gprs): ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    ack_fn := f_rrbp_ack_fn(dl_fn, dl_block.data.mac_hdr.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (not match(dl_block.data.mac_hdr.hdr_ext.bsn, exp_bsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (not match(data_block.mac_hdr.hdr_ext.bsn, exp_bsn)) {</span><br><span>            setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                     dl_block.data.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</span><br><span style="color: hsl(120, 100%, 40%);">+                       data_block.mac_hdr.hdr_ext.bsn, " vs exp ", exp_bsn);</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (lengthof(dl_block.data.blocks) < 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-            setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (lengthof(data_block.blocks) < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "DL block has no LLC payload: ", data_block);</span><br><span>             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (ispresent(dl_block.data.blocks[0].hdr) and dl_block.data.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           dl_block.data.blocks[0].hdr.length_ind, " vs ", lengthof(data));</span><br><span style="color: hsl(0, 100%, 40%);">-           f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dl_block.data.blocks[0].payload != data) {</span><br><span style="color: hsl(0, 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%);">+ if (not match(data_block.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: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                       data_block.blocks[0].payload, " vs ", data);</span><br><span>            f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (lengthof(dl_block.data.blocks) > 1 and substr(dl_block.data.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span style="color: hsl(0, 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%);">+    if (lengthof(data_block.blocks) > 1 and substr(data_block.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: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         data_block.blocks[1].payload);</span><br><span>            f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* TODO: check exp_cs */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                out uint32_t ack_fn, octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+/* This function does what could probably be done with templates */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_verify_data_egprs(in RlcmacDlEgprsDataBlock data_block,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template (present) octetstring data := ?,</span><br><span>                                                    template (present) uint14_t exp_bsn := ?,</span><br><span>                                                    template (present) CodingScheme exp_cs := ?)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-  log("verifying dl data block (egprs): ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   ack_fn := f_rrbp_ack_fn(dl_fn, dl_block.data_egprs.mac_hdr.rrbp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (not match(dl_block.data_egprs.mac_hdr.bsn1, exp_bsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (not match(data_block.mac_hdr.bsn1, exp_bsn)) {</span><br><span>           setverdict(fail, "DL block BSN doesn't match: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                     dl_block.data_egprs.blocks[0].hdr.length_ind, " vs exp ", exp_bsn);</span><br><span style="color: hsl(120, 100%, 40%);">+                         data_block.mac_hdr.bsn1, " vs exp ", exp_bsn);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (lengthof(dl_block.data_egprs.blocks) < 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-              setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (lengthof(data_block.blocks) < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "DL block has no LLC payload: ", data_block);</span><br><span>             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 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(0, 100%, 40%);">-          setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data));</span><br><span style="color: hsl(0, 100%, 40%);">-             f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (dl_block.data_egprs.blocks[0].payload != data) {</span><br><span style="color: hsl(0, 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%);">+ if (not match(data_block.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: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                       data_block.blocks[0].payload, " vs ", data);</span><br><span>            f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Check next data blocks contain dummy frames */</span><br><span style="color: hsl(0, 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(0, 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%);">+    if (lengthof(data_block.blocks) > 1 and substr(data_block.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: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         data_block.blocks[1].payload);</span><br><span>            f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>@@ -678,36 +664,62 @@</span><br><span>                See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */</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,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+/* High level (task specific) helper for receiving and matching GPRS/EGPRS data blocks */</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 dl_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template (present) octetstring data := ?,</span><br><span>                                            template (present) uint7_t exp_bsn := ?,</span><br><span>                                             template (present) CodingScheme exp_cs := ?)</span><br><span> 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 boolean is_egprs := false;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* FIXME: for some reason, this template expects blocks with 'rrbp_valid' flag set */</span><br><span style="color: hsl(0, 100%, 40%);">-   var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_GPRS(rrbp_valid := true);</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(120, 100%, 40%);">+ /* FIXME: ideally we should use an alt statement with timeout here, rather than</span><br><span style="color: hsl(120, 100%, 40%);">+        * having +100500 layers of abstraction. This would facilitate developing the</span><br><span style="color: hsl(120, 100%, 40%);">+  * multi-TBF/-TRX/-BTS tests, where you cannot expect that the first received</span><br><span style="color: hsl(120, 100%, 40%);">+  * block is exactly what you need. */</span><br><span>        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%);">-         dl_template := tr_RLCMAC_DATA_EGPRS;</span><br><span style="color: hsl(0, 100%, 40%);">-            dl_template.data_egprs.blocks := ?;</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%);">-                   f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(0, 100%, 40%);">-               is_egprs := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Make sure it's either GPRS or EGPRS data block */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (not match(dl_block, tr_RLCMAC_DATA)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Failed to match DL DATA: ", dl_block, " vs ", tr_RLCMAC_DATA);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (is_egprs) {</span><br><span style="color: hsl(0, 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%);">+  if (ischosen(dl_block.data_egprs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_rlcmac_dl_block_verify_data_egprs(dl_block.data_egprs, data, exp_bsn, exp_cs);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_rlcmac_dl_block_verify_data_gprs(dl_block.data, data, exp_bsn, exp_cs);</span><br><span>    } else {</span><br><span style="color: hsl(0, 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%);">+           /* Should not happen, but the caller may theoretically give us a template for CTRL */</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "DL block is neither GPRS nor EGPRS data block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+              f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_dl_block_ack_fn(in RlcmacDlBlock dl_block, uint32_t dl_fn)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT return uint32_t {</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean rrbp_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+       var MacRrbp rrbp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* The argument must be either a GPRS or EGPRS data block */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (ischosen(dl_block.data_egprs)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rrbp_valid := true; /* always valid */</span><br><span style="color: hsl(120, 100%, 40%);">+                rrbp := dl_block.data_egprs.mac_hdr.rrbp;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (ischosen(dl_block.data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         rrbp_valid := dl_block.data.mac_hdr.mac_hdr.rrbp_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+               rrbp := dl_block.data.mac_hdr.mac_hdr.rrbp;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Should not happen, but the caller may theoretically give us a CTRL block */</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "DL block is neither GPRS nor EGPRS data block: ", dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+              f_shutdown(__BFILE__, __LINE__);</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%);">+   /* Make sure that the given block really needs to be ACKnowledged */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (not rrbp_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "DL block shall not be ACKnowledged, field RRBP is not valid");</span><br><span style="color: hsl(120, 100%, 40%);">+            f_shutdown(__BFILE__, __LINE__);</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 f_rrbp_ack_fn(dl_fn, rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> testcase TC_pcuif_suspend() runs on RAW_PCU_Test_CT {</span><br><span>     var octetstring ra_id := enc_RoutingAreaIdentification(mp_gb_cfg.cell_id.ra_id);</span><br><span>     var GprsTlli tlli := 'FFFFFFFF'O;</span><br><span>@@ -1309,6 +1321,7 @@</span><br><span>    var octetstring data := f_rnd_octstring(10);</span><br><span>         var boolean ok;</span><br><span>      var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint32_t dl_fn;</span><br><span>  var OCT4 tlli := '00000001'O;</span><br><span>        var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span> </span><br><span>@@ -1331,11 +1344,12 @@</span><br><span> </span><br><span>        /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);</span><br><span> </span><br><span>         /* ACK the DL block */</span><br><span>       f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 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 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),</span><br><span style="color: hsl(120, 100%, 40%);">+                            0, f_dl_block_ack_fn(dl_block, dl_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>@@ -1347,9 +1361,10 @@</span><br><span>     f_tx_rlcmac_ul_block(ts_RLCMAC_CTRL_ACK(tlli), 0, sched_fn);</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 style="color: hsl(0, 100%, 40%);">-  f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);</span><br><span>     f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 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 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),</span><br><span style="color: hsl(120, 100%, 40%);">+                            0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span>     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1366,6 +1381,7 @@</span><br><span>         var octetstring data := f_rnd_octstring(10);</span><br><span>         var boolean ok;</span><br><span>      var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint32_t dl_fn;</span><br><span>  var OCT4 tlli := '00000001'O;</span><br><span>        var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span> </span><br><span>@@ -1419,11 +1435,12 @@</span><br><span> </span><br><span>        /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);</span><br><span> </span><br><span>     /* ACK the DL block */</span><br><span>       f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 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 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),</span><br><span style="color: hsl(120, 100%, 40%);">+                            0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span>     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span>@@ -1460,6 +1477,7 @@</span><br><span>         var octetstring data := f_rnd_octstring(10);</span><br><span>         var boolean ok;</span><br><span>      var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint32_t dl_fn;</span><br><span>  var OCT4 tlli := '00000001'O;</span><br><span>        var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span> </span><br><span>@@ -1482,11 +1500,12 @@</span><br><span> </span><br><span>        /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0, exp_cs_mcs);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);</span><br><span> </span><br><span>     /* ACK the DL block */</span><br><span>       f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 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 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),</span><br><span style="color: hsl(120, 100%, 40%);">+                            0, f_dl_block_ack_fn(dl_block, dl_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>@@ -1536,7 +1555,7 @@</span><br><span>   var RlcmacDlBlock dl_block;</span><br><span>  var octetstring data := f_rnd_octstring(10);</span><br><span>         var boolean ok;</span><br><span style="color: hsl(0, 100%, 40%);">- var uint32_t sched_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint32_t dl_fn;</span><br><span>  var OCT4 tlli := '00000001'O;</span><br><span>        var AckNackDescription ack_nack_desc := valueof(t_AckNackDescription_init);</span><br><span> </span><br><span>@@ -1559,7 +1578,7 @@</span><br><span> </span><br><span>  /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);</span><br><span> </span><br><span>         /* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS</span><br><span>    * or GPRS DL, or DL ACK was lost for some reason). As a result, PCU</span><br><span>@@ -1571,11 +1590,12 @@</span><br><span> </span><br><span>   /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);</span><br><span> </span><br><span>         /* ACK the DL block */</span><br><span>       f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span style="color: hsl(0, 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 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),</span><br><span style="color: hsl(120, 100%, 40%);">+                            0, f_dl_block_ack_fn(dl_block, dl_fn));</span><br><span> </span><br><span>     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18186">change 18186</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/+/18186"/><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: I1528408b4399d0a149a23961805277eaab90d407 </div>
<div style="display:none"> Gerrit-Change-Number: 18186 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>