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/5955 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 3 files changed, 291 insertions(+), 96 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/55/5955/1 diff --git a/msc_tests/BSC_ConnectionHandler.ttcn b/msc_tests/BSC_ConnectionHandler.ttcn new file mode 100644 index 0000000..cc3e2e8 --- /dev/null +++ b/msc_tests/BSC_ConnectionHandler.ttcn @@ -0,0 +1,122 @@ +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 L3_Templates all; + +/* this component represents a single subscriber connection */ +type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr { +} + +/* 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) +} + + +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 +} + +function f_establish_fully(SCCP_PAR_Address sccp_addr_peer, SCCP_PAR_Address sccp_addr_own) +runs on BSC_ConnHdlr { + + var hexstring imsi := '26242012345678'H; + var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi)); + 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); + + /* tell GSUP dispatcher to send this IMSI to us */ + f_create_gsup_expect(hex2str(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)))); + + GSUP.receive(tr_GSUP_UL_REQ(imsi)); + GSUP.send(ts_GSUP_UL_RES(imsi)); + +} + +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..de65b0b 100644 --- a/msc_tests/MSC_Tests.ttcn +++ b/msc_tests/MSC_Tests.ttcn @@ -16,112 +16,104 @@ 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 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 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,30 +282,111 @@ // 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 record BSC_ConnHdlrPars { + SCCP_PAR_Address sccp_addr_own, + SCCP_PAR_Address sccp_addr_peer +}; - timer T := 2.0; +type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr; + +/* FIXME: move into BSC_ConnectionHandler? */ +function f_start_handler(void_fn fn, charstring id) 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 + }; + + 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_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); +} + +testcase TC_nothing() runs on MTC_CT { + var BSC_ConnHdlr vc_conn; + + f_init(); + + vc_conn := f_start_handler(refers(f_tc_foo), testcasename()); + vc_conn.done; +} + + +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 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); + + log("Sending COMPL L3", l3_info); + /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */ + BSSAP.send(ts_BSSAP_Conn_Req(pars.sccp_addr_peer, pars.sccp_addr_own, + valueof(ts_BSSMAP_ComplL3(cell_id, l3_enc)))); + + var PDU_BSSAP bssap_rx; + var PDU_ML3_NW_MS l3_rx; + + timer T := 10.0; T.start; alt { - //[] SCCP.receive(tr_BSSMAP_ResetAck) { } - [] T.timeout { setverdict(fail); } + [] 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 { setverdict(fail, "Received unexpected BSSAP"); } + [] 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()); + vc_conn.done; +} + + control { - execute( TC_reset() ); + execute( TC_cmserv_imsi_unknown() ); execute( TC_nothing() ); } diff --git a/msc_tests/gen_links.sh b/msc_tests/gen_links.sh index 7703b52..ef3dc63 100755 --- a/msc_tests/gen_links.sh +++ b/msc_tests/gen_links.sh @@ -73,9 +73,9 @@ DIR=../library 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 " -FILES+="Osmocom_CTRL_Types.ttcn L3_Templates.ttcn L3_Templates.ttcn " -FILES+="BSSMAP_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn IPA_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 -- To view, visit https://gerrit.osmocom.org/5955 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7bb6660c6b6cef81533f0fbb5e735f08ed275b8c Gerrit-PatchSet: 1 Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org>