<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14417">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS: add some dynamic power control tests<br><br>Change-Id: I57489ba22542d859ced767e856634f9060c060f0<br>---<br>M bts/BTS_Tests.ttcn<br>M library/RSL_Types.ttcn<br>2 files changed, 392 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/17/14417/1</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 3244b48..01170f0 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -193,7 +193,8 @@</span><br><span>   float t_guard,</span><br><span>       ConnL1Pars l1_pars,</span><br><span>  TestSpecUnion spec optional,</span><br><span style="color: hsl(0, 100%, 40%);">-    RSL_IE_EncryptionInfo encr optional</span><br><span style="color: hsl(120, 100%, 40%);">+   RSL_IE_EncryptionInfo encr optional,</span><br><span style="color: hsl(120, 100%, 40%);">+  BtsBand bts0_band optional</span><br><span> }</span><br><span> </span><br><span> /* Test-specific parameters */</span><br><span>@@ -594,7 +595,8 @@</span><br><span>          ms_actual_ta := mp_ms_actual_ta_exp</span><br><span>  },</span><br><span>   spec := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-   encr := omit</span><br><span style="color: hsl(120, 100%, 40%);">+  encr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ bts0_band := omit</span><br><span> }</span><br><span> </span><br><span> /***********************************************************************</span><br><span>@@ -1890,6 +1892,363 @@</span><br><span>     f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* target level -100, first rssi -90, ms power 7, expected increase to 7+6 within 6 seconds,</span><br><span style="color: hsl(120, 100%, 40%);">+second rssi -110, ms power 7+6, expected decrease to 7 within 6 seconds,</span><br><span style="color: hsl(120, 100%, 40%);">+These power levels are valid for all bands and require no special handling */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_TC_rsl_ms_pwr_dyn_ass_updown(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      var uint5_t pwr_var := 7;</span><br><span style="color: hsl(120, 100%, 40%);">+     var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_trxc_fake_rssi(rxlev2dbm(10));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_l1_tune(L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_IE_List addl_ies;</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_IE_MS_Power_Parameters pp;</span><br><span style="color: hsl(120, 100%, 40%);">+    pp := valueof(ts_RSL_IE_MS_Power_Parameters('aabbcc'O));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    addl_ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+         valueof(t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ts_RSL_IE_MS_Power(pwr_var)})),</span><br><span style="color: hsl(120, 100%, 40%);">+            valueof(t_RSL_IE(RSL_IE_MS_POWER_PARAM, RSL_IE_Body:{ms_power_params := pp}))</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%);">+  /* establish with power parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_est_dchan(more_ies := addl_ies);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* set a high value to ensure L1 power control level increases */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_trxc_fake_rssi(rxlev2dbm(20));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T2 := 6.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T2.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(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { </span><br><span style="color: hsl(120, 100%, 40%);">+            if( not(oct2int(l1_dl.payload.data_ind.payload[0]) > (pwr_var+6))){</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%);">+             T2.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+              } </span><br><span style="color: hsl(120, 100%, 40%);">+    [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T2.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, </span><br><span style="color: hsl(120, 100%, 40%);">+                   "Power Level in L1 header has not increased sufficiently");</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%);">+   /* set a low value to ensure L1 power control level decreases */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_trxc_fake_rssi(rxlev2dbm(0));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T4 := 6.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T4.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(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { </span><br><span style="color: hsl(120, 100%, 40%);">+            if( not(oct2int(l1_dl.payload.data_ind.payload[0]) <= (pwr_var))){</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%);">+             T4.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass, "Power level in L1 decreased/increased as expected");</span><br><span style="color: hsl(120, 100%, 40%);">+              } </span><br><span style="color: hsl(120, 100%, 40%);">+    [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T4.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, </span><br><span style="color: hsl(120, 100%, 40%);">+                   "Power Level in L1 header has not decreased sufficiently");</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%);">+   f_rsl_chan_deact();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);</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%);">+/* check that we do not exceed the max power */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_TC_rsl_ms_pwr_dyn_max(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint5_t pwr_var := 7;</span><br><span style="color: hsl(120, 100%, 40%);">+     var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* set a low value to ensure power increases */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_trxc_fake_rssi(rxlev2dbm(10));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_l1_tune(L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_IE_List addl_ies;</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_IE_MS_Power_Parameters pp;</span><br><span style="color: hsl(120, 100%, 40%);">+    pp := valueof(ts_RSL_IE_MS_Power_Parameters('aabbcc'O));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    addl_ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+         valueof(t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ts_RSL_IE_MS_Power(pwr_var)})),</span><br><span style="color: hsl(120, 100%, 40%);">+            valueof(t_RSL_IE(RSL_IE_MS_POWER_PARAM, RSL_IE_Body:{ms_power_params := pp}))</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%);">+  /* establish with power parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_est_dchan(more_ies := addl_ies);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T1 := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+     T1.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(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T1.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+               if( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var){</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Power level in L1 header should not have changed");</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%);">+   f_rsl_chan_deact();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);</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%);">+/* see if we reach the band max power */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_TC_rsl_ms_pwr_dyn_up(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint5_t pwr_var := 15;</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint5_t pwr_max_var := f_get_max_power_from_band();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* set a low value to ensure power increases */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_trxc_fake_rssi(rxlev2dbm(10));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_l1_tune(L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_IE_MS_Power ms_power;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms_power := valueof(ts_RSL_IE_MS_Power(pwr_var));</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_IE pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+       pwr  := valueof(t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ms_power}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* establish with fixed power level */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_est_dchan(more_ies :={pwr});</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* check our initial power level */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_wait_for_l1_power_level(pwr_var);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* update power param to enable power loop</span><br><span style="color: hsl(120, 100%, 40%);">+    48.058 The maximum power to be used is indicated in the BS and MS Power elements respectively. */</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+  rsl := valueof(ts_RSL_MS_PWR_CTRL_with_pp(g_chan_nr, pwr_max_var));     </span><br><span style="color: hsl(120, 100%, 40%);">+      RSL.send(rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* wait, then check that our power level was reduced */</span><br><span style="color: hsl(120, 100%, 40%);">+       timer T1 := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+     T1.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(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T1.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+               var int8_t rcv := oct2int(l1_dl.payload.data_ind.payload[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+         if( f_power_level_is_highest_dbm(rcv) ){</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(pass, "Power level in L1 header reduced as expected");</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, </span><br><span style="color: hsl(120, 100%, 40%);">+                   log2str("Power Level in L1 header did not reach the expected value, e:",pwr_max_var," r:",rcv));</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%);">+   f_rsl_chan_deact();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);</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%);">+/* see if we reach the band min power */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_TC_rsl_ms_pwr_dyn_down(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* set a high value to ensure power decreases */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_trxc_fake_rssi(rxlev2dbm(50));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_l1_tune(L1CTL);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSL.clear;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint5_t pwr_var := 5;</span><br><span style="color: hsl(120, 100%, 40%);">+     var uint5_t pwr_target_val := 15;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var RSL_IE_MS_Power ms_power;</span><br><span style="color: hsl(120, 100%, 40%);">+ ms_power := valueof(ts_RSL_IE_MS_Power(pwr_var));</span><br><span style="color: hsl(120, 100%, 40%);">+     var RSL_IE pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+       pwr  := valueof(t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ms_power}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* establish with fixed power level */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_est_dchan(more_ies :={pwr});</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* check our initial power level */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_wait_for_l1_power_level(pwr_var);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* update power param to enable power loop</span><br><span style="color: hsl(120, 100%, 40%);">+     as per spec the supplied ms power IE should set the max allowed power...*/</span><br><span style="color: hsl(120, 100%, 40%);">+   var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+  rsl := valueof(ts_RSL_MS_PWR_CTRL_with_pp(g_chan_nr, pwr_var)); </span><br><span style="color: hsl(120, 100%, 40%);">+      RSL.send(rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* wait, then check that our power level was increased */</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T1 := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+     T1.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(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T1.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+               if( f_power_level_is_lowest_dbm(oct2int(l1_dl.payload.data_ind.payload[0])) ){</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(pass, "Power level in L1 header increased to lowest power value");</span><br><span style="color: hsl(120, 100%, 40%);">+               } else { </span><br><span style="color: hsl(120, 100%, 40%);">+                     Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, </span><br><span style="color: hsl(120, 100%, 40%);">+                   "Power level in L1 header NOT increased to lowest power value");</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%);">+   f_rsl_chan_deact();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);</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%);">+function f_wait_for_l1_power_level(integer level) runs on ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T0 := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+     T0.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(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (not (l1_dl.payload.data_ind.payload[0] == int2oct(level, 1))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Power level in L1 header != signaled (RSL) power level.");</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%);">+     [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T0.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Timeout waiting for initial power level");</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%);">+     T0.stop;</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_power_level_is_lowest_dbm(integer level) runs on ConnHdlr return boolean  {</span><br><span style="color: hsl(120, 100%, 40%);">+ var IntegerRecord min_dbm_level;</span><br><span style="color: hsl(120, 100%, 40%);">+      var IntegerRecord max_dbm_level;</span><br><span style="color: hsl(120, 100%, 40%);">+      var IntegerRecord x := f_power_from_band(g_pars.bts0_band, min_dbm_level, max_dbm_level);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(min_dbm_level); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (min_dbm_level[i] == level) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return true;</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 false;</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_power_level_is_highest_dbm(integer level) runs on ConnHdlr return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+    var IntegerRecord min_dbm_level;</span><br><span style="color: hsl(120, 100%, 40%);">+      var IntegerRecord max_dbm_level;</span><br><span style="color: hsl(120, 100%, 40%);">+      var IntegerRecord x := f_power_from_band(g_pars.bts0_band, min_dbm_level, max_dbm_level);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < sizeof(max_dbm_level); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (max_dbm_level[i] == level) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return true;</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 false;</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_get_max_power_from_band() runs on ConnHdlr return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+    var IntegerRecord min_dbm_level;</span><br><span style="color: hsl(120, 100%, 40%);">+      var IntegerRecord max_dbm_level;</span><br><span style="color: hsl(120, 100%, 40%);">+      var IntegerRecord x := f_power_from_band(g_pars.bts0_band, min_dbm_level, max_dbm_level);</span><br><span style="color: hsl(120, 100%, 40%);">+     return max_dbm_level[0];</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%);">+type charstring BtsBand ("GSM450","GSM480","GSM750","GSM810","GSM850","GSM900","DCS1800","PCS1900");</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_power_from_band(in BtsBand band, out IntegerRecord min_dbm_level, out IntegerRecord max_dbm_level) return IntegerRecord {</span><br><span style="color: hsl(120, 100%, 40%);">+   // 45.005 4.1.1</span><br><span style="color: hsl(120, 100%, 40%);">+       var IntegerRecord gsm_power :={31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19,</span><br><span style="color: hsl(120, 100%, 40%);">+     18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,</span><br><span style="color: hsl(120, 100%, 40%);">+      2, 1, 0};</span><br><span style="color: hsl(120, 100%, 40%);">+    var IntegerRecord dcs_power :={28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,</span><br><span style="color: hsl(120, 100%, 40%);">+         14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31, 30, 29};</span><br><span style="color: hsl(120, 100%, 40%);">+       var IntegerRecord pcs_power :={15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 31, 30};</span><br><span style="color: hsl(120, 100%, 40%);">+ var IntegerRecord rv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if((band == "GSM450")</span><br><span style="color: hsl(120, 100%, 40%);">+       or (band == "GSM480")</span><br><span style="color: hsl(120, 100%, 40%);">+       or (band == "GSM750") </span><br><span style="color: hsl(120, 100%, 40%);">+      or (band == "GSM810") </span><br><span style="color: hsl(120, 100%, 40%);">+      or (band == "GSM850") </span><br><span style="color: hsl(120, 100%, 40%);">+      or (band == "GSM900")){</span><br><span style="color: hsl(120, 100%, 40%);">+             rv := gsm_power;</span><br><span style="color: hsl(120, 100%, 40%);">+              min_dbm_level := {31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19} ;</span><br><span style="color: hsl(120, 100%, 40%);">+               max_dbm_level := {2, 1, 0};</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if(band == "DCS1800"){</span><br><span style="color: hsl(120, 100%, 40%);">+               rv := dcs_power;</span><br><span style="color: hsl(120, 100%, 40%);">+              min_dbm_level := {28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15};</span><br><span style="color: hsl(120, 100%, 40%);">+            max_dbm_level := {29};</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if(band == "PCS1900"){</span><br><span style="color: hsl(120, 100%, 40%);">+               rv := pcs_power;</span><br><span style="color: hsl(120, 100%, 40%);">+              min_dbm_level := {15};</span><br><span style="color: hsl(120, 100%, 40%);">+                max_dbm_level := {30};</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%);">+ return rv;</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_vty_get_bts0_band() runs on test_CT return BtsBand {</span><br><span style="color: hsl(120, 100%, 40%);">+      return f_vty_transceive_match_regex(BTSVTY, "show bts 0", "BTS 0 is of \w+ type in band (\w+),*", 0);</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_rsl_ms_pwr_dyn_ass_updown() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -100");</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer tn := 1; tn <= 1; tn := tn+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+            pars.bts0_band := f_vty_get_bts0_band();</span><br><span style="color: hsl(120, 100%, 40%);">+              vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_ass_updown), pars, trxc_comp := true);</span><br><span style="color: hsl(120, 100%, 40%);">+          vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");</span><br><span style="color: hsl(120, 100%, 40%);">+        Misc_Helpers.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%);">+testcase TC_rsl_ms_pwr_dyn_up() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -10");</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer tn := 1; tn <= 1; tn := tn+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+            pars.bts0_band := f_vty_get_bts0_band();</span><br><span style="color: hsl(120, 100%, 40%);">+              vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_up), pars, trxc_comp := true);</span><br><span style="color: hsl(120, 100%, 40%);">+          vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");</span><br><span style="color: hsl(120, 100%, 40%);">+        Misc_Helpers.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%);">+testcase TC_rsl_ms_pwr_dyn_max() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -10");</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer tn := 1; tn <= 1; tn := tn+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+            pars.bts0_band := f_vty_get_bts0_band();</span><br><span style="color: hsl(120, 100%, 40%);">+              vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_max), pars, trxc_comp := true);</span><br><span style="color: hsl(120, 100%, 40%);">+         vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");</span><br><span style="color: hsl(120, 100%, 40%);">+        Misc_Helpers.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%);">+testcase TC_rsl_ms_pwr_dyn_down() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "osmotrx ms-power-loop -100");</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer tn := 1; tn <= 1; tn := tn+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pars := valueof(t_Pars(t_RslChanNr_Bm(tn), ts_RSL_ChanMode_SIGN));</span><br><span style="color: hsl(120, 100%, 40%);">+            pars.bts0_band := f_vty_get_bts0_band();</span><br><span style="color: hsl(120, 100%, 40%);">+              vc_conn := f_start_handler(refers(f_TC_rsl_ms_pwr_dyn_down), pars, trxc_comp := true);</span><br><span style="color: hsl(120, 100%, 40%);">+                vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config(BTSVTY, "phy 0", "no osmotrx ms-power-loop");</span><br><span style="color: hsl(120, 100%, 40%);">+        Misc_Helpers.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> testcase TC_meas_res_sign_tchf() runs on test_CT {</span><br><span>     var ConnHdlr vc_conn;</span><br><span>        var ConnHdlrPars pars;</span><br><span>@@ -1902,6 +2261,7 @@</span><br><span>       }</span><br><span>    Misc_Helpers.f_shutdown(__BFILE__, __LINE__);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> testcase TC_meas_res_sign_tchh() runs on test_CT {</span><br><span>   var ConnHdlr vc_conn;</span><br><span>        var ConnHdlrPars pars;</span><br><span>@@ -5550,6 +5910,10 @@</span><br><span>      execute( TC_meas_res_sign_sdcch8() );</span><br><span>        execute( TC_meas_res_sign_tchh_toa256() );</span><br><span>   execute( TC_rsl_ms_pwr_ctrl() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_rsl_ms_pwr_dyn_up() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_rsl_ms_pwr_dyn_down() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_rsl_ms_pwr_dyn_ass_updown() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_rsl_ms_pwr_dyn_max() );</span><br><span>  execute( TC_rsl_chan_initial_ms_pwr() );</span><br><span>     execute( TC_rsl_chan_initial_ta() );</span><br><span>         execute( TC_rsl_modify_encr() );</span><br><span>diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn</span><br><span>index 456d6d2..0534b74 100644</span><br><span>--- a/library/RSL_Types.ttcn</span><br><span>+++ b/library/RSL_Types.ttcn</span><br><span>@@ -626,6 +626,18 @@</span><br><span>                 msg := msg</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* 9.3.31 */</span><br><span style="color: hsl(120, 100%, 40%);">+  type record RSL_IE_MS_Power_Parameters {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t len,</span><br><span style="color: hsl(120, 100%, 40%);">+          octetstring params</span><br><span style="color: hsl(120, 100%, 40%);">+    } with {</span><br><span style="color: hsl(120, 100%, 40%);">+              variant (len) "LENGTHTO(params)";</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    template (value) RSL_IE_MS_Power_Parameters ts_RSL_IE_MS_Power_Parameters(octetstring params) := {</span><br><span style="color: hsl(120, 100%, 40%);">+            len := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+           params := params</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* 9.3.40 */</span><br><span>         type enumerated RSL_ChanNeeded {</span><br><span>             RSL_CHANNEED_ANY        ('00'B),</span><br><span>@@ -765,6 +777,7 @@</span><br><span>               uint8_t                 handover_ref,</span><br><span>                RSL_IE_BS_Power         bs_power,</span><br><span>            RSL_IE_MS_Power         ms_power,</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL_IE_MS_Power_Parameters ms_power_params,</span><br><span>          uint8_t                 timing_adv,</span><br><span>          RSL_IE_MultirateCtrl    multirate_ctrl,</span><br><span>              uint8_t                 msg_id,</span><br><span>@@ -819,6 +832,7 @@</span><br><span>                                        handover_ref, iei = RSL_IE_HANDO_REF;</span><br><span>                                        bs_power, iei = RSL_IE_BS_POWER;</span><br><span>                                     ms_power, iei = RSL_IE_MS_POWER;</span><br><span style="color: hsl(120, 100%, 40%);">+                                      ms_power_params, iei = RSL_IE_MS_POWER_PARAM;</span><br><span>                                        timing_adv, iei = RSL_IE_TIMING_ADVANCE;</span><br><span>                                     multirate_ctrl, iei = RSL_IE_MR_CONTROL;</span><br><span>                                     msg_id, iei = RSL_IE_MSG_ID;</span><br><span>@@ -1442,6 +1456,18 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) RSL_Message ts_RSL_MS_PWR_CTRL_with_pp(template (value) RslChannelNr chan_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        integer pwr_level) := {</span><br><span style="color: hsl(120, 100%, 40%);">+               msg_disc := ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false),</span><br><span style="color: hsl(120, 100%, 40%);">+           msg_type := RSL_MT_MS_POWER_CONTROL,</span><br><span style="color: hsl(120, 100%, 40%);">+          ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := chan_nr}),</span><br><span style="color: hsl(120, 100%, 40%);">+                   t_RSL_IE(RSL_IE_MS_POWER, RSL_IE_Body:{ms_power := ts_RSL_IE_MS_Power(pwr_level)}),</span><br><span style="color: hsl(120, 100%, 40%);">+                   t_RSL_IE(RSL_IE_MS_POWER_PARAM, RSL_IE_Body:{ms_power_params :=</span><br><span style="color: hsl(120, 100%, 40%);">+                       ts_RSL_IE_MS_Power_Parameters('aabbcc'O)})</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>  /* 8.4.19 BTS -> BSC */</span><br><span>   template (value) RSL_Message ts_RSL_RF_CHAN_REL_ACK(template (value) RslChannelNr chan_nr) :=</span><br><span>                ts_RSL_MsgDiscType(ts_RSL_MsgDisc(RSL_MDISC_DCHAN, false),</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14417">change 14417</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/+/14417"/><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: I57489ba22542d859ced767e856634f9060c060f0 </div>
<div style="display:none"> Gerrit-Change-Number: 14417 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>