<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14493">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP<br><br>Change-Id: I21ffcaa241e4fc0bd2c6563e21f1c8bdb4d14dd6<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/MSC_ConnectionHandler.ttcn<br>M library/BSSMAP_Templates.ttcn<br>3 files changed, 94 insertions(+), 3 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/93/14493/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index 00995bf..37e1bf8 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -1233,6 +1233,20 @@</span><br><span>         setverdict(pass);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Verify MGCP muxed over IPA from MSC (or BSC-NAT) is forwarded to MGW by BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_assignment_mgcp_ipa() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.forward_mgcp_ipa := true;</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_TC_assignment_codec), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_bssap_tx_ud(template PDU_BSSAP bssap) runs on test_CT {</span><br><span>     BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, bssap));</span><br><span> }</span><br><span>@@ -1717,6 +1731,7 @@</span><br><span>        }</span><br><span>    connect(vc_conn:BSSAP, g_bssap.vc_RAN:CLIENT);</span><br><span>       connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(vc_conn:MGCP_MSC_CLIENT, g_bssap.vc_RAN:MGCP)</span><br><span> }</span><br><span> </span><br><span> function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars := omit)</span><br><span>@@ -4018,6 +4033,7 @@</span><br><span>  execute( TC_ctrl() );</span><br><span>        if (mp_bssap_cfg.transport == BSSAP_TRANSPORT_SCCPlite_SERVER) {</span><br><span>             execute( TC_ctrl_location() );</span><br><span style="color: hsl(120, 100%, 40%);">+                execute( TC_assignment_mgcp_ipa() );</span><br><span>         }</span><br><span> </span><br><span>        /* RSL DCHAN Channel ACtivation / Deactivation */</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index c709794..870103f 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -15,6 +15,7 @@</span><br><span> import from General_Types all;</span><br><span> import from Osmocom_Types all;</span><br><span> import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span> import from SCCPasp_Types all;</span><br><span> import from BSSAP_Types all;</span><br><span> import from RAN_Emulation all;</span><br><span>@@ -23,6 +24,7 @@</span><br><span> import from IPL4asp_Types all;</span><br><span> import from Native_Functions all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_CodecPort all;</span><br><span> import from MGCP_Types all;</span><br><span> import from MGCP_Templates all;</span><br><span> import from MGCP_Emulation all;</span><br><span>@@ -357,9 +359,19 @@</span><br><span>         port RAN_PROC_PT RAN;</span><br><span>        port TELNETasp_PT BSCVTY;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Proxy MGCP-over-IPA and MGCP-over-UDP */</span><br><span style="color: hsl(120, 100%, 40%);">+   //var MGCP_Adapter_CT vc_MGCP_UDP;</span><br><span style="color: hsl(120, 100%, 40%);">+    port IPA_MGCP_PT MGCP_MSC_CLIENT;</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer g_trans_id := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  var MgcpConnectionId g_mgcp_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       var MediaState g_media;</span><br><span>      var TestHdlrParams g_pars;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring host_bts := "127.0.0.2";</span><br><span style="color: hsl(120, 100%, 40%);">+     var charstring host_mgw := "127.0.0.3";</span><br><span style="color: hsl(120, 100%, 40%);">+     var charstring host_msc := "127.0.0.4";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  var boolean g_vty_initialized := false;</span><br><span> }</span><br><span> </span><br><span>@@ -372,6 +384,19 @@</span><br><span>              f_vty_transceive(BSCVTY, "enable");</span><br><span>                g_vty_initialized := true;</span><br><span>   }</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%);">+       if (g_pars.forward_mgcp_ipa) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vc_MGCP_UDP := MGCP_Adapter_CT.create(int2str(i) & "-MGCP_UDP");</span><br><span style="color: hsl(120, 100%, 40%);">+                connect(vc_BSSMAP:MGCP, vc_MGCP_UDP:MGCP);</span><br><span style="color: hsl(120, 100%, 40%);">+            vc_MGCP_UDP.start(MGCP_Adapter.main());</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%);">+private function get_next_trans_id() runs on MSC_ConnHdlr return MgcpTransId {</span><br><span style="color: hsl(120, 100%, 40%);">+      var MgcpTransId tid := int2str(g_trans_id);</span><br><span style="color: hsl(120, 100%, 40%);">+   g_trans_id := g_trans_id + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ return tid;</span><br><span> }</span><br><span> </span><br><span> /* Callback function from general RAN_Emulation whenever a connectionless</span><br><span>@@ -453,7 +478,8 @@</span><br><span>      TestHdlrParamsLcls lcls,</span><br><span>     TestHdlrParamsHandover handover optional,</span><br><span>    boolean         aoip,</span><br><span style="color: hsl(0, 100%, 40%);">-   boolean         use_osmux</span><br><span style="color: hsl(120, 100%, 40%);">+     boolean         use_osmux,</span><br><span style="color: hsl(120, 100%, 40%);">+    boolean         forward_mgcp_ipa /* only used for SCCPLite: Forward MGCP towards BSC's attached MGW over BSC<->MSC IPA conn */</span><br><span> };</span><br><span> </span><br><span> /* Note: Do not use valueof() to get a value of this template, use</span><br><span>@@ -478,7 +504,8 @@</span><br><span>       },</span><br><span>   handover := omit,</span><br><span>    aoip := true,</span><br><span style="color: hsl(0, 100%, 40%);">-   use_osmux := false</span><br><span style="color: hsl(120, 100%, 40%);">+    use_osmux := false,</span><br><span style="color: hsl(120, 100%, 40%);">+   forward_mgcp_ipa := false</span><br><span> }</span><br><span> </span><br><span> function f_create_chan_and_exp() runs on MSC_ConnHdlr {</span><br><span>@@ -846,6 +873,30 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Send a MGCP request + receive a (matching!) response */</span><br><span style="color: hsl(120, 100%, 40%);">+function mgcp_transceive_mgw(template MgcpCommand cmd, template MgcpResponse resp := ?) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        template MgcpResponse resp_any := ?</span><br><span style="color: hsl(120, 100%, 40%);">+   var MgcpResponse resp_val;</span><br><span style="color: hsl(120, 100%, 40%);">+    resp.line.trans_id := cmd.line.trans_id;</span><br><span style="color: hsl(120, 100%, 40%);">+      timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.send(cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] BSSAP.receive(resp) -> value resp_val { }</span><br><span style="color: hsl(120, 100%, 40%);">+               [] BSSAP.receive(resp_any) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "Response didn't match template");</span><br><span style="color: hsl(120, 100%, 40%);">+                     mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             [] BSSAP.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+          [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "Timeout waiting for response to ", cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+                  mtc.stop;</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%);">+     T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Helper function to check if the activity on the MGCP matches what we</span><br><span>  * expected */</span><br><span> function f_check_mgcp_expectations() runs on MSC_ConnHdlr {</span><br><span>@@ -878,7 +929,7 @@</span><br><span>               codecType := FR_AMR;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   f_MscConnHdlr_init(g_pars.media_nr, "127.0.0.2", "127.0.0.3", codecType);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_MscConnHdlr_init(g_pars.media_nr, host_bts, host_mgw, codecType);</span><br><span> </span><br><span>      /* patch in the LCLS related items, as needed */</span><br><span>     f_ass_patch_lcls(ass_tpl, exp_ass_cpl);</span><br><span>@@ -964,6 +1015,7 @@</span><br><span>                       g_media.mgcp_conn[0].mdcx_seen_exp := 1;</span><br><span>                     g_media.mgcp_conn[1].crcx_seen_exp := 0;</span><br><span>                     g_media.mgcp_conn[1].mdcx_seen_exp := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* FIXME: may want to add something here */</span><br><span>          } else {</span><br><span>                     g_media.mgcp_conn[0].crcx_seen_exp := 1;</span><br><span>                     g_media.mgcp_conn[0].mdcx_seen_exp := 1;</span><br><span>@@ -1028,6 +1080,24 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.forward_mgcp_ipa) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* With SCCPLite, connect to BSC-located MGW using a CRCX + SDP.</span><br><span style="color: hsl(120, 100%, 40%);">+                 It is sent in MGCP over IPA in the BSC<->MSC (BSC-NAT)</span><br><span style="color: hsl(120, 100%, 40%);">+                  connection. BSC will forward it to its MGW. */</span><br><span style="color: hsl(120, 100%, 40%);">+             var template MgcpCommand cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+         var template MgcpResponse resp := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+          var integer cic := f_bssmap_ie_cic_2_int(ass_cmd.pdu.bssmap.assignmentRequest.circuitIdentityCode);</span><br><span style="color: hsl(120, 100%, 40%);">+           var MgcpEndpoint ep := int2str(cic) & "@mgw"; /* 1: matches value configured in BSC_Tests.ttcn pass in AssignReq */</span><br><span style="color: hsl(120, 100%, 40%);">+             var MgcpCallId call_id := '51234'H;</span><br><span style="color: hsl(120, 100%, 40%);">+           var SDP_attribute_list attributes := { valueof(ts_SDP_ptime(20)) };</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd := ts_CRCX(get_next_trans_id(), ep, "sendrecv", call_id);</span><br><span style="color: hsl(120, 100%, 40%);">+               cmd.sdp := ts_SDP(host_msc, host_mgw, "23", "42",</span><br><span style="color: hsl(120, 100%, 40%);">+                      14000, { int2str(g_media.mgcp_conn[0].rtp_pt) },</span><br><span style="color: hsl(120, 100%, 40%);">+                      { valueof(ts_SDP_ptime(20)) });</span><br><span style="color: hsl(120, 100%, 40%);">+          g_mgcp_conn_id := f_mgcp_alloc_conn_id();</span><br><span style="color: hsl(120, 100%, 40%);">+             mgcp_transceive_mgw(cmd, tr_CRCX_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  f_check_mgcp_expectations();</span><br><span> </span><br><span>     if (st.is_assignment and st.assignment_done) {</span><br><span>diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn</span><br><span>index b377358..9015680 100644</span><br><span>--- a/library/BSSMAP_Templates.ttcn</span><br><span>+++ b/library/BSSMAP_Templates.ttcn</span><br><span>@@ -402,6 +402,11 @@</span><br><span>       cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5))</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow);</span><br><span style="color: hsl(120, 100%, 40%);">+  return cic;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,</span><br><span>                                                                             uint16_t udp_port,</span><br><span>                                                                           integer len) := {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/14493">change 14493</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/c/osmo-ttcn3-hacks/+/14493"/><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-Change-Id: I21ffcaa241e4fc0bd2c6563e21f1c8bdb4d14dd6 </div>
<div style="display:none"> Gerrit-Change-Number: 14493 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>