MSC_Tests: Add support for multiple BSC
The upcomming tests for inter-BSC handover make it necessary to
simulate multiple (two) BSCs to the MSC, while the current
Implementation can only handle one BSC instance at a time.
- Allow multiple BSC instances to be created
- Add a simple reset-test to test what happens when
two BSC instances are started (BSSMAP reset from two
different BSCs)
Change-Id: I52a4c8118828c1605cf672889982f987568ad17d
Related: OS#1609
diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn
index 84f33b7..ce9c8b9 100644
--- a/msc/MSC_Tests.ttcn
+++ b/msc/MSC_Tests.ttcn
@@ -47,11 +47,13 @@
import from L3_Templates all;
import from L3_Common all;
+const integer NUM_BSC := 2;
+type record of BSSAP_Configuration BSSAP_Configurations;
type component MTC_CT extends CTRL_Adapter_CT {
var boolean g_initialized := false;
- var BSSAP_Adapter g_bssap;
+ var BSSAP_Adapter g_bssap[NUM_BSC];
/* no 'adapter_CT' for MNCC or GSUP */
var MNCC_Emulation_CT vc_MNCC;
@@ -89,13 +91,27 @@
charstring mp_msc_mncc := "/tmp/mncc";
- BSSAP_Configuration mp_bssap_cfg := {
- sccp_service_type := "mtp3_itu",
- sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
- own_pc := 185,
- own_ssn := 254,
- peer_pc := 187,
- peer_ssn := 254
+ BSSAP_Configurations mp_bssap_cfg := {
+ {
+ sccp_service_type := "mtp3_itu",
+ sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },
+ own_pc := 185,
+ own_ssn := 254,
+ peer_pc := 187,
+ peer_ssn := 254,
+ sio := '83'O,
+ rctx := 0
+ },
+ {
+ sccp_service_type := "mtp3_itu",
+ sctp_addr := { 23906, "127.0.0.1", 2905, "127.0.0.1" },
+ own_pc := 186,
+ own_ssn := 254,
+ peer_pc := 187,
+ peer_ssn := 254,
+ sio := '83'O,
+ rctx := 1
+ }
};
}
@@ -167,14 +183,25 @@
}
}
-function f_init() runs on MTC_CT {
+function f_init(integer num_bsc := 1) runs on MTC_CT {
if (g_initialized == true) {
return;
}
g_initialized := true;
- f_bssap_init(g_bssap, mp_bssap_cfg, "MSC_Test", BSC_BssmapOps);
+ if (num_bsc > NUM_BSC) {
+ setverdict(fail, "excess number of BSC instances requested");
+ }
+
+ for (var integer i := 0; i < num_bsc; i := i + 1) {
+ if (isbound(mp_bssap_cfg[i])) {
+ f_bssap_init(g_bssap[0], mp_bssap_cfg[i], "MSC_Test_" & int2str(i), BSC_BssmapOps);
+ } else {
+ setverdict(fail, "missing BSSAP configuration");
+ }
+ }
+
f_ipa_ctrl_start(mp_msc_ip, mp_msc_ctrl_port);
f_init_mncc("MSC_Test");
f_init_mgcp("MSC_Test");
@@ -194,8 +221,8 @@
* to f_init() when the high level functions of the BSC_ConnectionHandler are
* not needed. */
function f_init_bssap_direct() runs on MTC_CT {
- f_bssap_init(g_bssap, mp_bssap_cfg, "MSC_Test", omit);
- connect(g_bssap.vc_SCCP:SCCP_SP_PORT, self:BSSAP_DIRECT);
+ f_bssap_init(g_bssap[0], mp_bssap_cfg[0], "MSC_Test", omit);
+ connect(g_bssap[0].vc_SCCP:SCCP_SP_PORT, self:BSSAP_DIRECT);
/* Start guard timer and activate it as default */
Tguard_direct.start
@@ -376,8 +403,8 @@
expect_ciph := false
};
var BSC_ConnHdlrPars pars := {
- sccp_addr_own := g_bssap.sccp_addr_own,
- sccp_addr_peer := g_bssap.sccp_addr_peer,
+ sccp_addr_own := g_bssap[0].sccp_addr_own,
+ sccp_addr_peer := g_bssap[0].sccp_addr_peer,
cell_id := valueof(ts_CellId_CGI('262'H, '42'H, 23, 42)),
imei := f_gen_imei(imsi_suffix),
imsi := f_gen_imsi(imsi_suffix),
@@ -399,8 +426,8 @@
vc_conn := BSC_ConnHdlr.create(id);
/* BSSMAP part / A interface */
- connect(vc_conn:BSSAP, g_bssap.vc_BSSMAP:CLIENT);
- connect(vc_conn:BSSAP_PROC, g_bssap.vc_BSSMAP:PROC);
+ connect(vc_conn:BSSAP, g_bssap[0].vc_BSSMAP:CLIENT);
+ connect(vc_conn:BSSAP_PROC, g_bssap[0].vc_BSSMAP:PROC);
/* MNCC part */
connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
@@ -1665,10 +1692,10 @@
f_init_bssap_direct();
/* Make a blind connection attemt, to trigger the deadlock condition */
- BSSAP_DIRECT.send(ts_BSSAP_CONNECT_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, 1, omit));
+ BSSAP_DIRECT.send(ts_BSSAP_CONNECT_req(g_bssap[0].sccp_addr_peer, g_bssap[0].sccp_addr_own, 1, omit));
/* Send a BSSMAP reset */
- BSSAP_DIRECT.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));
+ BSSAP_DIRECT.send(ts_BSSAP_UNITDATA_req(g_bssap[0].sccp_addr_peer, g_bssap[0].sccp_addr_own, ts_BSSMAP_Reset(0)));
T.start
alt {
[] BSSAP_DIRECT.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_ResetAck)) {
@@ -1678,7 +1705,7 @@
/* Acknowledge MSC sided reset requests */
[] BSSAP_DIRECT.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) {
- BSSAP_DIRECT.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_ResetAck));
+ BSSAP_DIRECT.send(ts_BSSAP_UNITDATA_req(g_bssap[0].sccp_addr_peer, g_bssap[0].sccp_addr_own, ts_BSSMAP_ResetAck));
repeat;
}
@@ -1774,6 +1801,14 @@
f_init();
}
+/* Two BSSMAP resets from two different BSCs */
+testcase TC_reset_two() runs on MTC_CT {
+ var BSC_ConnHdlr vc_conn;
+ f_init(2);
+ f_sleep(2.0);
+ setverdict(pass);
+}
+
/* TODO:
* continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
* malformed messages (missing IE, invalid message type): properly rejected?
@@ -1831,6 +1866,7 @@
execute( TC_lu_imsi_auth_tmsi_encr_013_2() );
execute( TC_mo_release_timeout() );
execute( TC_lu_and_mt_call_no_dlcx_resp() );
+ execute( TC_reset_two() );
execute( TC_lu_and_mt_call() );