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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Support sending message to PCU at specific FN<br><br>Change-Id: I81a29b4885f3fc6b753a1612d5fd369cd18f5dc6<br>---<br>M library/RLCMAC_Types.ttcn<br>M pcu/PCUIF_RAW_Components.ttcn<br>M pcu/PCU_Tests_RAW.ttcn<br>3 files changed, 65 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/RLCMAC_Types.ttcn b/library/RLCMAC_Types.ttcn</span><br><span>index 8e6942e..3a1ecb1 100644</span><br><span>--- a/library/RLCMAC_Types.ttcn</span><br><span>+++ b/library/RLCMAC_Types.ttcn</span><br><span>@@ -31,6 +31,16 @@</span><br><span>           RRBP_Nplus26_mod_2715648        ('11'B)</span><br><span>      } with { variant "FIELDLENGTH(2)" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    function f_rrbp_fn_delay(MacRrbp rrbp) return uint32_t {</span><br><span style="color: hsl(120, 100%, 40%);">+              select (rrbp) {</span><br><span style="color: hsl(120, 100%, 40%);">+               case (RRBP_Nplus13_mod_2715648) { return 13; }</span><br><span style="color: hsl(120, 100%, 40%);">+                case (RRBP_Nplus17_or_18_mod_2715648) { return 17; }</span><br><span style="color: hsl(120, 100%, 40%);">+          case (RRBP_Nplus21_or_22_mod_2715648) { return 21;  }</span><br><span style="color: hsl(120, 100%, 40%);">+         case (RRBP_Nplus26_mod_2715648) { return 26; }</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Partof DL RLC data block and DL RLC/MAC ctrl block */</span><br><span>     type record DlMacHeader {</span><br><span>            MacPayloadType  payload_type,</span><br><span>diff --git a/pcu/PCUIF_RAW_Components.ttcn b/pcu/PCUIF_RAW_Components.ttcn</span><br><span>index 5516d83..4ed57e5 100644</span><br><span>--- a/pcu/PCUIF_RAW_Components.ttcn</span><br><span>+++ b/pcu/PCUIF_RAW_Components.ttcn</span><br><span>@@ -228,6 +228,18 @@</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Get first message from queue. true if non-empty, false otherwise */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_PCUIF_MsgQueue_first(inout PCUIF_MsgQueue queue,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       out PCUIF_Message msg) return boolean</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      if (lengthof(queue) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return false;</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%);">+   msg := queue[0];</span><br><span style="color: hsl(120, 100%, 40%);">+      return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Multiple base stations can be connected to the PCU. This component</span><br><span>  * represents one BTS with an associated TDMA clock generator. */</span><br><span> type component RAW_PCU_BTS_CT {</span><br><span>@@ -250,6 +262,9 @@</span><br><span>     var boolean cfg_ptcch_burst_fwd := false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Queue received messages from Test Case, they will eventually be scheduled and</span><br><span style="color: hsl(120, 100%, 40%);">+ * sent according to their FN. FN value of 0 has the special meaning of "schedule</span><br><span style="color: hsl(120, 100%, 40%);">+ * as soon as possible". */</span><br><span> private altstep as_BTS_CT_MsgQueue(integer bts_nr)</span><br><span> runs on RAW_PCU_BTS_CT {</span><br><span>     var PCUIF_Message pcu_msg;</span><br><span>@@ -274,11 +289,14 @@</span><br><span>           }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Handle schedule events and manage actions: Send msgs over PCUIF to PCU,</span><br><span style="color: hsl(120, 100%, 40%);">+ * advertise Test Case about sent messages, etc. */</span><br><span> private altstep as_BTS_CT_TDMASched(integer bts_nr)</span><br><span> runs on RAW_PCU_BTS_CT {</span><br><span>       var PCUIF_Message pcu_msg;</span><br><span>   var RAW_PCU_Event event;</span><br><span>     var integer ev_begin_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer next_fn;</span><br><span> </span><br><span>     [] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_BEG)) -> value event {</span><br><span>          /* If the RTS queue for PDTCH is not empty, send a message */</span><br><span>@@ -299,6 +317,17 @@</span><br><span>         [lengthof(pdtch_data_queue) > 0] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_END)) -> value event {</span><br><span>                 /* FN matching the beginning of current block: */</span><br><span>            ev_begin_fn := event.data.tdma_fn - 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Check if we reached time to serve the first DATA.ind message in the queue: */</span><br><span style="color: hsl(120, 100%, 40%);">+              f_PCUIF_MsgQueue_first(pdtch_data_queue, pcu_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+            next_fn := pcu_msg.u.data_ind.fn;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (next_fn != 0 and next_fn != ev_begin_fn) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (next_fn < ev_begin_fn) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               setverdict(fail, "We are late scheduling the block! ", next_fn, " < ", ev_begin_fn);</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%);">+                     repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>            /* Dequeue a DATA.ind message */</span><br><span>             f_PCUIF_MsgQueue_dequeue(pdtch_data_queue, pcu_msg);</span><br><span> </span><br><span>diff --git a/pcu/PCU_Tests_RAW.ttcn b/pcu/PCU_Tests_RAW.ttcn</span><br><span>index cddf9f6..e4b03c1 100644</span><br><span>--- a/pcu/PCU_Tests_RAW.ttcn</span><br><span>+++ b/pcu/PCU_Tests_RAW.ttcn</span><br><span>@@ -663,13 +663,16 @@</span><br><span> }</span><br><span> </span><br><span> /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcuif_tx_data_ind(octetstring data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ var template RAW_PCU_EventParam ev_param := {tdma_fn := ? };</span><br><span>         BTS.send(ts_PCUIF_DATA_IND(bts_nr := 0, trx_nr := 0, ts_nr := 7, block_nr := 0,</span><br><span>                                 sapi := PCU_IF_SAPI_PDTCH, data := data,</span><br><span style="color: hsl(0, 100%, 40%);">-                                fn := 0, arfcn := 871, lqual_cb := lqual_cb));</span><br><span style="color: hsl(0, 100%, 40%);">-       BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_SENT));</span><br><span style="color: hsl(120, 100%, 40%);">+                            fn := fn, arfcn := 871, lqual_cb := lqual_cb));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (fn != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ev_param := {tdma_fn := fn };</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_SENT, ev_param));</span><br><span> }</span><br><span> </span><br><span> /* Enqueue RTS.req, expect DATA.req with UL ACK from the PCU */</span><br><span>@@ -700,7 +703,7 @@</span><br><span>                               fn := 0, arfcn := 871, sapi := PCU_IF_SAPI_PCH, data := macblock));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_tx_rlcmac_ul_block(template (value) RlcmacUlBlock ul_data, int16_t lqual_cb := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tx_rlcmac_ul_block(template (value) RlcmacUlBlock ul_data, int16_t lqual_cb := 0, uint32_t fn := 0)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span>     var octetstring data;</span><br><span>        /* Encode the payload of DATA.ind */</span><br><span>@@ -708,7 +711,7 @@</span><br><span>   data := f_pad_oct(data, 23, '00'O); /* CS-1 */</span><br><span> </span><br><span>   /* Enqueue DATA.ind (both TDMA frame and block numbers to be patched) */</span><br><span style="color: hsl(0, 100%, 40%);">-        f_pcuif_tx_data_ind(data, lqual_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_pcuif_tx_data_ind(data, lqual_cb, fn);</span><br><span> }</span><br><span> </span><br><span> private function f_tx_rlcmac_ul_n_blocks(PacketUlAssign ul_tbf_ass, integer num_blocks := 1)</span><br><span>@@ -730,16 +733,19 @@</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(out RlcmacDlBlock dl_block)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rx_rlcmac_dl_block(out RlcmacDlBlock dl_block, out uint32_t dl_fn)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span>      var PCUIF_Message pcu_msg;</span><br><span>   f_pcuif_rx_data_req(pcu_msg);</span><br><span>        dl_block := dec_RlcmacDlBlock(pcu_msg.u.data_req.data);</span><br><span style="color: hsl(120, 100%, 40%);">+       dl_fn := pcu_msg.u.data_req.fn;</span><br><span> }</span><br><span> </span><br><span> private function f_rx_rlcmac_dl_block_exp_ack_nack(out RlcmacDlBlock dl_block)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">- f_rx_rlcmac_dl_block(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t dl_fn;</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>       if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK(ul_tfi := ?, tlli := ?))) {</span><br><span>            setverdict(fail, "Failed to match Packet Uplink ACK / NACK");</span><br><span>              mtc.stop;</span><br><span>@@ -748,24 +754,30 @@</span><br><span> </span><br><span> private function f_rx_rlcmac_dl_block_exp_dummy(out RlcmacDlBlock dl_block)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       f_rx_rlcmac_dl_block(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t dl_fn;</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>       if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span>           setverdict(fail, "Failed to match Packet DUMMY DL");</span><br><span>               mtc.stop;</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, octetstring data)</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)</span><br><span> 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>  var template RlcmacDlBlock dl_template := tr_RLCMAC_DATA_RRBP;</span><br><span>       dl_template.data.blocks := ?;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       f_rx_rlcmac_dl_block(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span>       if (not match(dl_block, dl_template)) {</span><br><span>              setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);</span><br><span>                mtc.stop;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     if (lengthof(dl_block.data.blocks) < 1) {</span><br><span>                 setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span>               mtc.stop;</span><br><span>@@ -1358,6 +1370,7 @@</span><br><span>    var PCUIF_Message pcu_msg;</span><br><span>   var octetstring data := f_rnd_octstring(10);</span><br><span>         var boolean ok;</span><br><span style="color: hsl(120, 100%, 40%);">+       var uint32_t sched_fn;</span><br><span>       var OCT4 tlli := '00000001'O;</span><br><span>        var AckNackDescription ack_nack_desc;</span><br><span> </span><br><span>@@ -1407,10 +1420,10 @@</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, data);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data);</span><br><span> </span><br><span>         /* ACK the DL block */</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));</span><br><span style="color: hsl(120, 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> }</span><br><span> </span><br><span> control {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16487">change 16487</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/+/16487"/><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: I81a29b4885f3fc6b753a1612d5fd369cd18f5dc6 </div>
<div style="display:none"> Gerrit-Change-Number: 16487 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </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: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>