pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/33466 )
Change subject: pcu: Wait for USF before start using UL TBF ......................................................................
pcu: Wait for USF before start using UL TBF
Change-Id: Ibe8f8c24b239715c0a43d52e59475011e78cb4eb --- M pcu/GPRS_Components.ttcn M pcu/PCU_Tests.ttcn 2 files changed, 113 insertions(+), 1 deletion(-)
Approvals: pespin: Looks good to me, approved Jenkins Builder: Verified
diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn index a3e8c94..59c99d8 100644 --- a/pcu/GPRS_Components.ttcn +++ b/pcu/GPRS_Components.ttcn @@ -992,6 +992,36 @@ return; }
+/* Keep receiving & discarding DL blocks until the PCU requests USF for this MS */ +function f_ms_wait_usf(inout GprsMS ms, template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum) +runs on MS_BTS_IFACE_CT return uint32_t { + var BTS_PDTCH_Block data_msg; + + BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr, + sapi := PCU_IF_SAPI_PDTCH, fn := 0, + arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), + block_nr := nr.blk_nr)); + alt { + [] as_pcuif_rx_ignore_empty(nr); + [] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr, + tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH), + ?)) -> value data_msg { + var uint3_t rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block); + var uint3_t exp_usf := ms.ul_tbf.usf[valueof(nr.ts_nr)]; + log("Rx DL block USF ", rx_usf, " vs exp USF ", exp_usf); + if (rx_usf != exp_usf) { + BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr, + sapi := PCU_IF_SAPI_PDTCH, fn := 0, + arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), + block_nr := nr.blk_nr)); + repeat; + } + } + }; + + return data_msg.raw.fn; +} + //////////////////////// // Low level APIs //////////////////////// diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn index e485868..a1da67b 100644 --- a/pcu/PCU_Tests.ttcn +++ b/pcu/PCU_Tests.ttcn @@ -326,6 +326,9 @@ var RlcmacDlBlock dl_block; var uint32_t poll_fn;
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(g_ms[i]); + f_ms_tx_ul_data_block(g_ms[i], dummy, with_tlli := true, fn := g_ms[i].ul_tbf.start_time_fn, nr := nr); f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, poll_fn, nr := nr); } @@ -429,6 +432,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine */ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn); @@ -531,6 +537,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* In a busy network, there can be a significant delay between resource * allocation (Packet Uplink Assignment above) and the actual time when * the MS is allowed to transmit the first Uplink data block. */ @@ -825,6 +834,8 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms);
/* The actual / old link quality values. We need to keep track of the old * (basically previous) link quality value, because OsmoPCU actually @@ -917,6 +928,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */ @@ -989,6 +1003,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */ @@ -1602,6 +1619,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + f_ms_tx_ul_data_block_multi(ms, 5, with_tlli := true); exp_ul_ack_sub := tr_UlAckNackGprs(*, tr_AckNackDescription('1'B), *); exp_ul_ack := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, exp_ul_ack_sub); @@ -2172,6 +2192,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ total_payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); @@ -2223,6 +2246,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */ @@ -2358,6 +2384,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + f_TC_ul_data_toolong_fills_padding_cs(ms, CS_2, 2); f_TC_ul_data_toolong_fills_padding_cs(ms, CS_3, 1); f_TC_ul_data_toolong_fills_padding_cs(ms, CS_4, 0); @@ -2391,6 +2420,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine */ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn); @@ -2668,6 +2700,9 @@ f_ms_establish_ul_tbf(ms); tfi := ms.ul_tbf.tfi;
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */ @@ -2884,6 +2919,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Summary of what's transmitted: * 1- UL RlcDataBlock(dataA) [BSN=0, CV=3] * 2- UL RlcDataBlock(dataA finished, dataB starts) [BSN=1, CV=2] @@ -3185,6 +3223,9 @@ through PDCH (no multiblock assignment possible through PCH) */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine */ f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn, @@ -3330,6 +3371,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine */ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn); @@ -3416,6 +3460,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine */ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn); @@ -3580,6 +3627,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* build mobile Identity */ mi := valueof(ts_MI_IMSI_LV(imsi)); mi_enc_lv := enc_MobileIdentityLV(mi); @@ -3624,6 +3674,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send paging request with or without TMSI */ if (use_ptmsi) { tmsi := oct2int(f_rnd_octstring(4)); /* Random P-TMSI */ @@ -3786,6 +3839,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn); f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn); @@ -3845,6 +3901,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Fake GMM GPRS Attach or similar, PCU doesn't care about upper layers here */ f_ms_tx_ul_data_block_multi(ms, 1, with_tlli := true, fn := ms.ul_tbf.start_time_fn); f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn); @@ -3960,6 +4019,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); @@ -4024,6 +4086,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); @@ -4048,10 +4113,12 @@ * The MS decides it want to send new Ul TBF so it send RACH req to ask for it: */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + dl_fn := f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access * contention resolution) and make sure it is ACKED fine. */ payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); - dl_fn := f_rx_rlcmac_dl_block_exp_dummy(dl_block); f_ms_tx_ul_data_block(ms, payload, cv := 1, with_tlli := true, fn := f_next_pdch_block(dl_fn));
/* UL ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */ @@ -4099,6 +4166,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send one UL block (with TLLI since we are in One-Phase Access contention resolution) and make sure it is ACKED fine. */ payload := f_rnd_octstring(f_ultbf_payload_fill_length(ms.ul_tbf, true)); @@ -4692,6 +4762,9 @@ /* Establish an Uplink TBF */ f_ms_establish_ul_tbf(ms);
+ /* Wait until PCU starts requesting for UL block on this TBF: */ + f_ms_wait_usf(ms); + /* Send an Uplink block, so this TBF becomes "active" */ f_ms_tx_ul_data_block(ms, data, with_tlli := true, fn := ms.ul_tbf.start_time_fn);