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