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