<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21096">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified
  fixeria: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS_Tests: introduce and use as_l1_sacch_l1h()<br><br>The new altstep reduces code duplication and simplifies access<br>to the L1 SACCH Header.  It uses dec_SacchL1Header() to decode<br>the header, and would apply the received TA / MS Power level<br>values by default (see 'do_apply' parameter).<br><br>Change-Id: Ie593d9b06aea694fb0903a6d26ee387d8da4c82d<br>Related: SYS#4918<br>---<br>M bts/BTS_Tests.ttcn<br>1 file changed, 66 insertions(+), 68 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 a0d668d..fc714fe 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -1825,6 +1825,25 @@</span><br><span>                }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* handle incoming downlink SACCH, decode the L1 header into the given record */</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_l1_sacch_l1h(inout SacchL1Header l1h,</span><br><span style="color: hsl(120, 100%, 40%);">+                                boolean do_apply := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</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%);">+   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Parse the L1 SACCH header (MS Power Level & Timing Advance) */</span><br><span style="color: hsl(120, 100%, 40%);">+         l1h := dec_SacchL1Header(substr(l1_dl.payload.data_ind.payload, 0, 2));</span><br><span style="color: hsl(120, 100%, 40%);">+               log(%definitionId, "(): Rx SACCH L1 header: ", l1h);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (do_apply) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Update TA and MS power to follow what BTS requests */</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_L1CTL_PARAM(L1CTL, l1h.actual_ta, l1h.ms_power_lvl);</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> private altstep as_l1_dcch_loop() runs on ConnHdlr {</span><br><span>       var L1ctlDlMessage l1_dl;</span><br><span>    [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_DCCH(?))) -> value l1_dl {</span><br><span>@@ -2563,7 +2582,7 @@</span><br><span> These power levels are valid for all bands and require no special handling */</span><br><span> private function f_TC_rsl_ms_pwr_dyn_ass_updown(charstring id) runs on ConnHdlr {</span><br><span>       var uint5_t pwr_var := 7;</span><br><span style="color: hsl(0, 100%, 40%);">-       var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span> </span><br><span>   f_trxc_fake_rssi(rxlev2dbm(10));</span><br><span>     f_l1_tune(L1CTL);</span><br><span>@@ -2586,10 +2605,8 @@</span><br><span>   timer T2 := 6.0;</span><br><span>     T2.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Update sent MS power to follow what BTS requests */</span><br><span style="color: hsl(0, 100%, 40%);">-          f_L1CTL_PARAM(L1CTL, g_pars.l1_pars.ms_actual_ta, oct2int(l1_dl.payload.data_ind.payload[0]));</span><br><span style="color: hsl(0, 100%, 40%);">-          if (oct2int(l1_dl.payload.data_ind.payload[0]) < (pwr_var + 6)) {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] as_l1_sacch_l1h(l1h) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (l1h.ms_power_lvl < (pwr_var + 6)) {</span><br><span>                   repeat;</span><br><span>              }</span><br><span>            T2.stop;</span><br><span>@@ -2607,10 +2624,8 @@</span><br><span>    timer T4 := 6.0;</span><br><span>     T4.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Update sent MS power to follow what BTS requests */</span><br><span style="color: hsl(0, 100%, 40%);">-          f_L1CTL_PARAM(L1CTL, g_pars.l1_pars.ms_actual_ta, oct2int(l1_dl.payload.data_ind.payload[0]));</span><br><span style="color: hsl(0, 100%, 40%);">-          if (oct2int(l1_dl.payload.data_ind.payload[0]) > pwr_var) {</span><br><span style="color: hsl(120, 100%, 40%);">+        [] as_l1_sacch_l1h(l1h) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (l1h.ms_power_lvl > pwr_var) {</span><br><span>                         repeat;</span><br><span>              }</span><br><span>            T4.stop;</span><br><span>@@ -2631,7 +2646,7 @@</span><br><span> /* check that we do not exceed the max power */</span><br><span> private function f_TC_rsl_ms_pwr_dyn_max(charstring id) runs on ConnHdlr {</span><br><span>    var uint5_t pwr_var := 7;</span><br><span style="color: hsl(0, 100%, 40%);">-       var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span> </span><br><span>   /* set a low value to ensure power increases */</span><br><span>      f_trxc_fake_rssi(rxlev2dbm(10));</span><br><span>@@ -2652,14 +2667,12 @@</span><br><span>   timer T1 := 10.0;</span><br><span>    T1.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Update sent MS power to follow what BTS requests */</span><br><span style="color: hsl(0, 100%, 40%);">-          f_L1CTL_PARAM(L1CTL, g_pars.l1_pars.ms_actual_ta, oct2int(l1_dl.payload.data_ind.payload[0]));</span><br><span style="color: hsl(0, 100%, 40%);">-          repeat;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_l1_sacch_l1h(l1h) { repeat; }</span><br><span>  [] L1CTL.receive { repeat; }</span><br><span>         [] T1.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-         if( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var){</span><br><span style="color: hsl(120, 100%, 40%);">+           if (not isbound(l1h)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "No SACCH blocks were received");</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (l1h.ms_power_lvl != pwr_var) {</span><br><span>                    setverdict(fail, "Power level in L1 header should not have changed");</span><br><span>              }</span><br><span>            }</span><br><span>@@ -2672,7 +2685,7 @@</span><br><span> </span><br><span> /* see if we reach the band max power */</span><br><span> private function f_TC_rsl_ms_pwr_dyn_up(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-  var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span>       var uint5_t pwr_var := 15;</span><br><span>   var uint5_t pwr_max_var := f_get_max_power_from_band();</span><br><span> </span><br><span>@@ -2698,19 +2711,16 @@</span><br><span>        timer T1 := 10.0;</span><br><span>    T1.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Update sent MS power to follow what BTS requests */</span><br><span style="color: hsl(0, 100%, 40%);">-          f_L1CTL_PARAM(L1CTL, g_pars.l1_pars.ms_actual_ta, oct2int(l1_dl.payload.data_ind.payload[0]));</span><br><span style="color: hsl(0, 100%, 40%);">-          repeat;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_l1_sacch_l1h(l1h) { repeat; }</span><br><span>  [] L1CTL.receive { repeat; }</span><br><span>         [] T1.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-         var int8_t rcv := oct2int(l1_dl.payload.data_ind.payload[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-           if( f_power_level_is_highest_dbm(rcv) ){</span><br><span style="color: hsl(120, 100%, 40%);">+              if (not isbound(l1h)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "No SACCH blocks were received");</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (f_power_level_is_highest_dbm(l1h.ms_power_lvl)) {</span><br><span>                         setverdict(pass, "Power level in L1 header reduced as expected");</span><br><span>          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(0, 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%);">+                  setverdict(fail, "Power level := ", l1h.ms_power_lvl, " did not ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "reach the expected value := ", pwr_max_var);</span><br><span>           }</span><br><span>            }</span><br><span>    }</span><br><span>@@ -2722,7 +2732,7 @@</span><br><span> </span><br><span> /* see if we reach the band min power */</span><br><span> private function f_TC_rsl_ms_pwr_dyn_down(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-        var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span> </span><br><span>   /* set a high value to ensure power decreases */</span><br><span>     f_trxc_fake_rssi(rxlev2dbm(50));</span><br><span>@@ -2749,18 +2759,15 @@</span><br><span>   timer T1 := 10.0;</span><br><span>    T1.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Update sent MS power to follow what BTS requests */</span><br><span style="color: hsl(0, 100%, 40%);">-          f_L1CTL_PARAM(L1CTL, g_pars.l1_pars.ms_actual_ta, oct2int(l1_dl.payload.data_ind.payload[0]));</span><br><span style="color: hsl(0, 100%, 40%);">-          repeat;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_l1_sacch_l1h(l1h) { repeat; }</span><br><span>  [] L1CTL.receive { repeat; }</span><br><span>         [] T1.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-         if( f_power_level_is_lowest_dbm(oct2int(l1_dl.payload.data_ind.payload[0])) ){</span><br><span style="color: hsl(0, 100%, 40%);">-                  setverdict(pass, "Power level in L1 header increased to lowest power value");</span><br><span style="color: hsl(120, 100%, 40%);">+               if (not isbound(l1h)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "No SACCH blocks were received");</span><br><span style="color: hsl(120, 100%, 40%);">+          } else if (f_power_level_is_lowest_dbm(l1h.ms_power_lvl)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(pass, "Power level increased to lowest power value");</span><br><span>           } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "Power level in L1 header NOT increased to lowest power value");</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Power level NOT increased to lowest power value");</span><br><span>               }</span><br><span>            }</span><br><span>    }</span><br><span>@@ -2773,7 +2780,7 @@</span><br><span> /* see if we change the power level without receiving power parameters, which should not happen</span><br><span> rsl chan act WITHOUT power parameters */</span><br><span> private function f_TC_rsl_ms_pwr_dyn_active(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-       var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span> </span><br><span>   /* set a high value to ensure power decreases */</span><br><span>     f_trxc_fake_rssi(rxlev2dbm(50));</span><br><span>@@ -2795,8 +2802,8 @@</span><br><span>     timer T1 := 10.0;</span><br><span>    T1.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               if ( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_l1_sacch_l1h(l1h, do_apply := false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (l1h.ms_power_lvl != pwr_var) {</span><br><span>                   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span>                   "BS power control should not be active unless we receive a power parameters IE!");</span><br><span>                 }</span><br><span>@@ -2814,7 +2821,7 @@</span><br><span> /* see if we change the power level without receiving power parameters, which should not happen</span><br><span> ms power control WITHOUT power parameters */</span><br><span> private function f_TC_rsl_ms_pwr_dyn_active2(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-  var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span> </span><br><span>   /* set a high value to ensure power decreases */</span><br><span>     f_trxc_fake_rssi(rxlev2dbm(50));</span><br><span>@@ -2839,8 +2846,8 @@</span><br><span>     timer T1 := 10.0;</span><br><span>    T1.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               if ( oct2int(l1_dl.payload.data_ind.payload[0]) != pwr_var) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_l1_sacch_l1h(l1h, do_apply := false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (l1h.ms_power_lvl != pwr_var) {</span><br><span>                   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span>                   "BS power control should not be active unless we receive a power parameters IE!");</span><br><span>                 }</span><br><span>@@ -2856,12 +2863,12 @@</span><br><span> }</span><br><span> </span><br><span> private function f_wait_for_l1_power_level(integer level) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-    var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span>       timer T0 := 10.0;</span><br><span>    T0.start;</span><br><span>    alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (not (l1_dl.payload.data_ind.payload[0] == int2oct(level, 1))) {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] as_l1_sacch_l1h(l1h, do_apply := false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (l1h.ms_power_lvl != level) {</span><br><span>                     Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,</span><br><span>                   "Power level in L1 header != signaled (RSL) power level.");</span><br><span>                }</span><br><span>@@ -3169,7 +3176,7 @@</span><br><span> /* establish DChan, and send MS POWER CONTROL messages via RSL, verify that</span><br><span>  * the BTS is forwarding those values to the MS via the SACCH L1 header. */</span><br><span> private function f_tc_rsl_ms_pwr_ctrl(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-      var L1ctlDlMessage l1_dl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var SacchL1Header l1h;</span><br><span>       var RSL_IE_MS_Power ms_power;</span><br><span>        var RSL_Message rsl;</span><br><span>         var uint5_t power_level := 0;</span><br><span>@@ -3191,15 +3198,11 @@</span><br><span>      RSL.send(rsl);</span><br><span> </span><br><span>   alt {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Pick all SACCH blocks for checking */</span><br><span style="color: hsl(0, 100%, 40%);">-        [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* The first byte of the L1 header contains the power level.</span><br><span style="color: hsl(0, 100%, 40%);">-             * The reserved bits and the fpc bit is set to 0, so we may</span><br><span style="color: hsl(0, 100%, 40%);">-              * compare directly. */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (not (l1_dl.payload.data_ind.payload[0] == int2oct(power_level, 1))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       setverdict(fail, "Power level in L1 header does not match the signaled (RSL) power level.");</span><br><span style="color: hsl(120, 100%, 40%);">+        [] as_l1_sacch_l1h(l1h, do_apply := false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (l1h.ms_power_lvl != power_level) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "Power level := ", l1h.ms_power_lvl, "does not ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "match the signaled (RSL) power level := ", power_level);</span><br><span style="color: hsl(120, 100%, 40%);">+                        Misc_Helpers.f_shutdown(__BFILE__, __LINE__);</span><br><span>                }</span><br><span> </span><br><span>                /* Signal a new power level via RSL for the next turn. */</span><br><span>@@ -3240,9 +3243,8 @@</span><br><span> /* establish DChan, verify that the BTS sets the TA in the first SACCH L1 header.</span><br><span> TA for the IMM ASS messages is still controlled by g_pars.l1_pars.ms_actual_ta! */</span><br><span> private function f_tc_rsl_chan_initial_ta(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-     var L1ctlDlMessage l1_dl;</span><br><span>    var uint5_t ta_to_test := 16;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ var SacchL1Header l1h;</span><br><span> </span><br><span>   f_l1_tune(L1CTL);</span><br><span>    RSL.clear;</span><br><span>@@ -3254,12 +3256,8 @@</span><br><span> </span><br><span> </span><br><span>  alt {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Pick all SACCH blocks for checking */</span><br><span style="color: hsl(0, 100%, 40%);">-        [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               /* The second byte of the L1 header contains the TA. */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (not (l1_dl.payload.data_ind.payload[1] == int2oct(ta_to_test, 1))) {</span><br><span style="color: hsl(120, 100%, 40%);">+      [] as_l1_sacch_l1h(l1h, do_apply := false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (l1h.actual_ta != ta_to_test) {</span><br><span>                   setverdict(fail, "TA in L1 header does not match the signaled (RSL) TA.");</span><br><span>                 }</span><br><span> </span><br><span>@@ -3289,8 +3287,8 @@</span><br><span> </span><br><span> /* establish DChan, verify that the BTS sets MS power in the first SACCH L1 header. */</span><br><span> private function f_tc_rsl_chan_initial_ms_pwr(charstring id) runs on ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-  var L1ctlDlMessage l1_dl;</span><br><span>    var uint5_t ms_power_level := 7;</span><br><span style="color: hsl(120, 100%, 40%);">+      var SacchL1Header l1h;</span><br><span> </span><br><span>   var RSL_IE_MS_Power ms_power;</span><br><span>        ms_power.reserved := 0;</span><br><span>@@ -3306,10 +3304,10 @@</span><br><span>    T.start;</span><br><span>     alt {</span><br><span>        /* Pick all SACCH blocks for checking */</span><br><span style="color: hsl(0, 100%, 40%);">-        [] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, tr_RslLinkID_SACCH(?))) -> value l1_dl {</span><br><span style="color: hsl(0, 100%, 40%);">-               /* The first byte of the L1 header contains the power level.. */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (not (l1_dl.payload.data_ind.payload[0] == int2oct(ms_power_level, 1))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    setverdict(fail, "Power Level in L1 header does not match the signaled (RSL) MS Power Level.");</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_l1_sacch_l1h(l1h, do_apply := false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (l1h.ms_power_lvl != ms_power_level) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "Power level := ", l1h.ms_power_lvl, "does not ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "match the signaled (RSL) power level := ", ms_power_level);</span><br><span>            }</span><br><span>            }</span><br><span>    /* Ignore all other blocks */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/21096">change 21096</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/+/21096"/><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: Ie593d9b06aea694fb0903a6d26ee387d8da4c82d </div>
<div style="display:none"> Gerrit-Change-Number: 21096 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>