aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--library/BSSMAP_Templates.ttcn13
-rw-r--r--msc/BSC_ConnectionHandler.ttcn376
-rw-r--r--msc/MSC_Tests.ttcn236
3 files changed, 291 insertions, 334 deletions
diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn
index 41755db0..406dfc5b 100644
--- a/library/BSSMAP_Templates.ttcn
+++ b/library/BSSMAP_Templates.ttcn
@@ -420,6 +420,19 @@ template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT
template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
+template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr,
+ template uint16_t udp_port,
+ template integer len := ?) := {
+ elementIdentifier := '7C'O,
+ lengthIndicator := len,
+ ipAddress := addr,
+ uDPPortValue := udp_port
+}
+template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) :=
+ tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6);
+template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) :=
+ tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18);
+
template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := {
elementIdentifier := '83'O,
kC128_Value := kc128
diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn
index 7a94d85b..4330b535 100644
--- a/msc/BSC_ConnectionHandler.ttcn
+++ b/msc/BSC_ConnectionHandler.ttcn
@@ -676,6 +676,13 @@ function f_foo() runs on BSC_ConnHdlr{
/* re-configure MSC behaviour via VTY */
}
+type record CrcxResponse {
+ integer resp, /* 1 = reply with OK, 0 = do not reply, -1 = reply with error */
+ HostName mgw_rtp_ip,
+ PortNumber mgw_rtp_port,
+ MgcpConnectionId mgcp_connection_id /* MGCP Connection ID BSS Side */
+}
+
/* parameters related to a (MO?) voice call */
type record CallParameters {
/* CC related parameters */
@@ -695,24 +702,24 @@ type record CallParameters {
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 */
- HostName mgw_rtp_ip_bss, /* BSS-facing MGW RTP IP */
- PortNumber mgw_rtp_port_bss, /* BSS-facing MGW RTP Port */
- HostName mgw_rtp_ip_mss, /* MSS-facing MGW RTP IP */
- PortNumber mgw_rtp_port_mss, /* MSS-facing MGW RTP Port */
+ integer got_crcx_count,
+ CrcxResponse mgw_conn_1,
+ CrcxResponse mgw_conn_2,
uint7_t rtp_payload_type, /* dynamic RTP payload type */
charstring rtp_sdp_format, /* AMR/8000 or the like */
boolean mgw_drop_dlcx optional, /* Provoke errors by not responding to DLCX
(f_mt_call and f_mt_call) */
+ boolean stop_after_cc_setup, /* Special case: stop call establish after CC Setup */
+ boolean ran_clear_when_alerting, /* Special case: send Clear upon CC Alerting */
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 */
- boolean use_osmux /* MSC is expected to use Osmux for this call */
+ boolean use_osmux, /* MSC is expected to use Osmux for this call */
+ integer got_osmux_count
}
-template (value) CallParameters t_CallParams(hexstring called, integer tid) := {
+template (value) CallParameters t_CallParams(hexstring called := '12345'H, integer tid := 0) := {
called_party := called,
transaction_id := tid,
mo_call := false,
@@ -724,32 +731,43 @@ template (value) CallParameters t_CallParams(hexstring called, integer tid) := {
bss_rtp_port := 9000,
mss_rtp_ip := omit,
mss_rtp_port := omit,
- mgw_rtp_ip_bss := "1.1.1.1",
- mgw_rtp_port_bss := 10000,
- mgw_rtp_ip_mss := "1.1.1.1",
- mgw_rtp_port_mss := 11000,
+ got_crcx_count := 0,
+ mgw_conn_1 := {
+ resp := 1,
+ mgw_rtp_ip := "1.1.1.1",
+ mgw_rtp_port := 10000,
+ mgcp_connection_id := '11111'H
+ },
+ mgw_conn_2 := {
+ resp := 1,
+ mgw_rtp_ip := "1.1.1.1",
+ mgw_rtp_port := 11000,
+ mgcp_connection_id := '22222'H
+ },
rtp_payload_type := 98,
rtp_sdp_format := "AMR/8000",
mgw_drop_dlcx := false,
+ stop_after_cc_setup := false,
+ ran_clear_when_alerting := false,
mgcp_call_id := omit,
- mgcp_ep := omit,
- mgcp_connection_id_bss := '0'H,//
- mgcp_connection_id_mss := '0'H,//
- use_osmux := false
+ mgcp_ep := "rtpbridge/1@mgw",
+ use_osmux := false,
+ got_osmux_count := 0
};
/* Allocate a call reference and send SETUP via MNCC to MSC */
function f_mt_call_initate(inout CallParameters cpars)
runs on BSC_ConnHdlr {
+ cpars.mo_call := false;
cpars.mncc_callref := f_rnd_int(2147483648);
MNCC.send(ts_MNCC_SETUP_req(cpars.mncc_callref, hex2str(g_pars.msisdn),
hex2str(cpars.called_party), hex2str(g_pars.imsi)));
}
private template (value) SDP_Message ts_SDP_CRCX_CN(CallParameters cpars) :=
- ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,
+ ts_SDP(cpars.mgw_conn_2.mgw_rtp_ip, cpars.mgw_conn_2.mgw_rtp_ip,
hex2str(cpars.mgcp_call_id), "42",
- cpars.mgw_rtp_port_mss,
+ cpars.mgw_conn_2.mgw_rtp_port,
{ int2str(cpars.rtp_payload_type) },
{ valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,
cpars.rtp_sdp_format)),
@@ -770,6 +788,8 @@ runs on BSC_ConnHdlr {
log("f_mt_call_complete 1");
+ cpars.got_osmux_count := 0;
+
/* MS <- MSC: Expect CC SETUP */
BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_SETUP(cpars.transaction_id, *, cpars.called_party)));
@@ -783,53 +803,26 @@ runs on BSC_ConnHdlr {
/* Ask MSC via MNCC to create the RTP socket on the MSC/MGW side */
MNCC.send(ts_MNCC_RTP_CREATE(cpars.mncc_callref));
- /* First MGCP CRCX (for BSS/RAN side) */
+ /* First MGCP CRCX */
MGCP.receive(tr_CRCX) -> value mgcp_cmd {
log("f_mt_call_complete 3");
- cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
-
- /* When the endpoint contains a wildcard we keep the endpoint
- * identifier we have set up in cpars. Otherwise we use the
- * endpoint name that the call agent has supplied */
- if (match(mgcp_cmd.line.ep, t_MGCP_EP_wildcard) == false) {
- cpars.mgcp_ep := mgcp_cmd.line.ep;
- }
-
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_bss, cpars.mgw_rtp_ip_bss,
- hex2str(cpars.mgcp_call_id), "42",
- cpars.mgw_rtp_port_bss,
- { 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 != -1) { /* we expect MSC to use wildcard here */
- setverdict(fail, "MSC using unexpected CID " & int2str(osmux_cid) & " != -1");
- mtc.stop;
- }
- osmux_cid := 0;
- mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, osmux_cid, sdp);
- } else {
- mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, sdp);
+ if (not f_handle_crcx(cpars, mgcp_cmd)) {
+ return;
}
-
- f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(cpars.mgcp_ep));
- MGCP.send(mgcp_resp);
}
if (g_pars.ran_is_geran) {
- var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=
- valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));
+ var template BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=
+ tr_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_conn_1.mgw_rtp_ip), ?);
interleave {
/* Second MGCP CRCX (this time for MSS/CN side) */
[] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {
log("f_mt_call_complete 4");
- var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));
- MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));
+ if (not f_handle_crcx(cpars, mgcp_cmd)) {
+ break;
+ }
}
/* MSC acknowledges the MNCC_CREATE to the MNCC handler */
@@ -839,7 +832,7 @@ runs on BSC_ConnHdlr {
/* expect the MSC to trigger a BSSMAP ASSIGNMENT */
[] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) -> value bssap {
- var BSSMAP_IE_AoIP_TransportLayerAddress tla;
+ var template BSSMAP_IE_AoIP_TransportLayerAddress tla;
var BSSMAP_IE_SpeechCodec codec;
var BSSMAP_IE_Osmo_OsmuxCID osmuxCID;
log("f_mt_call_complete 6");
@@ -853,8 +846,8 @@ runs on BSC_ConnHdlr {
mtc.stop;
}
osmuxCID := valueof(ts_OsmuxCID(0));
- if (cpars.use_osmux and not match(bssap.pdu.bssmap.assignmentRequest.osmuxCID, osmuxCID)) {
- setverdict(fail, "MSC sent AssignReq without expected OsmuxCID IE");
+ if (not match(bssap.pdu.bssmap.assignmentRequest.osmuxCID, osmuxCID)) {
+ setverdict(fail, "MSC sent AssignReq without expected OsmuxCID IE. Expected ", osmuxCID, " Got ", bssap.pdu.bssmap.assignmentRequest.osmuxCID);
mtc.stop;
}
bssap := valueof(ts_BSSMAP_AssignmentComplete(omit, tla, codec, osmuxCID));
@@ -877,9 +870,9 @@ runs on BSC_ConnHdlr {
/* 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");
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,
+ 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_rtp_port_mss,
+ cpars.mgw_conn_2.mgw_rtp_port,
{ int2str(cpars.rtp_payload_type) },
{ valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,
cpars.rtp_sdp_format)),
@@ -890,9 +883,9 @@ runs on BSC_ConnHdlr {
setverdict(fail, "MSC using unexpected CID " & int2str(osmux_cid) & " != 0");
mtc.stop;
}
- mgcp_resp := ts_MDCX_ACK_osmux(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, osmux_cid, sdp);
+ 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.mgcp_connection_id_mss, sdp);
+ mgcp_resp := ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp);
}
MGCP.send(mgcp_resp);
}
@@ -900,25 +893,25 @@ runs on BSC_ConnHdlr {
/* 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");
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,
+ 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_rtp_port_mss,
+ 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.mgcp_connection_id_mss, sdp));
+ MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp));
}
}
} else {
- var template TransportLayerAddress rab_tla := ? /* FIXME: encode the mgw_rtp_ip_bss/mgw_rtp_port_bss */
+ 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.mgcp_connection_id_mss, sdp));
+ 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));
}
@@ -930,6 +923,13 @@ runs on BSC_ConnHdlr {
}
}
+ if (cpars.use_osmux == (cpars.got_osmux_count != 0)) {
+ log("Osmux ok: use_osmux = ", cpars.use_osmux, " got_osmux_count = ", cpars.got_osmux_count);
+ } else {
+ setverdict(fail, "Osmux failure: use_osmux = ", cpars.use_osmux, " got_osmux_count = ", cpars.got_osmux_count);
+ mtc.stop;
+ }
+
log("f_mt_call_complete DONE");
}
@@ -958,6 +958,139 @@ runs on BSC_ConnHdlr {
setverdict(pass);
}
+/* Reply to a received CRCX with an OK (or the reply configured in cpars), using the given parameters.
+ * Return true when an OK reply was sent, false otherwise.
+ * Count occurence of Osmux, include Osmux parameters in the reply if necessary. */
+function f_handle_crcx(inout CallParameters cpars, MgcpCommand mgcp_cmd)
+runs on BSC_ConnHdlr
+return boolean {
+ var CrcxResponse conn := cpars.mgw_conn_1;
+ if (cpars.got_crcx_count > 0) {
+ conn := cpars.mgw_conn_2;
+ }
+ cpars.got_crcx_count := cpars.got_crcx_count + 1;
+
+ var MgcpMessage mgcp_msg := {
+ command := mgcp_cmd
+ }
+ var template MgcpResponse mgcp_resp;
+ var MgcpOsmuxCID osmux_cid;
+ var MgcpCallId call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
+ if (ispresent(cpars.mgcp_call_id)) {
+ if (cpars.mgcp_call_id != call_id) {
+ setverdict(fail, "CRCX contained unexpected call id. Expected:", cpars.mgcp_call_id, " got:", call_id);
+ mtc.stop;
+ }
+ } else {
+ cpars.mgcp_call_id := call_id;
+ }
+
+ /* When the endpoint contains a wildcard we keep the endpoint
+ * identifier we have set up in cpars. Otherwise we use the
+ * endpoint name that the call agent has supplied */
+ if (match(mgcp_cmd.line.ep, t_MGCP_EP_wildcard) == false) {
+ cpars.mgcp_ep := mgcp_cmd.line.ep;
+ }
+
+ if (conn.resp == -1) {
+ /* Reply with error */
+ var MgcpResponse mgcp_rsp := {
+ line := {
+ code := "542",
+ trans_id := mgcp_cmd.line.trans_id,
+ string := "FORCED_FAIL"
+ },
+ sdp := omit
+
+ }
+ var MgcpParameter mgcp_rsp_param := {
+ code := "Z",
+ val := cpars.mgcp_ep
+ };
+ mgcp_rsp.params[0] := mgcp_rsp_param;
+ MGCP.send(mgcp_rsp);
+ return false;
+ }
+
+ if (conn.resp == 0) {
+ /* Do not reply at all */
+ return false;
+ }
+
+ if (conn.resp != 1) {
+ setverdict(fail, "Unexpected value for cpars.mgw_conn_*.resp, expect -1, 0 or 1");
+ mtc.stop;
+ }
+
+ var SDP_Message sdp := valueof(ts_SDP(conn.mgw_rtp_ip, conn.mgw_rtp_ip,
+ hex2str(cpars.mgcp_call_id), "42",
+ conn.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 (f_mgcp_contains_par(mgcp_msg, "X-OSMUX")) {
+ if (not cpars.use_osmux) {
+ setverdict(fail, "MSC sent X-Osmux parameter in MGCP, but not expecting any Osmux");
+ mtc.stop;
+ }
+ cpars.got_osmux_count := cpars.got_osmux_count + 1;
+ /* we expect MSC to use wildcard here, i.e. osmux_cid == -1 */
+ osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);
+ log("f_handle_crcx(): got Osmux CID: ", osmux_cid);
+ if (osmux_cid != -1) {
+ setverdict(fail, "MSC using unexpected CID " & int2str(osmux_cid) & " != -1");
+ mtc.stop;
+ }
+
+ osmux_cid := 0;
+ mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, conn.mgcp_connection_id, osmux_cid, sdp);
+ } else {
+ mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, conn.mgcp_connection_id, sdp);
+ }
+
+ f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(cpars.mgcp_ep));
+ MGCP.send(mgcp_resp);
+ return true;
+}
+
+
+altstep as_optional_mgcp_crcx(CallParameters cpars) runs on BSC_ConnHdlr {
+ var MgcpCommand mgcp_cmd;
+ [] MGCP.receive(tr_CRCX) -> value mgcp_cmd {
+ log("as_optional_mgcp_crcx: rx CRCX");
+ f_handle_crcx(cpars, mgcp_cmd);
+
+ /* Without this 'repeat', the as_optional_mgcp_crcx() exits currently waiting interleaves as soon as an
+ * CRCX is handled. */
+ repeat;
+ }
+}
+
+private altstep as_optional_mgcp_mdcx(HostName mgw_rtp_ip, PortNumber mgw_rtp_port) runs on BSC_ConnHdlr {
+ var MgcpCommand mgcp_cmd;
+ [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {
+ log("as_optional_mgcp_mdcx: rx MDCX");
+ log(mgcp_cmd);
+ var charstring conn_id;
+ var charstring rtp_payload_type;
+ f_mgcp_find_param_entry(mgcp_cmd.params, "I", conn_id);
+ rtp_payload_type := mgcp_cmd.sdp.media_list[0].media_field.fmts[0];
+
+ var SDP_Message sdp := valueof(ts_SDP(mgw_rtp_ip, mgw_rtp_ip,
+ mgcp_cmd.sdp.origin.session_id, "42",
+ mgw_rtp_port,
+ { rtp_payload_type },
+ { valueof(ts_SDP_ptime(20)) }));
+ MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, str2hex(conn_id), sdp));
+
+ /* Without this 'repeat', currently active other interleave and alt series exit as soon as an MDCX is
+ * handled. */
+ repeat;
+ }
+}
+
function f_mo_call_establish(inout CallParameters cpars)
runs on BSC_ConnHdlr {
@@ -968,6 +1101,8 @@ runs on BSC_ConnHdlr {
var PDU_BSSAP bssap;
var MgcpOsmuxCID osmux_cid;
+ cpars.mo_call := true;
+
if (cpars.emergency) {
f_establish_fully(EST_TYPE_EMERG_CALL);
} else {
@@ -984,8 +1119,14 @@ runs on BSC_ConnHdlr {
BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
}
- var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=
- valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));
+ if (cpars.stop_after_cc_setup) {
+ return;
+ }
+
+ var template BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=
+ tr_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_conn_1.mgw_rtp_ip), ?);
+
+ var default mdcx := activate(as_optional_mgcp_mdcx(cpars.mgw_conn_2.mgw_rtp_ip, cpars.mgw_conn_2.mgw_rtp_port));
interleave {
[] MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc {
@@ -994,43 +1135,20 @@ runs on BSC_ConnHdlr {
MNCC.send(ts_MNCC_RTP_CREATE(cpars.mncc_callref));
}
- /* First MGCP CRCX (for BSS/RAN side) */
+ /* First MGCP CRCX */
[] MGCP.receive(tr_CRCX) -> value mgcp_cmd {
log("f_mo_call_establish 2: rx 1st CRCX");
- cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
-
- /* When the endpoint contains a wildcard we keep the endpoint
- * identifier we have set up in cpars. Otherwise we use the
- * endpoint name that the call agent has supplied */
- if (match(mgcp_cmd.line.ep, t_MGCP_EP_wildcard) == false) {
- cpars.mgcp_ep := mgcp_cmd.line.ep;
+ if (not f_handle_crcx(cpars, mgcp_cmd)) {
+ break;
}
-
- if (cpars.use_osmux) {
- osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);
}
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_bss, cpars.mgw_rtp_ip_bss,
- hex2str(cpars.mgcp_call_id), "42",
- cpars.mgw_rtp_port_bss,
- { 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 != -1) { /* we expect MSC to use wildcard here */
- setverdict(fail, "MSC using unexpected CID " & int2str(osmux_cid) & " != -1");
- mtc.stop;
- }
- osmux_cid := 0;
- mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, osmux_cid, sdp);
- } else {
- mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, sdp);
+ /* Second MGCP CRCX */
+ [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {
+ log("f_mo_call_establish 6: rx 2nd CRCX");
+ if (not f_handle_crcx(cpars, mgcp_cmd)) {
+ break;
}
- f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(cpars.mgcp_ep));
- MGCP.send(mgcp_resp);
}
[] MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref)) {
@@ -1050,7 +1168,7 @@ runs on BSC_ConnHdlr {
var BSSMAP_IE_SpeechCodec codec;
var BSSMAP_IE_Osmo_OsmuxCID osmuxCID;
- if (tla_ass != bssap.pdu.bssmap.assignmentRequest.aoIPTransportLayer) {
+ if (not match(bssap.pdu.bssmap.assignmentRequest.aoIPTransportLayer, tla_ass)) {
log("Expected:", tla_ass);
log("Got:", bssap.pdu.bssmap.assignmentRequest.aoIPTransportLayer);
setverdict(fail, "MSC sent Assignment Request with unexpected AoIP Transport Layer IE");
@@ -1084,9 +1202,9 @@ runs on BSC_ConnHdlr {
/* MDCX setting up the RAN side remote RTP address received from Assignment Complete */
[] MGCP.receive(tr_MDCX) -> value mgcp_cmd {
log("f_mo_call_establish 5: rx MDCX for the RAN side");
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,
+ 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_rtp_port_mss,
+ cpars.mgw_conn_2.mgw_rtp_port,
{ int2str(cpars.rtp_payload_type) },
{ valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,
cpars.rtp_sdp_format)),
@@ -1098,22 +1216,25 @@ runs on BSC_ConnHdlr {
setverdict(fail, "MSC using unexpected CID " & int2str(osmux_cid) & " != 0");
mtc.stop;
}
- mgcp_resp := ts_MDCX_ACK_osmux(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_bss, osmux_cid, sdp);
+ 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.mgcp_connection_id_mss, sdp);
+ mgcp_resp := ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp);
}
MGCP.send(mgcp_resp);
}
- /* Second MGCP CRCX (this time for MSS/CN side) */
- [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {
- log("f_mo_call_establish 6: rx 2nd CRCX, for CN side");
- var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));
- MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));
- }
-
[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {
log("f_mo_call_establish 7: rx CC Alerting");
+
+ if (cpars.ran_clear_when_alerting) {
+ if (g_pars.ran_is_geran) {
+ BSSAP.send(ts_BSSMAP_ClearRequest(0));
+ } else {
+ BSSAP.send(ts_RANAP_IuReleaseRequest(ts_RanapCause_om_intervention));
+ }
+ break;
+ }
+
cpars.mncc_callref := mncc.u.signal.callref;
/* Call Proceeding */
MNCC.send(ts_MNCC_RTP_CONNECT(cpars.mncc_callref,
@@ -1127,33 +1248,32 @@ runs on BSC_ConnHdlr {
log("f_mo_call_establish 8: rx MNCC SETUP COMPLETE ind");
}
- /* second MDCX setting up the CN side remote RTP address and codec received from MNCC RTP CONNECT */
- [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {
- log("f_mo_call_establish 9: rx MDCX for CN side");
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,
- hex2str(cpars.mgcp_call_id), "42",
- cpars.mgw_rtp_port_mss,
- { 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.mgcp_connection_id_mss, sdp));
- }
-
[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CONNECT(cpars.transaction_id))) {
log("f_mo_call_establish 10: rx CC CONNECT");
BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT_ACK(cpars.transaction_id)));
}
+
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) {
+ log("f_mo_call_establish 11: rx CC RELEASE");
+ f_expect_clear();
+ break;
+ }
+ }
+
+ f_sleep(0.5);
+ deactivate(mdcx);
+
+ if (cpars.use_osmux == (cpars.got_osmux_count != 0)) {
+ log("Osmux ok: use_osmux = ", cpars.use_osmux, " got_osmux_count = ", cpars.got_osmux_count);
+ } else {
+ setverdict(fail, "Osmux failure: use_osmux = ", cpars.use_osmux, " got_osmux_count = ", cpars.got_osmux_count);
+ mtc.stop;
}
log("f_mo_call_establish DONE");
setverdict(pass);
}
-private altstep as_optional_mgcp_mdcx() runs on BSC_ConnHdlr {
- [] MGCP.receive(tr_MDCX) {};
-}
-
function f_call_hangup(inout CallParameters cpars, boolean release_by_ms, boolean is_csfb := false)
runs on BSC_ConnHdlr {
@@ -1194,7 +1314,7 @@ runs on BSC_ConnHdlr {
respond_to_dlcx := not (isbound(cpars.mgw_drop_dlcx) and valueof(cpars.mgw_drop_dlcx));
- var default mdcx := activate(as_optional_mgcp_mdcx());
+ var default mdcx := activate(as_optional_mgcp_mdcx(cpars.mgw_conn_2.mgw_rtp_ip, cpars.mgw_conn_2.mgw_rtp_port));
/* clearing of radio channel */
interleave {
diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn
index c290d7c8..b4db43df 100644
--- a/msc/MSC_Tests.ttcn
+++ b/msc/MSC_Tests.ttcn
@@ -608,12 +608,7 @@ testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
friend function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
- 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;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
-
+ var CallParameters cpars := valueof(t_CallParams);
f_perform_lu();
f_mo_call(cpars);
}
@@ -939,7 +934,6 @@ testcase TC_imsi_detach_by_imei() runs on MTC_CT {
private function f_emerg_call(MobileIdentityLV mi) runs on BSC_ConnHdlr {
var CallParameters cpars := valueof(t_CallParams('112'H, 0));
cpars.emergency := true;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
f_mo_call(cpars);
}
@@ -1213,14 +1207,14 @@ friend function f_tc_mo_setup_and_nothing(charstring id, BSC_ConnHdlrPars pars)
f_init_handler(pars, 190.0);
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
+ cpars.mgw_conn_2.resp := 0;
+ cpars.stop_after_cc_setup := true;
- f_perform_lu();
+ f_vty_config(MSCVTY, "msc", "mncc guard-timeout 20");
- f_establish_fully();
- f_create_mncc_expect(hex2str(cpars.called_party));
- f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});
+ f_perform_lu();
- BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));
+ f_mo_call_establish(cpars);
var default ccrel := activate(as_optional_cc_rel(cpars));
@@ -1247,28 +1241,15 @@ friend function f_tc_mo_crcx_ran_timeout(charstring id, BSC_ConnHdlrPars pars) r
var MgcpCommand mgcp_cmd;
f_perform_lu();
+ /* Do not respond to the second CRCX */
+ cpars.mgw_conn_2.resp := 0;
+ f_mo_call_establish(cpars);
- f_establish_fully();
- 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)));
- MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
- cpars.mncc_callref := mncc.u.signal.callref;
- 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);
- cpars.mgcp_ep := mgcp_cmd.line.ep;
- /* never respond to this */
+ var default ccrel := activate(as_optional_cc_rel(cpars));
- /* When the connection with the MGW fails, the MSC will first request
- * a release via call control. We will answer this request normally. */
- 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)));
+ f_expect_clear(60.0);
- f_expect_clear(30.0);
+ deactivate(ccrel);
}
testcase TC_mo_crcx_ran_timeout() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
@@ -1282,75 +1263,18 @@ testcase TC_mo_crcx_ran_timeout() runs on MTC_CT {
/* Test MO Call with reject to RAN-side CRCX */
friend function f_tc_mo_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
- var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
- var MNCC_PDU mncc;
- var MgcpCommand mgcp_cmd;
-
- f_perform_lu();
-
- f_establish_fully();
- 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)));
- MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
- cpars.mncc_callref := mncc.u.signal.callref;
- 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;
- /* Detect if the received CRCX is a wildcarded CRCX request. If yes,
- * set an endpoint name that fits the pattern. If not, just use the
- * endpoint name from the request */
- if (match(mgcp_cmd.line.ep, t_MGCP_EP_wildcard)) {
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- } else {
- cpars.mgcp_ep := mgcp_cmd.line.ep;
- }
+ var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
- cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);
+ /* Respond with error for the first CRCX */
+ cpars.mgw_conn_1.resp := -1;
- /* Respond to CRCX with error */
- var MgcpResponse mgcp_rsp := {
- line := {
- code := "542",
- trans_id := mgcp_cmd.line.trans_id,
- string := "FORCED_FAIL"
- },
- sdp := omit
- }
- var MgcpParameter mgcp_rsp_param := {
- code := "Z",
- val := cpars.mgcp_ep
- };
- mgcp_rsp.params[0] := mgcp_rsp_param;
- MGCP.send(mgcp_rsp);
+ f_perform_lu();
+ f_mo_call_establish(cpars);
- timer T := 30.0;
- T.start;
- alt {
- [] T.timeout {
- setverdict(fail, "Timeout waiting for channel release");
- mtc.stop;
- }
- [] 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)));
- repeat;
- }
- [] MNCC.receive { repeat; }
- [] GSUP.receive { repeat; }
- /* Note: As we did not respond properly to the CRCX from the MSC we
- * expect the MSC to omit any further MGCP operation (At least in the
- * the current implementation, there is no recovery mechanism implemented
- * and a DLCX can not be performed as the MSC does not know a specific
- * endpoint yet. */
- [] MGCP.receive {
- setverdict(fail, "Unexpected MGCP message");
- mtc.stop;
- }
- [] as_clear_cmd_compl_disc();
- }
+ var default ccrel := activate(as_optional_cc_rel(cpars));
+ f_expect_clear(60.0);
+ deactivate(ccrel);
}
testcase TC_mo_crcx_ran_reject() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
@@ -1520,10 +1444,6 @@ testcase TC_mt_t310() runs on MTC_CT {
friend function f_tc_gsup_cancel(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
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;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
/* Location Update to make subscriber known */
f_perform_lu();
@@ -1741,15 +1661,8 @@ testcase TC_lu_imsi_auth_tmsi_encr_013_2() runs on MTC_CT {
private 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.bss_rtp_port := 1110;
- cpars.mgcp_connection_id_bss := '10004'H;
- cpars.mgcp_connection_id_mss := '10005'H;
cpars.use_osmux := pars.use_osmux;
- /* Note: This is an optional parameter. When the call-agent (MSC) does
- * supply a full endpoint name this setting will be overwritten. */
- cpars.mgcp_ep := "rtpbridge/1@mgw";
-
f_perform_lu();
f_mt_call(cpars);
}
@@ -1773,11 +1686,6 @@ testcase TC_lu_and_mt_call_osmux() runs on MTC_CT {
private function f_tc_mo_setup_dtmf_dup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
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;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- cpars.mo_call := true;
f_perform_lu();
f_mo_seq_dtmf_dup(cpars);
@@ -1838,20 +1746,11 @@ friend function f_tc_mo_release_timeout(charstring id, BSC_ConnHdlrPars pars) ru
var MNCC_PDU mncc;
var MgcpCommand mgcp_cmd;
- f_perform_lu();
-
- f_establish_fully();
- 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)));
- MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
- cpars.mncc_callref := mncc.u.signal.callref;
- 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)));
+ /* Do not respond to the second CRCX */
+ cpars.mgw_conn_2.resp := 0;
- /* Drop CRCX */
- MGCP.receive(tr_CRCX) -> value mgcp_cmd;
+ f_perform_lu();
+ f_mo_call_establish(cpars);
var default ccrel := activate(as_optional_cc_rel(cpars));
@@ -1872,13 +1771,6 @@ testcase TC_mo_release_timeout() runs on MTC_CT {
private function f_tc_lu_and_mt_call_no_dlcx_resp(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
- cpars.bss_rtp_port := 1110;
- cpars.mgcp_connection_id_bss := '10004'H;
- cpars.mgcp_connection_id_mss := '10005'H;
-
- /* Note: This is an optional parameter. When the call-agent (MSC) does
- * supply a full endpoint name this setting will be overwritten. */
- cpars.mgcp_ep := "rtpbridge/1@mgw";
/* Intentionally disable the CRCX response */
cpars.mgw_drop_dlcx := true;
@@ -3107,10 +2999,6 @@ runs on BSC_ConnHdlr {
/* Call parameters taken from f_tc_lu_and_mt_call */
var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
- cpars.mgcp_connection_id_bss := '10004'H;
- cpars.mgcp_connection_id_mss := '10005'H;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- cpars.bss_rtp_port := 1110;
/* Perform location update */
f_perform_lu();
@@ -3190,51 +3078,13 @@ testcase TC_lu_and_mo_ussd_during_mt_call() runs on MTC_CT {
friend function f_tc_mo_cc_bssmap_clear(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
- var MNCC_PDU mncc;
- var MgcpCommand mgcp_cmd;
+ cpars.ran_clear_when_alerting := true;
f_perform_lu();
- f_establish_fully();
- 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)));
- MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc;
- cpars.mncc_callref := mncc.u.signal.callref;
- log("mncc_callref=", cpars.mncc_callref);
- 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)));
-
- MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));
- BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id)));
- MGCP.receive(tr_CRCX);
-
- f_sleep(1.0);
- if (pars.ran_is_geran) {
- BSSAP.send(ts_BSSMAP_ClearRequest(0));
- } else {
- BSSAP.send(ts_RANAP_IuReleaseRequest(ts_RanapCause_om_intervention));
- }
-
var default ccrel := activate(as_optional_cc_rel(cpars));
-
- if (pars.ran_is_geran) {
- interleave {
- [] MNCC.receive(tr_MNCC_REL_ind(?, ?)) { };
- [] BSSAP.receive(tr_BSSMAP_ClearCommand) {
- BSSAP.send(ts_BSSMAP_ClearComplete);
- };
- }
- } else {
- interleave {
- [] MNCC.receive(tr_MNCC_REL_ind(?, ?)) { };
- [] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {
- BSSAP.send(ts_RANAP_IuReleaseComplete);
- };
- }
- }
-
+ f_mo_call_establish(cpars);
+ f_expect_clear()
deactivate(ccrel);
f_sleep(1.0);
@@ -3255,10 +3105,6 @@ runs on BSC_ConnHdlr {
/* Call parameters taken from f_tc_lu_and_mt_call */
var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
- cpars.mgcp_connection_id_bss := '10004'H;
- cpars.mgcp_connection_id_mss := '10005'H;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- cpars.bss_rtp_port := 1110;
/* Perform location update */
f_perform_lu();
@@ -5020,13 +4866,6 @@ private function f_mt_lu_and_csfb_call(charstring id, BSC_ConnHdlrPars pars, boo
var octetstring vlr_name := f_enc_dns_hostname(mp_vlr_name);
var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
- cpars.bss_rtp_port := 1110;
- cpars.mgcp_connection_id_bss := '10004'H;
- cpars.mgcp_connection_id_mss := '10005'H;
-
- /* Note: This is an optional parameter. When the call-agent (MSC) does
- * supply a full endpoint name this setting will be overwritten. */
- cpars.mgcp_ep := "rtpbridge/1@mgw";
/* Initiate a call via MNCC interface */
f_mt_call_initate(cpars);
@@ -5142,11 +4981,6 @@ testcase TC_sgsap_vlr_failure() runs on MTC_CT {
private function f_tc_ho_inter_bsc_unknown_cell(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
f_init_handler(pars);
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;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- cpars.mo_call := true;
f_perform_lu();
f_mo_call_establish(cpars);
@@ -5175,25 +5009,20 @@ testcase TC_ho_inter_bsc_unknown_cell() runs on MTC_CT {
private altstep as_mgcp_ack_all_mdcx(CallParameters cpars) runs on BSC_ConnHdlr {
var MgcpCommand mgcp_cmd;
[] MGCP.receive(tr_MDCX) -> value mgcp_cmd {
- var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,
+ 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_rtp_port_mss,
+ 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.mgcp_connection_id_mss, sdp));
+ MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgw_conn_2.mgcp_connection_id, sdp));
repeat;
}
}
private function f_tc_ho_inter_bsc0(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
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;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- cpars.mo_call := true;
f_init_handler(pars);
@@ -5353,11 +5182,6 @@ function f_ML3_patch_seq_nr_MS_NW(in uint2_t seq_nr, inout octetstring enc_l3) {
private function f_tc_ho_inter_msc_out(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
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;
- cpars.mgcp_ep := "rtpbridge/1@mgw";
- cpars.mo_call := true;
var hexstring ho_number := f_gen_msisdn(99999);
f_init_handler(pars);