<p>Pau Espin Pedrol has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/14105">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: Introduce Osmux infra and one test for osmo-bsc<br><br>Test verifies once osmux is enabled in osmo-bsc, BSSMAP RESET (ACK)<br>contains Osmux Support IE and that it correctly handles BSSMAP ASsign<br>Req with Osmux CID.<br><br>Related: OS#2551<br>Depends: osmo-bsc 6de754cdde5319af3059d8fc6abf85037ec7eacc<br>Change-Id: If69c716dc06d61d810c32d1720a237c7535baca8<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/MSC_ConnectionHandler.ttcn<br>M bsc/expected-results.xml<br>M library/BSSMAP_Templates.ttcn<br>M library/MGCP_Templates.ttcn<br>M library/RAN_Emulation.ttcnpp<br>6 files changed, 170 insertions(+), 50 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/05/14105/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 0583b30..c731b7c 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -89,6 +89,9 @@</span><br><span>  /* are we initialized yet */</span><br><span>         var boolean g_initialized := false;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* Osmux is enabled through VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+    var boolean g_osmux_enabled := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      /* global test case guard timer */</span><br><span>   timer T_guard := 30.0;</span><br><span> </span><br><span>@@ -140,16 +143,16 @@</span><br><span> private function f_legacy_bssap_reset() runs on test_CT {</span><br><span>      var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span>     timer T := 5.0;</span><br><span style="color: hsl(0, 100%, 40%);">- BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0, g_osmux_enabled)));</span><br><span>       T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck)) {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck(g_osmux_enabled))) {</span><br><span>                log("Received RESET-ACK in response to RESET, we're ready to go!");</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_osmux_enabled))) -> value ud_ind {</span><br><span>                 log("Respoding to inbound RESET with RESET-ACK");</span><br><span>          BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts_BSSMAP_ResetAck));</span><br><span style="color: hsl(120, 100%, 40%);">+                         ts_BSSMAP_ResetAck(g_osmux_enabled)));</span><br><span>            repeat;</span><br><span>              }</span><br><span>    [] BSSAP.receive { repeat; }</span><br><span>@@ -257,15 +260,15 @@</span><br><span>                         mtc.stop;</span><br><span>            }</span><br><span>    /* always respond with RESET ACK to RESET */</span><br><span style="color: hsl(0, 100%, 40%);">-    [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_osmux_enabled))) -> value ud_ind {</span><br><span>                 BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts_BSSMAP_ResetAck));</span><br><span style="color: hsl(120, 100%, 40%);">+                         ts_BSSMAP_ResetAck(g_osmux_enabled)));</span><br><span>            repeat;</span><br><span>              }</span><br><span> }</span><br><span> </span><br><span> altstep no_bssmap_reset() runs on test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_osmux_enabled))) {</span><br><span>            setverdict(fail, "unexpected BSSMAP Reset");</span><br><span>               mtc.stop;</span><br><span>    }</span><br><span>@@ -289,6 +292,22 @@</span><br><span>     vc_MGCP.start(MGCP_Emulation.main(ops, mgcp_pars, id));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Enable or disable (current default) Osmux. When enabling, BSSMAP Reset</span><br><span style="color: hsl(120, 100%, 40%);">+ * contains extra IE (OsmuxSupport) and osmo-bsc will handle AssignReq with</span><br><span style="color: hsl(120, 100%, 40%);">+ * OsmuxCID IE.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_vty_allow_osmux(boolean allow) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_enter_cfg_msc(BSCVTY, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (allow) {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_transceive(BSCVTY, "osmux on");</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_vty_transceive(BSCVTY, "osmux off");</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   g_osmux_enabled := allow;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_init_vty(charstring id := "foo") runs on test_CT {</span><br><span>    if (BSCVTY.checkstate("Mapped")) {</span><br><span>                 /* skip initialization if already executed once */</span><br><span>@@ -302,7 +321,7 @@</span><br><span> /* global initialization function</span><br><span>  * \param nr_bts Number of BTSs we should start/bring up</span><br><span>  * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false) */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_init(integer nr_bts := NUM_BTS, boolean handler_mode := false) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init(integer nr_bts := NUM_BTS, boolean handler_mode := false, boolean allow_osmux := false) runs on test_CT {</span><br><span>       var integer i;</span><br><span> </span><br><span>   if (g_initialized) {</span><br><span>@@ -313,10 +332,15 @@</span><br><span>         T_guard.start;</span><br><span>       activate(as_Tguard());</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_vty("VirtMSC");</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_allow_osmux(allow_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* Call a function of our 'parent component' RAN_Adapter_CT to start the</span><br><span>      * MSC-side BSSAP emulation */</span><br><span>       if (handler_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-             f_ran_adapter_init(g_bssap, mp_bssap_cfg, "VirtMSC", MSC_RanOps);</span><br><span style="color: hsl(120, 100%, 40%);">+           var RanOps ranops := MSC_RanOps;</span><br><span style="color: hsl(120, 100%, 40%);">+              ranops.use_osmux := g_osmux_enabled;</span><br><span style="color: hsl(120, 100%, 40%);">+          f_ran_adapter_init(g_bssap, mp_bssap_cfg, "VirtMSC", ranops);</span><br><span>              f_ran_adapter_start(g_bssap);</span><br><span>        } else {</span><br><span>             f_ran_adapter_init(g_bssap, mp_bssap_cfg, "VirtMSC", omit);</span><br><span>@@ -328,7 +352,6 @@</span><br><span>  f_ipa_ctrl_start(mp_bsc_ip, mp_bsc_ctrl_port);</span><br><span> </span><br><span>   f_init_mgcp("VirtMSC");</span><br><span style="color: hsl(0, 100%, 40%);">-       f_init_vty("VirtMSC");</span><br><span> </span><br><span>         for (i := 0; i < nr_bts; i := i+1) {</span><br><span>              /* wait until osmo-bts-omldummy has respawned */</span><br><span>@@ -605,15 +628,24 @@</span><br><span> }</span><br><span> </span><br><span> /* generate an assignment request for either AoIP or SCCPlite */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_gen_ass_req() return PDU_BSSAP {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_gen_ass_req(boolean osmux_enabled := false) return PDU_BSSAP {</span><br><span>  var PDU_BSSAP ass_cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSMAP_IE_Osmo_OsmuxCID osmux_cid := valueof(ts_OsmuxCID(0));</span><br><span>    if (mp_bssap_cfg.transport == BSSAP_TRANSPORT_AoIP) {</span><br><span>                var BSSMAP_IE_AoIP_TransportLayerAddress tla :=</span><br><span>                                              valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));</span><br><span style="color: hsl(0, 100%, 40%);">-             ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));</span><br><span style="color: hsl(120, 100%, 40%);">+               if (osmux_enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla, osmux_cid));</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>    } else {</span><br><span>             var BSSMAP_IE_CircuitIdentityCode cic := valueof(ts_BSSMAP_IE_CIC(0,1));</span><br><span style="color: hsl(0, 100%, 40%);">-                ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+               if (osmux_enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit, osmux_cid));</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span>    }</span><br><span>    return ass_cmd;</span><br><span> }</span><br><span>@@ -632,13 +664,22 @@</span><br><span> }</span><br><span> </span><br><span> /* generate an assignment complete template for either AoIP or SCCPlite */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_gen_exp_compl() return template PDU_BSSAP {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_gen_exp_compl(boolean expect_osmux := false) return template PDU_BSSAP {</span><br><span>       var template PDU_BSSAP exp_compl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSMAP_IE_Osmo_OsmuxCID osmux_cid := valueof(ts_OsmuxCID(0));</span><br><span>    if (mp_bssap_cfg.transport == BSSAP_TRANSPORT_AoIP) {</span><br><span style="color: hsl(0, 100%, 40%);">-           exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (expect_osmux) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?, osmux_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    } else {</span><br><span>             /* CIC is optional "*" as the MSC allocated it */</span><br><span style="color: hsl(0, 100%, 40%);">-             exp_compl := tr_BSSMAP_AssignmentComplete(*, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (expect_osmux) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   exp_compl := tr_BSSMAP_AssignmentComplete(*, omit, osmux_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      exp_compl := tr_BSSMAP_AssignmentComplete(*, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>    }</span><br><span>    return exp_compl;</span><br><span> }</span><br><span>@@ -1002,9 +1043,9 @@</span><br><span>       IPA_RSL[0].clear;</span><br><span> </span><br><span>        /* perform BSSAP RESET, expect RESET ACK and DISC.ind on connection */</span><br><span style="color: hsl(0, 100%, 40%);">-  BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0, g_osmux_enabled)));</span><br><span>       interleave {</span><br><span style="color: hsl(0, 100%, 40%);">-    [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck)) { }</span><br><span style="color: hsl(120, 100%, 40%);">+        [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck(g_osmux_enabled))) { }</span><br><span>      [] BSSAP.receive(tr_BSSAP_DISC_ind(dt.sccp_conn_id, ?, ?)) { }</span><br><span>       }</span><br><span> </span><br><span>@@ -1491,9 +1532,9 @@</span><br><span>        f_pageing_helper('001010123456789'H, cid_list, c_BtsId_all);</span><br><span> </span><br><span>     /* Perform a BSSMAP Reset and wait for ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-   BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0)));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap.sccp_addr_peer, g_bssap.sccp_addr_own, ts_BSSMAP_Reset(0, g_osmux_enabled)));</span><br><span>       alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck)) { }</span><br><span style="color: hsl(120, 100%, 40%);">+        [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap.sccp_addr_own, g_bssap.sccp_addr_peer, tr_BSSMAP_ResetAck(g_osmux_enabled))) { }</span><br><span>      [] BSSAP.receive { repeat; }</span><br><span>         }</span><br><span> </span><br><span>@@ -1945,8 +1986,8 @@</span><br><span> type record of CodecListTest CodecListTests</span><br><span> </span><br><span> private function f_TC_assignment_codec(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-        var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span style="color: hsl(0, 100%, 40%);">-       var template PDU_BSSAP exp_compl := f_gen_exp_compl();</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_BSSAP ass_cmd := f_gen_ass_req(g_pars.use_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+     var template PDU_BSSAP exp_compl := f_gen_exp_compl(g_pars.use_osmux);</span><br><span> </span><br><span>   /* puzzle together the ASSIGNMENT REQ for given codec[s] */</span><br><span>  if (mp_bssap_cfg.transport == BSSAP_TRANSPORT_AoIP) {</span><br><span>@@ -2568,6 +2609,31 @@</span><br><span>       setverdict(pass);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_assignment_osmux() 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%);">+   /* See note above */</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_IE_Body mr_conf := {</span><br><span style="color: hsl(120, 100%, 40%);">+          other := {</span><br><span style="color: hsl(120, 100%, 40%);">+                    len := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                     payload := '2804'O</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%);">+  pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecAMR_H}));</span><br><span style="color: hsl(120, 100%, 40%);">+      pars.ass_codec_list.codecElements[0].s0_7 := '00000100'B; /* 5,90k */</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.ass_codec_list.codecElements[0].s8_15 := '00000111'B;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.expect_mr_conf_ie := mr_conf;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.use_osmux := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init(1, true, 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%);">+       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> /* test the procedure of the MSC requesting a Classmark Update:</span><br><span>  * a) BSSMAP Classmark Request should result in RR CLASSMARK ENQUIRY,</span><br><span>  * b) L3 RR CLASSMARK CHANGE should result in BSSMAP CLASSMARK UPDATE */</span><br><span>@@ -3993,6 +4059,8 @@</span><br><span>   execute( TC_assignment_codec_req_hr_fr() );</span><br><span>  execute( TC_assignment_codec_req_fr_hr() );</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_assignment_osmux() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* RLL Establish Indication on inactive DCHAN / SAPI */</span><br><span>      execute( TC_rll_est_ind_inact_lchan() );</span><br><span>     execute( TC_rll_est_ind_inval_sapi1() );</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 520cc3e..0db5630 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -263,6 +263,7 @@</span><br><span>  * MGW level media handling */</span><br><span> altstep as_Media_mgw(boolean norepeat := false) runs on MSC_ConnHdlr {</span><br><span>      var MgcpCommand mgcp_cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+     var MgcpOsmuxCID osmux_cid;</span><br><span> </span><br><span>      [] MGCP.receive(tr_CRCX) -> value mgcp_cmd {</span><br><span>              var SDP_Message sdp;</span><br><span>@@ -289,7 +290,12 @@</span><br><span>                                                  int2str(mgcp_conn.sample_rate))),</span><br><span>                            valueof(ts_SDP_ptime(mgcp_conn.ptime)) } ));</span><br><span>                 var template MgcpResponse mgcp_resp;</span><br><span style="color: hsl(0, 100%, 40%);">-            mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (g_pars.use_osmux and f_MgcpCmd_contains_par(mgcp_cmd, "X-OSMUX")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmux_cid := f_MgcpCmd_extract_osmux_cid(mgcp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+                   mgcp_resp := ts_CRCX_ACK_osmux(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, osmux_cid, sdp);</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      mgcp_resp := ts_CRCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(g_media.mgcp_ep));</span><br><span>              MGCP.send(mgcp_resp);</span><br><span>                g_media.mgcp_conn[cid].crcx_seen := g_media.mgcp_conn[cid].crcx_seen + 1;</span><br><span>@@ -364,8 +370,8 @@</span><br><span>      var template PDU_BSSAP resp := omit;</span><br><span> </span><br><span>     /* answer all RESET with a RESET ACK */</span><br><span style="color: hsl(0, 100%, 40%);">- if (match(bssap, tr_BSSMAP_Reset)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            resp := ts_BSSMAP_ResetAck;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (match(bssap, tr_BSSMAP_Reset(g_ran_ops.use_osmux))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             resp := ts_BSSMAP_ResetAck(g_ran_ops.use_osmux);</span><br><span>     }</span><br><span> </span><br><span>        return resp;</span><br><span>@@ -377,6 +383,7 @@</span><br><span>   decode_dtap := false,</span><br><span>        role_ms := false,</span><br><span>    protocol := RAN_PROTOCOL_BSSAP,</span><br><span style="color: hsl(120, 100%, 40%);">+       use_osmux := false,</span><br><span>  sccp_addr_local := omit,</span><br><span>     sccp_addr_peer := omit</span><br><span> }</span><br><span>@@ -431,7 +438,8 @@</span><br><span>    TestHdlrEncrParams encr optional,</span><br><span>    TestHdlrParamsLcls lcls,</span><br><span>     TestHdlrParamsHandover handover optional,</span><br><span style="color: hsl(0, 100%, 40%);">-       boolean         aoip</span><br><span style="color: hsl(120, 100%, 40%);">+  boolean         aoip,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean         use_osmux</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>@@ -455,7 +463,8 @@</span><br><span>              adjust_cx_exp := true</span><br><span>        },</span><br><span>   handover := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-       aoip := true</span><br><span style="color: hsl(120, 100%, 40%);">+  aoip := true,</span><br><span style="color: hsl(120, 100%, 40%);">+ use_osmux := false</span><br><span> }</span><br><span> </span><br><span> function f_create_chan_and_exp() runs on MSC_ConnHdlr {</span><br><span>diff --git a/bsc/expected-results.xml b/bsc/expected-results.xml</span><br><span>index 33bf677..ff3cce0 100644</span><br><span>--- a/bsc/expected-results.xml</span><br><span>+++ b/bsc/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='BSC_Tests' tests='105' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'></span><br><span style="color: hsl(120, 100%, 40%);">+<testsuite name='BSC_Tests' tests='106' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'></span><br><span>   <testcase classname='BSC_Tests' name='TC_ctrl_msc_connection_status' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_ctrl_msc0_connection_status' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_ctrl' time='MASKED'/></span><br><span>@@ -46,6 +46,7 @@</span><br><span>   <testcase classname='BSC_Tests' name='TC_assignment_codec_hr_exhausted_req_fr_hr' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_assignment_codec_req_hr_fr' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_assignment_codec_req_fr_hr' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='BSC_Tests' name='TC_assignment_osmux' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_rll_est_ind_inact_lchan' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_rll_est_ind_inval_sapi1' time='MASKED'/></span><br><span>   <testcase classname='BSC_Tests' name='TC_rll_est_ind_inval_sapi3' time='MASKED'/></span><br><span>diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn</span><br><span>index 02c84e2..ad314a3 100644</span><br><span>--- a/library/BSSMAP_Templates.ttcn</span><br><span>+++ b/library/BSSMAP_Templates.ttcn</span><br><span>@@ -164,47 +164,62 @@</span><br><span>       oldToNewBSSIEs := val</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+template BSSMAP_IE_Osmo_OsmuxSupport tr_BSSMAP_IE_Osmo_OsmuxSupport := {</span><br><span style="color: hsl(120, 100%, 40%);">+   elementIdentifier := 'F0'O</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 f_enc_osmux_support(boolean osmux_enabled) return template BSSMAP_IE_Osmo_OsmuxSupport {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (osmux_enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return tr_BSSMAP_IE_Osmo_OsmuxSupport;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return omit;</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%);">+template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause, boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {</span><br><span>       pdu := {</span><br><span>             bssmap := {</span><br><span>                  reset := {</span><br><span>                           messageType := '30'O,</span><br><span>                                cause := ts_BSSMAP_IE_Cause(cause),</span><br><span style="color: hsl(0, 100%, 40%);">-                             a_InterfaceSelectorForReset := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                           a_InterfaceSelectorForReset := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          osmuxSupport := f_enc_osmux_support(osmux_enabled)</span><br><span>                   }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_Reset(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {</span><br><span>         pdu := {</span><br><span>             bssmap := {</span><br><span>                  reset := {</span><br><span>                           messageType := '30'O,</span><br><span>                                cause := ?,</span><br><span style="color: hsl(0, 100%, 40%);">-                             a_InterfaceSelectorForReset := *</span><br><span style="color: hsl(120, 100%, 40%);">+                              a_InterfaceSelectorForReset := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                             osmuxSupport := f_enc_osmux_support(osmux_enabled)</span><br><span>                   }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_BSSAP ts_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := {</span><br><span>   pdu := {</span><br><span>             bssmap := {</span><br><span>                  resetAck := {</span><br><span>                                messageType := '31'O,</span><br><span style="color: hsl(0, 100%, 40%);">-                           a_InterfaceSelectorForReset := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                           a_InterfaceSelectorForReset := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          osmuxSupport := f_enc_osmux_support(osmux_enabled)</span><br><span>                   }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP tr_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := {</span><br><span>   pdu := {</span><br><span>             bssmap := {</span><br><span>                  resetAck := {</span><br><span>                                messageType := '31'O,</span><br><span style="color: hsl(0, 100%, 40%);">-                           a_InterfaceSelectorForReset := *</span><br><span style="color: hsl(120, 100%, 40%);">+                              a_InterfaceSelectorForReset := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                             osmuxSupport := f_enc_osmux_support(osmux_enabled)</span><br><span>                   }</span><br><span>            }</span><br><span>    }</span><br><span>@@ -443,9 +458,15 @@</span><br><span>     codecElements := valueof(elem)</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  elementIdentifier := 'F1'O,</span><br><span style="color: hsl(120, 100%, 40%);">+   osmuxCID := cid</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template PDU_BSSAP</span><br><span> ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-                       template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+                   template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                   template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)</span><br><span> modifies ts_BSSAP_BSSMAP := {</span><br><span>  pdu := {</span><br><span>             bssmap := {</span><br><span>@@ -472,14 +493,16 @@</span><br><span>                          globalCallReference := omit,</span><br><span>                                 lCLS_Configuration := omit,</span><br><span>                          lCLS_ConnectionStatusControl := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-                           lCLS_CorrelationNotNeeded := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                             lCLS_CorrelationNotNeeded := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            osmuxCID := osmuxCID</span><br><span>                         }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span> template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)</span><br><span> modifies tr_BSSAP_BSSMAP := {</span><br><span>  pdu := {</span><br><span>             bssmap := {</span><br><span>@@ -506,7 +529,8 @@</span><br><span>                            globalCallReference := *,</span><br><span>                            lCLS_Configuration := *,</span><br><span>                             lCLS_ConnectionStatusControl := *,</span><br><span style="color: hsl(0, 100%, 40%);">-                              lCLS_CorrelationNotNeeded := *</span><br><span style="color: hsl(120, 100%, 40%);">+                                lCLS_CorrelationNotNeeded := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                               osmuxCID := osmuxCID</span><br><span>                         }</span><br><span>            }</span><br><span>    }</span><br><span>@@ -515,7 +539,8 @@</span><br><span> template PDU_BSSAP</span><br><span> ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,</span><br><span>                         template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-                             template BSSMAP_IE_SpeechCodec speechCodec := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+                           template BSSMAP_IE_SpeechCodec speechCodec := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit)</span><br><span> modifies ts_BSSAP_BSSMAP := {</span><br><span>     pdu := {</span><br><span>             bssmap := {</span><br><span>@@ -533,14 +558,16 @@</span><br><span>                          aoIPTransportLayer := aoip,</span><br><span>                          speechCodec := speechCodec,</span><br><span>                          codecList := omit,</span><br><span style="color: hsl(0, 100%, 40%);">-                              lCLS_BSS_Status := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                               lCLS_BSS_Status := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                              osmuxCID := osmuxCID</span><br><span>                         }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span> template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)</span><br><span style="color: hsl(120, 100%, 40%);">+                                              template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *)</span><br><span> modifies tr_BSSAP_BSSMAP := {</span><br><span>     pdu := {</span><br><span>             bssmap := {</span><br><span>@@ -558,7 +585,8 @@</span><br><span>                            aoIPTransportLayer := aoip,</span><br><span>                          speechCodec := *,</span><br><span>                            codecList := *,</span><br><span style="color: hsl(0, 100%, 40%);">-                         lCLS_BSS_Status := *</span><br><span style="color: hsl(120, 100%, 40%);">+                          lCLS_BSS_Status := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                         osmuxCID := osmuxCID</span><br><span>                         }</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 123ea5b..fe2863d 100644</span><br><span>--- a/library/MGCP_Templates.ttcn</span><br><span>+++ b/library/MGCP_Templates.ttcn</span><br><span>@@ -143,6 +143,19 @@</span><br><span>            sdp := sdp</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template MgcpResponse ts_CRCX_ACK_osmux(MgcpTransId trans_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {</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 := 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:= {</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts_MgcpParConnectionId(conn_id),</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 ts_MDCX(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := {</span><br><span>              line := t_MgcpCmdLine("MDCX", trans_id, ep),</span><br><span>               params := {</span><br><span>diff --git a/library/RAN_Emulation.ttcnpp b/library/RAN_Emulation.ttcnpp</span><br><span>index 9a65eb7..41aec47 100644</span><br><span>--- a/library/RAN_Emulation.ttcnpp</span><br><span>+++ b/library/RAN_Emulation.ttcnpp</span><br><span>@@ -465,9 +465,9 @@</span><br><span> </span><br><span>   T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_ran_ops.use_osmux))) -> value ud_ind {</span><br><span>             BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts_BSSMAP_ResetAck));</span><br><span style="color: hsl(120, 100%, 40%);">+                         ts_BSSMAP_ResetAck(g_ran_ops.use_osmux)));</span><br><span>                }</span><br><span>    [] as_reset_ack();</span><br><span>   [] BSSAP.receive {</span><br><span>@@ -483,10 +483,10 @@</span><br><span> function f_bssap_reset(SCCP_PAR_Address peer, SCCP_PAR_Address own) runs on RAN_Emulation_CT {</span><br><span>         timer T := 5.0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0)));</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.send(ts_BSSAP_UNITDATA_req(peer, own, ts_BSSMAP_Reset(0, g_ran_ops.use_osmux)));</span><br><span>       T.start;</span><br><span>     alt {</span><br><span style="color: hsl(0, 100%, 40%);">-   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(own, peer, tr_BSSMAP_ResetAck)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(own, peer, tr_BSSMAP_ResetAck(g_ran_ops.use_osmux))) {</span><br><span>                log("Received RESET-ACK in response to RESET, we're ready to go!");</span><br><span>            }</span><br><span>    [] as_reset_ack();</span><br><span>@@ -650,6 +650,7 @@</span><br><span>     boolean decode_dtap,</span><br><span>         boolean role_ms,</span><br><span>     RanProtocol protocol,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean use_osmux,</span><br><span>   /* needed for performing BSSMAP RESET */</span><br><span>     SCCP_PAR_Address sccp_addr_local optional,</span><br><span>   SCCP_PAR_Address sccp_addr_peer optional</span><br><span>@@ -727,10 +728,10 @@</span><br><span>     var RANAP_N_UNITDATA_ind rud_ind;</span><br><span> #endif</span><br><span> #ifdef RAN_EMULATION_BSSAP</span><br><span style="color: hsl(0, 100%, 40%);">-       [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset)) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_ran_ops.use_osmux))) -> value ud_ind {</span><br><span>             log("Respoding to inbound RESET with RESET-ACK");</span><br><span>          BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(0, 100%, 40%);">-                      ts_BSSMAP_ResetAck));</span><br><span style="color: hsl(120, 100%, 40%);">+                         ts_BSSMAP_ResetAck(g_ran_ops.use_osmux)));</span><br><span>                repeat;</span><br><span>      }</span><br><span> #endif</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14105">change 14105</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/14105"/><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: If69c716dc06d61d810c32d1720a237c7535baca8 </div>
<div style="display:none"> Gerrit-Change-Number: 14105 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Pau Espin Pedrol <pespin@sysmocom.de> </div>