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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gbproxy: Add test cases for STATUS handling<br><br>We expect the uplink BSSGP status to be routed based in the<br>inner/contained downlink PDU - and vice-versa.<br><br>Change-Id: If2ddd158346a3da340f1c673354196f3872c4f67<br>Related: OS#4951<br>---<br>M gbproxy/GBProxy_Tests.ttcn<br>M library/Osmocom_Gb_Types.ttcn<br>2 files changed, 243 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn</span><br><span>index 38e695a..fa04190 100644</span><br><span>--- a/gbproxy/GBProxy_Tests.ttcn</span><br><span>+++ b/gbproxy/GBProxy_Tests.ttcn</span><br><span>@@ -359,6 +359,19 @@</span><br><span>    float t_guard</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function get_bvc_idx_for_bvci(GbInstance gbi, BssgpBvci bvci) return integer</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i := 0; i < lengthof(gbi.cfg.bvc); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (gbi.cfg.bvc[i].bvci == bvci) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    return i;</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%);">+     setverdict(fail, "Could not find BVC Index for BVCI ", bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+       return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_cellid_to_RAI(in BssgpCellId cell_id) return RoutingAreaIdentificationV {</span><br><span>      /* mcc_mnc is encoded as of 24.008 10.5.5.15 */</span><br><span>      var BcdMccMnc mcc_mnc := cell_id.ra_id.lai.mcc_mnc;</span><br><span>@@ -864,7 +877,9 @@</span><br><span> </span><br><span> type component GlobalTest_CT extends test_CT {</span><br><span>      port BSSGP_PT G_PCU[NUM_PCU];</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer  g_pcu_idx[NUM_PCU];        /* BVC index currently connected to G_PCU */</span><br><span>         port BSSGP_PT G_SGSN[NUM_SGSN];</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer  g_sgsn_idx[NUM_SGSN];      /* BVC index currently connected to G_SGSN */</span><br><span>        port BSSGP_PT RIM_PCU[NUM_PCU];</span><br><span>      port BSSGP_PT RIM_SGSN[NUM_SGSN];</span><br><span> };</span><br><span>@@ -886,16 +901,41 @@</span><br><span> private function f_global_init_ptp() runs on GlobalTest_CT {</span><br><span>      var integer i;</span><br><span>       for (i := 0; i < lengthof(g_sgsn); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             log("Connecting G_SGSN[", i, "] to BVCI=", g_sgsn[i].cfg.bvc[0].bvci);</span><br><span>           connect(self:G_SGSN[i], g_sgsn[i].vc_BSSGP_BVC[0]:GLOBAL);</span><br><span style="color: hsl(120, 100%, 40%);">+            g_sgsn_idx[i] := 0;</span><br><span>  }</span><br><span>    for (i := 0; i < lengthof(g_pcu); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("Connecting G_PCU[", i, "] to BVCI=", g_pcu[i].cfg.bvc[0].bvci);</span><br><span>             connect(self:G_PCU[i], g_pcu[i].vc_BSSGP_BVC[0]:GLOBAL);</span><br><span style="color: hsl(120, 100%, 40%);">+              g_pcu_idx[i] := 0;</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* (re)connect G_SGSN[sgsn_idx] to a specific PTP BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_global_ptp_connect_sgsn_bvci(integer sgsn_idx, BssgpBvci bvci) runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer sgsn_bvc_idx := get_bvc_idx_for_bvci(g_sgsn[sgsn_idx], bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer old_sgsn_bvc_idx := g_sgsn_idx[sgsn_idx];</span><br><span style="color: hsl(120, 100%, 40%);">+ disconnect(self:G_SGSN[sgsn_idx], g_sgsn[sgsn_idx].vc_BSSGP_BVC[old_sgsn_bvc_idx]:GLOBAL);</span><br><span style="color: hsl(120, 100%, 40%);">+    connect(self:G_SGSN[sgsn_idx], g_sgsn[sgsn_idx].vc_BSSGP_BVC[sgsn_bvc_idx]:GLOBAL);</span><br><span style="color: hsl(120, 100%, 40%);">+   g_sgsn_idx[sgsn_idx] := sgsn_bvc_idx;</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%);">+/* (re)connect G_PCU[pcu_idx] to a specific PTP BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_global_ptp_connect_pcu_bvci(integer pcu_idx, BssgpBvci bvci) runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer pcu_bvc_idx := get_bvc_idx_for_bvci(g_pcu[pcu_idx], bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer old_pcu_bvc_idx := g_pcu_idx[pcu_idx];</span><br><span style="color: hsl(120, 100%, 40%);">+    disconnect(self:G_PCU[pcu_idx], g_pcu[pcu_idx].vc_BSSGP_BVC[old_pcu_bvc_idx]:GLOBAL);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:G_PCU[pcu_idx], g_pcu[pcu_idx].vc_BSSGP_BVC[pcu_bvc_idx]:GLOBAL);</span><br><span style="color: hsl(120, 100%, 40%);">+        g_pcu_idx[pcu_idx] := pcu_bvc_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Send 'tx' on PTP-BVCI from PCU; expect 'rx' on SGSN */</span><br><span> friend function f_global_pcu2sgsn(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,</span><br><span>                                  integer pcu_idx := 0, integer sgsn_idx := 0) runs on GlobalTest_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer rx_idx;</span><br><span>  var PDU_BSSGP rx;</span><br><span>    timer T := 1.0;</span><br><span> </span><br><span>@@ -905,6 +945,9 @@</span><br><span>    [] G_SGSN[sgsn_idx].receive(exp_rx) {</span><br><span>                setverdict(pass);</span><br><span>            }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from G_SGSN.receive(exp_rx) -> @index value rx_idx {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "BSSGP arrived on wrong SGSN[", rx_idx, "] instead of SGSN[", sgsn_idx, "]");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span>    [] G_SGSN[sgsn_idx].receive(PDU_BSSGP:?) -> value rx {</span><br><span>            setverdict(fail, "Unexpected BSSGP on SGSN side: ", rx);</span><br><span>           mtc.stop;</span><br><span>@@ -919,6 +962,7 @@</span><br><span> /* Send 'tx' on PTP-BVCI from SGSN; expect 'rx' on PCU */</span><br><span> friend function f_global_sgsn2pcu(template (value) PDU_BSSGP tx, template (present) PDU_BSSGP exp_rx,</span><br><span>                                  integer sgsn_idx := 0, integer pcu_idx := 0) runs on GlobalTest_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer rx_idx;</span><br><span>  var PDU_BSSGP rx;</span><br><span>    timer T := 1.0;</span><br><span> </span><br><span>@@ -928,6 +972,9 @@</span><br><span>    [] G_PCU[pcu_idx].receive(exp_rx) {</span><br><span>          setverdict(pass);</span><br><span>            }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] any from G_PCU.receive(exp_rx) -> @index value rx_idx {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "BSSGP arrived on wrong PCU[", rx_idx, "] instead of PCU[", pcu_idx, "]");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    [] G_PCU[pcu_idx].receive(PDU_BSSGP:?) -> value rx {</span><br><span>              setverdict(fail, "Unexpected BSSGP on PCU side: ", rx);</span><br><span>            mtc.stop;</span><br><span>@@ -2978,6 +3025,189 @@</span><br><span>  f_cleanup();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * STATUS handling</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%);">+/* BSSGP STATUS PDU must be routed based on inner "PDU In Error" message */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* generate a TMSI with NRI matching sgsn_idx + nri_idx */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_gen_tmsi_for_sgsn_nri(integer sgsn_idx, integer nri_idx) runs on test_CT return OCT4</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer nri := mp_sgsn_nri[sgsn_idx][nri_idx];</span><br><span style="color: hsl(120, 100%, 40%);">+    return f_gen_tmsi(0, nri_v := nri, nri_bitlen := mp_nri_bitlength);</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%);">+/* generate a TLLI with NRI matching sgsn_idx + nri_idx */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_gen_tlli_for_sgsn_nri(integer sgsn_idx, integer nri_idx) runs on test_CT return OCT4</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var OCT4 p_tmsi := f_gen_tmsi_for_sgsn_nri(sgsn_idx, nri_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+        return f_gprs_tlli_from_tmsi(p_tmsi, TLLI_LOCAL);</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%);">+/* STATUS in uplink direction; expect routing by its NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_status_ul(integer pcu_idx, integer sgsn_idx, PDU_BSSGP inner)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    var template (value) PDU_BSSGP tx := ts_BSSGP_STATUS(omit, BSSGP_CAUSE_EQUIMENT_FAILURE, inner);</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (present) PDU_BSSGP exp_rx :=</span><br><span style="color: hsl(120, 100%, 40%);">+            tr_BSSGP_STATUS(omit, BSSGP_CAUSE_EQUIMENT_FAILURE,</span><br><span style="color: hsl(120, 100%, 40%);">+                           tx.pDU_BSSGP_STATUS.pDU_in_Error.erroneous_BSSGP_PDU);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_global_pcu2sgsn(tx, exp_rx, pcu_idx, sgsn_idx);</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%);">+/* STATUS in uplink direction; expect routing by its NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_status_dl(integer sgsn_idx, integer pcu_idx, PDU_BSSGP inner)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    var template (value) PDU_BSSGP tx := ts_BSSGP_STATUS(omit, BSSGP_CAUSE_EQUIMENT_FAILURE, inner);</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (present) PDU_BSSGP exp_rx :=</span><br><span style="color: hsl(120, 100%, 40%);">+            tr_BSSGP_STATUS(omit, BSSGP_CAUSE_EQUIMENT_FAILURE,</span><br><span style="color: hsl(120, 100%, 40%);">+                           tx.pDU_BSSGP_STATUS.pDU_in_Error.erroneous_BSSGP_PDU);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_global_sgsn2pcu(tx, exp_rx, sgsn_idx, pcu_idx);</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%);">+/* STATUS in uplink direction on SIG-BVC containing a TLLI; expect routing by its NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_status_sig_ul_tlli() runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer sgsn_idx, nri_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_global_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (sgsn_idx := 0; sgsn_idx < NUM_SGSN; sgsn_idx := sgsn_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               for (nri_idx := 0; nri_idx < lengthof(mp_sgsn_nri[sgsn_idx]); nri_idx := nri_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* some downlink PDU occurring on SIG-BVC with a TLLI */</span><br><span style="color: hsl(120, 100%, 40%);">+                      var OCT4 tlli := f_gen_tlli_for_sgsn_nri(sgsn_idx, nri_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+                  var PDU_BSSGP inner := valueof(ts_BSSGP_FLUSH_LL(tlli, 2342));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_TC_status_ul(0, sgsn_idx, inner);</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_cleanup();</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%);">+/* STATUS in uplink direction on SIG-BVC containing a TMSI; expect routing by its NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_status_sig_ul_tmsi() runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer sgsn_idx, nri_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_global_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (sgsn_idx := 0; sgsn_idx < NUM_SGSN; sgsn_idx := sgsn_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               for (nri_idx := 0; nri_idx < lengthof(mp_sgsn_nri[sgsn_idx]); nri_idx := nri_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* some downlink PDU occurring on SIG-BVC with a TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+                      const hexstring imsi := '001010123456789'H</span><br><span style="color: hsl(120, 100%, 40%);">+                    var OCT4 tmsi := f_gen_tmsi_for_sgsn_nri(sgsn_idx, nri_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+                  var BssgpBvci bvci := g_pcu[0].cfg.bvc[0].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                       var PDU_BSSGP inner := valueof(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_TC_status_ul(0, sgsn_idx, inner);</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_cleanup();</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%);">+/* STATUS in uplink direction on PTP-BVC containing a TLLI; expect routing by its NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_status_ptp_ul_tlli() runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer sgsn_idx, nri_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_global_init_ptp();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (sgsn_idx := 0; sgsn_idx < NUM_SGSN; sgsn_idx := sgsn_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               for (nri_idx := 0; nri_idx < lengthof(mp_sgsn_nri[sgsn_idx]); nri_idx := nri_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* some downlink PDU occurring on PTP-BVC with a TLLI */</span><br><span style="color: hsl(120, 100%, 40%);">+                      var OCT4 tlli := f_gen_tlli_for_sgsn_nri(sgsn_idx, nri_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+                  var PDU_BSSGP inner := valueof(ts_BSSGP_DL_UD(tlli, '2342'O));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_TC_status_ul(0, sgsn_idx, inner);</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_cleanup();</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%);">+/* STATUS in uplink direction on PTP-BVC containing a TMSI; expect routing by its NRI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_status_ptp_ul_tmsi() runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer sgsn_idx, nri_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_global_init_ptp();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (sgsn_idx := 0; sgsn_idx < NUM_SGSN; sgsn_idx := sgsn_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               for (nri_idx := 0; nri_idx < lengthof(mp_sgsn_nri[sgsn_idx]); nri_idx := nri_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* some downlink PDU occurring on PTP-BVC with a TMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+                      const hexstring imsi := '001010123456789'H</span><br><span style="color: hsl(120, 100%, 40%);">+                    var OCT4 tmsi := f_gen_tmsi_for_sgsn_nri(sgsn_idx, nri_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+                  var BssgpBvci bvci := g_pcu[0].cfg.bvc[0].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                       var PDU_BSSGP inner := valueof(ts_BSSGP_CS_PAGING_PTMSI(bvci, imsi, oct2int(tmsi)));</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_TC_status_ul(0, sgsn_idx, inner);</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_cleanup();</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%);">+/* STATUS in downlink direction in SIG-BVC containing a BVCI; expect routing by it */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_status_sig_dl_bvci() runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer sgsn_idx, pcu_idx, bvc_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_global_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* test each BVC in each PCU from each SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+        for (pcu_idx := 0; pcu_idx < lengthof(g_pcu); pcu_idx := pcu_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            for (bvc_idx := 0; bvc_idx < lengthof(g_pcu[pcu_idx].cfg.bvc); bvc_idx := bvc_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   for (sgsn_idx := 0; sgsn_idx < NUM_SGSN; sgsn_idx := sgsn_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               /* some uplink PDU occurring on SIG-BVC containing a BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+                          var BssgpBvci bvci := g_pcu[pcu_idx].cfg.bvc[bvc_idx].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                           var PDU_BSSGP inner := valueof(ts_BSSGP_LLC_DISCARDED('12345678'O, 1, bvci, 23));</span><br><span style="color: hsl(120, 100%, 40%);">+                             f_TC_status_dl(sgsn_idx, pcu_idx, inner);</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_cleanup();</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%);">+/* STATUS in downlink direction in PTP-BVC; expect routing by BVCI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_status_ptp_dl_bvci() runs on GlobalTest_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer sgsn_idx, pcu_idx, bvc_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     f_global_init_ptp();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* test each BVC in each PCU from each SGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+        for (pcu_idx := 0; pcu_idx < lengthof(g_pcu); pcu_idx := pcu_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            for (bvc_idx := 0; bvc_idx < lengthof(g_pcu[pcu_idx].cfg.bvc); bvc_idx := bvc_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   var BssgpBvci bvci := g_pcu[pcu_idx].cfg.bvc[bvc_idx].bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_global_ptp_connect_pcu_bvci(pcu_idx, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+                 for (sgsn_idx := 0; sgsn_idx < NUM_SGSN; sgsn_idx := sgsn_idx + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               f_global_ptp_connect_sgsn_bvci(sgsn_idx, bvci);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                             /* some uplink PDU occurring on PTP-BVC */</span><br><span style="color: hsl(120, 100%, 40%);">+                            var BssgpCellId cell_id := g_pcu[pcu_idx].cfg.bvc[bvc_idx].cell_id;</span><br><span style="color: hsl(120, 100%, 40%);">+                           var PDU_BSSGP inner := valueof(ts_BSSGP_UL_UD('12345678'O, cell_id, '4223'O));</span><br><span style="color: hsl(120, 100%, 40%);">+                                f_TC_status_dl(sgsn_idx, pcu_idx, inner);</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_cleanup();</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%);">+/* TODO: test case for DL-STATUS(SUSPEND/RESUME) containing RA-ID; expect routing by RA-ID */</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: test case for UL-STATUS(PAGING-by-IMSI) after sending an actual PAGIN-by-IMSI in DL first */</span><br><span> </span><br><span> control {</span><br><span>     execute( TC_BVC_bringup() );</span><br><span>@@ -3061,6 +3291,16 @@</span><br><span>        execute( TC_fc_bvc() );</span><br><span>      execute( TC_fc_ms() );</span><br><span>       execute( TC_ms_reg_enq() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Uplink STATUS */</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_status_sig_ul_tlli() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_status_sig_ul_tmsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_status_ptp_ul_tlli() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_status_ptp_ul_tmsi() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Downlink STATUS */</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_status_sig_dl_bvci() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_status_ptp_dl_bvci() );</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn</span><br><span>index 589108f..f97b9b0 100644</span><br><span>--- a/library/Osmocom_Gb_Types.ttcn</span><br><span>+++ b/library/Osmocom_Gb_Types.ttcn</span><br><span>@@ -1427,7 +1427,7 @@</span><br><span>    }</span><br><span> </span><br><span>        /* 10.4.14 */</span><br><span style="color: hsl(0, 100%, 40%);">-   template PDU_BSSGP ts_BSSGP_STATUS(template BssgpBvci bvci, template BssgpCause cause,</span><br><span style="color: hsl(120, 100%, 40%);">+        template PDU_BSSGP ts_BSSGP_STATUS(template (omit) BssgpBvci bvci, template BssgpCause cause,</span><br><span>                                           PDU_BSSGP pdu) := {</span><br><span>               pDU_BSSGP_STATUS := {</span><br><span>                        bssgpPduType := '41'O,</span><br><span>@@ -1443,12 +1443,12 @@</span><br><span>                     }</span><br><span>            }</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       template PDU_BSSGP tr_BSSGP_STATUS(template BVCI bvci := ?, template BssgpCause cause := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+   template PDU_BSSGP tr_BSSGP_STATUS(template BssgpBvci bvci := ?, template BssgpCause cause := ?,</span><br><span>                                        template octetstring pdu := ?) := {</span><br><span>               pDU_BSSGP_STATUS := {</span><br><span>                        bssgpPduType := '41'O,</span><br><span>                       cause := t_BSSGP_CAUSE(cause),</span><br><span style="color: hsl(0, 100%, 40%);">-                  bVCI := bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bVCI := t_BSSGP_BVCI(bvci),</span><br><span>                  pDU_in_Error := {</span><br><span>                            iEI := '15'O,</span><br><span>                                ext := '1'B,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/22257">change 22257</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/+/22257"/><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: If2ddd158346a3da340f1c673354196f3872c4f67 </div>
<div style="display:none"> Gerrit-Change-Number: 22257 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>