[PATCH] osmo-ttcn3-hacks[master]: MSC_Tests: More CM SERVICE REQ and EMERGENCY CALL related tests

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
Wed Jan 24 16:29:27 UTC 2018


Review at  https://gerrit.osmocom.org/6029

MSC_Tests: More CM SERVICE REQ and EMERGENCY CALL related tests

Change-Id: I04ca21824f66ad90d9dac2c25000ecd724aa4528
---
M library/L3_Templates.ttcn
M msc_tests/BSC_ConnectionHandler.ttcn
M msc_tests/MSC_Tests.ttcn
3 files changed, 272 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/29/6029/1

diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn
index ca81b72..db514a4 100644
--- a/library/L3_Templates.ttcn
+++ b/library/L3_Templates.ttcn
@@ -361,6 +361,29 @@
 					ts_ML3_MO_MM_ID_Rsp(valueof(ts_MI_IMEI_LV(imei)));
 
 
+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
+}
+
+template PDU_ML3_MS_NW ts_ML3_MO_MM_IMSI_DET_Ind(MobileIdentityLV mi,
+						 template MobileStationClassmark1_V cm1 := ts_CM1)
+modifies ts_ML3_MO := {
+	msgs := {
+		mm := {
+			imsiDetachIndication := {
+				messageType := '000001'B,
+				nsd := '00'B,
+				mobileStationClassmark1 := cm1,
+				mobileIdentityLV := mi
+			}
+		}
+	}
+}
+
 template PDU_ML3_MS_NW ts_ML3_MO_CC(integer tid) := {
 	discriminator := '0011'B,
 	tiOrSkip := {
@@ -440,6 +463,30 @@
 	}
 }
 
