<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/14046">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mgw: Add 2 CRCX tests with Osmux enabled<br><br>This patch requires "osmux on" to be set in osmo-mgw's VTY cfg file.<br><br>Depends: osmo-mgw.git Iac073f1db46569b46eddeaecc9934a2986bd50f1<br>Change-Id: Ibb58b2a4e08d6f30cfe347c217794d0d1310954f<br>---<br>M library/MGCP_Templates.ttcn<br>M library/MGCP_Types.ttcn<br>M mgw/MGCP_Test.ttcn<br>M mgw/expected-results.xml<br>4 files changed, 105 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/46/14046/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 506100f..9e6f5b7 100644</span><br><span>--- a/library/MGCP_Templates.ttcn</span><br><span>+++ b/library/MGCP_Templates.ttcn</span><br><span>@@ -49,6 +49,12 @@</span><br><span>            val := hex2str(cid)</span><br><span>  };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* Osmocom extension: X-Osmux: {*,%u} */</span><br><span style="color: hsl(120, 100%, 40%);">+      template MgcpParameter ts_MgcpParOsmuxCID(MgcpOsmuxCID osmux_cid) := {</span><br><span style="color: hsl(120, 100%, 40%);">+                code := "X-OSMUX",</span><br><span style="color: hsl(120, 100%, 40%);">+          val := f_mgcp_osmux_cid_encode(osmux_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* osmo-bsc_mgcp implements L/C/M/X only, osmo-mgw adds 'I' */</span><br><span>       /* SDP: osmo-bsc_mgcp implements Tx of v,o,s,c,t,m,a */</span><br><span> </span><br><span>@@ -89,6 +95,18 @@</span><br><span>             sdp := sdp</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template MgcpCommand ts_CRCX_osmux(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+           line := t_MgcpCmdLine("CRCX", trans_id, ep),</span><br><span style="color: hsl(120, 100%, 40%);">+                params := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   t_MgcpParConnMode(mode),</span><br><span style="color: hsl(120, 100%, 40%);">+                      ts_MgcpParCallId(call_id),</span><br><span style="color: hsl(120, 100%, 40%);">+                    //t_MgcpParReqId(omit),</span><br><span style="color: hsl(120, 100%, 40%);">+                       t_MgcpParLocConnOpt("p:20, a:AMR"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 ts_MgcpParOsmuxCID(osmux_cid)</span><br><span style="color: hsl(120, 100%, 40%);">+         },</span><br><span style="color: hsl(120, 100%, 40%);">+            sdp := sdp</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  template MgcpCommand tr_CRCX(template MgcpEndpoint ep := ?) := {</span><br><span>             line := t_MgcpCmdLine("CRCX", ?, ep),</span><br><span>              params := *,</span><br><span>@@ -105,6 +123,16 @@</span><br><span>          sdp := ?</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template MgcpResponse tr_CRCX_ACK_osmux := {</span><br><span style="color: hsl(120, 100%, 40%);">+          line := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     code := "200",</span><br><span style="color: hsl(120, 100%, 40%);">+                      trans_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                        string := "OK"</span><br><span style="color: hsl(120, 100%, 40%);">+              },</span><br><span style="color: hsl(120, 100%, 40%);">+            params:= { { "I", ? }, {"X-OSMUX", ?}, *},</span><br><span style="color: hsl(120, 100%, 40%);">+                sdp := ?</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  template MgcpResponse ts_CRCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := {</span><br><span>             line := {</span><br><span>                    code := "200",</span><br><span>@@ -286,6 +314,24 @@</span><br><span>              }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* -1 is wildcard, positive is translated as string */</span><br><span style="color: hsl(120, 100%, 40%);">+        function f_mgcp_osmux_cid_encode(MgcpOsmuxCID osmux_cid) return charstring {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (osmux_cid < -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return "ERROR-wrong-negative-value";</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (osmux_cid == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        return "*";</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             return int2str(osmux_cid);</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%);">+   function f_mgcp_osmux_cid_decode(charstring osmux_cid) return MgcpOsmuxCID {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (osmux_cid == "*") {</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             return str2int(osmux_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  function f_mgcp_contains_par(MgcpMessage msg, MgcpInfoCode code) return boolean {</span><br><span>            var MgcpParameterList pars;</span><br><span>          if (ischosen(msg.command)) {</span><br><span>@@ -352,6 +398,10 @@</span><br><span>          return str2hex(f_MgcpCmd_extract_par(cmd, "I"));</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ function f_MgcpCmd_extract_osmux_cid(MgcpCommand cmd) return MgcpOsmuxCID {</span><br><span style="color: hsl(120, 100%, 40%);">+           return f_mgcp_osmux_cid_decode(f_MgcpCmd_extract_par(cmd, "X-OSMUX"));</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span>      function f_mgcp_alloc_tid() return MgcpTransId {</span><br><span>             return int2str(float2int(rnd()*2147483647.0));</span><br><span>diff --git a/library/MGCP_Types.ttcn b/library/MGCP_Types.ttcn</span><br><span>index 8e11c7a..b56734c 100644</span><br><span>--- a/library/MGCP_Types.ttcn</span><br><span>+++ b/library/MGCP_Types.ttcn</span><br><span>@@ -24,13 +24,14 @@</span><br><span>        type hexstring MgcpCallId       length(1..32);  /* 3.2.2.2 */</span><br><span>        type hexstring MgcpConnectionId length(1..32);  /* 3.2.2.5 */</span><br><span>        type hexstring MgcpRequestId    length(1..32);  /* 3.2.2.18 */</span><br><span style="color: hsl(120, 100%, 40%);">+        type integer MgcpOsmuxCID       (-1 .. 255);</span><br><span>         type charstring MgcpResponseCode (pattern "\d#(3)");</span><br><span> </span><br><span>   type charstring MgcpInfoCode ("B", "C", "I", "N", "X", "L", "M", "R",</span><br><span>                                      "S", "D", "O", "P", "E", "Z", "Q", "T",</span><br><span>                                      "RC", "LC", "A", "ES", "RM", "RD", "PL",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  "MD", "X-Osmo-CP") with {</span><br><span style="color: hsl(0, 100%, 40%);">-             variant "TEXT_CODING(,convert=upper_case,'([BCINXLMRSDOPEZQTA])|(RC)|(LC)|(ES)|(RM)|(RD)|(PL)|(MD)|(X-Osmo-CP)',case_insensitive)"</span><br><span style="color: hsl(120, 100%, 40%);">+                                "MD", "X-OSMO-CP", "X-OSMUX") with {</span><br><span style="color: hsl(120, 100%, 40%);">+              variant "TEXT_CODING(,convert=upper_case,'([BCINXLMRSDOPEZQTA])|(RC)|(LC)|(ES)|(RM)|(RD)|(PL)|(MD)|(X-OSMO-CP)|(X-OSMUX)',case_insensitive)"</span><br><span>       };</span><br><span> </span><br><span>       /* 3.2.2.6 */</span><br><span>diff --git a/mgw/MGCP_Test.ttcn b/mgw/MGCP_Test.ttcn</span><br><span>index 8cb2404..fa103c4 100644</span><br><span>--- a/mgw/MGCP_Test.ttcn</span><br><span>+++ b/mgw/MGCP_Test.ttcn</span><br><span>@@ -437,6 +437,40 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ function f_crcx_osmux(charstring ep_prefix, MgcpOsmuxCID osmux_cid) runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+                var MgcpEndpoint ep := ep_prefix & "2@" & c_mgw_domain;</span><br><span style="color: hsl(120, 100%, 40%);">+             var template MgcpCommand cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+         var MgcpResponse resp;</span><br><span style="color: hsl(120, 100%, 40%);">+                var MgcpCallId call_id := '1234'H;</span><br><span style="color: hsl(120, 100%, 40%);">+            var charstring cid_response;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                f_init(ep);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* create the connection on the MGW */</span><br><span style="color: hsl(120, 100%, 40%);">+                cmd := ts_CRCX_osmux(get_next_trans_id(), ep, "recvonly", call_id, osmux_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+              resp := mgcp_transceive_mgw(cmd, tr_CRCX_ACK_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+          extract_conn_id(resp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* extract Osmux CID we got assigned by the MGW */</span><br><span style="color: hsl(120, 100%, 40%);">+            var MgcpMessage resp_msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                 response := resp</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 (f_mgcp_find_param(resp_msg, "X-OSMUX", cid_response) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        setverdict(fail, "No Osmux CID in MGCP response", resp);</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%);">+           /* Make sure response is no wildcard */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (f_mgcp_osmux_cid_decode(cid_response) == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Osmux CID in MGCP response contains unexpected wildcard");</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%);">+           /* clean-up */</span><br><span style="color: hsl(120, 100%, 40%);">+                f_dlcx_ok(ep, call_id);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* test valid CRCX without SDP */</span><br><span>    testcase TC_crcx() runs on dummy_CT {</span><br><span>                f_crcx(c_mgw_ep_rtpbridge);</span><br><span>@@ -791,6 +825,18 @@</span><br><span>           setverdict(pass);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* test valid CRCX without SDP */</span><br><span style="color: hsl(120, 100%, 40%);">+     testcase TC_crcx_osmux_wildcard() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_crcx_osmux(c_mgw_ep_rtpbridge, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(pass);</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%);">+   /* test valid CRCX without SDP */</span><br><span style="color: hsl(120, 100%, 40%);">+     testcase TC_crcx_osmux_fixed() runs on dummy_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_crcx_osmux(c_mgw_ep_rtpbridge, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  function f_crcx_and_dlcx_ep_callid_connid(MgcpEndpoint ep, MgcpCallId call_id) runs on dummy_CT {</span><br><span>            var template MgcpCommand cmd;</span><br><span>                var MgcpResponse resp;</span><br><span>@@ -1482,6 +1528,9 @@</span><br><span>               execute(TC_crcx_and_dlcx_ep_callid_connid_inval());</span><br><span>          execute(TC_crcx_and_dlcx_retrans());</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+              execute(TC_crcx_osmux_wildcard());</span><br><span style="color: hsl(120, 100%, 40%);">+            execute(TC_crcx_osmux_fixed());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>            execute(TC_crcx_dlcx_30ep());</span><br><span> </span><br><span>            execute(TC_rtpem_selftest());</span><br><span>diff --git a/mgw/expected-results.xml b/mgw/expected-results.xml</span><br><span>index 5c520c5..f968859 100644</span><br><span>--- a/mgw/expected-results.xml</span><br><span>+++ b/mgw/expected-results.xml</span><br><span>@@ -1,5 +1,5 @@</span><br><span> <?xml version="1.0"?></span><br><span style="color: hsl(0, 100%, 40%);">-<testsuite name='Titan' tests='35' failures='0' errors='0' skipped='1' inconc='0' time='MASKED'></span><br><span style="color: hsl(120, 100%, 40%);">+<testsuite name='Titan' tests='37' failures='0' errors='0' skipped='1' inconc='0' time='MASKED'></span><br><span>   <testcase classname='MGCP_Test' name='TC_selftest' time='MASKED'></span><br><span>     <skipped>no verdict</skipped></span><br><span>   </testcase></span><br><span>@@ -26,6 +26,8 @@</span><br><span>   <testcase classname='MGCP_Test' name='TC_crcx_and_dlcx_ep_callid_inval' time='MASKED'/></span><br><span>   <testcase classname='MGCP_Test' name='TC_crcx_and_dlcx_ep_callid_connid_inval' time='MASKED'/></span><br><span>   <testcase classname='MGCP_Test' name='TC_crcx_and_dlcx_retrans' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MGCP_Test' name='TC_crcx_osmux_wildcard' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='MGCP_Test' name='TC_crcx_osmux_fixed' time='MASKED'/></span><br><span>   <testcase classname='MGCP_Test' name='TC_crcx_dlcx_30ep' time='MASKED'/></span><br><span>   <testcase classname='MGCP_Test' name='TC_rtpem_selftest' time='MASKED'/></span><br><span>   <testcase classname='MGCP_Test' name='TC_one_crcx_receive_only_rtp' time='MASKED'/></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14046">change 14046</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/14046"/><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: Ibb58b2a4e08d6f30cfe347c217794d0d1310954f </div>
<div style="display:none"> Gerrit-Change-Number: 14046 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>