smlc: implement initial LCS tests for OsmoSMLC
Change-Id: Ic16b8bdb2d66dcf706bfd09ab15d9f56499dd982changes/74/20374/5
parent
1708d1bf1b
commit
5c5b276600
2
Makefile
2
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),)
|
||||
|
|
|
@ -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@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
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
|
@ -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]
|
|
@ -0,0 +1,503 @@
|
|||
module SMLC_Tests {
|
||||
|
||||
/* Integration Tests for OsmoSMLC
|
||||
* (C) 2020 by sysmocom - s.f.m.c. GmbH <info@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);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
/* Emit a marker to appear in the SUT's own logging output */
|
||||
f_logp(SMLCVTY, testcasename() & "() start");
|
||||
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)));
|
||||
|
||||
/* BSC sends Perform Location Request that already contains a TA Layer 3 BSSLAP APDU */
|
||||
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);
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
/* BSC sends Perform Location Request without BSSLAP APDU, SMLC needs to request TA */
|
||||
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);
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
/* BSC sends Perform Location Request, halfway the BSC indicates handover via BSSLAP Reset */
|
||||
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);
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
/* BSC sends Perform Location Request, halfway the BSC aborts the request because of inter-BSC HO */
|
||||
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);
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
/* BSC sends Perform Location Request, SMLC asks for TA, halfway the BSC aborts the TA request */
|
||||
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);
|
||||
|
||||
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);
|
||||
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() );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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>
|
|
@ -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 BSSAP_LE_Types.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_Adapter.ttcn BSSLAP_Types.ttcn BSSMAP_LE_Templates.ttcn "
|
||||
|
||||
gen_links $DIR $FILES
|
||||
|
||||
ignore_pp_results
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue