diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-10-08 13:11:05 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-10-08 13:11:17 +0200 |
commit | 202c2f748617283ffb1ac7bd23df7e6874f7b774 (patch) | |
tree | 6b16502fd16272b7f28f67354b56bba22ca7eaa6 /bts | |
parent | faa1d2fd9aaefa41e8a4b5979604427c5ac3e6c7 (diff) |
bts: Fix race condition in f_dyn_ipa_pdch_(de)act
Test BTS_Tests.TC_dyn_osmo_pdch_act_deact was sporadically failing due
to receiving IND_INFO on the PCU port with pdch_mask related TS bit set
to 0 after sending a PDCH ACT. That happened due to a race condition
because PCU send IND_INFO periodically. As a result, it can happen that
BTS sends an IND_INFO after PCU.clear was called and before the PDCH ACT
is handled.
Commit 446e07bc77ba2a1d08673cfeda6d4b6a72f49a77 already did same fix for
f_dyn_ipa_pdch_(de)act() family, but didn't change this one.
Change-Id: I323852632341c19837bebfcf2f00d404151367a7
Diffstat (limited to 'bts')
-rw-r--r-- | bts/BTS_Tests.ttcn | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn index 2c11ca23..f2861d17 100644 --- a/bts/BTS_Tests.ttcn +++ b/bts/BTS_Tests.ttcn @@ -4899,13 +4899,21 @@ runs on ConnHdlr { PCU.clear; f_rsl_chan_act(g_pars.chan_mode); /* expect INFO_IND on PCU interface listing TS as PDCH */ + timer T_wait := 2.0; + T_wait.start; alt { [] PCU.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(bts_nr, ?))) -> value sd { if (substr(sd.data.u.info_ind.trx[trx_nr].pdch_mask, g_chan_nr.tn, 1) != '1'B) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "PCUIF_INFO_IND PDCH_MASK not '1' after PDCH ACT"); + log("PCUIF_INFO_IND PDCH_MASK not yet '1' after PDCH ACT on TS", g_chan_nr.tn, + " mask:", sd.data.u.info_ind.trx[trx_nr].pdch_mask); + repeat; } } [] PCU.receive { repeat; } + [] T_wait.timeout { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Timeout waiting for PCUIF_INFO_IND PDCH_MASK to be '1' on TS", g_chan_nr.tn)); + } } /* try to activate this PDCH from the PCU point of view */ PCU.send(t_SD_PCUIF(pcu_conn_id, ts_PCUIF_ACT_REQ(bts_nr, trx_nr, g_chan_nr.tn))); @@ -4919,13 +4927,21 @@ runs on ConnHdlr { PCU.clear; RSL.send(ts_RSL_RF_CHAN_REL(g_chan_nr)); /* expect BTS to ask PCU to deactivate the channel */ + timer T_wait := 2.0; + T_wait.start; alt { [] PCU.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(bts_nr, ?))) -> value sd { if (substr(sd.data.u.info_ind.trx[trx_nr].pdch_mask, g_chan_nr.tn, 1) != '0'B) { - Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "PCUIF_INFO_IND PDCH_MASK not '0' after PDCH DEACT"); + log("PCUIF_INFO_IND PDCH_MASK not yet '0' after PDCH DEACT on TS", g_chan_nr.tn, + " mask:", sd.data.u.info_ind.trx[trx_nr].pdch_mask); + repeat; } } [] PCU.receive { repeat; } + [] T_wait.timeout { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, + log2str("Timeout waiting for PCUIF_INFO_IND PDCH_MASK to be '0' on TS", g_chan_nr.tn)); + } } /* Emulate PCU asking BTS to deactivate PDCH */ PCU.send(t_SD_PCUIF(pcu_conn_id, ts_PCUIF_DEACT_REQ(bts_nr, trx_nr, g_chan_nr.tn))); |