[PATCH] osmo-ttcn3-hacks[master]: MSC_Tests: Integrate MNCC, GSUP, BSSAP connection handler, ...

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/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Sun Jan 21 18:32:08 UTC 2018


Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/5955

to look at the new patch set (#2).

MSC_Tests: Integrate MNCC, GSUP, BSSAP connection handler, ...

Change-Id: I7bb6660c6b6cef81533f0fbb5e735f08ed275b8c
---
A msc_tests/BSC_ConnectionHandler.ttcn
M msc_tests/MSC_Tests.ttcn
M msc_tests/gen_links.sh
M msc_tests/regen_makefile.sh
4 files changed, 472 insertions(+), 96 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/55/5955/2

diff --git a/msc_tests/BSC_ConnectionHandler.ttcn b/msc_tests/BSC_ConnectionHandler.ttcn
new file mode 100644
index 0000000..15a460b
--- /dev/null
+++ b/msc_tests/BSC_ConnectionHandler.ttcn
@@ -0,0 +1,201 @@
+module BSC_ConnectionHandler {
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GSM_Types all;
+import from SCCPasp_Types all;
+import from BSSAP_Types all;
+import from BSSMAP_Emulation all;
+import from BSSMAP_Templates all;
+
+import from GSUP_Types all;
+import from GSUP_Emulation all;
+
+import from MNCC_Types all;
+import from MNCC_Emulation all;
+
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from MobileL3_MM_Types all;
+import from L3_Templates all;
+
+/* this component represents a single subscriber connection */
+type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr {
+	var BSC_ConnHdlrPars g_pars;
+}
+
+type record BSC_ConnHdlrPars {
+	SCCP_PAR_Address sccp_addr_own,
+	SCCP_PAR_Address sccp_addr_peer,
+	BSSMAP_IE_CellIdentifier cell_id,
+	hexstring imsi,
+	hexstring msisdn
+};
+
+
+/* Callback function from general BSSMAP_Emulation whenever a connectionless
+ * BSSMAP message arrives. Canreturn a PDU_BSSAPthat should be sent in return */
+private function BscUnitdataCallback(PDU_BSSAP bssap)
+runs on BSSMAP_Emulation_CT return template PDU_BSSAP {
+	var template PDU_BSSAP resp := omit;
+
+	log("BSSMAP_BscUnitdataCallback");
+	/* answer all RESET with RESET ACK */
+	if (match(bssap, tr_BSSMAP_Reset)){
+		log("BSSMAP_BscUnitdataCallback: Responding to RESET with RESET-ACK");
+		resp := ts_BSSMAP_ResetAck;
+	}
+
+	/* FIXME: Handle paging, etc. */
+	return resp;
+}
+
+const BssmapOps BSC_BssmapOps := {
+	/* Create call-back for inbound connections from MSC (hand-over) */
+	create_cb := refers(BSSMAP_Emulation.ExpectedCreateCallback),
+	unitdata_cb := refers(BscUnitdataCallback),
+	decode_dtap := true,
+	role_ms := true
+}
+
+
+private function MnccUnitdataCallback(MNCC_PDU mncc)
+runs on MNCC_Emulation_CT return template MNCC_PDU {
+	log("Ignoring MNCC", mncc);
+	return omit;
+}
+
+const MnccOps BCC_MnccOps := {
+	create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
+	unitdata_cb := refers(MnccUnitdataCallback)
+}
+
+
+
+template BSSAP_Conn_Req ts_BSSAP_Conn_Req(SCCP_PAR_Address peer, SCCP_PAR_Address own, PDU_BSSAP bssap) := {
+	addr_peer := peer,
+	addr_own := own,
+	bssap := bssap
+};
+
+template (value) MobileStationClassmark1_V ts_CM1(BIT1 a5_1_unavail := '0'B, BIT2 rev := '10'B) := {
+	rf_PowerCapability := '010'B,
+	a5_1 := a5_1_unavail,
+	esind := '1'B,
+	revisionLevel := rev,
+	spare1_1 := '0'B
+}
+
+/* Encode 'l3' and ask BSSMAP_Emulation to create new connection with COMPL L3 INFO */
+function f_bssap_compl_l3(PDU_ML3_MS_NW l3)
+runs on BSC_ConnHdlr {
+	log("Sending COMPL L3: ", l3);
+	var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3);
+	BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
+				     valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, l3_enc))));
+}
+
+/* helper function to fully establish a dedicated channel */
+function f_establish_fully(MobileIdentityLV mi, boolean expect_auth)
+runs on BSC_ConnHdlr {
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
+	var PDU_DTAP_MT dtap_mt;
+
+	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+	f_bssap_compl_l3(l3_info);
+
+	if (expect_auth) {
+		/* FIXME */
+	}
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
+}
+
+/* build a PDU_ML3_MS_NW containing a Location Update by IMSI */
+function f_build_lu_imsi(hexstring imsi) return PDU_ML3_MS_NW
+{
+	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi));
+	return f_build_lu(mi);
+}
+private function f_build_lu(MobileIdentityLV mi) return PDU_ML3_MS_NW
+{
+	var LocationAreaIdentification_V old_lai := { '62F220'O, '9999'O };
+	var PDU_ML3_MS_NW l3_info := valueof(ts_ML3_MO_LU_Req(valueof(ts_ML3_IE_LuType_Attach),
+							      old_lai, mi, valueof(ts_CM1)));
+	return l3_info;
+}
+
+function f_perform_lu(boolean expect_auth, boolean expect_tmsi)
+runs on BSC_ConnHdlr {
+	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
+	var PDU_DTAP_MT dtap_mt;
+
+	/* tell GSUP dispatcher to send this IMSI to us */
+	f_create_gsup_expect(hex2str(g_pars.imsi));
+
+	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+	f_bssap_compl_l3(l3_lu);
+
+	if (expect_auth) {
+		/* FIXME */
+	}
+
+	/* Expect MSC to perform LU with HLR */
+	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
+	GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
+	GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
+	GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
+
+	alt {
+	[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {
+		var PDU_ML3_LocationUpdateAccept lu_acc := dtap_mt.dtap.msgs.mm.locationUpdateAccept;
+		if (expect_tmsi) {
+			if (not ispresent(lu_acc.mobileIdentityTLV) or
+			    not ischosen(lu_acc.mobileIdentityTLV.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi)) {
+				setverdict(fail, "Expected TMSI but no TMSI was allocated");
+				self.stop;
+			} else {
+				BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));
+			}
+		} else {
+			if (ispresent(lu_acc.mobileIdentityTLV) and
+			    ischosen(lu_acc.mobileIdentityTLV.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi)) {
+				setverdict(fail, "Expected no TMSI but TMSI was allocated");
+				self.stop;
+			}
+		}
+		}
+	[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
+		setverdict(fail, "Expected LU ACK, but received LU REJ");
+		self.stop;
+		}
+	}
+	/* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+	setverdict(pass);
+}
+
+function f_foo() runs on BSC_ConnHdlr{
+	/* SCCP CC handled by BSSMAP_Emulation_CT.main() */
+	/* Expect auth, if enabled */
+
+	/* TODO: ISD */
+	/* Expect encr, if enabled */
+	/* Expect encr, if enabled */
+	/* Expect ASS CMD, if chan_type != requested */
+	/* Send ASS CMPL in successful case */
+
+	/* Expect AoIP port/ip information for RTP stream */
+	/* Expect MSC-originated MGCP to our simulated MGW */
+	/* Verify Counters via CTRL */
+	/* re-configure MSC behaviour via VTY */
+}
+
+
+
+
+
+}
+
+
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index adb9453..e336e9a 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -16,112 +16,106 @@
 import from SCTPasp_Types all;
 import from SCTPasp_PortType all;
 
