<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15376">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: First CBSP related tests<br><br>Change-Id: Ia6ffac181f50586d06d2f29bca1c57285179e861<br>---<br>A bsc/BSC_Tests_CBSP.ttcn<br>M bsc/gen_links.sh<br>M bsc/regen_makefile.sh<br>M library/CBSP_Templates.ttcn<br>M library/CBSP_Types.ttcn<br>M library/RSL_Types.ttcn<br>6 files changed, 549 insertions(+), 5 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/76/15376/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests_CBSP.ttcn b/bsc/BSC_Tests_CBSP.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..d128761</span><br><span>--- /dev/null</span><br><span>+++ b/bsc/BSC_Tests_CBSP.ttcn</span><br><span>@@ -0,0 +1,504 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module BSC_Tests_CBSP {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CBSP Integration Tests for OsmoBSC</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This test suite tests OsmoBSC while emulating the CBC (Cell Broadcast Centre)</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%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSMAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSC_Tests all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSL_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSL_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from CBSP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from CBSP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from CBSP_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from CBSP_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+     charstring mp_cbc_ip := "0.0.0.0";</span><br><span style="color: hsl(120, 100%, 40%);">+  integer mp_cbc_port := 48049;</span><br><span style="color: hsl(120, 100%, 40%);">+ integer mp_bsc_cbsp_port := 48050;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* BTS 0: 262-42-1-0 with CBCH</span><br><span style="color: hsl(120, 100%, 40%);">+         * BTS 1: 262-42-1-1 with CBCH</span><br><span style="color: hsl(120, 100%, 40%);">+         * BTS 2: 262-42-2-1 with CBCH</span><br><span style="color: hsl(120, 100%, 40%);">+         * BTS 3: 262-42-2-3 without CBCH */</span><br><span style="color: hsl(120, 100%, 40%);">+  GsmCgiAbstract mp_cgi_bts0 := { '262'H, '42'H, 1, 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+        GsmCgiAbstract mp_cgi_bts1 := { '262'H, '42'H, 1, 1 };</span><br><span style="color: hsl(120, 100%, 40%);">+        GsmCgiAbstract mp_cgi_bts2 := { '262'H, '42'H, 2, 1 };</span><br><span style="color: hsl(120, 100%, 40%);">+        GsmCgiAbstract mp_cgi_bts3 := { '262'H, '42'H, 2, 3 };</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 type record GsmCgiAbstract {</span><br><span style="color: hsl(120, 100%, 40%);">+     GsmMcc mcc,</span><br><span style="color: hsl(120, 100%, 40%);">+   GsmMnc mnc,</span><br><span style="color: hsl(120, 100%, 40%);">+   GsmLac lac,</span><br><span style="color: hsl(120, 100%, 40%);">+   GsmCellId ci</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+private template (value) BSSMAP_FIELD_CellIdentification_CGI bssmap_cgi(GsmCgiAbstract cgi) :=</span><br><span style="color: hsl(120, 100%, 40%);">+      ts_BSSMAP_CI_CGI(cgi.mcc, cgi.mnc, cgi.lac, cgi.ci);</span><br><span style="color: hsl(120, 100%, 40%);">+private template (value) BSSMAP_FIELD_CellIdentification_LAC_CI bssmap_lac_ci(GsmCgiAbstract cgi) :=</span><br><span style="color: hsl(120, 100%, 40%);">+    ts_BSSMAP_CI_LAC_CI(cgi.lac, cgi.ci);</span><br><span style="color: hsl(120, 100%, 40%);">+private template (value) BSSMAP_FIELD_CellIdentification_LAI bssmap_lai(GsmCgiAbstract cgi) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ ts_BSSMAP_CI_LAI(cgi.mcc, cgi.mnc, cgi.lac);</span><br><span style="color: hsl(120, 100%, 40%);">+private template (value) OCT2 bssmap_lac(GsmCgiAbstract cgi) := ts_BSSMAP_CI_LAC(cgi.lac);</span><br><span style="color: hsl(120, 100%, 40%);">+private template (value) OCT2 bssmap_ci(GsmCgiAbstract cgi) := ts_BSSMAP_CI_CI(cgi.ci);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component cbsp_test_CT extends test_CT, CBSP_Adapter_CT {</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 altstep as_IgnRSL(template RSL_Message tr) runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+[] IPA_RSL[0].receive(tr_RSL_UD(tr)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+[] IPA_RSL[1].receive(tr_RSL_UD(tr)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+[] IPA_RSL[2].receive(tr_RSL_UD(tr)) { repeat; }</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 altstep as_FailRSL() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+var template RSL_Message tr := (tr_RSL_SMSCB_CMD);</span><br><span style="color: hsl(120, 100%, 40%);">+var ASP_RSL_Unitdata rx;</span><br><span style="color: hsl(120, 100%, 40%);">+[] IPA_RSL[0].receive(tr_RSL_UD(tr)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+      setverdict(fail, "Received unexpected RSL ", rx);</span><br><span style="color: hsl(120, 100%, 40%);">+   mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+[] IPA_RSL[1].receive(tr_RSL_UD(tr)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+      setverdict(fail, "Received unexpected RSL ", rx);</span><br><span style="color: hsl(120, 100%, 40%);">+   mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+[] IPA_RSL[2].receive(tr_RSL_UD(tr)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+      setverdict(fail, "Received unexpected RSL ", rx);</span><br><span style="color: hsl(120, 100%, 40%);">+   mtc.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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_Tests.f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+   activate(as_IgnRSL((tr_RSL_BCCH_INFO, tr_RSL_SACCH_FILL,</span><br><span style="color: hsl(120, 100%, 40%);">+                          tr_RSL_NO_BCCH_INFO, tr_RSL_NO_SACCH_FILL,</span><br><span style="color: hsl(120, 100%, 40%);">+                            tr_RSL_MsgTypeD(?))));</span><br><span style="color: hsl(120, 100%, 40%);">+    activate(as_FailRSL());</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbsp_init_client() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     CBSP_Adapter.f_connect(mp_bsc_ip, mp_bsc_cbsp_port, "", -1);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_cbsp_init_tail();</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_cbsp_init_server() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var ASP_Event asp_evt;</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T := 10.0;</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%);">+     CBSP_Adapter.f_bind(mp_cbc_ip, mp_cbc_port);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CBSP[0].receive(ASP_Event:{connOpened:=?}) -> value asp_evt {</span><br><span style="color: hsl(120, 100%, 40%);">+           g_cbsp_conn_id[0] := asp_evt.connOpened.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for incoming connection to CBSP Port");</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_cbsp_init_tail();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbsp_init_tail() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] CBSP[0].receive(tr_CBSP_Recv(?, tr_CBSP_RESTART(?, CBSP_BC_MSGT_CBS, CBSP_RI_DATA_LOST)));</span><br><span style="color: hsl(120, 100%, 40%);">+ //[] CBSP[0].receive(tr_CBSP_Recv(?, tr_CBSP_RESTART(?, CBSP_BC_MSGT_EMERG, CBSP_RI_DATA_LOST)));</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_gen_page() return CBSP_IE {</span><br><span style="color: hsl(120, 100%, 40%);">+        var integer len := f_rnd_int(82);</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring payload := f_rnd_octstring(len);</span><br><span style="color: hsl(120, 100%, 40%);">+      return valueof(ts_CbspMsgContent(payload, len));</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_cbsp_reset_bss(integer idx) runs on CBSP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+     timer T := 3.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       tx := ts_CBSP_RESET(cell_list := ts_BSSMAP_CIL_BSS);</span><br><span style="color: hsl(120, 100%, 40%);">+  CBSP[idx].clear;</span><br><span style="color: hsl(120, 100%, 40%);">+      CBSP[idx].send(ts_CBSP_Send(g_cbsp_conn_id[idx], tx));</span><br><span style="color: hsl(120, 100%, 40%);">+        T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CBSP[idx].receive(tr_CBSP_Recv(?, tr_CBSP_RESET_COMPL(cell_list := ts_BSSMAP_CIL_BSS)));</span><br><span style="color: hsl(120, 100%, 40%);">+   [] CBSP[idx].receive {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "received unexpected CBSP");</span><br><span style="color: hsl(120, 100%, 40%);">+               mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "timeout waiting for RESET COMPLETE");</span><br><span style="color: hsl(120, 100%, 40%);">+             mtc.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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* send a WRITE CBS to the BSC; expect either COMPLETE or FAILURE in response*/</span><br><span style="color: hsl(120, 100%, 40%);">+function f_cbsp_write(uint16_t msg_id, uint16_t ser_no,</span><br><span style="color: hsl(120, 100%, 40%);">+                    template (value) BSSMAP_FIELD_CellIdentificationList cell_list := ts_BSSMAP_CIL_BSS,</span><br><span style="color: hsl(120, 100%, 40%);">+                  template (value) CBSP_Category category := CBSP_CATEG_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint16_t rep_period := 10, uint16_t num_bcast_req := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t dcs := 0, uint8_t channel_ind := 0, CBSP_IEs content,</span><br><span style="color: hsl(120, 100%, 40%);">+                 template BSSMAP_FIELD_CellIdentificationList success_list := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+               template CBSP_FailureListItems fail_list := omit) runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var template CBSP_PDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       tx := ts_CBSP_WRITE_CBS(msg_id, ser_no, cell_list, channel_ind, category,</span><br><span style="color: hsl(120, 100%, 40%);">+                             rep_period, num_bcast_req, dcs, content);</span><br><span style="color: hsl(120, 100%, 40%);">+     CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (istemplatekind(fail_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            rx := tr_CBSP_WRITE_CBS_COMPL(msg_id, ser_no, success_list, channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              rx := tr_CBSP_WRITE_CBS_FAIL(msg_id, ser_no, fail_list, *, success_list, channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], rx)) {</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%);">+     [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received unexpected CBSP");</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%);">+/* send a REPLACE CBS to the BSC; expect either COMPLETE or FAILURE in response*/</span><br><span style="color: hsl(120, 100%, 40%);">+function f_cbsp_replace(uint16_t msg_id, uint16_t new_ser_no, uint16_t old_ser_no,</span><br><span style="color: hsl(120, 100%, 40%);">+               template (value) BSSMAP_FIELD_CellIdentificationList cell_list := ts_BSSMAP_CIL_BSS,</span><br><span style="color: hsl(120, 100%, 40%);">+                  template (value) CBSP_Category category := CBSP_CATEG_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+                 uint16_t rep_period := 10, uint16_t num_bcast_req := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+               uint8_t dcs := 0, uint8_t channel_ind := 0, CBSP_IEs content,</span><br><span style="color: hsl(120, 100%, 40%);">+                 template BSSMAP_FIELD_CellIdentificationList success_list := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+               template CBSP_FailureListItems fail_list := omit) runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var template CBSP_PDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       tx := ts_CBSP_REPLACE_CBS(msg_id, new_ser_no, old_ser_no, cell_list, channel_ind, category,</span><br><span style="color: hsl(120, 100%, 40%);">+                           rep_period, num_bcast_req, dcs, content);</span><br><span style="color: hsl(120, 100%, 40%);">+     CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (istemplatekind(fail_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            rx := tr_CBSP_REPLACE_CBS_COMPL(msg_id, new_ser_no, old_ser_no, ?, success_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              rx := tr_CBSP_REPLACE_CBS_FAIL(msg_id, new_ser_no, old_ser_no, fail_list, *, success_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], rx)) {</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%);">+     [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received unexpected CBSP");</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%);">+/* send a KILL CBS to the BSC; expect either COMPLETE or FAILURE in response*/</span><br><span style="color: hsl(120, 100%, 40%);">+function f_cbsp_kill(uint16_t msg_id, uint16_t ser_no, template (omit) uint8_t channel_ind := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     template (value) BSSMAP_FIELD_CellIdentificationList cell_list := ts_BSSMAP_CIL_BSS,</span><br><span style="color: hsl(120, 100%, 40%);">+                  template BSSMAP_FIELD_CellIdentificationList success_list := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+               template CBSP_FailureListItems fail_list := omit) runs on cbsp_test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var template CBSP_PDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   tx := ts_CBSP_KILL(msg_id, ser_no, cell_list, channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+   CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (istemplatekind(fail_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            rx := tr_CBSP_KILL_COMPL(msg_id, ser_no, compl_list:=*, cell_list:=success_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       channel_ind:=channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              rx := tr_CBSP_KILL_FAIL(msg_id, ser_no, fail_list, compl_list:=*, cell_list:=success_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    channel_ind:=channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], rx)) {</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%);">+     [] CBSP[0].receive(tr_CBSP_Recv(g_cbsp_conn_id[0], ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Received unexpected CBSP");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private template (present) ASP_RSL_Unitdata tr_RSL_UD(template (present) RSL_Message rsl) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        streamId := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+        rsl := rsl</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%);">+template (present) RSL_IE_CbCommandType</span><br><span style="color: hsl(120, 100%, 40%);">+tr_RslCbCmdType(template (present) uint2_t lblock := ?, template (present) RSL_CbCommand cmd := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     command := cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       default_bcast_null := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+      spare := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+   last_block := lblock</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%);">+/* build a RSL_Message receive template from a CBSP page */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_page2rsl(CBSP_IE page, uint16_t msg_id, uint16_t ser_no, boolean ext_cbch := false)</span><br><span style="color: hsl(120, 100%, 40%);">+return template (present) RSL_Message</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var template RSL_Message tr;</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer lblock := page.body.msg_content.user_len / 22;</span><br><span style="color: hsl(120, 100%, 40%);">+    var octetstring payload;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (page.body.msg_content.user_len mod 22 > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           lblock := lblock + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     payload := int2oct(ser_no, 2) & int2oct(msg_id, 2) & '0011'O & page.body.msg_content.val;</span><br><span style="color: hsl(120, 100%, 40%);">+ tr := tr_RSL_SMSCB_CMD(tr_RslCbCmdType(lblock), f_pad_oct(payload, 88, '00'O));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ext_cbch) {</span><br><span style="color: hsl(120, 100%, 40%);">+               tr.ies[3] := tr_RSL_IE(RSL_IE_Body:{smscb_chan_ind := 1});</span><br><span style="color: hsl(120, 100%, 40%);">+            tr.ies[4] := *;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     return tr;</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%);">+ * Test Cases</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%);">+/* Test if BSC (server) accepts connections from CBC (client) */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_bsc_server() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_init_client();</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test if BSC (client) is connecting to CBC (server) */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_bsc_client() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_cbsp_init_server();</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test if a BSS-global RESET is executed successfully */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_reset_bss() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_cbsp_reset_bss(0);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       tx := ts_CBSP_WRITE_CBS(msg_id:=23,  new_ser_nr:=42, cell_list:=ts_BSSMAP_CIL_BSS,</span><br><span style="color: hsl(120, 100%, 40%);">+                            channel_ind:=0, category:=CBSP_CATEG_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+                          rep_period:=10, num_bcast_req:=1, dcs := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           content:=pages);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    CBSP[0].send(ts_CBSP_Send(g_cbsp_conn_id[0], tx));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(10.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%);">+/* Write to entire BSS; three cells succeed; one fails (no CBCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_bss() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_BSS;</span><br><span style="color: hsl(120, 100%, 40%);">+       f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(1, 1001, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=tr_BSSMAP_CIL_CGI({?,?,?}), fail_list:={?});</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var template RSL_Message tr := f_page2rsl(pages[0], 1, 1001);</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] IPA_RSL[0].receive(tr_RSL_UD(tr)) {}</span><br><span style="color: hsl(120, 100%, 40%);">+       [] IPA_RSL[1].receive(tr_RSL_UD(tr)) {}</span><br><span style="color: hsl(120, 100%, 40%);">+       [] IPA_RSL[2].receive(tr_RSL_UD(tr)) {}</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%);">+/* Write to single BTS supporting CBCH: success */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_bts_cgi() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_CGI({bssmap_cgi(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+    f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(2, 1002, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=cell_list, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template RSL_Message tr := f_page2rsl(pages[0], 1, 1001);</span><br><span style="color: hsl(120, 100%, 40%);">+ IPA_RSL[0].receive(tr_RSL_UD(tr));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(5.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%);">+/* Write to single BTS not supporting CBCH: failure */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_bts_no_cbch() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_CGI({bssmap_cgi(mp_cgi_bts3)});</span><br><span style="color: hsl(120, 100%, 40%);">+    f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(3, 1003, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=omit, fail_list:={?});</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(5.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%);">+/* Write to single non-existant BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_unknown_bts() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_CGI({ts_BSSMAP_CI_CGI(mp_cgi_bts0.mcc, mp_cgi_bts1.mnc, 22222, 33333)});</span><br><span style="color: hsl(120, 100%, 40%);">+   f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(4, 1004, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=omit, fail_list:={?});</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(5.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%);">+/* Write to single BTS using LAC+CI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_lac_ci() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(5, 1005, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       IPA_RSL[0].receive(tr_RSL_UD(f_page2rsl(pages[0], 5, 1005)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(5.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%);">+/* Write to single BTS using CI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_ci() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_CI({bssmap_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(6, 1006, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       IPA_RSL[0].receive(tr_RSL_UD(f_page2rsl(pages[0], 6, 1006)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(5.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%);">+/* Write to single BTS using LAI */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_lai() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAI({bssmap_lai(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+    f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(7, 1007, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       IPA_RSL[0].receive(tr_RSL_UD(f_page2rsl(pages[0], 7, 1007)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(5.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%);">+/* Write to two BTS using LAC */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_lac() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC({bssmap_lac(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+    f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(8, 1008, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template RSL_Message tr := f_page2rsl(pages[0], 8, 1008);</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] IPA_RSL[0].receive(tr_RSL_UD(tr));</span><br><span style="color: hsl(120, 100%, 40%);">+ [] IPA_RSL[1].receive(tr_RSL_UD(tr));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(5.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%);">+/* Write a message, then replace it */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_then_replace() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(9, 1009, cell_list, num_bcast_req:=10, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_cbsp_replace(9, 2009, 1009, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                     success_list:=?, fail_list:=omit);</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%);">+/* Replace a message that doesn't exist: failure */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_replace_nonexist() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_replace(10, 2010, 1010, cell_list, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                    success_list:=omit, fail_list:=?);</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%);">+/* Write more messages than can be scheduled */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_too_many() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* repeating three pages at an interval of 1 is impossible */</span><br><span style="color: hsl(120, 100%, 40%);">+ var CBSP_IEs pages := {f_gen_page(), f_gen_page(), f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(11, 1011, cell_list, rep_period:=1, content:=pages,</span><br><span style="color: hsl(120, 100%, 40%);">+                   success_list:=omit, fail_list:=?);</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%);">+/* Kill message that doesn't exist: failure */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_kill_nonexist() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_kill(12, 1012, 0, cell_list, success_list:=omit, fail_list:=?);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+/* Write a message, then kill it */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_then_kill() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(13, 1013, cell_list, content:=pages, success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_cbsp_kill(13, 1013, 0, cell_list, success_list:=?, fail_list:=omit);</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%);">+/* Write a message, then reset all messages */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_cbsp_write_then_reset() runs on cbsp_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var CBSP_IEs pages := {f_gen_page()};</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) BSSMAP_FIELD_CellIdentificationList cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := ts_BSSMAP_CIL_LAC_CI({bssmap_lac_ci(mp_cgi_bts0)});</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_init_server();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cbsp_write(14, 1014, cell_list, content:=pages, success_list:=?, fail_list:=omit);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_cbsp_reset_bss(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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_cbsp_bsc_server() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_cbsp_bsc_client() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_cbsp_reset_bss() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* test various different types of Cell Identities */</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_cbsp_write_bss() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_cbsp_write_bts_cgi() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_cbsp_write_bts_no_cbch() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_cbsp_write_unknown_bts() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_cbsp_write_lac_ci() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_cbsp_write_ci() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_cbsp_write_lai() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_cbsp_write_lac() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_cbsp_write_then_replace() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_cbsp_replace_nonexist() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_cbsp_write_too_many() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_cbsp_kill_nonexist() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_cbsp_write_then_kill() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_cbsp_write_then_reset() );</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>diff --git a/bsc/gen_links.sh b/bsc/gen_links.sh</span><br><span>index c71b31a..99c4cf5 100755</span><br><span>--- a/bsc/gen_links.sh</span><br><span>+++ b/bsc/gen_links.sh</span><br><span>@@ -67,7 +67,9 @@</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> DIR=../library</span><br><span style="color: hsl(0, 100%, 40%);">-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcnpp Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcnpp Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="CBSP_Types.ttcn CBSP_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="CBSP_CodecPort.ttcn CBSP_CodecPort_CtrlFunct.ttcn CBSP_CodecPort_CtrlFunctdef.cc CBSP_Adapter.ttcn "</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/bsc/regen_makefile.sh b/bsc/regen_makefile.sh</span><br><span>index 389aaed..def4a3f 100755</span><br><span>--- a/bsc/regen_makefile.sh</span><br><span>+++ b/bsc/regen_makefile.sh</span><br><span>@@ -2,7 +2,7 @@</span><br><span> </span><br><span> MAIN=BSC_Tests.ttcn</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc *.c"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc CBSP_CodecPort_CtrlFunctdef.cc *.c"</span><br><span> </span><br><span> export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_CTRL -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DRAN_EMULATION_CTRL -DUSE_MTP3_DISTRIBUTOR"</span><br><span> </span><br><span>diff --git a/library/CBSP_Templates.ttcn b/library/CBSP_Templates.ttcn</span><br><span>index 3c60f14..5e53dd9 100644</span><br><span>--- a/library/CBSP_Templates.ttcn</span><br><span>+++ b/library/CBSP_Templates.ttcn</span><br><span>@@ -130,7 +130,7 @@</span><br><span>                          }});</span><br><span> template CBSP_IE tr_CbspFailList(template CBSP_FailureListItems items := ?) :=</span><br><span>       tr_CBSP_IE({failure_list := {</span><br><span style="color: hsl(0, 100%, 40%);">-                                           len := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             len := ?,</span><br><span>                                            list := items</span><br><span>                                }});</span><br><span> </span><br><span>diff --git a/library/CBSP_Types.ttcn b/library/CBSP_Types.ttcn</span><br><span>index 43a7d7d..c4c6cf2 100644</span><br><span>--- a/library/CBSP_Types.ttcn</span><br><span>+++ b/library/CBSP_Types.ttcn</span><br><span>@@ -113,7 +113,8 @@</span><br><span> type record CBSP_IE_MessageContent {</span><br><span>      uint8_t         user_len,</span><br><span>    octetstring     val</span><br><span style="color: hsl(0, 100%, 40%);">-} with { variant (val) "FIELDLENGTH(82)" };</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (val) "FIELDLENGTH(82)"</span><br><span style="color: hsl(120, 100%, 40%);">+         variant (val) "ALIGN(left)" };</span><br><span> </span><br><span> /* 8.2.6 Cell List */</span><br><span> type record CBSP_IE_CellList {</span><br><span>diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn</span><br><span>index 87de9a4..c1b89b3 100644</span><br><span>--- a/library/RSL_Types.ttcn</span><br><span>+++ b/library/RSL_Types.ttcn</span><br><span>@@ -1547,6 +1547,25 @@</span><br><span>                         t_RSL_IE(RSL_IE_FULL_BCCH_INFO, RSL_IE_Body:{other := ts_RSL_LV(full_bcch_info)})</span><br><span>            }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     template RSL_Message tr_RSL_NO_BCCH_INFO(template RSL_IE_SysinfoType si_type := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+               msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false),</span><br><span style="color: hsl(120, 100%, 40%);">+           msg_type := RSL_MT_BCCH_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+         ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tr_RSL_IE(RSL_IE_Body:{chan_nr := ts_RslChanNr_BCCH(0)}),</span><br><span style="color: hsl(120, 100%, 40%);">+                     tr_RSL_IE(RSL_IE_Body:{sysinfo_type := si_type})</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%);">+     template RSL_Message tr_RSL_BCCH_INFO(template RSL_IE_SysinfoType si_type := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template octetstring full_bcch_info := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false),</span><br><span style="color: hsl(120, 100%, 40%);">+           msg_type := RSL_MT_BCCH_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+         ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tr_RSL_IE(RSL_IE_Body:{chan_nr := ts_RslChanNr_BCCH(0)}),</span><br><span style="color: hsl(120, 100%, 40%);">+                     tr_RSL_IE(RSL_IE_Body:{sysinfo_type := si_type}),</span><br><span style="color: hsl(120, 100%, 40%);">+                     tr_RSL_IE(RSL_IE_Body:{other := tr_RSL_LV(full_bcch_info)}),</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>        /* 8.5.2 BTS -> BSC */</span><br><span>    template (value) RSL_Message ts_RSL_RACH_LOAD_IND(uint16_t slot_ct, uint16_t busy_ct,</span><br><span>@@ -1560,7 +1579,7 @@</span><br><span>        }</span><br><span>    template RSL_Message tr_RSL_RACH_LOAD_IND(template uint16_t slot_ct := ?,</span><br><span>                                              template uint16_t busy_ct := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 template uint16_t acc_ct) := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                template uint16_t acc_ct := ?) := {</span><br><span>                msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false),</span><br><span>          msg_type := RSL_MT_CCCH_LOAD_IND,</span><br><span>            ies := {</span><br><span>@@ -1759,6 +1778,24 @@</span><br><span>                    t_RSL_IE(RSL_IE_L3_INFO, RSL_IE_Body:{l3_info := ts_RSL_L16V(l3_info)})</span><br><span>              }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+     template RSL_Message tr_RSL_NO_SACCH_FILL(template RSL_IE_SysinfoType si_type := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+              msg_disc := tr_RSL_MsgDisc(RSL_MDISC_TRX_MGMT, false),</span><br><span style="color: hsl(120, 100%, 40%);">+                msg_type := RSL_MT_SACCH_FILL,</span><br><span style="color: hsl(120, 100%, 40%);">+                ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tr_RSL_IE(RSL_IE_Body:{sysinfo_type := si_type})</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%);">+     template RSL_Message tr_RSL_SACCH_FILL(template RSL_IE_SysinfoType si_type := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              template octetstring l3_info := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+               msg_disc := tr_RSL_MsgDisc(RSL_MDISC_TRX_MGMT, false),</span><br><span style="color: hsl(120, 100%, 40%);">+                msg_type := RSL_MT_SACCH_FILL,</span><br><span style="color: hsl(120, 100%, 40%);">+                ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tr_RSL_IE(RSL_IE_Body:{sysinfo_type := si_type}),</span><br><span style="color: hsl(120, 100%, 40%);">+                     tr_RSL_IE(RSL_IE_Body:{l3_info := tr_RSL_L16V(l3_info)}),</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> </span><br><span>      /* 8.6.4 BTS -> BSC */</span><br><span>    template (value) RSL_Message ts_RSL_ERROR_REPORT(RSL_Cause cause) := {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15376">change 15376</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/+/15376"/><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: Ia6ffac181f50586d06d2f29bca1c57285179e861 </div>
<div style="display:none"> Gerrit-Change-Number: 15376 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>