<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13616">View Change</a></p><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/MGCP_Templates.ttcn<br>M library/MNCC_Types.ttcn<br>M msc/BSC_ConnectionHandler.ttcn<br>3 files changed, 185 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/16/13616/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><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 8e5c5f2..833c31f 100644</span><br><span>--- a/msc/BSC_ConnectionHandler.ttcn</span><br><span>+++ b/msc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -479,12 +479,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>@@ -493,6 +496,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>@@ -521,6 +525,7 @@</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(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span>                                                    hex2str(cpars.mgcp_call_id), "42",</span><br><span>                                                         cpars.mgw_rtp_port_mss,</span><br><span>@@ -529,25 +534,64 @@</span><br><span>                                                                              cpars.rtp_sdp_format)),</span><br><span>                                                        valueof(ts_SDP_ptime(20)) }));</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 style="color: hsl(120, 100%, 40%);">+         }</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>               }</span><br><span> </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> </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_mt_call_establish(inout CallParameters cpars)</span><br><span>@@ -588,15 +632,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>@@ -619,13 +668,43 @@</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%);">-   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(0, 100%, 40%);">-      interleave {</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 style="color: hsl(120, 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 style="color: hsl(120, 100%, 40%);">+             };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* expect AoIP IP/Port to match what we returned in CRCX_ACK above */</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%);">+   /* 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 style="color: hsl(120, 100%, 40%);">+</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_mo_call_establish 6: rx 2nd CRCX, for CN side");</span><br><span>            var SDP_Message sdp := valueof(ts_SDP(cpars.mgw_rtp_ip_mss, cpars.mgw_rtp_ip_mss,</span><br><span>                                                    hex2str(cpars.mgcp_call_id), "42",</span><br><span>                                                         cpars.mgw_rtp_port_mss,</span><br><span>@@ -634,31 +713,50 @@</span><br><span>                                                                              cpars.rtp_sdp_format)),</span><br><span>                                                        valueof(ts_SDP_ptime(20)) }));</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%);">-</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>            }</span><br><span> </span><br><span>        [] 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>            }</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(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>@@ -666,6 +764,7 @@</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>      var template PDU_BSSAP t_clear := tr_BSSMAP_ClearCommand;</span><br><span> </span><br><span>        if (is_csfb) {</span><br><span>@@ -676,11 +775,13 @@</span><br><span>       BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(cpars.transaction_id)));</span><br><span> </span><br><span>  if (release_by_ms) {</span><br><span style="color: hsl(120, 100%, 40%);">+          log("f_call_hangup 1a");</span><br><span>           /* B-side (MS) Release of call */</span><br><span>            BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_RELEASE(cpars.transaction_id, '1'B, '0000000'B)));</span><br><span>            MNCC.receive(tr_MNCC_REL_ind(cpars.mncc_callref));</span><br><span>           BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_REL_COMPL(cpars.transaction_id)));</span><br><span>         } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("f_call_hangup 1b");</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>@@ -689,21 +790,42 @@</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(120, 100%, 40%);">+   var default mdcx := activate(as_optional_mgcp_mdcx());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* clearing of radio channel */</span><br><span>      interleave {</span><br><span>         [] BSSAP.receive(t_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+           log("f_call_hangup 2");</span><br><span>            BSSAP.send(ts_BSSMAP_ClearComplete);</span><br><span>                 BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+                log("f_call_hangup 3");</span><br><span>            }</span><br><span>    [] 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(120, 100%, 40%);">+                     log("f_call_hangup 4");</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 style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     dlcx_contained_ci := f_MgcpCmd_contains_par(mgcp_cmd, "I");</span><br><span>                }</span><br><span>    }</span><br><span> </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 5");</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 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%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     deactivate(mdcx);</span><br><span style="color: hsl(120, 100%, 40%);">+     log("f_call_hangup DONE");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       setverdict(pass);</span><br><span> }</span><br><span> </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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>