<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24752">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS_Tests: add testcase TC_paging_imsi_200percent_with_ps<br><br>The current paging load tests only test what happens when the paging<br>load is introduced from the PS side. However there are no tests that<br>tests what happens when PS pagings are introduced from the PCU side<br>into an already overloaded system.<br><br>osmo-bts was equipped recently with a mechanism that detects congestive<br>situations. Once a congestion is detcted osmo-bts will drop pagings from<br>the BTS side. The rationale of the new testcase is that the behavior<br>must not change when the PS pagings start since osmo-bts is dropping<br>them.<br><br>Change-Id: Ie72e788d9ebff6ca4e50314746127a9689948062<br>Depends: osmo-bts I30f97672d7a0c369c4a656e878ab8cbbd83e31ea<br>Related: SYS#5306<br>---<br>M bts/BTS_Tests.ttcn<br>M library/PCUIF_CodecPort.ttcn<br>2 files changed, 106 insertions(+), 9 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/52/24752/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 e855405..d4bf6fb 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -3550,6 +3550,18 @@</span><br><span>      boolean combined_ccch,</span><br><span>       integer bs_ag_blks_res,</span><br><span>      float load_factor,</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Mix in a paging request through the PCU socket for every Nth (ps_load_modulus)</span><br><span style="color: hsl(120, 100%, 40%);">+      * paging command that is issued via RSL. */</span><br><span style="color: hsl(120, 100%, 40%);">+  integer ps_load_modulus,</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Wait until the paging queue inside the BTS is congested before starting to add</span><br><span style="color: hsl(120, 100%, 40%);">+      * pagings via the PCU socket (0 = disabled) */</span><br><span style="color: hsl(120, 100%, 40%);">+       boolean ps_wait_cong,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Maximum time to wait until the paging queue is drained at the end of the test.</span><br><span style="color: hsl(120, 100%, 40%);">+      * This usually takes about 15s (size: 200, ~ 13 per s -> 15s), it is recommended</span><br><span style="color: hsl(120, 100%, 40%);">+   * to set this value to 18s, however the draining process may take significantly</span><br><span style="color: hsl(120, 100%, 40%);">+       * longer when the queue contains paging requests for PS as those are implemented</span><br><span style="color: hsl(120, 100%, 40%);">+      * as immediate assignments and require an entire MAC block alone. */</span><br><span style="color: hsl(120, 100%, 40%);">+ float queue_drain_timeout,</span><br><span>   boolean exp_load_ind,</span><br><span>        boolean exp_overload,</span><br><span>        boolean use_tmsi</span><br><span>@@ -3559,20 +3571,34 @@</span><br><span>   integer num_paging_sent,</span><br><span>     integer num_paging_rcv_msgs,</span><br><span>         integer num_paging_rcv_ids,</span><br><span style="color: hsl(0, 100%, 40%);">-     integer num_overload</span><br><span style="color: hsl(120, 100%, 40%);">+  integer num_overload,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* When free space inside the paging queue reaches more than 2 thirds</span><br><span style="color: hsl(120, 100%, 40%);">+  * of its capacity cong_detected is set to true. */</span><br><span style="color: hsl(120, 100%, 40%);">+   boolean cong_detected</span><br><span> }</span><br><span> </span><br><span> /* Helper function for paging related testing */</span><br><span> private function f_TC_paging(PagingTestCfg cfg) runs on test_CT return PagingTestState {</span><br><span style="color: hsl(0, 100%, 40%);">-  f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Using the PCU socket affects the timing of the paging processing. We only</span><br><span style="color: hsl(120, 100%, 40%);">+   * activate the PCU socket if we do paging load tests that include additional</span><br><span style="color: hsl(120, 100%, 40%);">+  * paging load that is introduced through the PCU socket. */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (cfg.ps_load_modulus > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_init_with_pcuif();</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span>    f_init_l1ctl();</span><br><span>      f_l1_tune(L1CTL);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring imm_ass := f_rnd_octstring(23);</span><br><span style="color: hsl(120, 100%, 40%);">+       var ASP_RSL_Unitdata load_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     var PagingTestState st := {</span><br><span>          num_paging_sent := 0,</span><br><span>                num_paging_rcv_msgs := 0,</span><br><span>            num_paging_rcv_ids := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                num_overload := 0</span><br><span style="color: hsl(120, 100%, 40%);">+             num_overload := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            cong_detected := false</span><br><span>       };</span><br><span> </span><br><span>       var float max_pch_blocks_per_sec := f_pch_block_rate_est(cfg.combined_ccch, cfg.bs_ag_blks_res);</span><br><span>@@ -3603,8 +3629,18 @@</span><br><span>            [not cfg.exp_overload]  RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_LOAD_IND(0))) {</span><br><span>                        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected PCH Overload");</span><br><span>                     }</span><br><span style="color: hsl(0, 100%, 40%);">-               [cfg.exp_load_ind] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_LOAD_IND)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         [cfg.exp_load_ind] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_LOAD_IND)) -> value load_ind {</span><br><span>                   log("Rx LOAD_IND");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Detect paging congestion: The logic inside the BTS will diagnose the</span><br><span style="color: hsl(120, 100%, 40%);">+                        * paging queue as congested when the fill state is more than 66% (which</span><br><span style="color: hsl(120, 100%, 40%);">+                       * is two thirds fill state, or approx. 66 of 200 paging slots. When a</span><br><span style="color: hsl(120, 100%, 40%);">+                         * paging congestion is detected pagings that are issued through the PCU</span><br><span style="color: hsl(120, 100%, 40%);">+                       * socket (PS) are dropped in order to prefer the CS related pagings. */</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (load_ind.rsl.ies[1].body.paging_load < 66) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           st.cong_detected := true;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                  /* FIXME: analyze/verify interval + contents */</span><br><span>                      repeat;</span><br><span>                      }</span><br><span>@@ -3613,6 +3649,8 @@</span><br><span>            /* check if paging requests arrive on Um side */</span><br><span>             [] as_l1_count_paging(st.num_paging_rcv_msgs, st.num_paging_rcv_ids, cfg);</span><br><span>           [] L1CTL.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Only relevant when testing including with PCU sock connected */</span><br><span style="color: hsl(120, 100%, 40%);">+            [] PCU.receive { repeat; }</span><br><span>           [] T_itv.timeout {</span><br><span>                   /* Send paging cmds based on elapsed time */</span><br><span>                         var integer new_sent := f_min(pkt_total, float2int(T_total.read * pch_blocks_per_sec) + 1);</span><br><span>@@ -3629,6 +3667,13 @@</span><br><span>                                 /* Send RSL PAGING COMMAND */</span><br><span>                                RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_PAGING_CMD(mi, st.num_paging_sent mod 4)));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                           /* Add additional pagings through the PCU socket interface. */</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (cfg.ps_load_modulus > 0 and st.num_paging_sent mod cfg.ps_load_modulus == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 if (st.cong_detected == true or cfg.ps_wait_cong == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                          f_PCUIF_tx_imm_ass_pch(PCU, g_pcu_conn_id, imm_ass, '123459987'H, wait_for_cnf := 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%);">+</span><br><span>                          st.num_paging_sent := st.num_paging_sent + 1;</span><br><span>                        }</span><br><span>                    if (st.num_paging_sent < pkt_total) {</span><br><span>@@ -3649,19 +3694,20 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* wait for max 18s for paging queue to drain (size: 200, ~ 13 per s -> 15s) */</span><br><span style="color: hsl(0, 100%, 40%);">-      timer T_wait := 18.0;</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T_wait := cfg.queue_drain_timeout</span><br><span>      T_wait.start;</span><br><span>        alt {</span><br><span>        [] as_l1_count_paging(st.num_paging_rcv_msgs, st.num_paging_rcv_ids, cfg);</span><br><span>   [] L1CTL.receive { repeat; }</span><br><span>         /* 65535 == empty paging queue, we can terminate*/</span><br><span>   [] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_LOAD_IND(65535))) { }</span><br><span style="color: hsl(0, 100%, 40%);">-  [] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_LOAD_IND)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+       [] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_PAGING_LOAD_IND)) -> value load_ind { repeat; }</span><br><span>         /* ignore other RSL messages like RF RESource INDication */</span><br><span>  [] RSL_CCHAN.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Only relevant when testing including with PCU sock connected */</span><br><span style="color: hsl(120, 100%, 40%);">+    [] PCU.receive { repeat; }</span><br><span>   [] T_wait.timeout {</span><br><span style="color: hsl(0, 100%, 40%);">-             Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Waiting for empty paging queue");</span><br><span style="color: hsl(120, 100%, 40%);">+               Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Waiting for paging queue, last detected fill state: ", load_ind.rsl.ies[1].body.paging_load));</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span>@@ -3680,6 +3726,9 @@</span><br><span>                combined_ccch := true,</span><br><span>               bs_ag_blks_res := si3.payload.si3.ctrl_chan_desc.bs_ag_blks_res,</span><br><span>             load_factor := 0.8,</span><br><span style="color: hsl(120, 100%, 40%);">+           ps_load_modulus := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         ps_wait_cong := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                queue_drain_timeout := 18.0,</span><br><span>                 exp_load_ind := true,</span><br><span>                exp_overload := false,</span><br><span>               use_tmsi := false</span><br><span>@@ -3704,6 +3753,9 @@</span><br><span>            combined_ccch := true,</span><br><span>               bs_ag_blks_res := si3.payload.si3.ctrl_chan_desc.bs_ag_blks_res,</span><br><span>             load_factor := 0.8,</span><br><span style="color: hsl(120, 100%, 40%);">+           ps_load_modulus := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         ps_wait_cong := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                queue_drain_timeout := 18.0,</span><br><span>                 exp_load_ind := true,</span><br><span>                exp_overload := false,</span><br><span>               use_tmsi := true</span><br><span>@@ -3728,6 +3780,9 @@</span><br><span>             combined_ccch := true,</span><br><span>               bs_ag_blks_res := si3.payload.si3.ctrl_chan_desc.bs_ag_blks_res,</span><br><span>             load_factor := 2.0,</span><br><span style="color: hsl(120, 100%, 40%);">+           ps_load_modulus := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         ps_wait_cong := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                queue_drain_timeout := 18.0,</span><br><span>                 exp_load_ind := true,</span><br><span>                exp_overload := true,</span><br><span>                use_tmsi := false</span><br><span>@@ -3754,6 +3809,9 @@</span><br><span>            combined_ccch := true,</span><br><span>               bs_ag_blks_res := si3.payload.si3.ctrl_chan_desc.bs_ag_blks_res,</span><br><span>             load_factor := 2.0,</span><br><span style="color: hsl(120, 100%, 40%);">+           ps_load_modulus := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         ps_wait_cong := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                queue_drain_timeout := 18.0,</span><br><span>                 exp_load_ind := true,</span><br><span>                exp_overload := true,</span><br><span>                use_tmsi := true</span><br><span>@@ -3770,6 +3828,38 @@</span><br><span>    Misc_Helpers.f_shutdown(__BFILE__, __LINE__);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Same as above, but with additional paging load created by PS pagings that</span><br><span style="color: hsl(120, 100%, 40%);">+ * are issued through the PCU socket. The additional load is introduced when</span><br><span style="color: hsl(120, 100%, 40%);">+ * the paging queue is already two thirds full. Since the BTS implements a</span><br><span style="color: hsl(120, 100%, 40%);">+ * prioritization logic that drops the pagings from the PCU under in those</span><br><span style="color: hsl(120, 100%, 40%);">+ * congestive sitautions the behaviour on the PS side is expected to be</span><br><span style="color: hsl(120, 100%, 40%);">+ * unaffected and match the behavior of TC_paging_imsi_200percent() */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging_imsi_200percent_with_ps() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var SystemInformation si3 := valueof(ts_SI3_default);</span><br><span style="color: hsl(120, 100%, 40%);">+ var PagingTestCfg cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+            combined_ccch := true,</span><br><span style="color: hsl(120, 100%, 40%);">+                bs_ag_blks_res := si3.payload.si3.ctrl_chan_desc.bs_ag_blks_res,</span><br><span style="color: hsl(120, 100%, 40%);">+              load_factor := 2.0,</span><br><span style="color: hsl(120, 100%, 40%);">+           ps_load_modulus := 16,</span><br><span style="color: hsl(120, 100%, 40%);">+                ps_wait_cong := true,</span><br><span style="color: hsl(120, 100%, 40%);">+         queue_drain_timeout := 18.0,</span><br><span style="color: hsl(120, 100%, 40%);">+          exp_load_ind := true,</span><br><span style="color: hsl(120, 100%, 40%);">+         exp_overload := true,</span><br><span style="color: hsl(120, 100%, 40%);">+         use_tmsi := false</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+    var PagingTestState st := f_TC_paging(cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* We expect about 80-85% to pass, given that we can fill the paging buffer of 200</span><br><span style="color: hsl(120, 100%, 40%);">+     * slots and will fully drain that buffer before returning */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template integer tpl := (st.num_paging_sent*78/100 .. st.num_paging_sent *85/100);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not match(st.num_paging_rcv_ids, tpl)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Expected ", tpl, " pagings but have ", st.num_paging_rcv_ids));</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</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%);">+     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%);">+</span><br><span> </span><br><span> /***********************************************************************</span><br><span>  * Immediate Assignment / AGCH</span><br><span>@@ -7501,6 +7591,7 @@</span><br><span>       execute( TC_ipa_crcx_sdcch_not_active() );</span><br><span> </span><br><span>       if (mp_pcu_socket != "") {</span><br><span style="color: hsl(120, 100%, 40%);">+          execute( TC_paging_imsi_200percent_with_ps() );</span><br><span>              execute( TC_pcu_act_req() );</span><br><span>                 execute( TC_pcu_act_req_wrong_ts() );</span><br><span>                execute( TC_pcu_act_req_wrong_bts() );</span><br><span>diff --git a/library/PCUIF_CodecPort.ttcn b/library/PCUIF_CodecPort.ttcn</span><br><span>index 4b2a8ce..f3e4810 100644</span><br><span>--- a/library/PCUIF_CodecPort.ttcn</span><br><span>+++ b/library/PCUIF_CodecPort.ttcn</span><br><span>@@ -139,7 +139,7 @@</span><br><span> }</span><br><span> </span><br><span> function f_PCUIF_tx_imm_ass_pch(PCUIF_CODEC_PT pt, integer conn_id, octetstring imm_ass, hexstring imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                          uint8_t bts_nr := 0) return uint32_t {</span><br><span style="color: hsl(120, 100%, 40%);">+                                uint8_t bts_nr := 0, boolean wait_for_cnf := true) return uint32_t {</span><br><span>         var PCUIF_send_data sd;</span><br><span>      timer T := 3.0;</span><br><span>      /* append 3 last imsi digits so BTS can compute pagng group */</span><br><span>@@ -151,6 +151,12 @@</span><br><span>        }</span><br><span>    pt.send(t_SD_PCUIF(conn_id,</span><br><span>                  ts_PCUIF_DATA_REQ(bts_nr, 0, 0, 0, 0, PCU_IF_SAPI_PCH, prefix & imm_ass)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Exit early when the caller is not interested in the confirmation message */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (wait_for_cnf == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  T.start;</span><br><span>     alt {</span><br><span>        [] pt.receive(t_SD_PCUIF(conn_id,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24752">change 24752</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/+/24752"/><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: Ie72e788d9ebff6ca4e50314746127a9689948062 </div>
<div style="display:none"> Gerrit-Change-Number: 24752 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>