<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/14183">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: Fully implement TC_pcu_data_req_{pdtch,ptcch}<br><br>As trxcon+fake_trx don't have GPRS (TBF) support yet, we cannot do<br>any PCU related tests involving the Um interface yet.  Instead, let's<br>use virtphy to fill that gap.  Using virtphy, we can actually<br>receive/transmit GPRS blocks on the simulated Um interface.<br><br>TC_pcu_data_req_{pdtch,ptcch} are moved to a new test suite<br>"BTS_Tests_virtphy.ttcn" which should symbolize that the related tests<br>are to be executed with osmo-bts-virtual + virtphy instead of<br>osmo-bts-trx + fake_trx + trxcon.<br><br>You also have to set the following module parameter to make this work:<br>    BTS_Tests.mp_bts_trxc_port := -1<br><br>Related: OS#4023<br>Change-Id: I677f660b1076148b3317b08b06eb3d6551d9b577<br>---<br>M bts/BTS_Tests.ttcn<br>1 file changed, 71 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn</span><br><span>index 12e1a3a..e56e033 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -10,6 +10,7 @@</span><br><span> import from L1CTL_PortType all;</span><br><span> import from L1CTL_Types all;</span><br><span> import from LAPDm_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from LAPDm_RAW_PT all;</span><br><span> import from Osmocom_CTRL_Adapter all;</span><br><span> import from Osmocom_CTRL_Functions all;</span><br><span> </span><br><span>@@ -36,6 +37,7 @@</span><br><span> import from TELNETasp_PortType all;</span><br><span> </span><br><span> friend module BTS_Tests_SMSCB;</span><br><span style="color: hsl(120, 100%, 40%);">+friend module BTS_Tests_virtphy;</span><br><span> </span><br><span> /* The tests assume a BTS with the following timeslot configuration:</span><br><span>  * TS0 : Combined CCCH + SDCCH/4</span><br><span>@@ -70,6 +72,8 @@</span><br><span>    /* Time to wait for RSL conn from BTS during startup of test */</span><br><span>      float mp_ipa_up_timeout := 15.0;</span><br><span>     float mp_ipa_up_delay := 0.0;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* false for now, as only virtphy supports it, not calypso-l1 nor trxcon */</span><br><span style="color: hsl(120, 100%, 40%);">+   boolean mp_l1_supports_gprs := false;</span><br><span> }</span><br><span> </span><br><span> type record of RslChannelNr ChannelNrs;</span><br><span>@@ -3134,7 +3138,7 @@</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span> /* Verify no RTS before ACT_REQ; verify RTS after ACT_REQ */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_TC_pcu_act_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr, boolean exp_success)</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_TC_pcu_act_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr, boolean exp_success)</span><br><span> runs on test_CT {</span><br><span>   timer T := 3.0;</span><br><span> </span><br><span>@@ -3175,7 +3179,7 @@</span><br><span> }</span><br><span> </span><br><span> /* verify no more RTS after DEACT_REQ */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_TC_pcu_deact_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_TC_pcu_deact_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr)</span><br><span> runs on test_CT {</span><br><span>   timer T := 3.0;</span><br><span> </span><br><span>@@ -3196,7 +3200,7 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_init_pcu_test() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_pcu_test() runs on test_CT {</span><br><span>  f_init();</span><br><span>    PCU.send(t_SD_PCUIF(g_pcu_conn_id, ts_PCUIF_TXT_IND(0, PCU_VERSION, testcasename())));</span><br><span> }</span><br><span>@@ -3276,7 +3280,7 @@</span><br><span> private const octetstring c_PCU_DATA := '000102030405060708090a0b0c0d0e0f10111213141516'O;</span><br><span> </span><br><span> /* helper function to send a PCU DATA.req */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcu_data_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_pcu_data_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,</span><br><span>                           uint8_t block_nr, uint32_t fn, PCUIF_Sapi sapi, octetstring data)</span><br><span> runs on test_CT</span><br><span> {</span><br><span>@@ -3285,8 +3289,8 @@</span><br><span> }</span><br><span> </span><br><span> /* helper function to wait for RTS.ind for given SAPI on given BTS/TRX/TS and then send */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pcu_wait_rts_and_data_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          PCUIF_Sapi sapi, octetstring data)</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_pcu_wait_rts_and_data_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       PCUIF_Sapi sapi, octetstring data)</span><br><span> runs on test_CT</span><br><span> {</span><br><span>       var PCUIF_send_data sd;</span><br><span>@@ -3345,22 +3349,71 @@</span><br><span>    f_sleep(2.0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-testcase TC_pcu_data_req_pdtch() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pcu_to_l1(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                      PCUIF_Sapi sapi, octetstring data) runs on test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     PCU.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+    f_pcu_wait_rts_and_data_req(bts_nr, trx_nr, ts_nr, sapi, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] L1CTL.receive(tr_L1CTL_DATA_IND(t_RslChanNr_PDCH(ts_nr), ?, data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* FIXME: why is fn of DATA_IND different to fn of RTS / DATA_REQ above? */</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] L1CTL.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+            repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for ", data);</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_disable_dynamic_ts() runs on test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_vty_bsc();</span><br><span style="color: hsl(120, 100%, 40%);">+     /* I'm not quite sure why we need this with osmo-bts-virtual.  Somehow it deosn't seem to</span><br><span style="color: hsl(120, 100%, 40%);">+      * support dynamic timeslots?  But it uses the same scheduler as osmo-bts-trx ?!? */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 3"}, "phys_chan_config TCH/F");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 4"}, "phys_chan_config TCH/F");</span><br><span>      f_init_pcu_test();</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%);">+private function f_virtphy_common() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_disable_dynamic_ts();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_l1ctl();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_l1_tune(L1CTL);</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%);">+testcase TC_pcu_data_req_pdtch() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var TfiUsfArr tua := f_TfiUsfArrInit();</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring data := '0000'O & f_rnd_octstring(21);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_virtphy_common();</span><br><span> </span><br><span>      f_TC_pcu_act_req(0, 0, 7, true);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_pcu_wait_rts_and_data_req(0, 0, 7, PCU_IF_SAPI_PDTCH, c_PCU_DATA);</span><br><span style="color: hsl(0, 100%, 40%);">-    /* FIXME: how to check this was actually sent */</span><br><span style="color: hsl(0, 100%, 40%);">-        f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_TfiUsfArrSet(tua, 7, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_L1CTL_TBF_CFG(L1CTL, false, tua);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_pcu_to_l1(0, 0, 7, PCU_IF_SAPI_PDTCH, data); //c_PCU_DATA);</span><br><span> }</span><br><span> </span><br><span> testcase TC_pcu_data_req_ptcch() runs on test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-    f_init_pcu_test();</span><br><span style="color: hsl(120, 100%, 40%);">+    var TfiUsfArr tua := f_TfiUsfArrInit();</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring data := '0000'O & f_rnd_octstring(21);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_virtphy_common();</span><br><span> </span><br><span>      f_TC_pcu_act_req(0, 0, 7, true);</span><br><span style="color: hsl(0, 100%, 40%);">-        f_pcu_wait_rts_and_data_req(0, 0, 7, PCU_IF_SAPI_PTCCH, c_PCU_DATA);</span><br><span style="color: hsl(0, 100%, 40%);">-    /* FIXME: how to check this was actually sent */</span><br><span style="color: hsl(0, 100%, 40%);">-        f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_TfiUsfArrSet(tua, 7, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_L1CTL_TBF_CFG(L1CTL, false, tua);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_pcu_to_l1(0, 0, 7, PCU_IF_SAPI_PTCCH, data);</span><br><span> }</span><br><span> </span><br><span> /* Send AGCH from PCU; check it appears on Um side */</span><br><span>@@ -4986,8 +5039,10 @@</span><br><span>            execute( TC_pcu_data_req_wrong_trx() );</span><br><span>              execute( TC_pcu_data_req_wrong_ts() );</span><br><span>               execute( TC_pcu_data_req_ts_inactive() );</span><br><span style="color: hsl(0, 100%, 40%);">-               execute( TC_pcu_data_req_pdtch() );</span><br><span style="color: hsl(0, 100%, 40%);">-             execute( TC_pcu_data_req_ptcch() );</span><br><span style="color: hsl(120, 100%, 40%);">+           if (mp_l1_supports_gprs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    execute( TC_pcu_data_req_pdtch() );</span><br><span style="color: hsl(120, 100%, 40%);">+                   execute( TC_pcu_data_req_ptcch() );</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>            execute( TC_pcu_data_req_agch() );</span><br><span>           execute( TC_pcu_data_req_imm_ass_pch() );</span><br><span>            execute( TC_pcu_rach_content() );</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14183">change 14183</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/14183"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I677f660b1076148b3317b08b06eb3d6551d9b577 </div>
<div style="display:none"> Gerrit-Change-Number: 14183 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>