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