+import from Osmocom_CTRL_Functions all;
+import from Osmocom_CTRL_Types all;
+import from Osmocom_CTRL_Adapter all;
+
+import from MNCC_Emulation all;
+
+import from GSUP_Emulation all;
+import from GSUP_Types all;
+import from IPA_Emulation all;
+
 import from BSSAP_Types all;
+import from BSSAP_Adapter all;
+import from BSSAP_CodecPort all;
+import from BSSMAP_Templates all;
+import from BSSMAP_Emulation all;
+import from BSC_ConnectionHandler all;
 
-type component MTC_CT {
-	/* M3UA emulation component */
-	var M3UA_CT vc_M3UA;
-	/* SCCP emulation component */
-	var SCCP_CT vc_SCCP;
-	/* test port to SCCP emulation */
-	port SCCPasp_PT SCCP;
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from L3_Templates all;
 
-	var octetstring g_sio;
-	var MSC_SCCP_MTP3_parameters g_sccp_pars;
-	var SCCP_PAR_Address g_sccp_addr_own, g_sccp_addr_peer;
 
+type component MTC_CT extends BSSAP_Adapter_CT, CTRL_Adapter_CT {
 	var boolean g_initialized := false;
+
+	/* no 'adapter_CT' for MNCC or GSUP */
+	var MNCC_Emulation_CT vc_MNCC;
+	var GSUP_Emulation_CT vc_GSUP;
+	var IPA_Emulation_CT vc_GSUP_IPA;
+
+	/* only to get events from IPA underneath GSUP */
+	port IPA_CTRL_PT GSUP_IPA_EVENT;
 }
 
 modulepar {
-	charstring mp_sccp_service_type := "mtp3_itu";
+	/* remote parameters of IUT */
+	charstring mp_msc_ip := "127.0.0.1";
+	integer mp_msc_ctrl_port := 4255;
+	integer mp_msc_vty_port := 4254;
 
-	SCTP_Association_Address mp_sctp_addr := { 22905, "127.0.0.1", 2905, "127.0.0.1" };
-	integer mp_own_pc := 196;
-	integer mp_own_ssn := 254;
+	/* local parameters of emulated HLR */
+	charstring mp_hlr_ip := "127.0.0.1";
+	integer mp_hlr_port := 4222;
 
-	integer mp_peer_pc := 185;	/* 0.23.1 */
-	integer mp_peer_ssn := 254;
+	charstring mp_msc_mncc := "/tmp/mncc";
 }
 
 
-/* construct a SCCP_PAR_Address with just PC + SSN and no GT */
-template (value) SCCP_PAR_Address ts_SccpAddr_PC_SSN(integer pc, integer ssn) := {
-	addressIndicator := {
-		pointCodeIndic := '1'B,
-		ssnIndicator := '1'B,
-		globalTitleIndic := '0000'B,
-		routingIndicator := '1'B
-	},
-	signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, '83'O),
-	//signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, g_sio),
-	subsystemNumber := ssn,
-	globalTitle := omit
+function f_init_mncc(charstring id) runs on MTC_CT {
+	id := id & "-MNCC";
+	var MnccOps ops := {
+		create_cb := refers(MNCC_Emulation.ExpectedCreateCallback),
+		unitdata_cb := refers(MNCC_Emulation.DummyUnitdataCallback)
+	}
+
+	vc_MNCC := MNCC_Emulation_CT.create(id);
+	map(vc_MNCC:MNCC, system:MNCC_CODEC_PT);
+	vc_MNCC.start(MNCC_Emulation.main(ops, id, mp_msc_mncc));
 }
 
-function init_pars() runs on MTC_CT {
-	g_sio := '83'O;
-	g_sccp_pars := {
-		sio := {
-			ni := substr(oct2bit(g_sio),0,2),
-			prio := substr(oct2bit(g_sio),2,2),
-			si := substr(oct2bit(g_sio),4,4)
-		},
-		opc := mp_own_pc,
-		dpc := mp_peer_pc,
-		sls := 0,
-		sccp_serviceType := mp_sccp_service_type,
-		ssn := mp_own_ssn
-	};
-	g_sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(mp_own_pc, mp_own_ssn));
-	g_sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(mp_peer_pc, mp_peer_ssn));
+function f_init_gsup(charstring id) runs on MTC_CT {
+	id := id & "-GSUP";
+	var GsupOps ops := {
+		create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
+	}
+
+	vc_GSUP_IPA := IPA_Emulation_CT.create(id & "-IPA");
+	vc_GSUP := GSUP_Emulation_CT.create(id);
+
+	map(vc_GSUP_IPA:IPA_PORT, system:IPA_CODEC_PT);
+	connect(vc_GSUP:GSUP, vc_GSUP_IPA:IPA_GSUP_PORT);
+	/* we use this hack to get events like ASP_IPA_EVENT_UP */
+	connect(vc_GSUP_IPA:IPA_CTRL_PORT, self:GSUP_IPA_EVENT);
+
+	vc_GSUP.start(GSUP_Emulation.main(ops, id));
+	vc_GSUP_IPA.start(IPA_Emulation.main_server(mp_hlr_ip, mp_hlr_port));
+
+	/* wait for incoming connection to GSUP port before proceeding */
+	timer T := 10.0;
+	T.start;
+	alt {
+		[] GSUP_IPA_EVENT.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP)) { }
+		[] T.timeout {
+			setverdict(inconc, "No connection to GSUP Port");
+			self.stop
+		}
+	}
 }
 
