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/6109 msc: Rewrite TC_lu_and_mo_call() to be more modular All relevant parameters are passed in in form of a CallParameters record, and the bulk of the work has been moved to BSC_ConnectionHandler. Change-Id: I932c6c9f7a48b6a1f1ec399e8bba6a413c8bc69e --- M library/L3_Templates.ttcn M library/MGCP_Templates.ttcn M msc_tests/BSC_ConnectionHandler.ttcn M msc_tests/MSC_Tests.ttcn M msc_tests/gen_links.sh M msc_tests/regen_makefile.sh 6 files changed, 210 insertions(+), 64 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/09/6109/1 diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn index 5816ab9..549997e 100644 --- a/library/L3_Templates.ttcn +++ b/library/L3_Templates.ttcn @@ -632,6 +632,30 @@ } } +template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_REL_COMPL(integer tid) := { + discriminator := '0011'B, + tiOrSkip := { + transactionId := { + tio := int2bit(tid, 3), + tiFlag := '0'B, + tIExtension := omit + } + }, + msgs := { + cc := { + releaseComplete_MS_NW := { + messageType := '101010'B, + nsd := '00'B, + cause := omit, + facility := omit, + user_user := omit, + ss_VersionIndicator := omit + } + } + } +} + + template PDU_ML3_NW_MS tr_ML3_MT_MM_AUTH_REQ(template OCT16 rand := ?) := { discriminator := '0101'B, tiOrSkip := { diff --git a/library/MGCP_Templates.ttcn b/library/MGCP_Templates.ttcn index c0c827f..182868e 100644 --- a/library/MGCP_Templates.ttcn +++ b/library/MGCP_Templates.ttcn @@ -137,8 +137,8 @@ return cmd; } - template MgcpCommand tr_DLCX := { - line := t_MgcpCmdLine("DLCX", ?, ?), + template MgcpCommand tr_DLCX(template MgcpEndpoint ep := ?) := { + line := t_MgcpCmdLine("DLCX", ?, ep), params := *, sdp := * } @@ -152,6 +152,18 @@ params:= *, sdp := * } + + template MgcpResponse ts_DLCX_ACK2(MgcpTransId trans_id) := { + line := { + code := "250", + trans_id := trans_id, + string := "OK" + }, + params:= { /* list of ConnectionIDs */ }, + sdp := omit + } + + template MgcpResponse ts_DLCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := ts_CRCX_ACK(trans_id, conn_id, sdp); @@ -244,16 +256,35 @@ } } - function f_MgcpResp_extract_conn_id(MgcpResponse resp) return MgcpConnectionId { - var integer i; - for (i := 0; i < lengthof(resp.params); i := i + 1) { - var MgcpParameter par := resp.params[i]; - if (par.code == "I") { - return str2hex(par.val); + function f_mgcp_extract_par(MgcpMessage msg, MgcpInfoCode code) return charstring { + var MgcpParameterList pars; + if (ischosen(msg.command)) { + pars := msg.command.params; + } else { + pars := msg.response.params; + } + for (var integer i := 0; i < lengthof(pars); i := i + 1) { + var MgcpParameter par := pars[i]; + if (par.code == code) { + return par.val; } } setverdict(fail); - return '00000000'H; + return ""; + } + + function f_MgcpResp_extract_conn_id(MgcpResponse resp) return MgcpConnectionId { + var MgcpMessage msg := { + response := resp + } + return str2hex(f_mgcp_extract_par(msg, "I")); + } + + function f_MgcpCmd_extract_call_id(MgcpCommand cmd) return MgcpCallId { + var MgcpMessage msg := { + command := cmd + } + return str2hex(f_mgcp_extract_par(msg, "C")); } function f_mgcp_alloc_tid() return MgcpTransId { @@ -282,4 +313,5 @@ sdp := * } + } diff --git a/msc_tests/BSC_ConnectionHandler.ttcn b/msc_tests/BSC_ConnectionHandler.ttcn index d691d80..8ce1332 100644 --- a/msc_tests/BSC_ConnectionHandler.ttcn +++ b/msc_tests/BSC_ConnectionHandler.ttcn @@ -2,7 +2,9 @@ import from General_Types all; import from Osmocom_Types all; +import from Native_Functions all; import from GSM_Types all; +import from IPL4asp_Types all; import from SCCPasp_Types all; import from BSSAP_Types all; import from BSSMAP_Emulation all; @@ -16,10 +18,13 @@ import from MGCP_Types all; import from MGCP_Emulation all; +import from MGCP_Templates all; +import from SDP_Types all; import from MobileL3_Types all; import from MobileL3_CommonIE_Types all; import from MobileL3_MM_Types all; +import from MobileL3_CC_Types all; import from L3_Templates all; /* this component represents a single subscriber connection */ @@ -261,6 +266,138 @@ /* re-configure MSC behaviour via VTY */ } +/* parameters related to a (MO?) voice call */ +type record CallParameters { + boolean expect_auth, /* do we expect AUTHENTICATE from network */ + boolean expect_ciph, /* do we expect CIPHER MODE from network */ + + /* CC related parameters */ + hexstring called_party, /* whom are we calling */ + integer transaction_id optional, /* which TS 04.08 CC transaction ID to use */ + BearerCapability_TLV bearer_cap, /* which bearer capabilities to claim */ + + /* MNCC related parameters */ + uint32_t mncc_callref optional, /* call reference on the MNCC side */ + MNCC_bearer_cap mncc_bearer_cap optional, /* MNCC-side bearer capabilities */ + + /* RTP related parameters */ + HostName bss_rtp_ip optional, /* BSS Side RTP IP */ + PortNumber bss_rtp_port optional, /* BSS Side RTP Port */ + HostName mss_rtp_ip optional, /* MSS Side RTP IP */ + PortNumber mss_rtp_port optional, /* MSS Side RTP Port */ + uint7_t rtp_payload_type, /* dynamic RTP payload type */ + charstring rtp_sdp_format, /* AMR/8000 or the like */ + + MgcpCallId mgcp_call_id optional, /* MGCP Call ID; CallAgent allocated */ + MgcpEndpoint mgcp_ep optional /* MGCP Endpoint, CallAgent or MGW allocated */, + MgcpConnectionId mgcp_connection_id_bss, /* MGCP Connection ID BSS Side */ + MgcpConnectionId mgcp_connection_id_mss /* MGCP Connection ID MSS Side */ +} + +template (value) CallParameters t_CallParams(hexstring called, integer tid) := { + expect_auth := false, + expect_ciph := false, + called_party := called, + transaction_id := tid, + bearer_cap := valueof(ts_Bcap_voice), + mncc_callref := omit, + mncc_bearer_cap := valueof(ts_MNCC_bcap_voice), + bss_rtp_ip := "1.1.1.1", + bss_rtp_port := 0,// + mss_rtp_ip := omit, + mss_rtp_port := omit, + rtp_payload_type := 98, + rtp_sdp_format := "AMR/8000", + mgcp_call_id := omit, + mgcp_ep := omit, + mgcp_connection_id_bss := '0'H,// + mgcp_connection_id_mss := '0'H // +}; + + +function f_mo_call(inout CallParameters cpars) +runs on BSC_ConnHdlr { + + var MobileIdentityLV mi; + var MNCC_PDU mncc; + var MgcpCommand mgcp_cmd; + + /* If we have a TMSI, use TMSI instead of IMSI */ + if (ispresent(g_pars.tmsi)) { + mi := valueof(ts_MI_TMSI_LV(g_pars.tmsi)); + } else { + mi := valueof(ts_MI_IMSI_LV(g_pars.imsi)); + } + f_establish_fully(mi, cpars.expect_auth, cpars.expect_ciph); + + /* Create MNCC and MGCP expect */ + f_create_mncc_expect(hex2str(cpars.called_party)); + f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit}); + + BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party))); + interleave { + [] MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc { + cpars.mncc_callref := mncc.u.signal.callref; + /* Call Proceeding */ + MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap)); + BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id))); + }; + [] MGCP.receive(tr_CRCX) -> value mgcp_cmd { + cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd); + /* TODO: dynamic EP allocation case */ + cpars.mgcp_ep := mgcp_cmd.line.ep; + var SDP_Message sdp := valueof(ts_SDP(cpars.bss_rtp_ip, cpars.bss_rtp_ip, + hex2str(cpars.mgcp_call_id), "42", + cpars.bss_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_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, sdp)); + } + } + + /* Alerting */ + MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref)); + BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))); + + alt { + /* FIXME: expect AoIP IP/Port to match what we returned in CRCX_ACK above */ + [] BSSAP.receive(tr_BSSMAP_AssignmentReq) { + var BSSMAP_IE_AoIP_TransportLayerAddress tla; + tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port)); + BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla)); + } + } + + /* Answer. This causes TCH assignment in case of "late assignment" */ + MNCC.send(ts_MNCC_SETUP_COMPL_req(cpars.mncc_callref)); + + f_sleep(3.0); + + /* Hangup by "B" side */ + MNCC.send(ts_MNCC_DISC_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23)))); + BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id))); + + /* Release of call */ + MNCC.send(ts_MNCC_REL_req(cpars.mncc_callref, valueof(ts_MNCC_cause(42)))); + BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))); + BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id))); + + /* clearing of radio channel */ + interleave { + [] BSSAP.receive(tr_BSSMAP_ClearCommand) { + BSSAP.send(ts_BSSMAP_ClearComplete); + BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND); + } + [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd { + /* TODO: For one or all connections on EP? */ + MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id)); + f_create_mgcp_delete_ep(cpars.mgcp_ep); + } + } + setverdict(pass); +} diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn index 83ad17c..5afa93a 100644 --- a/msc_tests/MSC_Tests.ttcn +++ b/msc_tests/MSC_Tests.ttcn @@ -534,60 +534,13 @@ private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr { g_pars := pars; - f_perform_lu(false, true, true); + var CallParameters cpars := valueof(t_CallParams('12345'H, 0)); + cpars.bss_rtp_port := 1110; + cpars.mgcp_connection_id_bss := '22222'H; + cpars.mgcp_connection_id_mss := '33333'H; - f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), false, false); - - var hexstring called := '12345'H; - var integer tid := 0; - var MNCC_PDU mncc; - var MgcpCommand mgcp_cmd; - f_create_mncc_expect(hex2str(called)); - f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit}); - - BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(tid, called))); - interleave { - [] 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))); - }; - [] MGCP.receive(tr_CRCX) -> value mgcp_cmd { - var SDP_Message sdp := valueof(ts_SDP("127.0.0.2", "127.0.0.1", "23", "42", 1234, - { "98" }, - { valueof(ts_SDP_rtpmap(98, "AMR/8000")), - valueof(ts_SDP_ptime(20)) })); - MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, '1234'H, sdp)); - } - } - - /* Alerting */ - MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref)); - BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid))); - - BSSAP.receive(tr_BSSMAP_AssignmentReq); - BSSAP.send(ts_BSSMAP_AssignmentComplete); - - /* 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); + f_perform_lu(cpars.expect_auth, true, true); + f_mo_call(cpars); } testcase TC_lu_and_mo_call() runs on MTC_CT { var BSC_ConnHdlr vc_conn; diff --git a/msc_tests/gen_links.sh b/msc_tests/gen_links.sh index b501c55..4249947 100755 --- a/msc_tests/gen_links.sh +++ b/msc_tests/gen_links.sh @@ -75,7 +75,7 @@ gen_links $DIR $FILES 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 Osmocom_VTY_Functions.ttcn " +FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc " 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 MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn IPA_Emulation.ttcn " diff --git a/msc_tests/regen_makefile.sh b/msc_tests/regen_makefile.sh index 10ec38f..dacd10b 100755 --- a/msc_tests/regen_makefile.sh +++ b/msc_tests/regen_makefile.sh @@ -1,5 +1,5 @@ #!/bin/sh -FILES="*.ttcn SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc *.c" +FILES="*.ttcn SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc *.c" ../regen-makefile.sh MSC_Tests.ttcn $FILES -- To view, visit https://gerrit.osmocom.org/6109 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I932c6c9f7a48b6a1f1ec399e8bba6a413c8bc69e Gerrit-PatchSet: 1 Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org>