+template PDU_ML3_MS_NW ts_ML3_MO_CC_EMERG_SETUP(integer tid, template BearerCapability_TLV bcap := ts_Bcap_voice) := {
+	discriminator := '0011'B,
+	tiOrSkip := {
+		transactionId := {
+			tio := int2bit(tid, 3),
+			tiFlag := '0'B,
+			tIExtension := omit
+		}
+	},
+	msgs := {
+		cc := {
+			emergencySetup := {
+				messageType := '001110'B,
+				nsd := '00'B,
+				bearerCapability := bcap,
+				streamIdentifier := omit,
+				supportedCodecs := omit,
+				emergencyCategory := omit
+			}
+		}
+	}
+}
+
+
 template PDU_ML3_NW_MS tr_ML3_MT_CC_CALL_PROC(integer tid) := {
 	discriminator := '0011'B,
 	tiOrSkip := {
diff --git a/msc_tests/BSC_ConnectionHandler.ttcn b/msc_tests/BSC_ConnectionHandler.ttcn
index 0fb1702..69854e3 100644
--- a/msc_tests/BSC_ConnectionHandler.ttcn
+++ b/msc_tests/BSC_ConnectionHandler.ttcn
@@ -80,14 +80,6 @@
 	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 {
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index c2d1771..0fad797 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -702,6 +702,228 @@
 }
 
 
+/* Test IMSI DETACH (MI=IMSI) */
+private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
+
+	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+	f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
+
+	/* Send Early Classmark, just for the fun of it? */
+	BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+
+	/* wait for normal teardown */
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+	setverdict(pass);
+}
+testcase TC_imsi_detach_by_imsi() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), testcasename(), 2);
+	vc_conn.done;
+}
+
+/* Test IMSI DETACH (MI=TMSI) */
+private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
+
+	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+	f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
+
+	/* Send Early Classmark, just for the fun of it? */
+	BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+
+	/* wait for normal teardown */
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+	setverdict(pass);
+}
+testcase TC_imsi_detach_by_tmsi() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), testcasename(), 3);
+	vc_conn.done;
+}
+
+/* Test IMSI DETACH (MI=IMEI), which is illegal */
+private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imsi));
+
+	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+	f_bssap_compl_l3(valueof(ts_ML3_MO_MM_IMSI_DET_Ind(mi)));
+
+	/* Send Early Classmark, just for the fun of it? */
+	BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3));
+
+	/* wait for normal teardown */
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+	setverdict(pass);
+}
+testcase TC_imsi_detach_by_imei() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), testcasename(), 4);
+	vc_conn.done;
+}
+
+
+/* helper function for an emergency call. caller passes in mobile identity to use */
+private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
+
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0010'B, mi));
+	f_bssap_compl_l3(l3_info);
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
+
+	var hexstring called := '112'H;
+	var integer tid := 0;
+	var MNCC_PDU mncc;
+	f_create_mncc_expect(hex2str(called));
+
+	BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_EMERG_SETUP(tid)));
+	MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(called)))) -> value mncc;
+	/* FIXME: extract call_id */
+
+	/* Call Proceeding */
+	MNCC.send(ts_MNCC_CALL_PROC_req(mncc.u.signal.callref, ts_MNCC_bcap_voice));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(tid)));
+
+	/* Alerting */
+	MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid)));
+
+	/* Answer. This causes TCH assignment in case of "late assignment" */
+	MNCC.send(ts_MNCC_SETUP_COMPL_req(mncc.u.signal.callref));
+
+	f_sleep(3.0);
+
+	/* Hangup by "B" side */
+	MNCC.send(ts_MNCC_DISC_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(23))));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(tid)));
+
+	/* Release of call */
+	MNCC.send(ts_MNCC_REL_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(42))));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(tid)));
+
+	/* clearing of radio channel */
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+
+	f_sleep(5.0);
+}
+
+/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
+private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imsi));
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0010'B, mi));
+	f_bssap_compl_l3(l3_info);
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ('05'O)));
+	setverdict(pass);
+}
+testcase TC_emerg_call_imei_reject() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), testcasename(), 5);
+	vc_conn.done;
+}
+
+/* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
+private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+	/* First perform location update to ensure subscriber is known */
+	f_perform_lu(false, true, true);
+	/* Then issue emergency call identified by IMSI */
+	f_emerg_call(valueof(ts_MI_IMSI_LV(g_pars.imsi)));
+}
+testcase TC_emerg_call_imsi() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), testcasename(), 6);
+	vc_conn.done;
+}
+
+/* CM Service Request for VGCS -> reject */
+private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	/* First perform location update to ensure subscriber is known */
+	f_perform_lu(false, true, true);
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1001'B, mi));
+	f_bssap_compl_l3(l3_info);
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
+	setverdict(pass);
+}
+testcase TC_cm_serv_req_vgcs_reject() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vgcs_reject), testcasename(), 7);
+	vc_conn.done;
+}
+
+/* CM Service Request for VBS -> reject */
+private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	/* First perform location update to ensure subscriber is known */
+	f_perform_lu(false, true, true);
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1010'B, mi));
+	f_bssap_compl_l3(l3_info);
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
+	setverdict(pass);
+}
+testcase TC_cm_serv_req_vbs_reject() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_vbs_reject), testcasename(), 8);
+	vc_conn.done;
+}
+
+/* CM Service Request for LCS -> reject */
+private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	/* First perform location update to ensure subscriber is known */
+	f_perform_lu(false, true, true);
+
+	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
+	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('1011'B, mi));
+	f_bssap_compl_l3(l3_info);
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ(int2oct(32,1))));
+	setverdict(pass);
+}
+testcase TC_cm_serv_req_lcs_reject() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_cm_serv_req_lcs_reject), testcasename(), 9);
+	vc_conn.done;
+}
+
+
 /* TODO:
    * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
    * malformed messages (missing IE, invalid message type): properly rejected?
@@ -711,6 +933,9 @@
    * emergency call
    * IMSI DETACH
    * send new transaction after/during clear (like SMS, ...)
+   * too long L3 INFO in DTAP
+   * too long / padded BSSAP
+   * too long / short TLV values
  */
 
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I04ca21824f66ad90d9dac2c25000ecd724aa4528
Gerrit-PatchSet: 1
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list