<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23808">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: add TC_assignment_codec_fr_by_mode_modify<br><br>Test the lchan mode modification code path of OsmoBSC, in preparation of<br>adding VAMOS bits to the mode modification procedure.<br><br>Related: SYS#4895<br>Change-Id: Idf4efaed986de0bbd2b663313e837352cc139f0f<br>---<br>M bsc/BSC_Tests.ttcn<br>M bsc/MSC_ConnectionHandler.ttcn<br>2 files changed, 111 insertions(+), 27 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/08/23808/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 1f8f951..8de0e23 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -3609,36 +3609,39 @@</span><br><span> </span><br><span>   f_establish_fully(ass_cmd, exp_compl);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* Verify that the RSL-side activation actually matches our expectations */</span><br><span style="color: hsl(0, 100%, 40%);">-     var RSL_Message rsl := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (not g_pars.expect_channel_mode_modify) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Verify that the RSL-side activation actually matches our expectations */</span><br><span style="color: hsl(120, 100%, 40%);">+           var RSL_Message rsl := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        var RSL_IE_Body mode_ie;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (f_rsl_find_ie(rsl, RSL_IE_CHAN_MODE, mode_ie) == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-           setverdict(fail, "Couldn't find CHAN_MODE IE");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       var template RSL_IE_Body t_mode_ie := f_rsl_chmod_tmpl_from_codec(g_pars.ass_codec_list.codecElements[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (not match(mode_ie, t_mode_ie)) {</span><br><span style="color: hsl(0, 100%, 40%);">-            setverdict(fail, "RSL Channel Mode IE doesn't match expectation");</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       var RSL_IE_Body mr_conf;</span><br><span style="color: hsl(0, 100%, 40%);">-        if (g_pars.expect_mr_conf_ie != omit) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (f_rsl_find_ie(rsl, RSL_IE_MR_CONFIG, mr_conf) == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   setverdict(fail, "Missing MR CONFIG IE in RSL Chan Activ");</span><br><span style="color: hsl(120, 100%, 40%);">+         var RSL_IE_Body mode_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (f_rsl_find_ie(rsl, RSL_IE_CHAN_MODE, mode_ie) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 setverdict(fail, "Couldn't find CHAN_MODE IE");</span><br><span>                        mtc.stop;</span><br><span>            }</span><br><span style="color: hsl(0, 100%, 40%);">-               log("found RSL MR CONFIG IE: ", mr_conf);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             if (not match(mr_conf, g_pars.expect_mr_conf_ie)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(fail, "RSL MR CONFIG IE does not match expectation. Expected: ",</span><br><span style="color: hsl(0, 100%, 40%);">-                           g_pars.expect_mr_conf_ie);</span><br><span style="color: hsl(120, 100%, 40%);">+            var template RSL_IE_Body t_mode_ie := f_rsl_chmod_tmpl_from_codec(g_pars.ass_codec_list.codecElements[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not match(mode_ie, t_mode_ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  log("mode_ie ", mode_ie, " != t_mode_ie ", t_mode_ie);</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "RSL Channel Mode IE doesn't match expectation");</span><br><span>             }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (f_rsl_find_ie(rsl, RSL_IE_MR_CONFIG, mr_conf) == true) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                var RSL_IE_Body mr_conf;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (g_pars.expect_mr_conf_ie != omit) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (f_rsl_find_ie(rsl, RSL_IE_MR_CONFIG, mr_conf) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         setverdict(fail, "Missing MR CONFIG IE in RSL Chan Activ");</span><br><span style="color: hsl(120, 100%, 40%);">+                         mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>                    log("found RSL MR CONFIG IE: ", mr_conf);</span><br><span style="color: hsl(0, 100%, 40%);">-                     setverdict(fail, "Found MR CONFIG IE in RSL Chan Activ, expecting omit");</span><br><span style="color: hsl(0, 100%, 40%);">-                     mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (not match(mr_conf, g_pars.expect_mr_conf_ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           setverdict(fail, "RSL MR CONFIG IE does not match expectation. Expected: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 g_pars.expect_mr_conf_ie);</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (f_rsl_find_ie(rsl, RSL_IE_MR_CONFIG, mr_conf) == true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          log("found RSL MR CONFIG IE: ", mr_conf);</span><br><span style="color: hsl(120, 100%, 40%);">+                           setverdict(fail, "Found MR CONFIG IE in RSL Chan Activ, expecting omit");</span><br><span style="color: hsl(120, 100%, 40%);">+                           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span>@@ -3800,6 +3803,30 @@</span><br><span>      f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish signalling on a TCH/F lchan, and then switch to speech mode without a new Assignment. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_assignment_codec_fr_by_mode_modify() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* By disabling all SDCCH, the MS should be given a TCH/F for signalling. Then activating an FR codec should</span><br><span style="color: hsl(120, 100%, 40%);">+   * merely do a Channel Mode Modify, and not assign to a new lchan. f_establish_fully() already accounts for</span><br><span style="color: hsl(120, 100%, 40%);">+    * expecting a Channel Mode Modify if the channel type is compatible. */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_disable_all_sdcch();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_disable_all_tch_h();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.expect_channel_mode_modify := true;</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn := f_start_handler(refers(f_TC_assignment_codec), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_enable_all_sdcch();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_enable_all_tch();</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* 'amr start-mode auto' should not keep the (unused) 'smod' bits from previous configuration */</span><br><span> testcase TC_assignment_codec_amr_startmode_cruft() runs on test_CT {</span><br><span>        var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span>@@ -4059,6 +4086,20 @@</span><br><span>  f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 5 sub-slot 1 unused");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_disable_all_sdcch() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 0 borken");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 1 borken");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 2 borken");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 3 borken");</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_enable_all_sdcch() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 0 unused");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 1 unused");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 2 unused");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 0 sub-slot 3 unused");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Allow HR only */</span><br><span> private function f_TC_assignment_codec_xr_exhausted_req_hr(charstring id) runs on MSC_ConnHdlr {</span><br><span>      g_pars := f_gen_test_hdlr_pars();</span><br><span>@@ -8561,6 +8602,7 @@</span><br><span>    execute( TC_ciph_mode_a5_3() );</span><br><span> </span><br><span>  execute( TC_assignment_codec_fr() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_assignment_codec_fr_by_mode_modify() );</span><br><span>  execute( TC_assignment_codec_hr() );</span><br><span>         execute( TC_assignment_codec_efr() );</span><br><span>        execute( TC_assignment_codec_amr_f() );</span><br><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 5b5bd6b..6bc35c9 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -589,7 +589,8 @@</span><br><span>   charstring      host_aoip_tla,</span><br><span>       TestHdlrParamsMSCPool mscpool,</span><br><span>       boolean         media_mgw_offer_ipv6,</span><br><span style="color: hsl(0, 100%, 40%);">-   OCT3            last_used_eutran_plmn optional</span><br><span style="color: hsl(120, 100%, 40%);">+        OCT3            last_used_eutran_plmn optional,</span><br><span style="color: hsl(120, 100%, 40%);">+       boolean         expect_channel_mode_modify</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>@@ -625,7 +626,8 @@</span><br><span>             l3_info := omit</span><br><span>      },</span><br><span>   media_mgw_offer_ipv6 := true,</span><br><span style="color: hsl(0, 100%, 40%);">-   last_used_eutran_plmn := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ last_used_eutran_plmn := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+        expect_channel_mode_modify := false</span><br><span> }</span><br><span> </span><br><span> function f_create_chan_and_exp() runs on MSC_ConnHdlr {</span><br><span>@@ -784,7 +786,9 @@</span><br><span>        boolean assignment_done,</span><br><span>     RslChannelNr old_chan_nr,</span><br><span>    /* Modify related bits */</span><br><span style="color: hsl(120, 100%, 40%);">+     PDU_ML3_NW_MS rr_channel_mode_modify_msg optional,</span><br><span>   boolean rr_modify_seen,</span><br><span style="color: hsl(120, 100%, 40%);">+       RSL_Message rsl_mode_modify_msg optional,</span><br><span>    boolean modify_done</span><br><span> }</span><br><span> </span><br><span>@@ -796,7 +800,9 @@</span><br><span>   old_lchan_rll_rel_req_seen := false,</span><br><span>         assignment_done := false,</span><br><span>    old_chan_nr := -,</span><br><span style="color: hsl(120, 100%, 40%);">+     rr_channel_mode_modify_msg := omit,</span><br><span>  rr_modify_seen := false,</span><br><span style="color: hsl(120, 100%, 40%);">+      rsl_mode_modify_msg := omit,</span><br><span>         modify_done := false</span><br><span> }</span><br><span> </span><br><span>@@ -908,6 +914,7 @@</span><br><span>          var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[2].body.l3_info.payload);</span><br><span>          log("Rx L3 from net: ", l3);</span><br><span>               if (ischosen(l3.msgs.rrm.channelModeModify)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        st.rr_channel_mode_modify_msg := l3;</span><br><span>                         f_rsl_reply(ts_RRM_ModeModifyAck(l3.msgs.rrm.channelModeModify.channelDescription,</span><br><span>                                                    l3.msgs.rrm.channelModeModify.channelMode), rsl);</span><br><span>                   st.rr_modify_seen := true;</span><br><span>@@ -915,6 +922,7 @@</span><br><span>             repeat;</span><br><span>              }</span><br><span>    [st.voice_call and st.rr_modify_seen] RSL.receive(tr_RSL_MsgTypeD(RSL_MT_MODE_MODIFY_REQ)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+          st.rsl_mode_modify_msg := rsl;</span><br><span>               RSL.send(ts_RSL_MODE_MODIFY_ACK(g_chan_nr));</span><br><span>                 st.modify_done := true;</span><br><span>              repeat;</span><br><span>@@ -1138,6 +1146,7 @@</span><br><span>               * channel, we must now check if the mode of the current</span><br><span>              * channel is compatible. If not we expect the BSC to modify</span><br><span>                  * the mode */</span><br><span style="color: hsl(120, 100%, 40%);">+                st.is_assignment := false;</span><br><span>           exp_modify := f_channel_needs_modify(BSCVTY, ass_cmd.pdu.bssmap.assignmentRequest.channelType, g_chan_nr);</span><br><span>   }</span><br><span> </span><br><span>@@ -1212,6 +1221,39 @@</span><br><span>               mtc.stop;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (exp_modify) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Verify that the RR Channel Mode Modify and RSL MODE MODIFY message asked for the expected channel</span><br><span style="color: hsl(120, 100%, 40%);">+           * mode. */</span><br><span style="color: hsl(120, 100%, 40%);">+           /* TODO: more precisely expect the different types of speech? */</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT1 rr_channel_mode := st.rr_channel_mode_modify_msg.msgs.rrm.channelModeModify.channelMode.mode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (st.voice_call and rr_channel_mode == '00'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "f_establish_fully(): Expected RR Channel Mode Modify",</span><br><span style="color: hsl(120, 100%, 40%);">+                               " to a speech mode, but got channelMode == ", rr_channel_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+                  mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (not st.voice_call and rr_channel_mode != '00'O) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "f_establish_fully(): Expected RR Channel Mode Modify",</span><br><span style="color: hsl(120, 100%, 40%);">+                               " to signalling mode, but got channelMode == ", rr_channel_mode);</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%);">+           var RSL_IE_Body chan_mode_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+         if (not f_rsl_find_ie(st.rsl_mode_modify_msg, RSL_IE_CHAN_MODE, chan_mode_ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "RSL MODE MODIFY message lacks a Channel Mode IE");</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%);">+             var RSL_SpeechDataInd rsl_spd_ind := chan_mode_ie.chan_mode.spd_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (st.voice_call and rsl_spd_ind != RSL_SPDI_SPEECH) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "f_establish_fully(): Expected RSL MODE MODIFY",</span><br><span style="color: hsl(120, 100%, 40%);">+                              " to a speech mode, but got spd_ind == ", rsl_spd_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+                  mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (not st.voice_call and rsl_spd_ind != RSL_SPDI_SIGN) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "f_establish_fully(): Expected RSL MODE MODIFY",</span><br><span style="color: hsl(120, 100%, 40%);">+                              " to signalling mode, but got spd_ind == ", rsl_spd_ind);</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%);">+</span><br><span>  /* When the BSC detects that LCLS is possible it will cross the</span><br><span>       * connetions that point to the PBX side of the MGW. In our case this</span><br><span>         * is mgcp_conn[1]. The BSC performs this operation already before the</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23808">change 23808</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23808"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Idf4efaed986de0bbd2b663313e837352cc139f0f </div>
<div style="display:none"> Gerrit-Change-Number: 23808 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>