pespin submitted this change.

View Change

Approvals: fixeria: Looks good to me, approved osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified
pcu: Fix dummy DL block received due to timer race conditions

Timer X2002, which manages delay at PCU between sending DL TBF Ass over
CCCH and start transmitting for it over PDCH, is clock-time based.
As a result, timer at PCU process and ttcn3 process may time out
slightly differently. Hence, it can happen that we request a DL block
immediatelly *before* the timer triggers at the PCU. In that scenario,
PCU transmits a dummy block instead of a data block.
Account for this race condition in several tests; some tests already
used this formula.

Change-Id: Ic2bb953483cd1f678cbe32c7a94e177f79ecb4e4
---
M pcu/PCU_Tests.ttcn
1 file changed, 51 insertions(+), 20 deletions(-)

diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
index f1f80db..23709dc 100644
--- a/pcu/PCU_Tests.ttcn
+++ b/pcu/PCU_Tests.ttcn
@@ -453,7 +453,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

/* MS has moved to CS, it sent SUSP REQ to BTS and PCU gets it, TBF is freed: */
BTS.send(ts_PCUIF_SUSP_REQ(0, ms.tlli, ra_id, 0));
@@ -1066,7 +1068,8 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
+ poll_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0, exp_dl_cs_mcs);

/* ACK the DL block */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
@@ -1343,7 +1346,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, poll_fn, data, 0, exp_dl_cs_mcs);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ poll_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0, exp_dl_cs_mcs);

/* ACK the DL block */
f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
@@ -1739,7 +1744,9 @@
f_sleep(X2002);

while (true) {
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, ?, ?);

/* Keep Ack/Nack description updated (except for last BSN) */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
@@ -1843,7 +1850,9 @@
* FINAL_ACK one), so that PCU sees we are listening in PDCH and avoids
* other code paths like trying to Imm Assign on CCCH again, etc.. */
while (true) {
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, ?, ?);

if (dl_block.data.mac_hdr.hdr_ext.fbi) {
log("Received FINAL_ACK");
@@ -1871,8 +1880,10 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
/* Now that we confirmed the new assignment in the dl-tbf, lets receive the data and ack it */
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
+ f_rlcmac_dl_block_exp_data(dl_block, data2, 0);
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
f_dl_block_ack_fn(dl_block, dl_fn));
@@ -1917,7 +1928,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);
if (dl_block.data.mac_hdr.hdr_ext.fbi == false) {
setverdict(fail, "Expected DL data block with FBI=1 but got FBI=0");
f_shutdown(__BFILE__, __LINE__);
@@ -2070,7 +2083,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data2, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data2, 0);

/* ACK the DL block */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
@@ -2135,7 +2150,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

/* ACK the DL block */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
@@ -2637,7 +2654,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0, exp_cs_mcs);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0, exp_cs_mcs);

/* ACK the DL block */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
@@ -2829,7 +2848,6 @@
f_sleep(X2002);
/* Skip potential dummy blocks before X2002 triggers at PCU after us: */
dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
-
f_rlcmac_dl_block_exp_data(dl_block, data, 0, exp_cs_mcs);

/* ACK the DL block, and request UL TBF at the same time */
@@ -2982,7 +3000,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

/* Now we don't ack the dl block (emulate MS failed receiveing IMM ASS
* or GPRS DL, or DL ACK was lost for some reason). As a result, PCU
@@ -2991,7 +3011,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

/* ACK the DL block */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
@@ -3233,7 +3255,9 @@

/* Recv DL data until receiving RRBP to DL ACK (because it's last queued DL data) */
while (true) {
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, ?, ?);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, ?, ?);

/* Keep Ack/Nack description updated (except for last BSN) */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block);
@@ -3847,7 +3871,9 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

/* ACK the DL block, asking for new UL TBF by including ChanReqDesc */
f_dltbf_ack_block(ms.dl_tbf, dl_block, '1'B);
@@ -4261,12 +4287,14 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

/* ACK the DL block */
f_acknackdesc_ack_block(ms.dl_tbf.acknack_desc, dl_block, '1'B);
f_ms_tx_ul_block(ms, ts_RLCMAC_DL_ACK_NACK(ms.dl_tbf.tfi, ms.dl_tbf.acknack_desc),
- f_dl_block_ack_fn(dl_block, dl_fn));
+ f_dl_block_ack_fn(dl_block, dl_fn));

var StatsDExpects expect := {
{ name := "TTCN3.bts.0.rach.requests", mtype := "c", min := 1, max := 1},
@@ -4353,9 +4381,10 @@

/* Wait timer X2002 and DL block is available after CCCH IMM ASS */
f_sleep(X2002);
-
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
/* Expect the first (GPRS DL) block with bsn=0 and rrbp_valid=1 */
- f_rx_rlcmac_dl_block_exp_data(dl_block, fn, data, 0);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

if (ischosen(dl_block.data_egprs)) {
if (lengthof(dl_block.data_egprs.blocks) != 2) {
@@ -4447,7 +4476,9 @@
f_ms_exp_dl_tbf_ass_ccch(ms);
/* Wait timer X2002 and DL block is available after CCCH IMM ASS: */
f_sleep(X2002);
- f_rx_rlcmac_dl_block_exp_data(dl_block, dl_fn, data, 0);
+ /* Skip potential dummy blocks before X2002 triggers at PCU after us: */
+ dl_fn := f_rx_rlcmac_dl_block_skip_dummy(dl_block, max_dummy := 10);
+ f_rlcmac_dl_block_exp_data(dl_block, data, 0);

f_shutdown(__BFILE__, __LINE__, final := true);
}

To view, visit change 39500. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ic2bb953483cd1f678cbe32c7a94e177f79ecb4e4
Gerrit-Change-Number: 39500
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: osmith <osmith@sysmocom.de>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>