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/5958 msc tests: Put everything together; implement first ConnHdlr based tests Change-Id: I0e77af4e8eaa9a8134e45a209b279d86d615d081 --- M msc_tests/BSC_ConnectionHandler.ttcn M msc_tests/MSC_Tests.ttcn 2 files changed, 193 insertions(+), 34 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/58/5958/1 diff --git a/msc_tests/BSC_ConnectionHandler.ttcn b/msc_tests/BSC_ConnectionHandler.ttcn index cc3e2e8..15a460b 100644 --- a/msc_tests/BSC_ConnectionHandler.ttcn +++ b/msc_tests/BSC_ConnectionHandler.ttcn @@ -16,11 +16,22 @@ 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 */ @@ -42,7 +53,9 @@ const BssmapOps BSC_BssmapOps := { /* Create call-back for inbound connections from MSC (hand-over) */ create_cb := refers(BSSMAP_Emulation.ExpectedCreateCallback), - unitdata_cb := refers(BscUnitdataCallback) + unitdata_cb := refers(BscUnitdataCallback), + decode_dtap := true, + role_ms := true } @@ -73,28 +86,94 @@ spare1_1 := '0'B } -function f_establish_fully(SCCP_PAR_Address sccp_addr_peer, SCCP_PAR_Address sccp_addr_own) +/* 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)))); +} - var hexstring imsi := '26242012345678'H; +/* 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 BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23,42)); 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))); - var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info); + 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(imsi)); + f_create_gsup_expect(hex2str(g_pars.imsi)); - log("Sending COMPL L3", l3_info); /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */ - BSSAP.send(ts_BSSAP_Conn_Req(sccp_addr_peer, sccp_addr_own, - valueof(ts_BSSMAP_ComplL3(cell_id, l3_enc)))); + f_bssap_compl_l3(l3_lu); - GSUP.receive(tr_GSUP_UL_REQ(imsi)); - GSUP.send(ts_GSUP_UL_RES(imsi)); + 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{ diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn index de65b0b..272cc71 100644 --- a/msc_tests/MSC_Tests.ttcn +++ b/msc_tests/MSC_Tests.ttcn @@ -23,12 +23,14 @@ 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; import from MobileL3_Types all; @@ -285,19 +287,28 @@ BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, bssap)) } -type record BSC_ConnHdlrPars { - SCCP_PAR_Address sccp_addr_own, - SCCP_PAR_Address sccp_addr_peer -}; - type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr; +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) runs on MTC_CT return BSC_ConnHdlr { +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 + 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); @@ -321,17 +332,88 @@ T.timeout; } -private function f_tc_foo(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr { - f_establish_fully(pars.sccp_addr_peer, pars.sccp_addr_own); - f_sleep(30.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_nothing() runs on MTC_CT { +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_foo), testcasename()); + 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; } @@ -339,8 +421,7 @@ private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr { - var hexstring imsi := '262430000000000'H; - var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi)); + 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)); var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info); @@ -356,12 +437,8 @@ timer T := 10.0; T.start; alt { - [] BSSAP.receive(tr_BSSAP_DTAP) -> value bssap_rx { - l3_rx := dec_PDU_ML3_NW_MS(bssap_rx.pdu.dtap); - if (not match(l3_rx, tr_CM_SERV_REJ)) { - setverdict(fail, "Received unexpeted DTAP/L3"); - } - } + [] 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"); } [] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); } } @@ -378,7 +455,7 @@ 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()); + vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 5); vc_conn.done; } @@ -387,7 +464,10 @@ control { execute( TC_cmserv_imsi_unknown() ); - execute( TC_nothing() ); + execute( TC_lu_imsi_noauth_tmsi() ); + //execute( TC_lu_imsi_noauth_notmsi() ); + execute( TC_lu_imsi_reject() ); + execute( TC_lu_imsi_timeout_gsup() ); } -- To view, visit https://gerrit.osmocom.org/5958 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0e77af4e8eaa9a8134e45a209b279d86d615d081 Gerrit-PatchSet: 1 Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org>