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