-function init() runs on MTC_CT {
+function f_init() runs on MTC_CT {
 
 	if (g_initialized == true) {
 		return;
 	}
 	g_initialized := true;
 
-	init_pars();
-
-	/* Create components */
-	vc_M3UA := M3UA_CT.create;
-	vc_SCCP := SCCP_CT.create;
-
-	/* connect system SCTP port to M3UA lower side */
-	map(vc_M3UA:SCTP_PORT, system:sctp);
-
-	/* connect MTP3 service provider to SCCP MTP3 port */
-	connect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
-
-	/* connect test suite to SCCP service provider port */
-	connect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
-
-	vc_M3UA.start(f_M3UA_Emulation(mp_sctp_addr));
-	vc_SCCP.start(SCCPStart(g_sccp_pars));
-
-}
-
-function terminate() runs on MTC_CT {
-
-	disconnect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
-	disconnect(vc_M3UA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
-	unmap(vc_M3UA:SCTP_PORT, system:sctp);
-
-	all component.stop;
-
-	self.stop;
-}
-
-testcase TC_nothing() runs on MTC_CT {
-	init();
-
-	timer T := 30.0;
-	T.start;
-	T.timeout;
-
+	f_bssap_init("MSC_Test", BSC_BssmapOps);
+	f_ipa_ctrl_start(mp_msc_ip, mp_msc_ctrl_port);
+	f_init_mncc("MSC_Test");
+	f_init_gsup("MSC_Test");
 }
 
 template PDU_BSSAP ts_BSSAP_BSSMAP := {
@@ -290,31 +284,189 @@
 //	enc_PDU_BSSAP
 
 function f_send_BSSAP_UNITDATA(template PDU_BSSAP bssap) runs on MTC_CT {
-	SCCP.send(t_ASP_N_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, '00000001'B, '00000001'B,
-					enc_PDU_BSSAP(valueof(bssap)), omit))
+	BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, bssap))
 }
 
