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