smlc: implement initial LCS tests for OsmoSMLC

Change-Id: Ic16b8bdb2d66dcf706bfd09ab15d9f56499dd982
This commit is contained in:
Neels Hofmeyr 2020-10-01 06:35:56 +02:00
parent 1708d1bf1b
commit 5c5b276600
10 changed files with 797 additions and 1 deletions

View File

@ -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),)

View File

@ -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
}
}

18
smlc/SMLC_Tests.cfg Normal file
View File

@ -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

19
smlc/SMLC_Tests.default Normal file
View File

@ -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]

503
smlc/SMLC_Tests.ttcn Normal file
View File

@ -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() );
}
}
}

View File

@ -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>

75
smlc/gen_links.sh Executable file
View File

@ -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

28
smlc/osmo-smlc.cfg Normal file
View File

@ -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

45
smlc/osmo-stp.cfg Normal file
View File

@ -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

9
smlc/regen_makefile.sh Executable file
View File

@ -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