-testcase TC_reset() runs on MTC_CT {
-	init();
+type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;
 
-	timer T := 2.0;
+function f_gen_imsi(hexstring prefix, integer suffix) return hexstring {
+	var integer suffix_len := 15 - lengthof(prefix);
+	suffix_len := suffix_len-1; /* FIXME: fix odd IMSI length */
+	return prefix & int2hex(suffix, suffix_len);
+}
+
+function f_gen_msisdn(hexstring prefix, integer suffix) return hexstring {
+	var integer suffix_len := 12 - lengthof(prefix);
+	return prefix & int2hex(suffix, suffix_len);
+}
+
+/* FIXME: move into BSC_ConnectionHandler? */
+function f_start_handler(void_fn fn, charstring id, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
+	var BSC_ConnHdlr vc_conn;
+	var BSC_ConnHdlrPars pars := {
+		sccp_addr_own := g_sccp_addr_own,
+		sccp_addr_peer := g_sccp_addr_peer,
+		cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
+		imsi := f_gen_imsi('26242'H, imsi_suffix),
+		msisdn := f_gen_msisdn('491239999'H, imsi_suffix)
+	};
+
+	vc_conn := BSC_ConnHdlr.create(id);
+	/* BSSMAP part / A interface */
+	connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
+	connect(vc_conn:BSSAP_PROC, vc_BSSMAP:PROC);
+	/* MNCC part */
+	connect(vc_conn:MNCC, vc_MNCC:MNCC_CLIENT);
+	connect(vc_conn:MNCC_PROC, vc_MNCC:MNCC_PROC);
+	/* GSUP part */
+	connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
+	connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
+
+	vc_conn.start(derefers(fn)(id, pars));
+	return vc_conn;
+}
+
+function f_sleep(float seconds) {
+	timer T := seconds;
 	T.start;
 	T.timeout;
+}
 
-	f_send_BSSAP_UNITDATA(ts_BSSMAP_Reset(0));
+private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+	f_perform_lu(false, true);
+}
+
+testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), testcasename(), 1);
+	vc_conn.done;
+}
+
+private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+	f_perform_lu(false, false);
+}
+
+testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), testcasename(), 2);
+	vc_conn.done;
+}
+
+/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
+private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
+
+	f_create_gsup_expect(hex2str(g_pars.imsi));
+	f_bssap_compl_l3(l3_lu);
+	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
+	GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
+	alt {
+		[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
+		[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
+			setverdict(fail, "Expecting LU REJ, but got ACCEPT");
+			self.stop;
+		}
+	}
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+	setverdict(pass);
+}
+testcase TC_lu_imsi_reject() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), testcasename(), 3);
+	vc_conn.done;
+}
+
+/* Do LU by IMSI, timeout on GSUP */
+private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
+
+	f_create_gsup_expect(hex2str(g_pars.imsi));
+	f_bssap_compl_l3(l3_lu);
+	GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
+	/* Normally the HLR would need to respond here, but we decide to force a timeout here */
+	alt {
+		/* FIXME: Expect specific reject cause */
+		[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
+		[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
+			setverdict(fail, "Expecting LU REJ, but got ACCEPT");
+			self.stop;
+		}
+	}
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+	setverdict(pass);
+}
+testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), testcasename(), 4);
+	vc_conn.done;
+}
+
+
+/* Send CM SERVICE REQ for IMSI that has never performed LU before */
+private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
+runs on BSC_ConnHdlr {
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
+	var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
+
+	f_create_gsup_expect(hex2str(g_pars.imsi));
+
+	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+	f_bssap_compl_l3(l3_info);
+
+	timer T := 10.0;
 	T.start;
 	alt {
-		//[] SCCP.receive(tr_BSSMAP_ResetAck) { }
-		[] T.timeout { setverdict(fail); }
+	[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
+	//[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
+	[] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
+	[] GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi)) {
+		setverdict(fail, "Unexpected GSUP UL REQ");
+		}
+	[] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
 	}
 
