From 8fe8a90da2310012076b1db1136186d3c65941d4 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Sun, 3 Nov 2019 05:51:03 +0100 Subject: [PATCH] msc: add and fix Iu mt call Change-Id: I3ce29f3d9254656dc295674e8cec72a741b7764a --- msc/BSC_ConnectionHandler.ttcn | 88 ++++++++++++++++++++++++++++++---- msc/MSC_Tests.ttcn | 2 +- msc/MSC_Tests_Iu.ttcn | 9 ++++ 3 files changed, 88 insertions(+), 11 deletions(-) diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn index 7bbae3446..11f0a5fee 100644 --- a/msc/BSC_ConnectionHandler.ttcn +++ b/msc/BSC_ConnectionHandler.ttcn @@ -905,21 +905,89 @@ runs on BSC_ConnHdlr { } } else { - var template TransportLayerAddress rab_tla := ? /* FIXME: encode the mgw_rtp_ip/mgw_rtp_port */ - var template RAB_SetupOrModifyList rab_sml := tr_RAB_SML(rab_id := ?, tla := rab_tla, binding_id := ?); - interleave { [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd { - var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars)); - MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp)); - /* MSC acknowledges the MNCC_CREATE to the MNCC handler */ - MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref)); + log("f_mt_call_complete 4.iu"); + if (not f_handle_crcx(cpars, mgcp_cmd)) { + break; } - [] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) { - //BSSAP.send(ts_RANAP_RabAssResp(rab_sml)); FIXME } - /* FIXME: same MNCC and MGCP as in 2G above */ + /* MSC acknowledges the MNCC_CREATE to the MNCC handler */ + [] MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref)) { + log("f_mt_call_complete 5.iu"); + } + + [] BSSAP.receive(tr_RANAP_RabAssReq(?)) { + log("f_mt_call_complete 6.iu"); + var RAB_SetupOrModifiedList l := { + { + { + id := id_RAB_SetupOrModifiedItem, + criticality := ignore, + value_ := { + rAB_SetupOrModifiedItem := { + rAB_ID := int2bit(23, 8), + transportLayerAddress := hex2bit( '350001c0a8021500000000000000000000000000'H), + iuTransportAssociation := { + bindingID := '040c0000'O + }, + dl_dataVolumes := omit, + iE_Extensions := omit + } + } + } + } + }; + BSSAP.send(ts_RANAP_RabAssResp(l)); + + BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT(cpars.transaction_id))); + } + + [] MNCC.receive(tr_MNCC_SETUP_cnf(cpars.mncc_callref)) { + log("f_mt_call_complete 7.iu"); + MNCC.send(ts_MNCC_RTP_CONNECT(cpars.mncc_callref, + /* ip 42.23.11.5 */ hex2int('42231105'H), + /* port 423 */ 423, + /* payload type 3 = GSM FR */ 3)); + } + + /* MDCX setting up the RAN side remote RTP address received from Assignment Complete */ + [] MGCP.receive(tr_MDCX) -> value mgcp_cmd { + log("f_mt_call_complete 8.iu"); + var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_conn_2.mgw_rtp_ip, cpars.mgw_conn_2.mgw_rtp_ip, + hex2str(cpars.mgcp_call_id), "42", + cpars.mgw_conn_2.mgw_rtp_port, + { int2str(cpars.rtp_payload_type) }, + { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type, + cpars.rtp_sdp_format)), + valueof(ts_SDP_ptime(20)) })); + if (cpars.use_osmux) { + osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd); + if (osmux_cid != 0) { /* we expect MSC to use specific CID here */ + setverdict(fail, "MSC using unexpected CID " & int2str(osmux_cid) & " != 0"); + mtc.stop; + } + mgcp_resp := ts_MDCX_ACK_osmux(mgcp_cmd.line.trans_id, cpars.mgw_conn_1.mgcp_connection_id, osmux_cid, sdp); + } else { + mgcp_resp := ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp); + } + MGCP.send(mgcp_resp); + } + + /* MDCX setting up the CN side remote RTP address received from MNCC CONNECT */ + [] MGCP.receive(tr_MDCX) -> value mgcp_cmd { + log("f_mt_call_complete 9.iu"); + var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_conn_2.mgw_rtp_ip, cpars.mgw_conn_2.mgw_rtp_ip, + hex2str(cpars.mgcp_call_id), "42", + cpars.mgw_conn_2.mgw_rtp_port, + { int2str(cpars.rtp_payload_type) }, + { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type, + cpars.rtp_sdp_format)), + valueof(ts_SDP_ptime(20)) })); + MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp)); + } + } } diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn index b4db43df1..4ef592f07 100644 --- a/msc/MSC_Tests.ttcn +++ b/msc/MSC_Tests.ttcn @@ -1658,7 +1658,7 @@ testcase TC_lu_imsi_auth_tmsi_encr_013_2() runs on MTC_CT { } /* LU followed by MT call (including paging) */ -private function f_tc_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr { +friend function f_tc_lu_and_mt_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr { f_init_handler(pars); var CallParameters cpars := valueof(t_CallParams('12345'H, 0)); cpars.use_osmux := pars.use_osmux; diff --git a/msc/MSC_Tests_Iu.ttcn b/msc/MSC_Tests_Iu.ttcn index 628fbcdc2..987baf04e 100644 --- a/msc/MSC_Tests_Iu.ttcn +++ b/msc/MSC_Tests_Iu.ttcn @@ -249,6 +249,13 @@ testcase TC_iu_mo_release_timeout() runs on MTC_CT { vc_conn.done; } +testcase TC_iu_lu_and_mt_call() runs on MTC_CT { + var BSC_ConnHdlr vc_conn; + f_init(3); + vc_conn := f_start_handler(refers(f_tc_lu_and_mt_call), 1142, ran_idx := 2, ran_is_geran := false); + vc_conn.done; +} + testcase TC_iu_lu_and_mo_sms() runs on MTC_CT { var BSC_ConnHdlr vc_conn; f_init(3); @@ -438,6 +445,8 @@ control { execute( TC_iu_mo_release_timeout() ); execute( TC_reset_two_1iu() ); + execute( TC_iu_lu_and_mt_call() ); + execute( TC_iu_lu_and_mo_sms() ); execute( TC_iu_lu_and_mt_sms() ); execute( TC_iu_lu_and_mt_sms_paging_and_nothing() );