<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13616">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Neels Hofmeyr: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">msc: mo and mt voice call tests: add lots of missing parts<br><br>Both f_mo_call_establish() and f_mt_call_establish() were testing barely half a<br>voice call setup.  For example, f_mo_call_establish() used to be satisfied with<br>just two CRCX, but no actual RTP connections being made.<br><br>Add numerous MNCC and MGCP messages more closely resembling an actual call.<br><br>The main reason is to achieve a state that passes both current osmo-msc master<br>as well as the upcoming inter-MSC Handover refactoring.<br><br>Add log markers to f_*_call_*(): often when a test halts, it is not at all<br>clear why. With these log markers it is saner to figure out what has happened<br>and what hasn't.<br><br>Change-Id: I162985045bb5e129977a3a797b656e30220990df<br>---<br>M library/L3_Templates.ttcn<br>M library/MGCP_Templates.ttcn<br>M library/MNCC_Types.ttcn<br>M msc/BSC_ConnectionHandler.ttcn<br>M msc/MSC_Tests.ttcn<br>5 files changed, 231 insertions(+), 93 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn</span><br><span>index 6099303..4d71f27 100644</span><br><span>--- a/library/L3_Templates.ttcn</span><br><span>+++ b/library/L3_Templates.ttcn</span><br><span>@@ -1271,12 +1271,12 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_REL_COMPL(integer tid) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_ML3_MS_NW ts_ML3_MO_CC_REL_COMPL(integer tid, BIT1 tid_remote := '0'B) := {</span><br><span>     discriminator := '0011'B,</span><br><span>    tiOrSkip := {</span><br><span>                transactionId := {</span><br><span>                   tio := int2bit(tid, 3),</span><br><span style="color: hsl(0, 100%, 40%);">-                 tiFlag := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                       tiFlag := tid_remote,</span><br><span>                        tIExtension := omit</span><br><span>          }</span><br><span>    },</span><br><span>diff --git a/library/MGCP_Templates.ttcn b/library/MGCP_Templates.ttcn</span><br><span>index f720553..506100f 100644</span><br><span>--- a/library/MGCP_Templates.ttcn</span><br><span>+++ b/library/MGCP_Templates.ttcn</span><br><span>@@ -286,6 +286,22 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ function f_mgcp_contains_par(MgcpMessage msg, MgcpInfoCode code) return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+             var MgcpParameterList pars;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ischosen(msg.command)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  pars := msg.command.params;</span><br><span style="color: hsl(120, 100%, 40%);">+           } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      pars := msg.response.params;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             for (var integer i := 0; i < lengthof(pars); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 var MgcpParameter par := pars[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (par.code == code) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               return true;</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  function f_mgcp_extract_par(MgcpMessage msg, MgcpInfoCode code) return charstring {</span><br><span>          var MgcpParameterList pars;</span><br><span>          if (ischosen(msg.command)) {</span><br><span>@@ -317,6 +333,13 @@</span><br><span>          return f_mgcp_extract_par(msg, code);</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ function f_MgcpCmd_contains_par(MgcpCommand cmd, MgcpInfoCode code) return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+          var MgcpMessage msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      command := cmd</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             return f_mgcp_contains_par(msg, code);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  function f_MgcpResp_extract_conn_id(MgcpResponse resp) return MgcpConnectionId {</span><br><span>             return str2hex(f_MgcpResp_extract_par(resp, "I"));</span><br><span>         }</span><br><span>diff --git a/library/MNCC_Types.ttcn b/library/MNCC_Types.ttcn</span><br><span>index a3714b1..f5028d2 100644</span><br><span>--- a/library/MNCC_Types.ttcn</span><br><span>+++ b/library/MNCC_Types.ttcn</span><br><span>@@ -1874,14 +1874,17 @@</span><br><span> template MNCC_PDU ts_MNCC_RTP_CREATE(uint32_t call_id) := ts_MNCC_SIMPLE_RTP(MNCC_RTP_CREATE, call_id);</span><br><span> </span><br><span> /* MSC -> MNCC: RTP_CREATE.rsp; acknowledge creation of RTP (stating MSC side IP/Port) */</span><br><span style="color: hsl(0, 100%, 40%);">-template MNCC_PDU tr_MNCC_RTP_CREATE(template uint32_t call_id := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template MNCC_PDU tr_MNCC_RTP_CREATE(template uint32_t call_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 template uint32_t ip := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template uint32_t rtp_port := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                              template uint32_t payload_type := ?) := {</span><br><span>       msg_type := MNCC_RTP_CREATE,</span><br><span>         u := {</span><br><span>               rtp := {</span><br><span>                     callref := call_id,</span><br><span style="color: hsl(0, 100%, 40%);">-                     ip := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                        rtp_port := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                  payload_type := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                    ip := ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                     rtp_port := rtp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                 payload_type := payload_type,</span><br><span>                        payload_msg_type := ?</span><br><span>                }</span><br><span>    }</span><br><span>diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn</span><br><span>index 1750bf5..44d3c6d 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -551,6 +551,8 @@</span><br><span>         /* CC related parameters */</span><br><span>  hexstring called_party,                         /* whom are we calling */</span><br><span>    integer transaction_id optional,                /* which TS 04.08 CC transaction ID to use */</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean mo_call,                                /* For a MO call, the transaction_id was allocated by the MS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    important to set the TI flag properly */</span><br><span>  BearerCapability_TLV bearer_cap,                /* which bearer capabilities to claim */</span><br><span>     boolean emergency,                              /* is this an emergency call? */</span><br><span> </span><br><span>@@ -581,6 +583,7 @@</span><br><span> template (value) CallParameters t_CallParams(hexstring called, integer tid) := {</span><br><span>       called_party := called,</span><br><span>      transaction_id := tid,</span><br><span style="color: hsl(120, 100%, 40%);">+        mo_call := false,</span><br><span>    bearer_cap := valueof(ts_Bcap_voice),</span><br><span>        emergency := false,</span><br><span>  mncc_callref := omit,</span><br><span>@@ -595,6 +598,7 @@</span><br><span>  mgw_rtp_port_mss := 11000,</span><br><span>   rtp_payload_type := 98,</span><br><span>      rtp_sdp_format := "AMR/8000",</span><br><span style="color: hsl(120, 100%, 40%);">+       mgw_drop_dlcx := false,</span><br><span>      mgcp_call_id := omit,</span><br><span>        mgcp_ep := omit,</span><br><span>     mgcp_connection_id_bss := '0'H,//</span><br><span>@@ -628,12 +632,15 @@</span><br><span> </span><br><span>        f_establish_fully(EST_TYPE_PAG_RESP);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     log("f_mt_call_complete 1");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* MS <- MSC: Expect CC SETUP */</span><br><span>  BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_SETUP(cpars.transaction_id, *, cpars.called_party)));</span><br><span> </span><br><span>  /* MS -> MSC: ALERTING */</span><br><span>         BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_ALERTING(cpars.transaction_id)));</span><br><span>     MNCC.receive(tr_MNCC_ALERT_ind(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+  log("f_mt_call_complete 2");</span><br><span> </span><br><span>   /* Create MGCP expect */</span><br><span>     f_create_mgcp_expect(ExpectCriteria:{omit,omit,omit});</span><br><span>@@ -642,6 +649,7 @@</span><br><span> </span><br><span>     /* First MGCP CRCX (for BSS/RAN side) */</span><br><span>     MGCP.receive(tr_CRCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+          log("f_mt_call_complete 3");</span><br><span>               cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);</span><br><span> </span><br><span>               /* When the endpoint contains a wildcard we keep the endpoint</span><br><span>@@ -672,21 +680,64 @@</span><br><span>                interleave {</span><br><span>                 /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span>           [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+                        log("f_mt_call_complete 4");</span><br><span>                       var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span>                       MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* MSC acknowledges the MNCC_CREATE to the MNCC handler */</span><br><span style="color: hsl(0, 100%, 40%);">-                      MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref));</span><br><span>                        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* MSC acknowledges the MNCC_CREATE to the MNCC handler */</span><br><span style="color: hsl(120, 100%, 40%);">+            [] MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     log("f_mt_call_complete 5");</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          /* expect the MSC to trigger a BSSMAP ASSIGNMENT */</span><br><span>          [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span>                   var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span>                        var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(120, 100%, 40%);">+                      log("f_mt_call_complete 6");</span><br><span> </span><br><span>                   tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span>                   codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span> </span><br><span>                        BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT(cpars.transaction_id)));</span><br><span>                      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           [] MNCC.receive(tr_MNCC_SETUP_cnf(cpars.mncc_callref)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      log("f_mt_call_complete 7");</span><br><span style="color: hsl(120, 100%, 40%);">+                        MNCC.send(ts_MNCC_RTP_CONNECT(cpars.mncc_callref,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   /* ip 42.23.11.5 */ hex2int('42231105'H),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     /* port 423 */ 423,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   /* payload type 3 = GSM FR */ 3));</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* MDCX setting up the RAN side remote RTP address received from Assignment Complete */</span><br><span style="color: hsl(120, 100%, 40%);">+               [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+                       log("f_mt_call_complete 8");</span><br><span style="color: hsl(120, 100%, 40%);">+                        var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             hex2str(cpars.mgcp_call_id), "42",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          cpars.mgw_rtp_port_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               { int2str(cpars.rtp_payload_type) },</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                       cpars.rtp_sdp_format)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 valueof(ts_SDP_ptime(20)) }));</span><br><span style="color: hsl(120, 100%, 40%);">+                      MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* MDCX setting up the CN side remote RTP address received from MNCC CONNECT */</span><br><span style="color: hsl(120, 100%, 40%);">+               [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+                       log("f_mt_call_complete 9");</span><br><span style="color: hsl(120, 100%, 40%);">+                        var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             hex2str(cpars.mgcp_call_id), "42",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          cpars.mgw_rtp_port_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               { int2str(cpars.rtp_payload_type) },</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                       cpars.rtp_sdp_format)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 valueof(ts_SDP_ptime(20)) }));</span><br><span style="color: hsl(120, 100%, 40%);">+                      MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          }</span><br><span>    } else {</span><br><span>             var template TransportLayerAddress rab_tla := ? /* FIXME: encode the mgw_rtp_ip_bss/mgw_rtp_port_bss */</span><br><span>@@ -702,12 +753,12 @@</span><br><span>              [] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) {</span><br><span>                      //BSSAP.send(ts_RANAP_RabAssResp(rab_sml)); FIXME</span><br><span>                    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* FIXME: same MNCC and MGCP as in 2G above */</span><br><span>               }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* MS -> MSC: ALERTING */</span><br><span style="color: hsl(0, 100%, 40%);">-    BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT(cpars.transaction_id)));</span><br><span style="color: hsl(0, 100%, 40%);">- MNCC.receive(tr_MNCC_SETUP_cnf(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+  log("f_mt_call_complete DONE");</span><br><span> }</span><br><span> </span><br><span> function f_expect_paging(boolean by_tmsi := true)</span><br><span>@@ -757,15 +808,20 @@</span><br><span>      } else {</span><br><span>             BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(cpars.transaction_id, cpars.called_party)));</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=</span><br><span style="color: hsl(120, 100%, 40%);">+           valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         interleave {</span><br><span>         [] MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(cpars.called_party)))) -> value mncc {</span><br><span style="color: hsl(120, 100%, 40%);">+         log("f_mo_call_establish 1: rx MNCC SETUP ind");</span><br><span>           cpars.mncc_callref := mncc.u.signal.callref;</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Call Proceeding */</span><br><span style="color: hsl(0, 100%, 40%);">-           MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));</span><br><span style="color: hsl(0, 100%, 40%);">-            BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));</span><br><span style="color: hsl(0, 100%, 40%);">-            };</span><br><span style="color: hsl(120, 100%, 40%);">+            MNCC.send(ts_MNCC_RTP_CREATE(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* First MGCP CRCX (for BSS/RAN side) */</span><br><span>     [] MGCP.receive(tr_CRCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+               log("f_mo_call_establish 2: rx 1st CRCX");</span><br><span>                 cpars.mgcp_call_id := f_MgcpCmd_extract_call_id(mgcp_cmd);</span><br><span> </span><br><span>               /* When the endpoint contains a wildcard we keep the endpoint</span><br><span>@@ -788,64 +844,94 @@</span><br><span>                f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(cpars.mgcp_ep));</span><br><span>                MGCP.send(mgcp_resp);</span><br><span>                }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(0, 100%, 40%);">-              var BSSMAP_IE_AoIP_TransportLayerAddress tla_ass :=</span><br><span style="color: hsl(0, 100%, 40%);">-                     valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.mgw_rtp_ip_bss),cpars.mgw_rtp_port_bss));</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MNCC.receive(tr_MNCC_RTP_CREATE(cpars.mncc_callref)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             log("f_mo_call_establish 3: rx RTP CREATE");</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Call Proceeding */</span><br><span style="color: hsl(120, 100%, 40%);">+         MNCC.send(ts_MNCC_CALL_PROC_req(cpars.mncc_callref, cpars.mncc_bearer_cap));</span><br><span style="color: hsl(120, 100%, 40%);">+          BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(cpars.transaction_id)));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                interleave {</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(0, 100%, 40%);">-              [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">-                  var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(0, 100%, 40%);">-                  MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* Alerting */</span><br><span style="color: hsl(0, 100%, 40%);">-                  MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               /* expect AoIP IP/Port to match what we returned in CRCX_ACK above */</span><br><span style="color: hsl(0, 100%, 40%);">-           [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span style="color: hsl(0, 100%, 40%);">-                   var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(0, 100%, 40%);">-                        tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span style="color: hsl(0, 100%, 40%);">-                      codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span style="color: hsl(0, 100%, 40%);">-                       BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(0, 100%, 40%);">-                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Alerting */</span><br><span style="color: hsl(120, 100%, 40%);">+                MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template TransportLayerAddress rab_tla := ?; /* FIXME: encode the mgw_rtp_ip_bss/mgw_rtp_port_bss */</span><br><span style="color: hsl(0, 100%, 40%);">-                var template RAB_SetupOrModifyList rab_sml := tr_RAB_SML(rab_id := ?, tla := rab_tla, binding_id := ?);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             interleave {</span><br><span style="color: hsl(0, 100%, 40%);">-            /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(0, 100%, 40%);">-              [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">-                  var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(0, 100%, 40%);">-                  MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+    //[g_pars.ran_is_geran] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+       [] BSSAP.receive(tr_BSSMAP_AssignmentReq(omit, tla_ass)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            log("f_mo_call_establish 4: rx Assignment Request");</span><br><span style="color: hsl(120, 100%, 40%);">+                var BSSMAP_IE_AoIP_TransportLayerAddress tla;</span><br><span style="color: hsl(120, 100%, 40%);">+         var BSSMAP_IE_SpeechCodec codec;</span><br><span style="color: hsl(120, 100%, 40%);">+              tla := valueof(ts_BSSMAP_IE_AoIP_TLA4(f_inet_addr(cpars.bss_rtp_ip), cpars.bss_rtp_port));</span><br><span style="color: hsl(120, 100%, 40%);">+            codec := valueof(ts_BSSMAP_IE_SpeechCodec({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+             BSSAP.send(ts_BSSMAP_AssignmentComplete(omit, tla, codec));</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     /*</span><br><span style="color: hsl(120, 100%, 40%);">+    [!g_pars.ran_is_geran] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           //BSSAP.send(ts_RANAP_RabAssResp(rab_sml)); FIXME</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                  /* Alerting */</span><br><span style="color: hsl(0, 100%, 40%);">-                  MNCC.send(ts_MNCC_ALERT_req(cpars.mncc_callref));</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* MDCX setting up the RAN side remote RTP address received from Assignment Complete */</span><br><span style="color: hsl(120, 100%, 40%);">+       [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+               log("f_mo_call_establish 5: rx MDCX for the RAN side");</span><br><span style="color: hsl(120, 100%, 40%);">+             var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     hex2str(cpars.mgcp_call_id), "42",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  cpars.mgw_rtp_port_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       { int2str(cpars.rtp_payload_type) },</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                               cpars.rtp_sdp_format)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         valueof(ts_SDP_ptime(20)) }));</span><br><span style="color: hsl(120, 100%, 40%);">+              MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Second MGCP CRCX (this time for MSS/CN side) */</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MGCP.receive(tr_CRCX(cpars.mgcp_ep)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+                log("f_mo_call_establish 6: rx 2nd CRCX, for CN side");</span><br><span style="color: hsl(120, 100%, 40%);">+             var SDP_Message sdp := valueof(ts_SDP_CRCX_CN(cpars));</span><br><span style="color: hsl(120, 100%, 40%);">+                MGCP.send(ts_CRCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           [] BSSAP.receive(tr_RANAP_RabAssReq(rab_sml)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 //BSSAP.send(ts_RANAP_RabAssResp(rab_sml)); FIXME</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+               log("f_mo_call_establish 7: rx CC Alerting");</span><br><span style="color: hsl(120, 100%, 40%);">+               cpars.mncc_callref := mncc.u.signal.callref;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Call Proceeding */</span><br><span style="color: hsl(120, 100%, 40%);">+         MNCC.send(ts_MNCC_RTP_CONNECT(cpars.mncc_callref,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           /* ip 42.23.11.5 */ hex2int('42231105'H),</span><br><span style="color: hsl(120, 100%, 40%);">+                                             /* port 423 */ 423,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           /* payload type 3 = GSM FR */ 3));</span><br><span style="color: hsl(120, 100%, 40%);">+              MNCC.send(ts_MNCC_SETUP_rsp(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   [] MNCC.receive(tr_MNCC_SETUP_COMPL_ind(?)) -> value mncc {</span><br><span style="color: hsl(120, 100%, 40%);">+                log("f_mo_call_establish 8: rx MNCC SETUP COMPLETE ind");</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* second MDCX setting up the CN side remote RTP address and codec received from MNCC RTP CONNECT */</span><br><span style="color: hsl(120, 100%, 40%);">+  [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+               log("f_mo_call_establish 9: rx MDCX for CN side");</span><br><span style="color: hsl(120, 100%, 40%);">+          var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     hex2str(cpars.mgcp_call_id), "42",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  cpars.mgw_rtp_port_mss,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       { int2str(cpars.rtp_payload_type) },</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  { valueof(ts_SDP_rtpmap(cpars.rtp_payload_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                               cpars.rtp_sdp_format)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         valueof(ts_SDP_ptime(20)) }));</span><br><span style="color: hsl(120, 100%, 40%);">+              MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, cpars.mgcp_connection_id_mss, sdp));</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CONNECT(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                log("f_mo_call_establish 10: rx CC CONNECT");</span><br><span style="color: hsl(120, 100%, 40%);">+               BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT_ACK(cpars.transaction_id)));</span><br><span>          }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Answer. MNCC_SETUP_RSP -> CONNECT to MS; CONNECT_ACK from MS */</span><br><span style="color: hsl(0, 100%, 40%);">-   MNCC.send(ts_MNCC_SETUP_rsp(cpars.mncc_callref));</span><br><span style="color: hsl(0, 100%, 40%);">-       BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CONNECT(cpars.transaction_id)));</span><br><span style="color: hsl(0, 100%, 40%);">-      BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_CONNECT_ACK(cpars.transaction_id)));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+   log("f_mo_call_establish DONE");</span><br><span>   setverdict(pass);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_optional_mgcp_mdcx() runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MGCP.receive(tr_MDCX) {};</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_call_hangup(inout CallParameters cpars, boolean release_by_ms, boolean is_csfb := false)</span><br><span> runs on BSC_ConnHdlr {</span><br><span> </span><br><span>@@ -853,63 +939,81 @@</span><br><span>       var MNCC_PDU mncc;</span><br><span>   var MgcpCommand mgcp_cmd;</span><br><span>    var boolean respond_to_dlcx;</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean dlcx_contained_ci := false;</span><br><span style="color: hsl(120, 100%, 40%);">+       var template PDU_BSSAP t_clear := tr_BSSMAP_ClearCommand;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (is_csfb) {</span><br><span style="color: hsl(120, 100%, 40%);">+                t_clear := tr_BSSMAP_ClearCommandCSFB;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  MNCC.send(ts_MNCC_DISC_req(cpars.mncc_callref, valueof(ts_MNCC_cause(23))));</span><br><span>         BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   log("f_call_hangup 1: rx DTAP CC DISC");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         if (release_by_ms) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var BIT1 tid_remote := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (cpars.mo_call) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  tid_remote := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>            /* B-side (MS) Release of call */</span><br><span style="color: hsl(0, 100%, 40%);">-               BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_RELEASE(cpars.transaction_id, '1'B, '0000000'B)));</span><br><span style="color: hsl(120, 100%, 40%);">+             BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_RELEASE(cpars.transaction_id, tid_remote, '0000000'B)));</span><br><span>              MNCC.receive(tr_MNCC_REL_ind(cpars.mncc_callref));</span><br><span style="color: hsl(120, 100%, 40%);">+            log("f_call_hangup 2: rx MNCC REL ind");</span><br><span>           BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_REL_COMPL(cpars.transaction_id)));</span><br><span style="color: hsl(120, 100%, 40%);">+          log("f_call_hangup 3: rx DTAP CC REL COMPL");</span><br><span>      } else {</span><br><span>             /* A-side (PLMN) Release of call */</span><br><span>          MNCC.send(ts_MNCC_REL_req(cpars.mncc_callref, valueof(ts_MNCC_cause(42))));</span><br><span>          BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id)));</span><br><span style="color: hsl(120, 100%, 40%);">+            log("f_call_hangup 4: rx DTAP CC RELEASE");</span><br><span>                BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id)));</span><br><span>    }</span><br><span> </span><br><span>        respond_to_dlcx := not (isbound(cpars.mgw_drop_dlcx) and valueof(cpars.mgw_drop_dlcx));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             /* clearing of radio channel */</span><br><span style="color: hsl(0, 100%, 40%);">- if (g_pars.ran_is_geran) {</span><br><span style="color: hsl(0, 100%, 40%);">-              var template PDU_BSSAP t_clear := tr_BSSMAP_ClearCommand;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (is_csfb) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  t_clear := tr_BSSMAP_ClearCommandCSFB;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(120, 100%, 40%);">+     var default mdcx := activate(as_optional_mgcp_mdcx());</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              interleave {</span><br><span style="color: hsl(0, 100%, 40%);">-            [] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span style="color: hsl(0, 100%, 40%);">-                    BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (respond_to_dlcx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          /* TODO: For one or all connections on EP? */</span><br><span style="color: hsl(0, 100%, 40%);">-                           MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span style="color: hsl(0, 100%, 40%);">-                                f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span style="color: hsl(0, 100%, 40%);">-                 }</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* clearing of radio channel */</span><br><span style="color: hsl(120, 100%, 40%);">+       interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  //[g_pars.ran_is_geran] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+      [] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+           log("f_call_hangup 5: rx BSSAP Clear Command");</span><br><span style="color: hsl(120, 100%, 40%);">+             BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+          BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+          log("f_call_hangup 6: rx SCCP DISC");</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                var template RANAP_PDU t_iurel := tr_RANAP_IuReleaseCommand(?);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (is_csfb) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  /* FIXME! */</span><br><span style="color: hsl(120, 100%, 40%);">+  /*</span><br><span style="color: hsl(120, 100%, 40%);">+    [!g_pars.ran_is_geran] BSSAP.receive(t_iurel) {</span><br><span style="color: hsl(120, 100%, 40%);">+               BSSAP.send(ts_RANAP_IuReleaseComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+               BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span>                 }</span><br><span style="color: hsl(0, 100%, 40%);">-               interleave {</span><br><span style="color: hsl(0, 100%, 40%);">-            [] BSSAP.receive(t_iurel) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     BSSAP.send(ts_RANAP_IuReleaseComplete);</span><br><span style="color: hsl(0, 100%, 40%);">-                 BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-               [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+    [] MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("f_call_hangup 7: rx MGCP DLCX");</span><br><span>                      if (respond_to_dlcx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          /* TODO: For one or all connections on EP? */</span><br><span>                                MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span style="color: hsl(0, 100%, 40%);">-                                f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span>                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     dlcx_contained_ci := f_MgcpCmd_contains_par(mgcp_cmd, "I");</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Two DLCXes expected, one for RAN and one for CN side.</span><br><span style="color: hsl(120, 100%, 40%);">+       * Unless the first DLCX did not contain a CI, in which case it was a wildcard DLCX for both. */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (dlcx_contained_ci) {</span><br><span style="color: hsl(120, 100%, 40%);">+              MGCP.receive(tr_DLCX(?)) -> value mgcp_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+                       log("f_call_hangup 8: rx MGCP DLCX");</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (respond_to_dlcx) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                MGCP.send(ts_DLCX_ACK2(mgcp_cmd.line.trans_id));</span><br><span>                     }</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_mgcp_delete_ep(cpars.mgcp_ep);</span><br><span style="color: hsl(120, 100%, 40%);">+       log("f_call_hangup 9: done");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     deactivate(mdcx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  setverdict(pass);</span><br><span> }</span><br><span> </span><br><span>diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn</span><br><span>index d4be96b..709a73c 100644</span><br><span>--- a/msc/MSC_Tests.ttcn</span><br><span>+++ b/msc/MSC_Tests.ttcn</span><br><span>@@ -157,8 +157,16 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private altstep as_optional_cc_rel(CallParameters cpars) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) { repeat; };</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_optional_cc_rel(CallParameters cpars, boolean respond := false) runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(cpars.transaction_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (respond) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                var BIT1 tid_remote := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+                          if (cpars.mo_call) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                  tid_remote := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+                           }</span><br><span style="color: hsl(120, 100%, 40%);">+                             BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_REL_COMPL(cpars.transaction_id, tid_remote)));</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span> }</span><br><span> </span><br><span> function f_init_smpp(charstring id) runs on MTC_CT {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13616">change 13616</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13616"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I162985045bb5e129977a3a797b656e30220990df </div>
<div style="display:none"> Gerrit-Change-Number: 13616 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>