aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2022-04-07 00:31:19 +0200
committerlaforge <laforge@osmocom.org>2022-04-07 14:18:28 +0000
commita47a8c60eee3c224ea680207c0ef2eb6e718f7cf (patch)
tree1ad6a905d5f1125297678b24f1a365515e43688f
parent9b320c10f29a43a0409fd7ba5037af251fbb1dd8 (diff)
bsc: add TC_emerg_call_and_lcs_loc_req
An emergency call often comes with a Location Request. Make sure osmo-bsc handles it well. Related: SYS#5916 Change-Id: I95037374c45943cb14401bc48f16a39c2fcbe1f5
-rw-r--r--bsc/BSC_Tests.ttcn100
-rw-r--r--library/BSSMAP_Templates.ttcn4
2 files changed, 104 insertions, 0 deletions
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index cce88379..a2add34f 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -10093,6 +10093,105 @@ testcase TC_ho_during_lcs_loc_req() runs on test_CT {
f_shutdown_helper();
}
+private function f_tc_emerg_call_and_lcs_loc_req(charstring id) runs on MSC_ConnHdlr
+{
+ /* Make sure the CHAN RQD indicates an emergency call (0b101xxxxx). The difference is that osmo-bsc directly
+ * assigns a TCH lchan and establishing voice for the emergency call will use Mode Modify, not reassignment to
+ * another lchan. */
+ g_pars.ra := 'b7'O;
+ f_assignment_emerg_setup();
+
+ var PDU_BSSAP emerg_setup_data_ind_bssap;
+ timer T := 3.0;
+ T.start;
+ alt {
+ [] BSSAP.receive(tr_BSSAP_DTAP) -> value emerg_setup_data_ind_bssap {
+ var PDU_ML3_MS_NW verify_emerg_setup;
+ verify_emerg_setup := dec_PDU_ML3_MS_NW(emerg_setup_data_ind_bssap.pdu.dtap);
+ if (not isbound(verify_emerg_setup.msgs.cc.emergencySetup)) {
+ setverdict(fail, "no emergency setup");
+ }
+ }
+ [] BSSAP.receive {
+ setverdict(fail, "unexpected BSSAP message!");
+ }
+ [] T.timeout {
+ setverdict(fail, "timeout waiting for EMERGENCY SETUP!");
+ }
+ }
+
+ /* Here would usually be a CC Call Proceeding from the MSC, but what does the BSC care about DTAP. */
+
+ /* Do a Location Request in-between the CC call setup */
+ f_bssap_le_register_imsi(g_pars.imsi, omit);
+ BSSAP.send(valueof(ts_BSSMAP_Perform_Location_Request(ts_BSSMAP_Imsi(g_pars.imsi),
+ ts_CellId_CGI('262'H, '42'H, 23, 42))));
+ BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, ?, ?));
+ /* SMLC got the TA from the BSC, now responds with geo information data. */
+ BSSAP_LE.send(ts_BSSMAP_LE_PerfLocResp(gad_ell_point_unc_circle, omit));
+ BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_DISC_IND);
+ BSSAP.receive(tr_BSSMAP_Perform_Location_Response(tr_BSSMAP_IE_LocationEstimate(gad_ell_point_unc_circle)));
+
+ /* Go on with voice call assignment */
+ var template PDU_BSSAP exp_compl := f_gen_exp_compl();
+ var PDU_BSSAP ass_cmd := f_gen_ass_req();
+
+ /* Below speechOrDataIndicator and codecList are copied from an emergency call captured during tests.
+ * They seem a bit weird (AMR-WB, and the order differ between speechId_DataIndicator and the codecList), but
+ * seems a good idea to see how osmo-bsc reacts to this. */
+ ass_cmd.pdu.bssmap.assignmentRequest.channelType := {
+ elementIdentifier := '0B'O, /* overwritten */
+ lengthIndicator := 0, /* overwritten */
+ speechOrDataIndicator := '0001'B, /* speech */
+ spare1_4 := '0000'B,
+ channelRateAndType := ChRate_TCHForH_Fpref,
+ speechId_DataIndicator := 'c2918105'O
+ };
+ ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({
+ ts_CodecHR, ts_CodecAMR_WB, ts_CodecEFR, ts_CodecFR}));
+
+ f_rslem_dchan_queue_enable();
+
+ var ExpectCriteria mgcpcrit := {
+ connid := omit,
+ endpoint := omit,
+ transid := omit
+ };
+ f_create_mgcp_expect(mgcpcrit);
+
+ BSSAP.send(ass_cmd);
+
+ var AssignmentState st := valueof(ts_AssignmentStateInit);
+ st.voice_call := true;
+ st.is_assignment := false;
+ alt {
+ [] as_modify(st);
+ [] as_Media();
+ [st.modify_done] BSSAP.receive(exp_compl) {
+ setverdict(pass);
+ }
+ }
+
+ /* Voice call carries on ... */
+ f_sleep(2.0);
+
+ setverdict(pass);
+ f_perform_clear();
+}
+
+testcase TC_emerg_call_and_lcs_loc_req() runs on test_CT {
+ var MSC_ConnHdlr vc_conn;
+ var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+ f_init(1, true);
+ f_sleep(1.0);
+ f_vty_allow_emerg_msc(true);
+ f_vty_allow_emerg_bts(true, 0);
+ vc_conn := f_start_handler(refers(f_tc_emerg_call_and_lcs_loc_req), pars);
+ vc_conn.done;
+ f_shutdown_helper();
+}
+
/* Attempt Complete Layer 3 without any MSC available (OS#4832) */
private function f_tc_no_msc(charstring id) runs on MSC_ConnHdlr {
f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", FR_AMR);
@@ -11466,6 +11565,7 @@ control {
execute( TC_lcs_loc_req_for_idle_ms_no_pag_resp() );
execute( TC_cm_service_during_lcs_loc_req() );
execute( TC_ho_during_lcs_loc_req() );
+ execute( TC_emerg_call_and_lcs_loc_req() );
}
execute( TC_no_msc() );
diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn
index 376cea69..87099b61 100644
--- a/library/BSSMAP_Templates.ttcn
+++ b/library/BSSMAP_Templates.ttcn
@@ -599,6 +599,10 @@ template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase :
s0_7 := '00111111'B,
s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */
}
+template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_WB modifies ts_CodecBase := {
+ codecType := FR_AMR_WB,
+ s0_7 := '00000001'B
+}
template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := {
elementIdentifier := '7D'O,
lengthIndicator := 0, /* overwritten */