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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cbc: Initial set of CBC tess for osmo-cbc<br><br>osmo-cbc is the Osmocom cell broadcast centre.  So far, there was no<br>TTCN-3 test suite.  Let's change that.<br><br>Change-Id: I38286e8a3dd0f39bd25f631dcbb3ff4f8d4c221f<br>---<br>M Makefile<br>A cbc/CBC_Tests.cfg<br>A cbc/CBC_Tests.default<br>A cbc/CBC_Tests.ttcn<br>A cbc/ECBE_Types.ttcn<br>A cbc/SABP_Selftest.ttcn<br>A cbc/gen_links.sh<br>A cbc/regen_makefile.sh<br>M library/CBSP_Templates.ttcn<br>M library/CBSP_Types.ttcn<br>M library/SABP_Adapter.ttcn<br>11 files changed, 929 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index 2510e28..319cb87 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -13,7 +13,7 @@</span><br><span> # See the License for the specific language governing permissions and</span><br><span> # limitations under the License.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS=bsc bsc-nat bts ccid fr fr-net gbproxy ggsn_tests hlr mgw mme msc pcu pgw remsim \</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS=bsc bsc-nat bts cbc ccid fr fr-net gbproxy ggsn_tests hlr mgw mme msc pcu pgw remsim \</span><br><span>   sccp selftest sgsn simtrace sip stp sysinfo smlc</span><br><span> </span><br><span> NPROC=$(shell nproc 2>/dev/null)</span><br><span>diff --git a/cbc/CBC_Tests.cfg b/cbc/CBC_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..7c2a3ac</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/CBC_Tests.cfg</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[ORDERED_INCLUDE]</span><br><span style="color: hsl(120, 100%, 40%);">+# Common configuration, shared between test suites</span><br><span style="color: hsl(120, 100%, 40%);">+"../Common.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+# testsuite specific configuration, not expected to change</span><br><span style="color: hsl(120, 100%, 40%);">+"./CBC_Tests.default"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local configuration below</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MAIN_CONTROLLER]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span style="color: hsl(120, 100%, 40%);">+CBC_Tests.control</span><br><span>diff --git a/cbc/CBC_Tests.default b/cbc/CBC_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..48fe83d</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/CBC_Tests.default</span><br><span>@@ -0,0 +1,12 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+mtc.FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING | DEBUG_ENCDEC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+*.CBCVTY.PROMPT1 := "OsmoCBC> "</span><br><span style="color: hsl(120, 100%, 40%);">+*.TCP.noDelay := "yes" // turn off nagle</span><br><span style="color: hsl(120, 100%, 40%);">+*.HTTP.use_notification_ASPs := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+// Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoCBC";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span>diff --git a/cbc/CBC_Tests.ttcn b/cbc/CBC_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..36fa55c</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/CBC_Tests.ttcn</span><br><span>@@ -0,0 +1,467 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module CBC_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+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%);">+import from Socket_API_Definitions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from HTTP_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HTTPmsg_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from ECBE_Types 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_host := "127.0.0.1";</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_ecbe_port := 12345;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component test_CT extends CBSP_Adapter_CT, http_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%);">+/*********************************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * ECBE (REST) interface</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_ecbe_tx_post_cbs(EcbeCbcMessage cbc)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring body := oct2char(enc_EcbeCbcMessage(cbc));</span><br><span style="color: hsl(120, 100%, 40%);">+     log("TX POST CBS: ", body);</span><br><span style="color: hsl(120, 100%, 40%);">+ var HTTPMessage http_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    f_http_tx_request(url := "/api/ecbe/v1/message", method := "POST", body := body);</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_ecbe_rx_resp(template integer exp_sts := (200..299))</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPResponse {</span><br><span style="color: hsl(120, 100%, 40%);">+    var HTTPMessage http_resp := f_http_rx_response(tr_HTTP_Resp(exp_sts), tout := 20.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ return http_resp.response;</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%);">+/* run a HTTP POST to add a new CBC message */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ecbe_post_cbs(EcbeCbcMessage cbc, template integer exp_sts := 201)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPResponse {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ecbe_tx_post_cbs(cbc);</span><br><span style="color: hsl(120, 100%, 40%);">+      return f_ecbe_rx_resp(exp_sts)</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_ecbe_tx_delete_cbs(integer msg_id)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_http_tx_request("/api/ecbe/v1/message/" & int2str(msg_id), method := "DELETE");</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%);">+/* run a HTTP GET on specified URL expecting json in RSRES format as response */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ecbe_delete_cbs(integer msg_id, template integer exp_sts := 200)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPResponse {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ecbe_tx_delete_cbs(msg_id);</span><br><span style="color: hsl(120, 100%, 40%);">+ return f_ecbe_rx_resp(exp_sts);</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%);">+altstep as_cbsp_reset(integer idx) runs on CBSP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var CBSP_RecvFrom rf;</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CBSP[idx].receive(tr_CBSP_Recv(g_cbsp_conn_id[idx], tr_CBSP_RESET)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+               var CBSP_IE ie;</span><br><span style="color: hsl(120, 100%, 40%);">+               f_cbsp_find_ie(rf.msg, CBSP_IEI_CELL_LIST, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+               CBSP[idx].send(ts_CBSP_Send(g_cbsp_conn_id[idx],</span><br><span style="color: hsl(120, 100%, 40%);">+                              ts_CBSP_RESET_COMPL(ie.body.cell_list.cell_id)));</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_cbs2ecbe_category(CBSP_Category cat_in) return EcbeCategory</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     select (cat_in) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case (CBSP_CATEG_HIGH_PRIO) { return high_priority; }</span><br><span style="color: hsl(120, 100%, 40%);">+ case (CBSP_CATEG_BACKGROUND) { return background; }</span><br><span style="color: hsl(120, 100%, 40%);">+   case (CBSP_CATEG_NORMAL) { return normal; }</span><br><span style="color: hsl(120, 100%, 40%);">+   case else { 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_cbs2ecbe_page(CBS_MessageContent inp) return EcbePage</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return hex2str(oct2hex(inp.payload));</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%);">+/* convert from CBS_Message to EcbeCbcMessage */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_cbs2ecbe(CBS_Message inp, charstring cbe_name) return EcbeCbcMessage</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var EcbeCbcMessage ret := {</span><br><span style="color: hsl(120, 100%, 40%);">+           cbe_name := cbe_name,</span><br><span style="color: hsl(120, 100%, 40%);">+         category := f_cbs2ecbe_category(inp.category),</span><br><span style="color: hsl(120, 100%, 40%);">+                repetition_period := inp.rep_period,</span><br><span style="color: hsl(120, 100%, 40%);">+          num_of_bcast := inp.num_bcast_req,</span><br><span style="color: hsl(120, 100%, 40%);">+            scope := { scope_plmn := {} },</span><br><span style="color: hsl(120, 100%, 40%);">+                smscb_message := {</span><br><span style="color: hsl(120, 100%, 40%);">+                    serial_nr := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                serial_nr_encoded := inp.ser_nr</span><br><span style="color: hsl(120, 100%, 40%);">+                       },</span><br><span style="color: hsl(120, 100%, 40%);">+                    message_id := inp.msg_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                     payload := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          payload_encoded := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                  dcs := inp.dcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       pages := { } /* appended below */</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%);">+    for (var integer i := 0; i < lengthof(inp.content); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            ret.smscb_message.payload.payload_encoded.pages := </span><br><span style="color: hsl(120, 100%, 40%);">+                   ret.smscb_message.payload.payload_encoded.pages & { f_cbs2ecbe_page(inp.content[i]) };</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return ret;</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%);">+ * CBSP interface</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%);">+/* receive + acknowledge KEEP-ALIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_cbsp_keepalive_ack(integer idx) runs on CBSP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] CBSP[idx].receive(tr_CBSP_Recv(g_cbsp_conn_id[idx], tr_CBSP_KEEP_ALIVE)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         CBSP[idx].send(ts_CBSP_Send(g_cbsp_conn_id[idx], ts_CBSP_KEEP_ALIVE_COMPL));</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%);">+/* receive + ignore RESTART */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_cbsp_restart(integer idx) runs on CBSP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        [] CBSP[idx].receive(tr_CBSP_Recv(g_cbsp_conn_id[idx], tr_CBSP_RESTART));</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(boolean raw := false) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_http_init(mp_cbc_host, mp_ecbe_port);</span><br><span style="color: hsl(120, 100%, 40%);">+       CBSP_Adapter.f_connect(mp_cbc_host, mp_cbc_port, "", -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not raw) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var BSSMAP_FIELD_CellIdentificationList cell_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        cIl_allInBSS := ''O</span><br><span style="color: hsl(120, 100%, 40%);">+           };</span><br><span style="color: hsl(120, 100%, 40%);">+            activate(as_cbsp_keepalive_ack(0));</span><br><span style="color: hsl(120, 100%, 40%);">+           activate(as_cbsp_restart(0));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_cbsp_send(ts_CBSP_RESTART(cell_list, CBSP_BC_MSGT_CBS, CBSP_RI_DATA_LOST));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_cbsp_send(ts_CBSP_RESTART(cell_list, CBSP_BC_MSGT_EMERG, CBSP_RI_DATA_LOST));</span><br><span style="color: hsl(120, 100%, 40%);">+               as_cbsp_reset(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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test whether or not we receive a valid KEEP-ALIVE from the CBC */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rx_keepalive() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var CBSP_PDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      var CBSP_IE ie;</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%);">+     rx := f_cbsp_exp(tr_CBSP_KEEP_ALIVE(?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_find_ie(rx, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+</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 whether CBC terminates connection if KEEP-ALIVE is not answered by BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rx_keepalive_timeout() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var CBSP_PDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      var CBSP_IE ie;</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer ka_rep_per_s;</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%);">+     rx := f_cbsp_exp(tr_CBSP_KEEP_ALIVE(?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_cbsp_find_ie(rx, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* sleep for longer than the keep-alive period */</span><br><span style="color: hsl(120, 100%, 40%);">+     ka_rep_per_s := f_cbsp_period2s(ie.body.keep_alive_rep_period);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(int2float(ka_rep_per_s + 5));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* expect the CBSP connection to be closed */</span><br><span style="color: hsl(120, 100%, 40%);">+ CBSP[0].receive(PortEvent:{connClosed:=?})</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+type record CBS_Message {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t msg_id,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t ser_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t old_ser_nr optional,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSMAP_FIELD_CellIdentificationList cell_list,</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t channel_ind,</span><br><span style="color: hsl(120, 100%, 40%);">+  CBSP_Category category,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t rep_period,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t num_bcast_req,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t dcs,</span><br><span style="color: hsl(120, 100%, 40%);">+  CBS_MessageContents content</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record CBS_MessageContent {</span><br><span style="color: hsl(120, 100%, 40%);">+     octetstring payload,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t user_len</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of CBS_MessageContent CBS_MessageContents;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* handle a CBSP-WRITE-REPLACE and respond to it with COMPLETE or FAILURE depending on arguments */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbsp_write(CBS_Message msg, integer idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                       template (omit) BSSMAP_FIELD_CellIdentificationList tx_cell_list := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template (omit) CBSP_FailureListItems tx_fail_list := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template (omit) CBSP_IE_NumBcastComplList tx_compl_list := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var template CBSP_IEs content_ies := {};</span><br><span style="color: hsl(120, 100%, 40%);">+      var template (present) CBSP_PDU rx_templ;</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_RecvFrom rf;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < lengthof(msg.content); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            //content_ies[i] := tr_CbspMsgContent(msg.content[i].payload, msg.content[i].user_len);</span><br><span style="color: hsl(120, 100%, 40%);">+               content_ies[i] := tr_CbspMsgContent(?, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     rx_templ := tr_CBSP_WRITE_CBS(msg.msg_id, msg.ser_nr, msg.cell_list, msg.channel_ind,</span><br><span style="color: hsl(120, 100%, 40%);">+                               msg.category, msg.rep_period, msg.num_bcast_req, msg.dcs,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     content_ies);</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(g_cbsp_conn_id[idx], rx_templ)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+            var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (istemplatekind(tx_fail_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 var template (value) BSSMAP_FIELD_CellIdentificationList tx_list;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (istemplatekind(tx_cell_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         /* use the "expected list" when confirming the write-replace */</span><br><span style="color: hsl(120, 100%, 40%);">+                             tx_list := msg.cell_list;</span><br><span style="color: hsl(120, 100%, 40%);">+                     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* use an user-provided different list of cells */</span><br><span style="color: hsl(120, 100%, 40%);">+                            tx_list := valueof(tx_cell_list);</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (istemplatekind(tx_compl_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                tx := ts_CBSP_WRITE_CBS_COMPL(msg.msg_id, msg.ser_nr, tx_list, msg.channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+                      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              tx := ts_CBSP_REPLACE_CBS_COMPL(msg.msg_id, msg.ser_nr, msg.old_ser_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               valueof(tx_compl_list), tx_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              msg.channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tx := ts_CBSP_WRITE_CBS_FAIL(msg.msg_id, msg.ser_nr, valueof(tx_fail_list),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                omit, tx_cell_list, msg.channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</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%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_cbsp_keepalive_ack(idx) { repeat; }</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 in index ", 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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* handle a CBSP-KILL and respond to it with COMPLETE or FAILURE depending on arguments */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cbsp_handle_kill(integer idx, uint16_t msg_id, uint16_t ser_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template BSSMAP_FIELD_CellIdentificationList exp_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                template (omit) BSSMAP_FIELD_CellIdentificationList tx_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template (omit) CBSP_FailureListItems tx_fail_list := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (omit) CBSP_IE_NumBcastComplList tx_compl_list := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                              template (omit) uint8_t channel_ind := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (present) CBSP_PDU rx_templ;</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBSP_RecvFrom rf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rx_templ := tr_CBSP_KILL(msg_id, ser_nr, exp_list, channel_ind);</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(g_cbsp_conn_id[idx], rx_templ)) -> value rf {</span><br><span style="color: hsl(120, 100%, 40%);">+            var template (value) CBSP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (istemplatekind(tx_fail_list, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 tx := ts_CBSP_KILL_COMPL(msg_id, ser_nr, tx_compl_list, tx_list, channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tx := ts_CBSP_KILL_FAIL(msg_id, ser_nr, valueof(tx_fail_list), tx_compl_list,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         tx_list, channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</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%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] as_cbsp_keepalive_ack(idx) { repeat; }</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 in index ", 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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private const BSSMAP_FIELD_CellIdentificationList cil_BSS := {</span><br><span style="color: hsl(120, 100%, 40%);">+        cIl_allInBSS := ''O</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_write_replace() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     var CBS_Message msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+              msg_id := 42,</span><br><span style="color: hsl(120, 100%, 40%);">+         ser_nr := 16752,</span><br><span style="color: hsl(120, 100%, 40%);">+              old_ser_nr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+           cell_list := cil_BSS,</span><br><span style="color: hsl(120, 100%, 40%);">+         channel_ind := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             category := CBSP_CATEG_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+                rep_period := 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              num_bcast_req := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+           dcs := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+             content := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  { '00'O, 1 }</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_write(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sleep(100.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_selftest() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring c_load_q := '0700000d0400080000f110012345671200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+  const octetstring c_load_q_compl := '0800000f0a000a0000f1100123456700001200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+        const octetstring c_reset := '1000000b0400080000f11001234567'O;</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring c_reset_compl := '1100000b0400080000f11001234567'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_msg_sts_q := '0a0000130e022b0200000400080000f110012345671200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   const octetstring c_msg_sts_q_fail := '0c0000140e022b0200000900090000f11001234567021200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_kill := '040000110e00000200000400080000f11001234567'O;</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_kill_fail := '060000120e00000200000900090000f1100123456702'O;</span><br><span style="color: hsl(120, 100%, 40%);">+     const octetstring c_write_repl := '010000c70e022b0300300400080000f110012345671200050006000407000613020c400107f4f29c9e769f5de337b90c921d1b8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d100'O;</span><br><span style="color: hsl(120, 100%, 40%);">+  const octetstring c_write_repl_compl := '020000130e022b0300300400080000f110012345671200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+    const octetstring c_write_repl_fail := '030000140e022b0300300900090000f110012345670d1200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   const octetstring c_msg_s_q := '0a0000130e022b0200900400080000f110012345671200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+     const octetstring c_msg_s_q_compl := '0b0000160e022b02009008000b0000f110012345670008001200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ const octetstring c_kill_compl := '050000160e022b02008008000b0000f110012345670006001200'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  log(dec_CBSP_PDU(c_load_q));</span><br><span style="color: hsl(120, 100%, 40%);">+  log(dec_CBSP_PDU(c_load_q_compl));</span><br><span style="color: hsl(120, 100%, 40%);">+    log(dec_CBSP_PDU(c_reset));</span><br><span style="color: hsl(120, 100%, 40%);">+   log(dec_CBSP_PDU(c_reset_compl));</span><br><span style="color: hsl(120, 100%, 40%);">+     log(dec_CBSP_PDU(c_msg_sts_q));</span><br><span style="color: hsl(120, 100%, 40%);">+       log(dec_CBSP_PDU(c_msg_sts_q_fail));</span><br><span style="color: hsl(120, 100%, 40%);">+  log(dec_CBSP_PDU(c_kill));</span><br><span style="color: hsl(120, 100%, 40%);">+    log(dec_CBSP_PDU(c_kill_fail));</span><br><span style="color: hsl(120, 100%, 40%);">+       log(dec_CBSP_PDU(c_write_repl));</span><br><span style="color: hsl(120, 100%, 40%);">+      log(dec_CBSP_PDU(c_write_repl_compl));</span><br><span style="color: hsl(120, 100%, 40%);">+        log(dec_CBSP_PDU(c_write_repl_fail));</span><br><span style="color: hsl(120, 100%, 40%);">+ log(dec_CBSP_PDU(c_msg_s_q));</span><br><span style="color: hsl(120, 100%, 40%);">+ log(dec_CBSP_PDU(c_msg_s_q_compl));</span><br><span style="color: hsl(120, 100%, 40%);">+   log(dec_CBSP_PDU(c_kill_compl));</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 SABP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SABP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SABP_IEs all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SABP_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_selftest_sabp() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       const octetstring c_write := '00000080930000080006000211120007000240c0000f0010000113f0030282ec0613f0030282ec070001400100000d0002012a000900020000000400010100000056029f01b4d90d064297d9ec37e8fe96b3c9a0303bdd68341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d10012'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   log(dec_SABP_PDU(c_write));</span><br><span style="color: hsl(120, 100%, 40%);">+   log(enc_SABP_PDU(dec_SABP_PDU(c_write)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) Service_Areas_List sa_list := {</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_SabpSai('62F224'O, '0023'O, '0042'O)</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+    var template (value) SABP_PDU tx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   tx := ts_SABP_Write(int2bit(1, 16), int2bit(1, 16), sa_list, 23, 42, '00000000'B, '01011010'B);</span><br><span style="color: hsl(120, 100%, 40%);">+       log("Write: ", enc_SABP_PDU(valueof(tx)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var Service_Areas_List sa_list2 := { valueof(ts_SabpSai('62F224'O, '1000'O, '0042'O)) };</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer i := 0; i < 2500; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             sa_list2 := sa_list2 & {valueof(ts_SabpSai('62F224'O, '2000'O, int2oct(i,2))) };</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     tx := ts_SABP_Write(int2bit(2, 16), int2bit(2, 16), sa_list2, 23, 42, '00000000'B, '01011010'B);</span><br><span style="color: hsl(120, 100%, 40%);">+      log("Write: ", enc_SABP_PDU(valueof(tx)))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ tx := ts_SABP_Restart(sa_list);</span><br><span style="color: hsl(120, 100%, 40%);">+       log("Restart: ", enc_SABP_PDU(valueof(tx)));</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%);">+ * ECBE interface (verifying expected procedures on 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%);">+function f_create_and_delete(CBS_Message msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template (omit) BSSMAP_FIELD_CellIdentificationList cell_list_success)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var EcbeCbcMessage ecbe := f_cbs2ecbe(msg, "TTCN-3");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ecbe_tx_post_cbs(ecbe);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_cbsp_write(msg, 0, cell_list_success);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ecbe_rx_resp(201);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ecbe_tx_delete_cbs(msg.msg_id);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: cbc segfaults if we terminate here (if we don't wait for Connect_result? */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_cbsp_handle_kill(0, msg.msg_id, msg.ser_nr, cell_list_success, cell_list_success);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ecbe_rx_resp(200);</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 (value) CBS_Message t_CBSmsg(uint16_t msg_id, uint16_t ser_nr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       msg_id := msg_id,</span><br><span style="color: hsl(120, 100%, 40%);">+     ser_nr := ser_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+     old_ser_nr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+   cell_list := cil_BSS,</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_ind := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+     category := CBSP_CATEG_NORMAL,</span><br><span style="color: hsl(120, 100%, 40%);">+        rep_period := 5,</span><br><span style="color: hsl(120, 100%, 40%);">+      num_bcast_req := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+   dcs := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+     content := {</span><br><span style="color: hsl(120, 100%, 40%);">+          { '00'O, 1 }</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%);">+/* specify a variety of different Cell Identifier formats to extend test coverage */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ecbe_create_delete_cgi() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) CBS_Message msg := t_CBSmsg(43, 16752);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        cell_list_success := ts_BSSMAP_CIL_CGI({</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_CGI('901'H, '70'H, 23, 42),</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_CGI('901'H, '70'H, 24, 42),</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_CGI('901'H, '70'H, 24, 43)</span><br><span style="color: hsl(120, 100%, 40%);">+       });</span><br><span style="color: hsl(120, 100%, 40%);">+   f_create_and_delete(valueof(msg), cell_list_success);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ecbe_create_delete_lac_ci() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) CBS_Message msg := t_CBSmsg(44, 16752);</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_list_success := ts_BSSMAP_CIL_LAC_CI({</span><br><span style="color: hsl(120, 100%, 40%);">+           ts_BSSMAP_CI_LAC_CI(10001, 50001),</span><br><span style="color: hsl(120, 100%, 40%);">+            ts_BSSMAP_CI_LAC_CI(10002, 50002),</span><br><span style="color: hsl(120, 100%, 40%);">+            ts_BSSMAP_CI_LAC_CI(10003, 50003)</span><br><span style="color: hsl(120, 100%, 40%);">+     });</span><br><span style="color: hsl(120, 100%, 40%);">+   f_create_and_delete(valueof(msg), cell_list_success);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ecbe_create_delete_lac() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) CBS_Message msg := t_CBSmsg(45, 16752);</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_list_success := ts_BSSMAP_CIL_LAC({</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_LAC(10001),</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_LAC(10002),</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_LAC(10003)</span><br><span style="color: hsl(120, 100%, 40%);">+       });</span><br><span style="color: hsl(120, 100%, 40%);">+   f_create_and_delete(valueof(msg), cell_list_success);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ecbe_create_delete_ci() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) CBS_Message msg := t_CBSmsg(46, 16752);</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_list_success := ts_BSSMAP_CIL_CI({</span><br><span style="color: hsl(120, 100%, 40%);">+               ts_BSSMAP_CI_CI(50001),</span><br><span style="color: hsl(120, 100%, 40%);">+               ts_BSSMAP_CI_CI(50002),</span><br><span style="color: hsl(120, 100%, 40%);">+               ts_BSSMAP_CI_CI(50003)</span><br><span style="color: hsl(120, 100%, 40%);">+        });</span><br><span style="color: hsl(120, 100%, 40%);">+   f_create_and_delete(valueof(msg), cell_list_success);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ecbe_create_delete_lai() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (value) CBS_Message msg := t_CBSmsg(47, 16752);</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_list_success := ts_BSSMAP_CIL_LAI({</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_BSSMAP_CI_LAI('901'H, '70'H, 25),</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_BSSMAP_CI_LAI('901'H, '70'H, 26),</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_BSSMAP_CI_LAI('901'H, '70'H, 27)</span><br><span style="color: hsl(120, 100%, 40%);">+   });</span><br><span style="color: hsl(120, 100%, 40%);">+   f_create_and_delete(valueof(msg), cell_list_success);</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_rx_keepalive() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_rx_keepalive_timeout() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ecbe_create_delete_cgi() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_ecbe_create_delete_lac_ci() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_ecbe_create_delete_lac() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_ecbe_create_delete_ci() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_ecbe_create_delete_lai() );</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/cbc/ECBE_Types.ttcn b/cbc/ECBE_Types.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..7c66fb9</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/ECBE_Types.ttcn</span><br><span>@@ -0,0 +1,147 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module ECBE_Types {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Type definitions for the ECBE (External Cell Broadcast Entity) protocol of OsmoCBC */</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * smscb.schema.json</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type charstring EcbeLanguageCode length(2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeMessageId (0..65535);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated EcbeGeographicScope {</span><br><span style="color: hsl(120, 100%, 40%);">+      cell_wide_immediate,</span><br><span style="color: hsl(120, 100%, 40%);">+  plmn_wide,</span><br><span style="color: hsl(120, 100%, 40%);">+    lac_sac_tac_wide,</span><br><span style="color: hsl(120, 100%, 40%);">+     cell_wide</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeMessageCode (0..1023);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeUpdateNumber (0..15);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeSerialNrEncoded (0..65535);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbeSerialNrDecoded {</span><br><span style="color: hsl(120, 100%, 40%);">+       EcbeGeographicScope     geo_scope,</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeMessageCode         msg_code,</span><br><span style="color: hsl(120, 100%, 40%);">+     EcbeUpdateNumber        update_nr</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union EcbeSerialNr {</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeSerialNrEncoded     serial_nr_encoded,</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeSerialNrDecoded     serial_nr_decoded</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeDcsEncoded (0..255);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated EcbeCharacterSet {</span><br><span style="color: hsl(120, 100%, 40%);">+  gsm,</span><br><span style="color: hsl(120, 100%, 40%);">+  eight_bit,</span><br><span style="color: hsl(120, 100%, 40%);">+    ucs2</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeDcsClass (0..3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbePayloadDecoded {</span><br><span style="color: hsl(120, 100%, 40%);">+     EcbeCharacterSet        character_set optional,</span><br><span style="color: hsl(120, 100%, 40%);">+       EcbeLanguageCode        Language optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeDcsClass            dcs_class optional,</span><br><span style="color: hsl(120, 100%, 40%);">+   charstring              data_utf8</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type charstring EcbePage;</span><br><span style="color: hsl(120, 100%, 40%);">+type record of EcbePage EcbePages;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbePayloadEncoded {</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeDcsEncoded          dcs,</span><br><span style="color: hsl(120, 100%, 40%);">+  EcbePages               pages</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeWarningTypeEncoded (0..127);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated EcbeWarningTypeDecoded {</span><br><span style="color: hsl(120, 100%, 40%);">+        earthquake,</span><br><span style="color: hsl(120, 100%, 40%);">+   tsunami,</span><br><span style="color: hsl(120, 100%, 40%);">+      earthquake_and_tsunami,</span><br><span style="color: hsl(120, 100%, 40%);">+       test,</span><br><span style="color: hsl(120, 100%, 40%);">+ other,</span><br><span style="color: hsl(120, 100%, 40%);">+        rfu</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union EcbeWarningType {</span><br><span style="color: hsl(120, 100%, 40%);">+       EcbeWarningTypeEncoded  warning_type_encoded,</span><br><span style="color: hsl(120, 100%, 40%);">+ EcbeWarningTypeDecoded  warning_type_decoded</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbePayloadEtws {</span><br><span style="color: hsl(120, 100%, 40%);">+     EcbeWarningType         warning_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean                 emergency_user_alert optional,</span><br><span style="color: hsl(120, 100%, 40%);">+        boolean                 popup_on_display optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    charstring              warning_sec_info optional</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union EcbePayload {</span><br><span style="color: hsl(120, 100%, 40%);">+     EcbePayloadEncoded      payload_encoded,</span><br><span style="color: hsl(120, 100%, 40%);">+      EcbePayloadDecoded      payload_decoded,</span><br><span style="color: hsl(120, 100%, 40%);">+      EcbePayloadEtws         payload_etws</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbeSmscbMessage {</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeSerialNr    serial_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeMessageId   message_id,</span><br><span style="color: hsl(120, 100%, 40%);">+   EcbePayload     payload</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%);">+external function enc_EcbeSmscbMessage(in EcbeSmscbMessage inp) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+     with { extension "prototype(convert) encode(JSON)" }</span><br><span style="color: hsl(120, 100%, 40%);">+external function dec_EcbeSmscbMessage(in octetstring inp) return EcbeSmscbMessage</span><br><span style="color: hsl(120, 100%, 40%);">+    with { extension "prototype(convert) decode(JSON)" }</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%);">+ * cbc.schema.json</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated EcbeCategory {</span><br><span style="color: hsl(120, 100%, 40%);">+   normal,</span><br><span style="color: hsl(120, 100%, 40%);">+       high_priority,</span><br><span style="color: hsl(120, 100%, 40%);">+        background</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeRepetitionPeriod (1..4095);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated EcbeChannelIndicator {</span><br><span style="color: hsl(120, 100%, 40%);">+      basic,</span><br><span style="color: hsl(120, 100%, 40%);">+        extended</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeWarningPeriodSec (0..3600);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer EcbeNumberOfBroadcasts (0..65535);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbeScopePlmn {</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union EcbeScope {</span><br><span style="color: hsl(120, 100%, 40%);">+  EcbeScopePlmn   scope_plmn</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record EcbeCbcMessage {</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring              cbe_name optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeCategory            category optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    EcbeRepetitionPeriod    repetition_period optional,</span><br><span style="color: hsl(120, 100%, 40%);">+   EcbeNumberOfBroadcasts  num_of_bcast optional,</span><br><span style="color: hsl(120, 100%, 40%);">+        EcbeScope               scope,</span><br><span style="color: hsl(120, 100%, 40%);">+        EcbeSmscbMessage        smscb_message</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%);">+external function enc_EcbeCbcMessage(in EcbeCbcMessage inp) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+   with { extension "prototype(convert) encode(JSON)" }</span><br><span style="color: hsl(120, 100%, 40%);">+external function dec_EcbeCbcMessage(in octetstring inp) return EcbeCbcMessage</span><br><span style="color: hsl(120, 100%, 40%);">+        with { extension "prototype(convert) decode(JSON)" }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+} with { encode "JSON" }</span><br><span>diff --git a/cbc/SABP_Selftest.ttcn b/cbc/SABP_Selftest.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..1f6ecb5</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/SABP_Selftest.ttcn</span><br><span>@@ -0,0 +1,180 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module SABP_Selftest {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This is testing the SABP code, specifically re-creating the SABP messages from within</span><br><span style="color: hsl(120, 100%, 40%);">+ * the TCP stream using SABP_Adapter.f_APER_getMsgLen() for the various possible APER</span><br><span style="color: hsl(120, 100%, 40%);">+ * length determinant cases */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SABP_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SABP_Templates 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 IPL4asp_PortType 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_bind_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+       integer mp_bind_port := 12345;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component test_CT extends SABP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ port IPL4asp_PT TCP;</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer g_tcp_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+    timer Tguard := 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%);">+template (value) ASP_Send ts_AS(integer conn_id, octetstring msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    connId := conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+    proto := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+        msg := msg</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_Tguard() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        [] Tguard.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Tguard timeout");</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 test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var IPL4asp_Types.Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+ var ASP_Event asp_evt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      activate(as_Tguard());</span><br><span style="color: hsl(120, 100%, 40%);">+        Tguard.start;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_bind(mp_bind_ip, mp_bind_port, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        map(self:TCP, system:TCP);</span><br><span style="color: hsl(120, 100%, 40%);">+    res := f_IPL4_connect(TCP, mp_bind_ip, mp_bind_port, "", -1, 0, { tcp:={} });</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not ispresent(res.connId)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Could not connect to SABP TCP port");</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%);">+     g_tcp_conn_id := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        SABP[0].receive(ASP_Event:{connOpened:=?}) -> value asp_evt {</span><br><span style="color: hsl(120, 100%, 40%);">+              g_sabp_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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* send a given input octetstring 'stream' in chunks of 'chunk_size', spaced at 'delay' intervals */</span><br><span style="color: hsl(120, 100%, 40%);">+private function tcp_send_segmented(octetstring stream, integer chunk_size := 1, float delay := 0.05)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</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(stream); i := i+chunk_size) {</span><br><span style="color: hsl(120, 100%, 40%);">+            var integer size := chunk_size;</span><br><span style="color: hsl(120, 100%, 40%);">+               if (lengthof(stream) - i < chunk_size) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   size := lengthof(stream) - i;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             TCP.send(ts_AS(g_tcp_conn_id, substr(stream, i, size)));</span><br><span style="color: hsl(120, 100%, 40%);">+              f_sleep(delay);</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%);">+/* a simple SABP-RESTART message with single-byte length dteerminant (shorter than 128 byte) */</span><br><span style="color: hsl(120, 100%, 40%);">+const octetstring c_restart := '00044010000001000F0009000062F22400230042'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test whether a message with 1-byte length determinant is parsed */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_1byte_len() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     TCP.send(ts_AS(g_tcp_conn_id, c_restart));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sabp_exp(tr_SABP_Restart(?));</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 whether a message with 1-byte length determinant is parsed if each byte is received separately */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_1byte_len_bytewise() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     tcp_send_segmented(c_restart, 1, 0.05);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sabp_exp(tr_SABP_Restart(?));</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%);">+/* send three concatenated RESTART in one segment */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_1byte_len_chained() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring chain := c_restart & c_restart & c_restart;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     TCP.send(ts_AS(g_tcp_conn_id, chain));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sabp_exp(tr_SABP_Restart(?));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sabp_exp(tr_SABP_Restart(?));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sabp_exp(tr_SABP_Restart(?));</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* SABP write-replace with length determinant encoded over two bytes ('8093'O) */</span><br><span style="color: hsl(120, 100%, 40%);">+const octetstring c_wrepl := '00000080930000080006000211120007000240C0000F0010000113F0030282EC0613F0030282EC070001400100000D0002012A000900020000000400010100000056029F01B4D90D064297D9EC37E8FE96B3C9A0303BDD68341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D10012'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test whether a message with 2-byte length determinant is parsed */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_2byte_len() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     TCP.send(ts_AS(g_tcp_conn_id, c_wrepl));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sabp_exp(tr_SABP_Write(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sabp_send(ts_SABP_Reset({ { pLMNidentity := '09F107'O, lac := '0000'O, sac := '0000'O } }));</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 whether a message with 2-byte length determinant is parsed if each byte is received separately */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_2byte_len_bytewise() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     tcp_send_segmented(c_wrepl, 1, 0.05);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sabp_exp(tr_SABP_Write(?, ?));</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%);">+/* send three concatenated WRITE-REPLACE in one segment */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_2byte_len_chained() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring chain := c_wrepl & c_wrepl & c_wrepl;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     TCP.send(ts_AS(g_tcp_conn_id, chain));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_sabp_exp(tr_SABP_Write(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sabp_exp(tr_SABP_Write(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sabp_exp(tr_SABP_Write(?, ?));</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%);">+/* send three concatenated WRITE-REPLACE in segments of 10 bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_2byte_len_chained_bytewise() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring chain := c_wrepl & c_wrepl & c_wrepl;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     tcp_send_segmented(chain, 10, 0.05);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sabp_exp(tr_SABP_Write(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sabp_exp(tr_SABP_Write(?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sabp_exp(tr_SABP_Write(?, ?));</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%);">+/* SABP write-replace with length determinant encoded over multiple chunks ('Cx'O case) */</span><br><span style="color: hsl(120, 100%, 40%);">+const octetstring c_chunked := '000000C1000007000600020002000700020002000F00C109C462F2241000004262F2242000000062F2242000000162F2242000000262F2242000000362F2242000000462F2242000000562F2242000000662F2242000000762F2242000000862F2242000000962F2242000000A62F2242000000B62F2242000000C62F2242000000D62F2242000000E62F2242000000F62F2242000001062F2242000001162F2242000001262F2242000001362F2242000001462F2242000001562F2242000001662F2242000001762F2242000001862F2242000001962F2242000001A62F2242000001B62F2242000001C62F2242000001D62F2242000001E62F2242000001F62F2242000002062F2242000002162F2242000002262F2242000002362F2242000002462F2242000002562F2242000002662F2242000002762F2242000002862F2242000002962F2242000002A62F2242000002B62F2242000002C62F2242000002D62F2242000002E62F2242000002F62F2242000003062F2242000003162F2242000003262F2242000003362F2242000003462F2242000003562F2242000003662F2242000003762F2242000003862F2242000003962F2242000003A62F2242000003B62F2242000003C62F2242000003D62F2242000003E62F2242000003F62F2242000004062F2242000004162F2242000004262F2242000004362F2242000004462F2242000004562F2242000004662F2242000004762F2242000004862F2242000004962F2242000004A62F2242000004B62F2242000004C62F2242000004D62F2242000004E62F2242000004F62F2242000005062F2242000005162F2242000005262F2242000005362F2242000005462F2242000005562F2242000005662F2242000005762F2242000005862F2242000005962F2242000005A62F2242000005B62F2242000005C62F2242000005D62F2242000005E62F2242000005F62F2242000006062F2242000006162F2242000006262F2242000006362F2242000006462F2242000006562F2242000006662F2242000006762F2242000006862F2242000006962F2242000006A62F2242000006B62F2242000006C62F2242000006D62F2242000006E62F2242000006F62F2242000007062F2242000007162F2242000007262F2242000007362F2242000007462F2242000007562F2242000007662F2242000007762F2242000007862F2242000007962F2242000007A62F2242000007B62F2242000007C62F2242000007D62F2242000007E62F2242000007F62F2242000008062F2242000008162F2242000008262F2242000008362F2242000008462F2242000008562F2242000008662F2242000008762F2242000008862F2242000008962F2242000008A62F2242000008B62F2242000008C62F2242000008D62F2242000008E62F2242000008F62F2242000009062F2242000009162F2242000009262F2242000009362F2242000009462F2242000009562F2242000009662F2242000009762F2242000009862F2242000009962F2242000009A62F2242000009B62F2242000009C62F2242000009D62F2242000009E62F2242000009F62F224200000A062F224200000A162F224200000A262F224200000A362F224200000A462F224200000A562F224200000A662F224200000A762F224200000A862F224200000A962F224200000AA62F224200000AB62F224200000AC62F224200000AD62F224200000AE62F224200000AF62F224200000B062F224200000B162F224200000B262F224200000B362F224200000B462F224200000B562F224200000B662F224200000B762F224200000B862F224200000B962F224200000BA62F224200000BB62F224200000BC62F224200000BD62F224200000BE62F224200000BF62F224200000C062F224200000C162F224200000C262F224200000C362F224200000C462F224200000C562F224200000C662F224200000C762F224200000C862F224200000C962F224200000CA62F224200000CB62F224200000CC62F224200000CD62F224200000CE62F224200000CF62F224200000D062F224200000D162F224200000D262F224200000D362F224200000D462F224200000D562F224200000D662F224200000D762F224200000D862F224200000D962F224200000DA62F224200000DB62F224200000DC62F224200000DD62F224200000DE62F224200000DF62F224200000E062F224200000E162F224200000E262F224200000E362F224200000E462F224200000E562F224200000E662F224200000E762F224200000E862F224200000E962F224200000EA62F224200000EB62F224200000EC62F224200000ED62F224200000EE62F224200000EF62F224200000F062F224200000F162F224200000F262F224200000F362F224200000F462F224200000F562F224200000F662F224200000F762F224200000F862F224200000F962F224200000FA62F224200000FB62F224200000FC62F224200000FD62F224200000FE62F224200000FF62F2242000010062F2242000010162F2242000010262F2242000010362F2242000010462F2242000010562F2242000010662F2242000010762F2242000010862F2242000010962F2242000010A62F2242000010B62F2242000010C62F2242000010D62F2242000010E62F2242000010F62F2242000011062F2242000011162F2242000011262F2242000011362F2242000011462F2242000011562F2242000011662F2242000011762F2242000011862F2242000011962F2242000011A62F2242000011B62F2242000011C62F2242000011D62F2242000011E62F2242000011F62F2242000012062F2242000012162F2242000012262F2242000012362F2242000012462F2242000012562F2242000012662F2242000012762F2242000012862F2242000012962F2242000012A62F2242000012B62F2242000012C62F2242000012D62F2242000012E62F2242000012F62F2242000013062F2242000013162F2242000013262F2242000013362F2242000013462F2242000013562F2242000013662F2242000013762F2242000013862F2242000013962F2242000013A62F2242000013B62F2242000013C62F2242000013D62F2242000013E62F2242000013F62F2242000014062F2242000014162F2242000014262F2242000014362F2242000014462F2242000014562F2242000014662F2242000014762F2242000014862F2242000014962F2242000014A62F2242000014B62F2242000014C62F2242000014D62F2242000014E62F2242000014F62F2242000015062F2242000015162F2242000015262F2242000015362F2242000015462F2242000015562F2242000015662F2242000015762F2242000015862F2242000015962F2242000015A62F2242000015B62F2242000015C62F2242000015D62F2242000015E62F2242000015F62F2242000016062F2242000016162F2242000016262F2242000016362F2242000016462F2242000016562F2242000016662F2242000016762F2242000016862F2242000016962F2242000016A62F2242000016B62F2242000016C62F2242000016D62F2242000016E62F2242000016F62F2242000017062F2242000017162F2242000017262F2242000017362F2242000017462F2242000017562F2242000017662F2242000017762F2242000017862F2242000017962F2242000017A62F2242000017B62F2242000017C62F2242000017D62F2242000017E62F2242000017F62F2242000018062F2242000018162F2242000018262F2242000018362F2242000018462F2242000018562F2242000018662F2242000018762F2242000018862F2242000018962F2242000018A62F2242000018B62F2242000018C62F2242000018D62F2242000018E62F2242000018F62F2242000019062F2242000019162F2242000019262F2242000019362F2242000019462F2242000019562F2242000019662F2242000019762F2242000019862F2242000019962F2242000019A62F2242000019B62F2242000019C62F2242000019D62F2242000019E62F2242000019F62F224200001A062F224200001A162F224200001A262F224200001A362F224200001A462F224200001A562F224200001A662F224200001A762F224200001A862F224200001A962F224200001AA62F224200001AB62F224200001AC62F224200001AD62F224200001AE62F224200001AF62F224200001B062F224200001B162F224200001B262F224200001B362F224200001B462F224200001B562F224200001B662F224200001B762F224200001B862F224200001B962F224200001BA62F224200001BB62F224200001BC62F224200001BD62F224200001BE62F224200001BF62F224200001C062F224200001C162F224200001C262F224200001C362F224200001C462F224200001C562F224200001C662F224200001C762F224200001C862F224200001C962F224200001CA62F224200001CB62F224200001CC62F224200001CD62F224200001CE62F224200001CF62F224200001D062F224200001D162F224200001D262F224200001D362F224200001D462F224200001D562F224200001D662F224200001D762F224200001D862F224200001D962F224200001DA62F224200001DB62F224200001DC62F224200001DD62F224200001DE62F224200001DF62F224200001E062F224200001E162F224200001E262F224200001E362F224200001E462F224200001E562F224200001E662F224200001E762F224200001E862F224200001E962F224200001EA62F224200001EB62F224200001EC62F224200001ED62F224200001EE62F224200001EF62F224200001F062F224200001F162F224200001F262F224200001F362F224200001F462F224200001F562F224200001F662F224200001F762F224200001F862F224200001F962F224200001FA62F224200001FB62F224200001FC62F224200001FD62F224200001FE62F224200001FF62F2242000020062F2242000020162F2242000020262F2242000020362F2242000020462F2242000020562F2242000020662F2242000020762F2242000020862F2242000020962F2242000020A62F2242000020B62F2242000020C62F2242000020D62F2242000020E62F2242000020F62F2242000021062F2242000021162F2242000021262F2242000021362F2242000021462F2242000021562F2242000021662F2242000021762F2242000021862F2242000021962F2242000021A62F2242000021B62F2242000021C62F2242000021D62F2242000021E62F2242000021F62F2242000022062F2242000022162F2242000022262F2242000022362F2242000022462F2242000022562F2242000022662F2242000022762F2242000022862F2242000022962F2242000022A62F2242000022B62F2242000022C62F2242000022D62F2242000022E62F2242000022F62F2242000023062F2242000023162F2242000023262F2242000023362F2242000023462F2242000023562F2242000023662F2242000023762F2242000023862F2242000023962F2242000023A62F2242000023B62F2242000023C62F2242000023D62F2242000023E62F2242000023F62F2242000024062F2242000024162F2242000024262F2242000024362F2242000024462F2242000024562F2242000024662F2242000024762F2242000024862F2242000024962F2242000024A62F2242000024B62F2242000024C62F2242000024D62F2242000024E62F2242000024F62F2242000025062F2242000025162F2242000025262F2242000025362F2242000025462F2242000025562F2242000025662F2242000025762F2242000025862F2242000025962F2242000025A62F2242000025B62F2242000025C62F2242000025D62F2242000025E62F2242000025F62F2242000026062F2242000026162F2242000026262F2242000026362F2242000026462F2242000026562F2242000026662F2242000026762F2242000026862F2242000026962F2242000026A62F2242000026B62F2242000026C62F2242000026D62F2242000026E62F2242000026F62F2242000027062F2242000027162F2242000027262F2242000027362F2242000027462F2242000027562F2242000027662F2242000027762F2242000027862F2242000027962F2242000027A62F2242000027B62F2242000027C62F2242000027D62F2242000027E62F2242000027F62F2242000028062F2242000028162F2242000028262F2242000028362F2242000028462F2242000028562F2242000028662F2242000028762F2242000028862F2242000028962F2242000028A62F2242000028B62F2242000028C62F2242000028D62F2242000028E62F2242000028F62F2242000029062F2242000029162F2242000029262F2242000029362F2242000029462F2242000029562F2242000029662F2242000029762F2242000029862F2242000029962F2242000029A62F2242000029B62F2242000029C62F2242000029D62F2242000029E62F2242000029F62F224200002A062F224200002A162F224200002A262F224200002A362F224200002A462F224200002A562F224200002A662F224200002A762F224200002A862F224200002A962F224200002AA62F224200002AB62F224200002AC62F224200002AD62F224200002AE62F224200002AF62F224200002B062F224200002B162F224200002B262F224200002B362F224200002B462F224200002B562F224200002B662F224200002B762F224200002B862F224200002B962F224200002BA62F224200002BB62F224200002BC62F224200002BD62F224200002BE62F224200002BF62F224200002C062F224200002C162F224200002C262F224200002C362F224200002C462F224200002C562F224200002C662F224200002C762F224200002C862F224200002C962F224200002CA62F224200002CB62F224200002CC62F224200002CD62F224200002CE62F224200002CF62F224200002D062F224200002D162F224200002D262F224200002D362F224200002D462F224200002D562F224200002D662F224200002D762F224200002D862F224200002D962F224200002DA62F224200002DB62F224200002DC62F224200002DD62F224200002DE62F224200002DF62F224200002E062F224200002E162F224200002E262F224200002E362F224200002E462F224200002E562F224200002E662F224200002E762F224200002E862F224200002E962F224200002EA62F224200002EB62F224200002EC62F224200002ED62F224200002EE62F224200002EF62F224200002F062F224200002F162F224200002F262F224200002F362F224200002F462F224200002F562F224200002F662F224200002F762F224200002F862F224200002F962F224200002FA62F224200002FB62F224200002FC62F224200002FD62F224200002FE62F224200002FF62F2242000030062F2242000030162F2242000030262F2242000030362F2242000030462F2242000030562F2242000030662F2242000030762F2242000030862F2242000030962F2242000030A62F2242000030B62F2242000030C62F2242000030D62F2242000030E62F2242000030F62F2242000031062F2242000031162F2242000031262F2242000031362F2242000031462F2242000031562F2242000031662F2242000031762F2242000031862F2242000031962F2242000031A62F2242000031B62F2242000031C62F2242000031D62F2242000031E62F2242000031F62F2242000032062F2242000032162F2242000032262F2242000032362F2242000032462F2242000032562F2242000032662F2242000032762F2242000032862F2242000032962F2242000032A62F2242000032B62F2242000032C62F2242000032D62F2242000032E62F2242000032F62F2242000033062F2242000033162F2242000033262F2242000033362F2242000033462F2242000033562F2242000033662F2242000033762F2242000033862F2242000033962F2242000033A62F2242000033B62F2242000033C62F2242000033D62F2242000033E62F2242000033F62F2242000034062F2242000034162F2242000034262F2242000034362F2242000034462F2242000034562F2242000034662F2242000034762F2242000034862F2242000034962F2242000034A62F2242000034B62F2242000034C62F2242000034D62F2242000034E62F2242000034F62F2242000035062F2242000035162F2242000035262F2242000035362F2242000035462F2242000035562F2242000035662F2242000035762F2242000035862F2242000035962F2242000035A62F2242000035B62F2242000035C62F2242000035D62F2242000035E62F2242000035F62F2242000036062F2242000036162F2242000036262F2242000036362F2242000036462F2242000036562F2242000036662F2242000036762F2242000036862F2242000036962F2242000036A62F2242000036B62F2242000036C62F2242000036D62F2242000036E62F2242000036F62F2242000037062F2242000037162F2242000037262F2242000037362F2242000037462F2242000037562F2242000037662F2242000037762F2242000037862F2242000037962F2242000037A62F2242000037B62F2242000037C62F2242000037D62F2242000037E62F2242000037F62F2242000038062F2242000038162F2242000038262F2242000038362F2242000038462F2242000038562F2242000038662F2242000038762F2242000038862F2242000038962F2242000038A62F2242000038B62F2242000038C62F2242000038D62F2242000038E62F2242000038F62F2242000039062F2242000039162F2242000039262F2242000039362F2242000039462F2242000039562F2242000039662F2242000039762F2242000039862F2242000039962F2242000039A62F2242000039B62F2242000039C62F2242000039D62F2242000039E62F2242000039F62F224200003A062F224200003A162F224200003A262F224200003A362F224200003A462F224200003A562F224200003A662F224200003A762F224200003A862F224200003A962F224200003AA62F224200003AB62F224200003AC62F224200003AD62F224200003AE62F224200003AF62F224200003B062F224200003B162F224200003B262F224200003B362F224200003B462F224200003B562F224200003B662F224200003B762F224200003B862F224200003B962F224200003BA62F224200003BB62F224200003BC62F224200003BD62F224200003BE62F224200003BF62F224200003C062F224200003C162F224200003C262F224200003C362F224200003C462F224200003C562F224200003C662F224200003C762F224200003C862F224200003C962F224200003CA62F224200003CB62F224200003CC62F224200003CD62F224200003CE62F224200003CF62F224200003D062F224200003D162F224200003D262F224200003D362F224200003D462F224200003D562F224200003D662F224200003D762F224200003D862F224200003D962F224200003DA62F224200003DB62F224200003DC62F224200003DD62F224200003DE62F224200003DF62F224200003E062F224200003E162F224200003E262F224200003E362F224200003E462F224200003E562F224200003E662F224200003E762F224200003E862F224200003E962F224200003EA62F224200003EB62F224200003EC62F224200003ED62F224200003EE62F224200003EF62F224200003F062F224200003F162F224200003F262F224200003F362F224200003F462F224200003F562F224200003F662F224200003F762F224200003F862F224200003F962F224200003FA62F224200003FB62F224200003FC62F224200003FD62F224200003FE62F224200003FF62F2242000040062F2242000040162F2242000040262F2242000040362F2242000040462F2242000040562F2242000040662F2242000040762F2242000040862F2242000040962F2242000040A62F2242000040B62F2242000040C62F2242000040D62F2242000040E62F2242000040F62F2242000041062F2242000041162F2242000041262F2242000041362F2242000041462F2242000041562F2242000041662F2242000041762F2242000041862F2242000041962F2242000041A62F2242000041B62F2242000041C62F2242000041D62F2242000041E62F2242000041F62F2242000042062F2242000042162F2242000042262F2242000042362F2242000042462F2242000042562F2242000042662F2242000042762F2242000042862F2242000042962F2242000042A62F2242000042B62F2242000042C62F2242000042D62F2242000042E62F2242000042F62F2242000043062F2242000043162F2242000043262F2242000043362F2242000043462F2242000043562F2242000043662F2242000043762F2242000043862F2242000043962F2242000043A62F2242000043B62F2242000043C62F2242000043D62F2242000043E62F2242000043F62F2242000044062F2242000044162F2242000044262F2242000044362F2242000044462F2242000044562F2242000044662F2242000044762F2242000044862F2242000044962F2242000044A62F2242000044B62F2242000044C62F2242000044D62F2242000044E62F2242000044F62F2242000045062F2242000045162F2242000045262F2242000045362F2242000045462F2242000045562F2242000045662F2242000045762F2242000045862F2242000045962F2242000045A62F2242000045B62F2242000045C62F2242000045D62F2242000045E62F2242000045F62F2242000046062F2242000046162F2242000046262F2242000046362F2242000046462F2242000046562F2242000046662F2242000046762F2242000046862F2242000046962F2242000046A62F2242000046B62F2242000046C62F2242000046D62F2242000046E62F2242000046F62F2242000047062F2242000047162F2242000047262F2242000047362F2242000047462F2242000047562F2242000047662F2242000047762F2242000047862F2242000047962F2242000047A62F2242000047B62F2242000047C62F2242000047D62F2242000047E62F2242000047F62F2242000048062F2242000048162F2242000048262F2242000048362F2242000048462F2242000048562F2242000048662F2242000048762F2242000048862F2242000048962F2242000048A62F2242000048B62F2242000048C62F2242000048D62F2242000048E62F2242000048F62F2242000049062F2242000049162F2242000049262F2242000049362F2242000049462F2242000049562F2242000049662F2242000049762F2242000049862F2242000049962F2242000049A62F2242000049B62F2242000049C62F2242000049D62F2242000049E62F2242000049F62F224200004A062F224200004A162F224200004A262F224200004A362F224200004A462F224200004A562F224200004A662F224200004A762F224200004A862F224200004A962F224200004AA62F224200004AB62F224200004AC62F224200004AD62F224200004AE62F224200004AF62F224200004B062F224200004B162F224200004B262F224200004B362F224200004B462F224200004B562F224200004B662F224200004B762F224200004B862F224200004B962F224200004BA62F224200004BB62F224200004BC62F224200004BD62F224200004BE62F224200004BF62F224200004C062F224200004C162F224200004C262F224200004C362F224200004C462F224200004C562F224200004C662F224200004C762F224200004C862F224200004C962F224200004CA62F224200004CB62F224200004CC62F224200004CD62F224200004CE62F224200004CF62F224200004D062F224200004D162F224200004D262F224200004D362F224200004D462F224200004D562F224200004D662F224200004D762F224200004D862F224200004D962F224200004DA62F224200004DB62F224200004DC62F224200004DD62F224200004DE62F224200004DF62F224200004E062F224200004E162F224200004E262F224200004E362F224200004E462F224200004E562F224200004E662F224200004E762F224200004E862F224200004E962F224200004EA62F224200004EB62F224200004EC62F224200004ED62F224200004EE62F224200004EF62F224200004F062F224200004F162F224200004F262F224200004F362F224200004F462F224200004F562F224200004F662F224200004F762F224200004F862F224200004F962F224200004FA62F224200004FB62F224200004FC62F224200004FD62F224200004FE62F224200004FF62F2242000050062F2242000050162F2242000050262F2242000050362F2242000050462F2242000050562F2242000050662F2242000050762F2242000050862F2242000050962F2242000050A62F2242000050B62F2242000050C62F2242000050D62F2242000050E62F2242000050F62F2242000051062F2242000051162F2242000051262F2242000051362F2242000051462F2242000051562F2242000051662F2242000051762F2242000051862F2242000051962F2242000051A62F2242000051B62F2242000051C62F2242000051D62F2242000051E62F2242000051F62F2242000052062F2242000052162F2242000052262F2242000052362F2242000052462F2242000052562F2242000052662F2242000052762F2242000052862F2242000052962F2242000052A62F2242000052B62F2242000052C62F2242000052D62F2242000052E62F2242000052F62F2242000053062F2242000053162F2242000053262F2242000053362F2242000053462F2242000053562F2242000053662F2242000053762F2242000053862F2242000053962F2242000053A62F2242000053B62F2242000053C62F2242000053D62F2242000053E62F2242000053F62F2242000054062F2242000054162F2242000054262F2242000054362F2242000054462F2242000054562F2242000054662F2242000054762F2242000054862F2242000054962F2242000054A62F2242000054B62F2242000054C62F2242000054D62F2242000054E62F2242000054F62F2242000055062F2242000055162F2242000055262F2242000055362F2242000055462F2242000055562F2242000055662F2242000055762F2242000055862F2242000055962F2242000055A62F2242000055B62F2242000055C62F2242000055D62F2242000055E62F2242000055F62F2242000056062F2242000056162F2242000056262F2242000056362F2242000056462F2242000056562F2242000056662F2242000056762F2242000056862F2242000056962F2242000056A62F2242000056B62F2242000056C62F2242000056D62F2242000056E62F2242000056F62F2242000057062F2242000057162F2242000057262F2242000057362F2242000057462F2242000057562F2242000057662F2242000057762F2242000057862F2242000057962F2242000057A62F2242000057B62F2242000057C62F2242000057D62F2242000057E62F2242000057F62F2242000058062F2242000058162F2242000058262F2242000058362F2242000058462F2242000058562F2242000058662F2242000058762F2242000058862F2242000058962F2242000058A62F2242000058B62F2242000058C62F2242000058D62F2242000058E62F2242000058F62F2242000059062F2242000059162F2242000059262F2242000059362F2242000059462F2242000059562F2242000059662F2242000059762F2242000059862F2242000059962F2242000059A62F2242000059B62F2242000059C62F2242000059D62F2242000059E62F2242000059F62F224200005A062F224200005A162F224200005A262F224200005A362F224200005A462F224200005A562F224200005A662F224200005A762F224200005A862F224200005A962F224200005AA62F224200005AB62F224200005AC62F224200005AD62F224200005AE62F224200005AF62F224200005B062F224200005B162F224200005B262F224200005B362F224200005B462F224200005B562F224200005B662F224200005B762F224200005B862F224200005B962F224200005BA62F224200005BB62F224200005BC62F224200005BD62F224200005BE62F224200005BF62F224200005C062F224200005C162F224200005C262F224200005C362F224200005C462F224200005C562F224200005C662F224200005C762F224200005C862F224200005C962F224200005CA62F224200005CB62F224200005CC62F224200005CD62F224200005CE62F224200005CF62F224200005D062F224200005D162F224200005D262F224200005D362F224200005D462F224200005D562F224200005D662F224200005D762F224200005D862F224200005D962F224200005DA62F224200005DB62F224200005DC62F224200005DD62F224200005DE62F224200005DF62F224200005E062F224200005E162F224200005E262F224200005E362F224200005E462F224200005E562F224200005E662F224200005E762F224200005E862F224200005E962F224200005EA62F224200005EB62F224200005EC62F224200005ED62F224200005EE62F224200005EF62F224200005F062F224200005F162F224200005F262F224200005F362F224200005F462F224200005F562F224200005F662F224200005F762F224200005F862F224200005F962F224200005FA62F224200005FB62F224200005FC62F224200005FD62F224200005FE62F224200005FF62F2242000060062F2242000060162F2242000060262F2242000060362F2242000060462F2242000060562F2242000060662F2242000060762F2242000060862F2242000060962F2242000060A62F2242000060B62F2242000060C62F2242000060D62F2242000060E62F2242000060F62F2242000061062F2242000061162F2242000061262F2242000061362F2242000061462F2242000061562F2242000061662F2242000061762F2242000061862F2242000061962F2242000061A62F2242000061B62F2242000061C62F2242000061D62F2242000061E62F2242000061F62F2242000062062F2242000062162F2242000062262F2242000062362F2242000062462F2242000062562F2242000062662F2242000062762F2242000062862F2242000062962F2242000062A62F2242000062B62F2242000062C62F2242000062D62F2242000062E62F2242000062F62F2242000063062F2242000063162F2242000063262F2242000063362F2242000063462F2242000063562F2242000063662F2242000063762F2242000063862F2242000063962F2242000063A62F2242000063B62F2242000063C62F2242000063D62F2242000063E62F2242000063F62F2242000064062F2242000064162F2242000064262F2242000064362F2242000064462F2242000064562F2242000064662F2242000064762F2242000064862F2242000064962F2242000064A62F2242000064B62F2242000064C62F2242000064D62F2242000064E62F2242000064F62F2242000065062F2242000065162F2242000065262F2242000065362F2242000065462F2242000065562F2242000065662F2242000065762F2242000065862F2242000065962F2242000065A62F2242000065B62F2242000065C62F2242000065D62F2242000065E62F2242000065F62F2242000066062F2242000066162F2242000066262F2242000066362F2242000066462F2242000066562F2242000066662F2242000066762F2242000066862F2242000066962F2242000066A62F2242000066B62F2242000066C62F2242000066D62F2242000066E62F2242000066F62F2242000067062F2242000067162F2242000067262F2242000067362F2242000067462F2242000067562F2242000067662F2242000067762F2242000067862F2242000067962F2242000067A62F2242000067B62F2242000067C62F2242000067D62F2242000067E62F2242000067F62F2242000068062F2242000068162F2242000068262F2242000068362F2242000068462F2242000068562F2242000068662F2242000068762F2242000068862F2242000068962F2242000068A62F2242000068B62F2242000068C62F2242000068D62F2242000068E62F2242000068F62F2242000069062F2242000069162F2242000069262F2242000069362F2242000069462F2242000069562F2242000069662F2242000069762F2242000069862F2242000069962F2242000069A62F2242000069B62F2242000069C62F2242000069D62F2242000069E62F2242000069F62F224200006A062F224200006A162F224200006A262F224200006A362F224200006A462F224200006A562F224200006A662F224200006A762F224200006A862F224200006A962F224200006AA62F224200006AB62F224200006AC62F224200006AD62F224200006AE62F224200006AF62F224200006B062F224200006B162F224200006B262F224200006B362F224200006B462F224200006B562F224200006B662F224200006B762F224200006B862F224200006B962F224200006BA62F224200006BB62F224200006BC62F224200006BD62F224200006BE62F224200006BF62F224200006C062F224200006C162F224200006C262F224200006C362F224200006C462F224200006C562F224200006C662F224200006C762F224200006C862F224200006C962F224200006CA62F224200006CB62F224200006CC62F224200006CD62F224200006CE62F224200006CF62F224200006D062F224200006D162F224200006D262F224200006D362F224200006D462F224200006D562F224200006D662F224200006D762F224200006D862F224200006D962F224200006DA62F224200006DB62F224200006DC62F224200006DD62F224200006DE62F224200006DF62F224200006E062F224200006E162F224200006E262F224200006E362F224200006E462F224200006E562F224200006E662F224200006E762F224200006E862F224200006E962F224200006EA62F224200006EB62F224200006EC62F224200006ED62F224200006EE62F224200006EF62F224200006F062F224200006F162F224200006F262F224200006F362F224200006F462F224200006F562F224200006F662F224200006F762F224200006F862F224200006F962F224200006FA62F224200006FB62F224200006FC62F224200006FD62F224200006FE62F224200006FF62F2242000070062F2242000070162F2242000070262F2242000070362F2242000070462F2242000070562F2242000070662F2242000070762F2242000070862F2242000070962F2242000070A62F2242000070B62F2242000070C62F2242000070D62F2242000070E62F2242000070F62F2242000071062F2242000071162F2242000071262F2242000071362F2242000071462F2242000071562F2242000071662F2242000071762F2242000071862F2242000071962F2242000071A62F2242000071B62F2242000071C62F2242000071D62F2242000071E62F2242000071F62F2242000072062F2242000072162F2242000072262F2242000072362F2242000072462F2242000072562F2242000072662F2242000072762F2242000072862F2242000072962F2242000072A62F2242000072B62F2242000072C62F2242000072D62F2242000072E62F2242000072F62F2242000073062F2242000073162F2242000073262F2242000073362F2242000073462F2242000073562F2242000073662F2242000073762F2242000073862F2242000073962F2242000073A62F2242000073B62F2242000073C62F2242000073D62F2242000073E62F2242000073F62F2242000074062F2242000074162F2242000074262F2242000074362F2242000074462F2242000074562F2242000074662F2242000074762F2242000074862F2242000074962F2242000074A62F2242000074B62F2242000074C62F2242000074D62F2242000074E62F2242000074F62F2242000075062F2242000075162F2242000075262F2242000075362F2242000075462F2242000075562F2242000075662F2242000075762F2242000075862F2242000075962F2242000075A62F2242000075B62F2242000075C62F2242000075D62F2242000075E62F2242000075F62F2242000076062F2242000076162F2242000076262F2242000076362F2242000076462F2242000076562F2242000076662F2242000076762F2242000076862F2242000076962F2242000076A62F2242000076B62F2242000076C62F2242000076D62F2242000076E62F2242000076F62F2242000077062F2242000077162F2242000077262F2242000077362F2242000077462F2242000077562F2242000077662F2242000077762F2242000077862F2242000077962F2242000077A62F2242000077B62F2242000077C62F2242000077D62F2242000077E62F2242000077F62F2242000078062F2242000078162F2242000078262F2242000078362F2242000078462F2242000078562F2242000078662F2242000078762F2242000078862F2242000078962F2242000078A62F2242000078B62F2242000078C62F2242000078D62F2242000078E62F2242000078F62F2242000079062F2242000079162F2242000079262F2242000079362F2242000079462F2242000079562F2242000079662F2242000079762F2242000079862F2242000079962F2242000079A62F2242000079B62F2242000079C62F2242000079D62F2242000079E62F2242000079F62F224200007A062F224200007A162F224200007A262F224200007A362F224200007A462F224200007A562F224200007A662F224200007A762F224200007A862F224200007A962F224200007AA62F224200007AB62F224200007AC62F224200007AD62F224200007AE62F224200007AF62F224200007B062F224200007B162F224200007B262F224200007B362F224200007B462F224200007B562F224200007B662F224200007B762F224200007B862F224200007B962F224200007BA62F224200007BB62F224200007BC62F224200007BD62F224200007BE62F224200007BF62F224200007C062F224200007C162F224200007C262F224200007C362F224200007C462F224200007C562F224200007C662F224200007C762F224200007C862F224200007C962F224200007CA62F224200007CB62F224200007CC62F224200007CD62F224200007CE62F224200007CF62F224200007D062F224200007D162F224200007D262F224200007D362F224200007D462F224200007D562F224200007D662F224200007D762F224200007D862F224200007D962F224200007DA62F224200007DB62F224200007DC62F224200007DD62F224200007DE62F224200007DF62F224200007E062F224200007E162F224200007E262F224200007E362F224200007E462F224200007E562F224200007E662F224200007E762F224200007E862F224200007E962F224200007EA62F224200007EB62F224200007EC62F224200007ED62F224200007EE62F224200007EF62F224200007F062F224200007F162F224200007F262F224200007F362F224200007F462F224200007F562F224200007F662F224200007F762F224200007F862F224200007F962F224200007FA62F224200007FB62F224200007FC62F224200007FD62F224200007FE62F224200007FF62F2242000080062F2242000080162F2242000080262F2242000080362F2242000080462F2242000080562F2242000080662F2242000080762F2242000080862F2242000080962F2242000080A62F2242000080B62F2242000080C62F2242000080D62F2242000080E62F2242000080F62F2242000081062F2242000081162F2242000081262F2242000081362F2242000081462F2242000081562F2242000081662F2242000081762F2242000081862F2242000081962F2242000081A62F2242000081B62F2242000081C62F2242000081D62F2242000081E62F2242000081F62F2242000082062F2242000082162F2242000082262F2242000082362F2242000082462F2242000082562F2242000082662F2242000082762F2242000082862F2242000082962F2242000082A62F2242000082B62F2242000082C62F2242000082D62F2242000082E62F2242000082F62F2242000083062F2242000083162F2242000083262F2242000083362F2242000083462F2242000083562F2242000083662F2242000083762F2242000083862F2242000083962F2242000083A62F2242000083B62F2242000083C62F2242000083D62F2242000083E62F2242000083F62F2242000084062F2242000084162F2242000084262F2242000084362F2242000084462F2242000084562F2242000084662F2242000084762F2242000084862F2242000084962F2242000084A62F2242000084B62F2242000084C62F2242000084D62F2242000084E62F2242000084F62F2242000085062F2242000085162F2242000085262F2242000085362F2242000085462F2242000085562F2242000085662F2242000085762F2242000085862F2242000085962F2242000085A62F2242000085B62F2242000085C62F2242000085D62F2242000085E62F2242000085F62F2242000086062F2242000086162F2242000086262F2242000086362F2242000086462F2242000086562F2242000086662F2242000086762F2242000086862F2242000086962F2242000086A62F2242000086B62F2242000086C62F2242000086D62F2242000086E62F2242000086F62F2242000087062F2242000087162F2242000087262F2242000087362F2242000087462F2242000087562F2242000087662F2242000087762F2242000087862F2242000087962F2242000087A62F2242000087B62F2242000087C62F2242000087D62F2242000087E62F2242000087F62F2242000088062F2242000088162F2242000088262F2242000088362F2242000088462F2242000088562F2242000088662F2242000088762F2242000088862F2242000088962F2242000088A62F2242000088B62F2242000088C62F2242000088D62F2242000088E62F2242000088F62F2242000089062F2242000089162F2242000089262F2242000089362F2242000089462F2242000089562F2242000089662F2242000089762F2242000089862F2242000089962F2242000089A62F2242000089B62F2242000089C62F2242000089D62F2242000089E62F2242000089F62F224200008A062F224200008A162F224200008A262F224200008A362F224200008A462F224200008A562F224200008A662F224200008A762F224200008A862F224200008A962F224200008AA62F224200008AB62F224200008AC62F224200008AD62F224200008AE62F224200008AF62F224200008B062F224200008B162F224200008B262F224200008B362F224200008B462F224200008B562F224200008B662F224200008B762F224200008B862F224200008B962F224200008BA62F224200008BB62F224200008BC62F224200008BD62F224200008BE62F224200008BF62F224200008C062F224200008C162F224200008C262F224200008C362F224200008C462F224200008C562F224200008C662F224200008C762F224200008C862F224200008C962F224200008CA62F224200008CB62F224200008CC62F224200008CD62F224200008CE62F224200008CF62F224200008D062F224200008D162F224200008D262F224200008D362F224200008D462F224200008D562F224200008D662F224200008D762F224200008D862F224200008D962F224200008DA62F224200008DB62F224200008DC62F224200008DD62F224200008DE62F224200008DF62F224200008E062F224200008E162F224200008E262F224200008E362F224200008E462F224200008E562F224200008E662F224200008E762F224200008E862F224200008E962F224200008EA62F224200008EB62F224200008EC62F224200008ED62F224200008EE62F224200008EF62F224200008F062F224200008F162F224200008F262F224200008F362F224200008F462F224200008F562F224200008F662F224200008F762F224200008F862F224200008F962F224200008FA62F224200008FB62F224200008FC62F224200008FD62F224200008FE62F224200008FF62F2242000090062F2242000090162F2242000090262F2242000090362F2242000090462F2242000090562F2242000090662F2242000090762F2242000090862F2242000090962F2242000090A62F2242000090B62F2242000090C62F2242000090D62F2242000090E62F2242000090F62F2242000091062F2242000091162F2242000091262F2242000091362F2242000091462F2242000091562F2242000091662F2242000091762F2242000091862F2242000091962F2242000091A62F2242000091B62F2242000091C62F2242000091D62F2242000091E62F2242000091F62F22420849200092062F2242000092162F2242000092262F28465242000092362F2242000092462F2242000092562F2242000092662F2242000092762F2242000092862F2242000092962F2242000092A62F2242000092B62F2242000092C62F2242000092D62F2242000092E62F2242000092F62F2242000093062F2242000093162F2242000093262F2242000093362F2242000093462F2242000093562F2242000093662F2242000093762F2242000093862F2242000093962F2242000093A62F2242000093B62F2242000093C62F2242000093D62F2242000093E62F2242000093F62F2242000094062F2242000094162F2242000094262F2242000094362F2242000094462F2242000094562F2242000094662F2242000094762F2242000094862F2242000094962F2242000094A62F2242000094B62F2242000094C62F2242000094D62F2242000094E62F2242000094F62F2242000095062F2242000095162F2242000095262F2242000095362F2242000095462F2242000095562F2242000095662F2242000095762F2242000095862F2242000095962F2242000095A62F2242000095B62F2242000095C62F2242000095D62F2242000095E62F2242000095F62F2242000096062F2242000096162F2242000096262F2242000096362F2242000096462F2242000096562F2242000096662F2242000096762F2242000096862F2242000096962F2242000096A62F2242000096B62F2242000096C62F2242000096D62F2242000096E62F2242000096F62F2242000097062F2242000097162F2242000097262F2242000097362F2242000097462F2242000097562F2242000097662F2242000097762F2242000097862F2242000097962F2242000097A62F2242000097B62F2242000097C62F2242000097D62F2242000097E62F2242000097F62F2242000098062F2242000098162F2242000098262F2242000098362F2242000098462F2242000098562F2242000098662F2242000098762F2242000098862F2242000098962F2242000098A62F2242000098B62F2242000098C62F2242000098D62F2242000098E62F2242000098F62F2242000099062F2242000099162F2242000099262F2242000099362F2242000099462F2242000099562F2242000099662F2242000099762F2242000099862F2242000099962F2242000099A62F2242000099B62F2242000099C62F2242000099D62F2242000099E62F2242000099F62F224200009A062F224200009A162F224200009A262F224200009A362F224200009A462F224200009A562F224200009A662F224200009A762F224200009A862F224200009A962F224200009AA62F224200009AB62F224200009AC62F224200009AD62F224200009AE62F224200009AF62F224200009B062F224200009B162F224200009B262F224200009B362F224200009B462F224200009B562F224200009B662F224200009B762F224200009B862F224200009B962F224200009BA62F224200009BB62F224200009BC62F224200009BD62F224200009BE62F224200009BF62F224200009C062F224200009C162F224200009C262F224200009C3000D0002001600090002002A00040001000000000300075A'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test whether a message with chnked length determinant is parsed */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_chunked_len() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     TCP.send(ts_AS(g_tcp_conn_id, c_chunked));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_sabp_exp(tr_SABP_Write(?, ?));</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 whether a message with chunked length determinant is parsed if each byte is received separately */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_chunked_len_bytewise() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     tcp_send_segmented(c_chunked, 100, 0.05);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sabp_exp(tr_SABP_Write(?, ?));</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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_1byte_len() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_1byte_len_bytewise() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_1byte_len_chained() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_2byte_len() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_2byte_len_bytewise() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_2byte_len_chained() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_2byte_len_chained_bytewise() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_chunked_len() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_chunked_len_bytewise() );</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/cbc/gen_links.sh b/cbc/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..075be2f</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/gen_links.sh</span><br><span>@@ -0,0 +1,57 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BASEDIR=../deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+. ../gen_links.sh.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Socket_API_Definitions.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="IPL4asp_Functions.ttcn  IPL4asp_PT.cc  IPL4asp_PT.hh IPL4asp_PortType.ttcn  IPL4asp_Types.ttcn  IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.SCTPasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SCTPasp_PT.cc  SCTPasp_PT.hh  SCTPasp_PortType.ttcn  SCTPasp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.TELNETasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TELNETasp_PT.cc  TELNETasp_PT.hh  TELNETasp_PortType.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.BSSMAP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="BSSAP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library/sabp</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SABP_CommonDataTypes.asn SABP_Constants.asn SABP_Containers.asn SABP_IEs.asn SABP_PDU_Contents.asn SABP_PDU_Descriptions.asn SABP_Types.ttcn SABP_EncDec.cc SABP_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Abstract_Socket/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Abstract_Socket.cc Abstract_Socket.hh "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.HTTPmsg/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="HTTPmsg_MessageLen.ttcn HTTPmsg_MessageLen_Function.cc HTTPmsg_PT.cc HTTPmsg_PT.hh HTTPmsg_PortType.ttcn HTTPmsg_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.JSON_v07_2006/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="JSON_EncDec.cc JSON_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="HTTP_Adapter.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="BSSMAP_Templates.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 style="color: hsl(120, 100%, 40%);">+FILES+="SABP_CodecPort.ttcn SABP_CodecPort_CtrlFunct.ttcn SABP_CodecPort_CtrlFunctDef.cc SABP_Adapter.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ignore_pp_results</span><br><span>diff --git a/cbc/regen_makefile.sh b/cbc/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..0dabc7d</span><br><span>--- /dev/null</span><br><span>+++ b/cbc/regen_makefile.sh</span><br><span>@@ -0,0 +1,11 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn TCCConversion.cc TCCInterface.cc TCCEncoding.cc IPL4asp_PT.cc IPL4asp_discovery.cc TELNETasp_PT.cc Native_FunctionDefs.cc SCTPasp_PT.cc Abstract_Socket.cc HTTPmsg_PT.cc HTTPmsg_MessageLen_Function.cc JSON_EncDec.cc CBSP_CodecPort_CtrlFunctdef.cc SABP_EncDec.cc SABP_CodecPort_CtrlFunctDef.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+#FILES+="*.ttcnpp "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="*.asn"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3=""</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+../regen-makefile.sh CBC_Tests.ttcn $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sed -i -e 's/^LINUX_LIBS = -lxml2/LINUX_LIBS = -lxml2 -lfftranscode/' Makefile</span><br><span>diff --git a/library/CBSP_Templates.ttcn b/library/CBSP_Templates.ttcn</span><br><span>index 5ee1f33..5da2958 100644</span><br><span>--- a/library/CBSP_Templates.ttcn</span><br><span>+++ b/library/CBSP_Templates.ttcn</span><br><span>@@ -54,7 +54,7 @@</span><br><span>        if (istemplatekind(val, "omit")) {</span><br><span>                 ie := omit;</span><br><span>  } else if (istemplatekind(val, "*")) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ie := tr_CBSP_IE({channel_ind := ?}) ifpresent;</span><br><span style="color: hsl(120, 100%, 40%);">+               ie := tr_CBSP_IE({channel_ind := ?}); //ifpresent;</span><br><span>   } else {</span><br><span>             ie := tr_CBSP_IE({channel_ind := val});</span><br><span>      }</span><br><span>@@ -542,14 +542,20 @@</span><br><span>                    ts_OldSerNo(old_ser_nr),</span><br><span>                     ts_CbspCellList(cell_list),</span><br><span>                  ts_CbspChannelInd(channel_ind)});</span><br><span style="color: hsl(0, 100%, 40%);">-template CBSP_PDU tr_CBSP_KILL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                               template BSSMAP_FIELD_CellIdentificationList cell_list := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                            template uint8_t channel_ind := ?) :=</span><br><span style="color: hsl(0, 100%, 40%);">-   tr_CBSP(CBSP_MSGT_KILL, {</span><br><span style="color: hsl(0, 100%, 40%);">-                       tr_CbspMsgId(msg_id),</span><br><span style="color: hsl(0, 100%, 40%);">-                   tr_OldSerNo(old_ser_nr),</span><br><span style="color: hsl(0, 100%, 40%);">-                        tr_CbspCellList(cell_list),</span><br><span style="color: hsl(0, 100%, 40%);">-                     tr_CbspChannelInd(channel_ind) });</span><br><span style="color: hsl(120, 100%, 40%);">+function tr_CBSP_KILL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                   template BSSMAP_FIELD_CellIdentificationList cell_list := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                  template uint8_t channel_ind := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+return template (present) CBSP_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+      var template CBSP_IEs ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_CbspMsgId(msg_id),</span><br><span style="color: hsl(120, 100%, 40%);">+         tr_OldSerNo(old_ser_nr),</span><br><span style="color: hsl(120, 100%, 40%);">+              tr_CbspCellList(cell_list)</span><br><span style="color: hsl(120, 100%, 40%);">+    };</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not istemplatekind(channel_ind, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     return tr_CBSP(CBSP_MSGT_KILL, ies);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* 8.1.3.5 KILL COMPLETE */</span><br><span> function ts_CBSP_KILL_COMPL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,</span><br><span>diff --git a/library/CBSP_Types.ttcn b/library/CBSP_Types.ttcn</span><br><span>index c4c6cf2..5ab3c98 100644</span><br><span>--- a/library/CBSP_Types.ttcn</span><br><span>+++ b/library/CBSP_Types.ttcn</span><br><span>@@ -378,5 +378,24 @@</span><br><span> external function dec_CBSP_PDU(in octetstring msg) return CBSP_PDU</span><br><span>      with { extension "prototype(convert) decode(RAW)" };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* convert from warning period encoding to seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_cbsp_period2s(uint8_t period) return integer</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (period == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            return -1; /* infinite */</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (period <= 10) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return period;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (period <= 20) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return 10 + (period - 10)*2;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (period <= 38) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return 30 + (period - 20)*5;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (period <= 86) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return 120 + (period - 38)*10;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (period <= 186) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return 600 + (period - 86)*30;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</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> </span><br><span> } with { encode "RAW"; variant "FIELDORDER(msb)" }</span><br><span>diff --git a/library/SABP_Adapter.ttcn b/library/SABP_Adapter.ttcn</span><br><span>index e94e91c..046f597 100644</span><br><span>--- a/library/SABP_Adapter.ttcn</span><br><span>+++ b/library/SABP_Adapter.ttcn</span><br><span>@@ -20,7 +20,7 @@</span><br><span> import from SABP_CodecPort_CtrlFunct all;</span><br><span> import from IPL4asp_Types all;</span><br><span> import from IPL4asp_PortType all;</span><br><span style="color: hsl(0, 100%, 40%);">-//import from Socket_API_Definitions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Socket_API_Definitions all;</span><br><span> </span><br><span> const integer SABP_HDR_LEN := 3;</span><br><span> </span><br><span>@@ -72,7 +72,7 @@</span><br><span>  * If the callback function detects that the it will be impossible to determine the length of the message,</span><br><span>  * even receiving more octets, should return "-2". In this case the connection will be closed and the</span><br><span>  * length calculation error will be reported. */</span><br><span style="color: hsl(0, 100%, 40%);">-private function f_APER_getMsgLen(in octetstring stream, inout ro_integer args) return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_APER_getMsgLen(in octetstring stream, inout Socket_API_Definitions.ro_integer args) return integer {</span><br><span>  var integer stream_len := lengthof(stream);</span><br><span>  var integer hdr_len := args[0];</span><br><span>      var octetstring stream_nohdr;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23022">change 23022</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/+/23022"/><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: I38286e8a3dd0f39bd25f631dcbb3ff4f8d4c221f </div>
<div style="display:none"> Gerrit-Change-Number: 23022 </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: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>