<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>