This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
neels gerrit-no-reply at lists.osmocom.orgneels has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20374 ) Change subject: smlc: implement initial LCS tests for OsmoSMLC ...................................................................... smlc: implement initial LCS tests for OsmoSMLC Change-Id: Ic16b8bdb2d66dcf706bfd09ab15d9f56499dd982 --- M Makefile A smlc/BSC_ConnectionHandler.ttcn A smlc/SMLC_Tests.cfg A smlc/SMLC_Tests.default A smlc/SMLC_Tests.ttcn A smlc/expected-results.xml A smlc/gen_links.sh A smlc/osmo-smlc.cfg A smlc/osmo-stp.cfg A smlc/regen_makefile.sh 10 files changed, 810 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/74/20374/1 diff --git a/Makefile b/Makefile index 03e7a70..b1a7e61 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ # limitations under the License. SUBDIRS=bsc bsc-nat bts ccid ggsn_tests hlr mgw mme msc pcu pgw remsim sccp selftest sgsn \ - simtrace sip stp sysinfo + simtrace sip stp sysinfo smlc NPROC=$(shell nproc 2>/dev/null) ifeq ($(NPROC),) diff --git a/smlc/BSC_ConnectionHandler.ttcn b/smlc/BSC_ConnectionHandler.ttcn new file mode 100644 index 0000000..bd787c7 --- /dev/null +++ b/smlc/BSC_ConnectionHandler.ttcn @@ -0,0 +1,95 @@ +module BSC_ConnectionHandler { + +/* BSC Connection Handler of SMLC Tests in TTCN-3 + * (C) 2020 sysmocom - s.f.m.c. GmbH <info at sysmocom.de> + * All rights reserved. + * + * Released under the terms of GNU General Public License, Version 2 or + * (at your option) any later version. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +import from Misc_Helpers all; +import from General_Types all; +import from Osmocom_Types all; +import from SCCPasp_Types all; +import from BSSAP_Types all; +import from BSSAP_CodecPort all; +import from RAN_Emulation all; +import from BSSMAP_Templates all; +import from BSSAP_LE_Emulation all; +import from BSSAP_LE_Types all; +import from BSSMAP_LE_Templates all; + +import from TELNETasp_PortType all; +import from Osmocom_VTY_Functions all; + +/* this component represents a single subscriber connection at the SMLC. */ +type component BSC_ConnHdlr extends BSSAP_LE_ConnHdlr { + /* SCCP Connecction Identifier for the underlying SCCP connection */ + var integer g_sccp_conn_id; + + port TELNETasp_PT SMLCVTY; + + var TestHdlrParams g_pars; + + var charstring host_bsc := "127.0.0.4"; + + var boolean g_vty_initialized := false; +} + +function f_BscConnHdlr_init_vty() runs on BSC_ConnHdlr { + if (not g_vty_initialized) { + map(self:SMLCVTY, system:SMLCVTY); + f_vty_set_prompts(SMLCVTY); + f_vty_transceive(SMLCVTY, "enable"); + g_vty_initialized := true; + } +} + +/* initialize all parameters */ +function f_BscConnHdlr_init() runs on BSC_ConnHdlr { + f_BscConnHdlr_init_vty(); +} + +/* Callback function from general BSSAP_LE_Emulation whenever a connectionless + * BSSAP_LE message arrives. Can return a PDU_BSSAP_LE that should be sent in return */ +private function BSSAP_LE_UnitdataCallback(PDU_BSSAP_LE bssap) +runs on BSSAP_LE_Emulation_CT return template PDU_BSSAP_LE { + var template PDU_BSSAP_LE resp := omit; + + /* answer all RESET with a RESET ACK */ + if (match(bssap, tr_BSSMAP_LE_Reset)) { + resp := ts_BSSMAP_LE_ResetAck; + } + + return resp; +} + +const BssapLeOps BSC_BssapLeOps := { + create_cb := refers(BSSAP_LE_Emulation.ExpectedCreateCallback), + unitdata_cb := refers(BSSAP_LE_UnitdataCallback), + decode_dtap := false, + role_ms := false, + sccp_addr_local := omit, + sccp_addr_peer := omit +} +type record TestHdlrParams { + hexstring imsi, + integer bssap_le_idx, + SCCP_PAR_Address sccp_addr_bsc optional, + SCCP_PAR_Address sccp_addr_smlc optional +}; + +/* Note: Do not use valueof() to get a value of this template, use + * f_gen_test_hdlr_pars() instead in order to get a configuration that is + * matched to the current test situation (aoip vs. sccplite) */ +template (value) TestHdlrParams t_def_TestHdlrPars := { + imsi := '001019876543210'H, + bssap_le_idx := 0, + sccp_addr_bsc := omit, + sccp_addr_smlc := omit +} + +} diff --git a/smlc/SMLC_Tests.cfg b/smlc/SMLC_Tests.cfg new file mode 100644 index 0000000..cc9fd6e --- /dev/null +++ b/smlc/SMLC_Tests.cfg @@ -0,0 +1,18 @@ +[ORDERED_INCLUDE] +# Common configuration, shared between test suites +"../Common.cfg" +# testsuite specific configuration, not expected to change +"./SMLC_Tests.default" + +# Local configuration below + +[LOGGING] + +[TESTPORT_PARAMETERS] + +[MODULE_PARAMETERS] + +[MAIN_CONTROLLER] + +[EXECUTE] +SMLC_Tests.control diff --git a/smlc/SMLC_Tests.default b/smlc/SMLC_Tests.default new file mode 100644 index 0000000..485d215 --- /dev/null +++ b/smlc/SMLC_Tests.default @@ -0,0 +1,19 @@ +[LOGGING] +"VirtBSC-SCCP".FileMask := ERROR | WARNING | PARALLEL | VERDICTOP; +mtc.FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING | DEBUG_ENCDEC; + +[TESTPORT_PARAMETERS] +*.SMLCVTY.CTRL_MODE := "client" +*.SMLCVTY.CTRL_HOSTNAME := "127.0.0.1" +*.SMLCVTY.CTRL_PORTNUM := "4271" +*.SMLCVTY.CTRL_LOGIN_SKIPPED := "yes" +*.SMLCVTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes" +*.SMLCVTY.CTRL_READMODE := "buffered" +*.SMLCVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes" +*.SMLCVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes" +*.SMLCVTY.PROMPT1 := "OsmoSMLC> " + +[MODULE_PARAMETERS] +Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoSMLC"; + +[EXECUTE] diff --git a/smlc/SMLC_Tests.ttcn b/smlc/SMLC_Tests.ttcn new file mode 100644 index 0000000..52e203a --- /dev/null +++ b/smlc/SMLC_Tests.ttcn @@ -0,0 +1,516 @@ +module SMLC_Tests { + +/* Integration Tests for OsmoSMLC + * (C) 2020 by sysmocom - s.f.m.c. GmbH <info at sysmocom.de> + * All rights reserved. + * + * Released under the terms of GNU General Public License, Version 2 or + * (at your option) any later version. + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + * This test suite tests OsmoSMLC while emulating both multiple BTS + MS as + * well as the MSC. See README for more details. + * + * There are test cases that run in so-called 'handler mode' and test cases + * that run directly on top of the BSSAP and RSL CodecPorts. The "handler mode" + * tests abstract the multiplexing/demultiplexing of multiple SCCP connections + * and/or RSL channels and are hence suitable for higher-level test cases, while + * the "raw" tests directly on top of the CodecPorts are more suitable for lower- + * level testing. + */ + +import from Misc_Helpers all; +import from General_Types all; +import from Osmocom_Types all; + +import from BSSAP_LE_Adapter all; +import from BSSAP_LE_CodecPort all; +import from BSSAP_LE_Types all; +import from BSSAP_LE_Emulation all; +import from BSSMAP_LE_Templates all; +import from BSSLAP_Types all; + +import from BSSAP_Types all; +import from BSSMAP_Templates all; + +import from Osmocom_CTRL_Functions all; +import from Osmocom_CTRL_Types all; +import from Osmocom_CTRL_Adapter all; + +import from Osmocom_VTY_Functions all; +import from TELNETasp_PortType all; + +import from SCCP_Templates all; + +import from SCCPasp_Types all; + +import from BSC_ConnectionHandler all; + +const integer NUM_BSC := 1; + +/* Default list of counters for 'smlc' */ +const CounterNameVals counternames_bsc := { + { "foo:bar", 0 } +}; + +type component test_CT extends CTRL_Adapter_CT { + var BSSAP_LE_Adapter g_bssap_le[NUM_BSC]; + port BSSAP_LE_CODEC_PT BSSAP_LE; + + port TELNETasp_PT SMLCVTY; + + /* are we initialized yet */ + var boolean g_initialized := false; + + /*Configure T(tias) over VTY, seconds */ + var integer g_smlc_sccp_timer_ias := 7 * 60; + /*Configure T(tiar) over VTY, seconds */ + var integer g_smlc_sccp_timer_iar := 15 * 60; + + /* global test case guard timer (actual timeout value is set in f_init()) */ + timer T_guard := 30.0; + + var CounterNameValsList g_ctr_smlc; + var CounterNameValsList g_ctr_bsc; + +} + +type record of BSSAP_LE_Configuration BSSAP_LE_Configurations; + +modulepar { + /* IP address at which the SMLC can be reached */ + charstring mp_smlc_ip := "127.0.0.1"; + /* port number to which to establish the IPA CTRL connection */ + integer mp_smlc_ctrl_port := 4272; + /* IP address at which the test binds */ + charstring mp_test_ip := "127.0.0.1"; + + BSSAP_LE_Configurations mp_bssap_le_cfg := { + { + sccp_service_type := "mtp3_itu", + sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" }, + own_pc := 187, /* 0.23.3 first BSC emulation */ + own_ssn := 250, /* BSC side SSN */ + peer_pc := 190, /* 0.23.6 osmo-smlc */ + peer_ssn := 252, /* SMLC side SSN */ + sio := '83'O, + rctx := 1 + } + }; +} + +private function f_gen_test_hdlr_pars(integer bssap_le_idx := 0) return TestHdlrParams { + + var TestHdlrParams pars := valueof(t_def_TestHdlrPars); + return pars; +} + +/* Convenience functions for rate counters using g_ctr_bsc. */ + +private function f_ctrs_smlc_init(integer bscs_count := NUM_BSC, CounterNameVals counternames := counternames_bsc) runs on test_CT { + g_ctr_bsc := f_counter_name_vals_get_n(IPA_CTRL, "bsc", bscs_count, counternames); + log("initial msc rate counters: ", g_ctr_bsc); +} + +private function f_ctrs_smlc_add(integer msc_nr, charstring countername, integer val := 1) runs on test_CT { + f_counter_name_vals_list_add(g_ctr_bsc, msc_nr, countername, val); +} + +/* f_ctrs_smlc_init(); + * f_do_thing(on_msc := 0); + * f_do_thing(on_msc := 0); + * f_do_other(on_msc := 1); + * f_ctrs_smlc_add(0, "thing", 2); + * f_ctrs_smlc_add(1, "other"); + * f_ctrs_smlc_verify(); + */ +private function f_ctrs_smlc_verify() runs on test_CT { + log("verifying msc rate counters: ", g_ctr_bsc); + f_counter_name_vals_expect_n(IPA_CTRL, "bsc", g_ctr_bsc); +} + +/* convenience: f_ctrs_smlc_add() and f_ctrs_smlc_verify() in one call. + * f_ctrs_smlc_init(); + * f_do_thing(on_msc := 0); + * f_do_thing(on_msc := 0); + * f_do_thing(on_msc := 0); + * f_ctrs_smlc_expect(0, "thing", 3); + */ +private function f_ctrs_smlc_expect(integer msc_nr, charstring countername, integer val := 1) runs on test_CT { + f_ctrs_smlc_add(msc_nr, countername, val); + f_ctrs_smlc_verify(); +} + +private function f_shutdown_helper() runs on test_CT { + all component.stop; + setverdict(pass); + mtc.stop; +} + +/* global altstep for global guard timer */ +altstep as_Tguard() runs on test_CT { + [] T_guard.timeout { + setverdict(fail, "Timeout of T_guard"); + mtc.stop; + } +} + +private function f__logp(TELNETasp_PT pt, charstring log_msg) +{ + // log on TTCN3 log output + log(log_msg); + // log in stderr log + f_vty_transceive(pt, "logp lglobal notice TTCN3 f_logp(): " & log_msg); +} + +private function f_logp(charstring log_msg) runs on BSC_ConnHdlr +{ + f__logp(SMLCVTY, log_msg); +} + +/* global initialization function + * \param nr_bts Number of BTSs we should start/bring up + * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false). + * \param nr_msc Number of virtual MSCs to bring up to connect to osmo-bsc. + */ +function f_init(integer nr_bsc := NUM_BSC, float guard_timeout := 30.0) runs on test_CT { + var integer bssap_le_idx; + + if (g_initialized) { + return; + } + g_initialized := true; + + T_guard.start(guard_timeout); + activate(as_Tguard()); + + f_init_vty("VirtBSC"); + + for (bssap_le_idx := 0; bssap_le_idx < nr_bsc; bssap_le_idx := bssap_le_idx+1) { + f_bssap_le_adapter_init(g_bssap_le[bssap_le_idx], mp_bssap_le_cfg[bssap_le_idx], "VirtBSC", BSC_BssapLeOps); + f_bssap_le_adapter_start(g_bssap_le[bssap_le_idx]); + } +} + +function f_init_vty(charstring id := "foo") runs on test_CT { + if (SMLCVTY.checkstate("Mapped")) { + /* skip initialization if already executed once */ + return; + } + map(self:SMLCVTY, system:SMLCVTY); + f_vty_set_prompts(SMLCVTY); + f_vty_transceive(SMLCVTY, "enable"); + f_cs7_inst_0_cfg(SMLCVTY, {"sccp-timer ias " & int2str(g_smlc_sccp_timer_ias), + "sccp-timer iar " & int2str(g_smlc_sccp_timer_iar)}); +} + +type function void_fn(charstring id) runs on BSC_ConnHdlr; + +private function f_connect_handler(inout BSC_ConnHdlr vc_conn, integer bssap_le_idx := 0) runs on test_CT { + connect(vc_conn:BSSAP_LE, g_bssap_le[bssap_le_idx].vc_BSSAP_LE:CLIENT); + connect(vc_conn:BSSAP_LE_PROC, g_bssap_le[bssap_le_idx].vc_BSSAP_LE:PROC); +} + +function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars := omit) +runs on test_CT return BSC_ConnHdlr { + var charstring id := testcasename(); + var BSC_ConnHdlr vc_conn; + var integer bssap_le_idx := 0; + if (isvalue(pars)) { + bssap_le_idx := valueof(pars).bssap_le_idx; + } + vc_conn := BSC_ConnHdlr.create(id); + f_connect_handler(vc_conn, bssap_le_idx); + vc_conn.start(f_handler_init(fn, id, pars)); + return vc_conn; +} + +private function f_handler_init(void_fn fn, charstring id, template (omit) TestHdlrParams pars := omit) +runs on BSC_ConnHdlr { + if (isvalue(pars)) { + g_pars := valueof(pars); + } + fn.apply(id); +} + +type record of charstring Commands; + +private function f_cs7_inst_0_cfg(TELNETasp_PT pt, Commands cmds := {}) +{ + f_vty_enter_cfg_cs7_inst(pt, 0); + for (var integer i := 0; i < sizeof(cmds); i := i+1) { + f_vty_transceive(pt, cmds[i]); + } + f_vty_transceive(pt, "end"); +} + +template (value) PDU_BSSAP_LE ts_BSSMAP_LE_BSSLAP(template (value) BSSLAP_PDU bsslap) + := ts_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap))); + +template PDU_BSSAP_LE tr_BSSMAP_LE_BSSLAP(template BSSLAP_PDU bsslap) + := tr_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap))); + +private function f_tc_smlc_location_request_with_ta_l3(charstring id) runs on BSC_ConnHdlr { + f_sleep(1.0); + + f_BscConnHdlr_init(); + f_bssap_le_register_imsi(g_pars.imsi, omit); + + f__logp(SMLCVTY, "f_tc_smlc_location_request_with_ta_l3 start"); + + var uint16_t cell_id := 42; + var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id)); + + BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc, + valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi, + enc_BSSLAP_PDU(valueof(ts_BSSLAP_TA_Layer3(23))))))); + BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND); + + /* SMLC got the TA from the BSC, now responds with geo information data. */ + /* TODO: implement GAD coding in ttcn */ + /* Expecting geo: + * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1) + * 0... .... = Sign of latitude: North (0) + * .010 0001 0000 1001 1100 1001 = Degrees of latitude: 2165193 (23.23000 degrees) + * 0001 1110 0010 1010 0101 0011 = Degrees of longitude: 1976915 (42.42000 degrees) + * .100 1010 = Uncertainty code: 74 (11552.7 m) + * [Location OSM URI: https://www.openstreetmap.org/?mlat=23.23000&mlon=42.42000&zoom=12] + */ + var octetstring geo := '102109C91E2A534A'O; + BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit)); + + f_sleep(2.0); + f__logp(SMLCVTY, "f_tc_smlc_location_request_with_ta_l3 done"); + setverdict(pass); +} +testcase TC_smlc_location_request_with_ta_l3() runs on test_CT { + var BSC_ConnHdlr vc_conn; + var TestHdlrParams pars := f_gen_test_hdlr_pars(); + + f_init(); + f_sleep(1.0); + + pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own; + pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer; + + vc_conn := f_start_handler(refers(f_tc_smlc_location_request_with_ta_l3), pars); + vc_conn.done; +} + +private function f_tc_smlc_location_request_without_ta_l3(charstring id) runs on BSC_ConnHdlr { + f_sleep(1.0); + + f_BscConnHdlr_init(); + f_bssap_le_register_imsi(g_pars.imsi, omit); + + f__logp(SMLCVTY, "f_tc_smlc_location_request_without_ta_l3 start"); + + var uint16_t cell_id := 42; + var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id)); + + BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc, + valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi)))); + BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND); + + /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */ + BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req)); + + /* BSC figures out the TA and sends it back to the SMLC */ + + BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Resp(cell_id, 23))); + + /* SMLC got the TA from the BSC, now responds with geo information data. */ + /* TODO: implement GAD coding in ttcn */ + /* Expecting geo: + * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1) + * 0... .... = Sign of latitude: North (0) + * .010 0001 0000 1001 1100 1001 = Degrees of latitude: 2165193 (23.23000 degrees) + * 0001 1110 0010 1010 0101 0011 = Degrees of longitude: 1976915 (42.42000 degrees) + * .100 1010 = Uncertainty code: 74 (11552.7 m) + * [Location OSM URI: https://www.openstreetmap.org/?mlat=23.23000&mlon=42.42000&zoom=12] + */ + var octetstring geo := '102109C91E2A534A'O; + BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit)); + + f_sleep(2.0); + f__logp(SMLCVTY, "f_tc_smlc_location_request_without_ta_l3 done"); + setverdict(pass); +} +testcase TC_smlc_location_request_without_ta_l3() runs on test_CT { + var BSC_ConnHdlr vc_conn; + var TestHdlrParams pars := f_gen_test_hdlr_pars(); + + f_init(1); + f_sleep(1.0); + + pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own; + pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer; + + vc_conn := f_start_handler(refers(f_tc_smlc_location_request_without_ta_l3), pars); + vc_conn.done; +} + +private function f_tc_smlc_location_request_bsslap_reset(charstring id) runs on BSC_ConnHdlr { + f_sleep(1.0); + + f_BscConnHdlr_init(); + f_bssap_le_register_imsi(g_pars.imsi, omit); + + f__logp(SMLCVTY, "f_tc_smlc_location_request_bsslap_reset start"); + + var uint16_t cell_id := 1; + var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(1, cell_id)); + + BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc, + valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi)))); + BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND); + + /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */ + BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req)); + + /* BSC reports a Handover via a BSSLAP Reset */ + BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_Reset(17, 42, + valueof(ts_BSSLAP_IE_ChanDesc), + BSSLAP_CAUSE_INTRA_BSS_HO))); + + /* SMLC got the TA from the BSC via BSSLAP Reset, now responds with geo information data. */ + /* TODO: implement GAD coding in ttcn */ + /* Expecting geo: + * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1) + * 0... .... = Sign of latitude: North (0) + * .000 1011 0011 1000 1011 0100 = Degrees of latitude: 735412 (7.89012 degrees) + * 0000 0110 0101 0100 0110 1011 = Degrees of longitude: 414827 (8.90122 degrees) + * .101 0001 = Uncertainty code: 81 (22522.4 m) + * [Location OSM URI: https://www.openstreetmap.org/?mlat=7.89012&mlon=8.90122&zoom=12] + */ + var octetstring geo := '100B38B406546B51'O; + BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit)); + + f_sleep(2.0); + f__logp(SMLCVTY, "f_tc_smlc_location_request_bsslap_reset done"); + setverdict(pass); +} +testcase TC_smlc_location_request_bsslap_reset() runs on test_CT { + var BSC_ConnHdlr vc_conn; + var TestHdlrParams pars := f_gen_test_hdlr_pars(); + + f_init(1); + f_sleep(1.0); + + pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own; + pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer; + + vc_conn := f_start_handler(refers(f_tc_smlc_location_request_bsslap_reset), pars); + vc_conn.done; +} + +private function f_tc_smlc_location_request_abort(charstring id) runs on BSC_ConnHdlr { + f_sleep(1.0); + + f_BscConnHdlr_init(); + f_bssap_le_register_imsi(g_pars.imsi, omit); + + f__logp(SMLCVTY, "f_tc_smlc_location_request_abort start"); + + var uint16_t cell_id := 42; + var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id)); + + BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc, + valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi)))); + BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND); + + /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */ + BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req)); + + /* BSC aborts */ + BSSAP_LE.send(ts_BSSMAP_LE_PerfLocAbort(BSSMAP_LE_LCS_CAUSE_INTER_BSC_HO)); + + var PDU_BSSAP_LE bssap_le; + timer nothing := 7.0; + nothing.start; + alt { + [] BSSAP_LE.receive(tr_BSSAP_LE_BSSMAP) -> value(bssap_le) { + log("unexpected bssap_le: ", bssap_le); + setverdict(fail, "No more messages expected from SMLC"); + mtc.stop; + } + [] nothing.timeout { + setverdict(pass); + break; + } + } + + f_sleep(2.0); + f__logp(SMLCVTY, "f_tc_smlc_location_request_abort done"); + setverdict(pass); +} +testcase TC_smlc_location_request_abort() runs on test_CT { + var BSC_ConnHdlr vc_conn; + var TestHdlrParams pars := f_gen_test_hdlr_pars(); + + f_init(1); + f_sleep(1.0); + + pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own; + pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer; + + vc_conn := f_start_handler(refers(f_tc_smlc_location_request_abort), pars); + vc_conn.done; +} + +private function f_tc_smlc_location_request_bsslap_abort(charstring id) runs on BSC_ConnHdlr { + f_sleep(1.0); + + f_BscConnHdlr_init(); + f_bssap_le_register_imsi(g_pars.imsi, omit); + + f__logp(SMLCVTY, "f_tc_smlc_location_request_bsslap_abort start"); + + var uint16_t cell_id := 42; + var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id)); + + BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc, + valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi)))); + BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND); + + /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */ + BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req)); + + /* BSC aborts the TA Request */ + BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_Abort(BSSLAP_CAUSE_SUPERV_TIMER_EXPIRED))); + + /* Expect response without location, just an LCS Cause indicating abort */ + BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(omit, BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED)); + + f_sleep(2.0); + f__logp(SMLCVTY, "f_tc_smlc_location_request_bsslap_abort done"); + setverdict(pass); +} +testcase TC_smlc_location_request_bsslap_abort() runs on test_CT { + var BSC_ConnHdlr vc_conn; + var TestHdlrParams pars := f_gen_test_hdlr_pars(); + + f_init(1); + f_sleep(1.0); + + pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own; + pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer; + + vc_conn := f_start_handler(refers(f_tc_smlc_location_request_bsslap_abort), pars); + vc_conn.done; +} + +control { +if (true) { + execute( TC_smlc_location_request_without_ta_l3() ); +} else { + execute( TC_smlc_location_request_with_ta_l3() ); + execute( TC_smlc_location_request_without_ta_l3() ); + execute( TC_smlc_location_request_bsslap_reset() ); + execute( TC_smlc_location_request_bsslap_abort() ); + execute( TC_smlc_location_request_abort() ); +} +} + +} diff --git a/smlc/expected-results.xml b/smlc/expected-results.xml new file mode 100644 index 0000000..9034822 --- /dev/null +++ b/smlc/expected-results.xml @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<testsuite name='BSC_Tests' tests='209' failures='3' errors='0' skipped='1' inconc='0' time='MASKED'> + <testcase classname='SMLC_Tests' name='TC_smlc_location_request_for_idle_ms' time='MASKED'/> +</testsuite> diff --git a/smlc/gen_links.sh b/smlc/gen_links.sh new file mode 100755 index 0000000..25782f6 --- /dev/null +++ b/smlc/gen_links.sh @@ -0,0 +1,75 @@ +#!/bin/bash + +BASEDIR=../deps + +. ../gen_links.sh.inc + +#DIR=$BASEDIR/titan.TestPorts.UNIX_DOMAIN_SOCKETasp/src +#FILES="UD_PT.cc UD_PT.hh UD_PortType.ttcn UD_Types.ttcn" +#gen_links $DIR $FILES + +DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src +FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h SDP_EncDec.cc" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src +FILES="Socket_API_Definitions.ttcn" +gen_links $DIR $FILES + +# Required by MGCP and IPA +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 + +# required by M3UA_Emulation +DIR=$BASEDIR/titan.ProtocolModules.M3UA/src +FILES="M3UA_Types.ttcn" +gen_links $DIR $FILES + +# required by M3UA_Emulation +DIR=$BASEDIR/titan.TestPorts.SCTPasp/src +FILES="SCTPasp_PT.cc SCTPasp_PT.hh SCTPasp_PortType.ttcn SCTPasp_Types.ttcn" +gen_links $DIR $FILES + +# required by SCCP Emulation +DIR=$BASEDIR/titan.ProtocolEmulations.M3UA/src +FILES="M3UA_Emulation.ttcn" +gen_links $DIR $FILES + +# required by SCCP Emulation +DIR=$BASEDIR/titan.TestPorts.MTP3asp/src +FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src +FILES="SCCP_Emulation.ttcn SCCP_Mapping.ttcnpp SCCP_Types.ttcn SCCPasp_Types.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.ProtocolModules.BSSMAP/src +FILES="BSSAP_Types.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.ProtocolModules.MobileL3_v13.4.0/src +FILES="MobileL3_CC_Types.ttcn MobileL3_CommonIE_Types.ttcn MobileL3_GMM_SM_Types.ttcn MobileL3_MM_Types.ttcn MobileL3_RRM_Types.ttcn MobileL3_SMS_Types.ttcn MobileL3_SS_Types.ttcn MobileL3_Types.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.ProtocolModules.SDP/src +FILES="SDP_EncDec.cc SDP_Types.ttcn SDP_parse_.tab.c SDP_parse_.tab.h SDP_parse_parser.h SDP_parser.l +SDP_parser.y lex.SDP_parse_.c" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.ProtocolModules.RTP/src +FILES="RTP_EncDec.cc RTP_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=../library +FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn RAN_Emulation.ttcnpp RLCMAC_CSN1_Templates.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcnpp Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn GSM_SystemInformation.ttcn GSM_RestOctets.ttcn " +FILES+="BSSAP_LE_CodecPort.ttcn BSSAP_LE_Emulation.ttcn BSSAP_LE_Types.ttcn BSSAP_LE_Adapter.ttcn BSSLAP_Types.ttcn BSSMAP_LE_Templates.ttcn " + +gen_links $DIR $FILES + +ignore_pp_results diff --git a/smlc/osmo-smlc.cfg b/smlc/osmo-smlc.cfg new file mode 100644 index 0000000..3bba0b3 --- /dev/null +++ b/smlc/osmo-smlc.cfg @@ -0,0 +1,28 @@ +log gsmtap 172.18.23.203 + logging level set-all debug + logging filter all 1 +log stderr + logging filter all 1 + logging color 1 + logging print level 1 + logging print category 1 + logging print category-hex 0 + logging print extended-timestamp 1 + logging print file basename last + logging level set-all debug + +line vty + no login + bind 0.0.0.0 + +cs7 instance 0 + asp asp-clnt-msc-0 2905 2905 m3ua + local-ip 172.18.23.20 + local-ip fd02:db8:23::20 + remote-ip 172.18.23.200 + remote-ip fd02:db8:23::200 + +cells + lac-ci 23 42 lat 23.23 lon 42.42 + cgi 001 02 3 4 lat 5.678 lon 6.789 + cgi 001 02 1 17 lat 7.890123 lon 8.90123 diff --git a/smlc/osmo-stp.cfg b/smlc/osmo-stp.cfg new file mode 100644 index 0000000..dad1f2d --- /dev/null +++ b/smlc/osmo-stp.cfg @@ -0,0 +1,45 @@ +! +! OsmoSTP (0.8.1) configuration saved from vty +!! +! +log stderr + logging filter all 1 + logging color 1 + logging print category 1 + logging timestamp 1 + logging print extended-timestamp 1 + logging level all everything + logging level lglobal notice + logging level llapd notice + logging level linp notice + logging level lmux notice + logging level lmi notice + logging level lmib notice + logging level lsms notice + logging level lctrl notice + logging level lgtp notice + logging level lstats notice + logging level lgsup notice + logging level loap notice + logging level lss7 debug + logging level lsccp debug + logging level lsua debug + logging level lm3ua debug + logging level lmgcp notice +! +line vty + no login +! +cs7 instance 0 + xua rkm routing-key-allocation dynamic-permitted + asp virt-bsc0-0 23905 2905 m3ua + local-ip 127.0.0.1 + remote-ip 127.0.0.1 + as virt-bsc0 m3ua + asp virt-bsc0-0 + routing-key 1 0.23.3 + + route-table system + update route 0.23.3 7.255.7 linkset virt-bsc0 + listen m3ua 2905 + accept-asp-connections dynamic-permitted diff --git a/smlc/regen_makefile.sh b/smlc/regen_makefile.sh new file mode 100755 index 0000000..d8b8642 --- /dev/null +++ b/smlc/regen_makefile.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +MAIN=SMLC_Tests.ttcn + +FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc *.c" + +export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_CTRL -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DRAN_EMULATION_CTRL -DUSE_MTP3_DISTRIBUTOR" + +../regen-makefile.sh $MAIN $FILES -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20374 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: Ic16b8bdb2d66dcf706bfd09ab15d9f56499dd982 Gerrit-Change-Number: 20374 Gerrit-PatchSet: 1 Gerrit-Owner: neels <nhofmeyr at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201001/3cabb67a/attachment.htm>