-	terminate();
+	alt {
+	[] BSSAP.receive(tr_BSSMAP_ClearCommand) {
+		setverdict(pass);
+		}
+	[] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
+	[] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
+	}
 }
+testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 5);
+	vc_conn.done;
+}
+
+
 
 
 control {
-	execute( TC_reset() );
-	execute( TC_nothing() );
+	execute( TC_cmserv_imsi_unknown() );
+	execute( TC_lu_imsi_noauth_tmsi() );
+	//execute( TC_lu_imsi_noauth_notmsi() );
+	execute( TC_lu_imsi_reject() );
+	execute( TC_lu_imsi_timeout_gsup() );
 }
 
 
diff --git a/msc_tests/gen_links.sh b/msc_tests/gen_links.sh
index 6625b11..ef3dc63 100755
--- a/msc_tests/gen_links.sh
+++ b/msc_tests/gen_links.sh
@@ -19,6 +19,15 @@
 FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCConversion.hh TCCInterface.cc TCCInterface_ip.h"
 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"
@@ -52,7 +61,21 @@
 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=../library
-FILES="General_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h"
+FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn "
+FILES+="IPA_Types.ttcn IPA_Emulation.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc RSL_Types.ttcn GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn L3_Templates.ttcn "
+FILES+="BSSMAP_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn BSSAP_Adapter.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn IPA_Emulation.ttcn "
+FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
+FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc "
 gen_links $DIR $FILES
diff --git a/msc_tests/regen_makefile.sh b/msc_tests/regen_makefile.sh
index f271c88..ce33695 100755
--- a/msc_tests/regen_makefile.sh
+++ b/msc_tests/regen_makefile.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
 
-FILES="*.ttcn SCCP_EncDec.cc  SCTPasp_PT.cc  TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc"
+FILES="*.ttcn SCCP_EncDec.cc  SCTPasp_PT.cc  TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc *.c"
 
 ../regen-makefile.sh MSC_Tests.ttcn $FILES

-- 
To view, visit https://gerrit.osmocom.org/5955
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I7bb6660c6b6cef81533f0fbb5e735f08ed275b8c
Gerrit-PatchSet: 2
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder



More information about the gerrit-log mailing list