<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20101">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BTS_Tests: group hopping parameters into a separate record<br><br>Change-Id: Iedb5d858a2d4f5d5a45e7465ae6586b3ae4bbb72<br>Related: SYS#4868, OS#4708<br>---<br>M bts/BTS_Tests.ttcn<br>M bts/BTS_Tests_LAPDm.ttcn<br>M library/LAPDm_RAW_PT.ttcn<br>3 files changed, 62 insertions(+), 46 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/01/20101/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn</span><br><span>index ac781f6..3100d03 100644</span><br><span>--- a/bts/BTS_Tests.ttcn</span><br><span>+++ b/bts/BTS_Tests.ttcn</span><br><span>@@ -237,6 +237,17 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+friend type record FreqHopPars {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Whether frequency hopping is in use */</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean enabled,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Mobile Allocation Index Offset / Hopping Sequence Number */</span><br><span style="color: hsl(120, 100%, 40%);">+ MaioHsn maio_hsn,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MA bitmap to be indicated in RR Immediate Assignment */</span><br><span style="color: hsl(120, 100%, 40%);">+ MobileAllocationLV ma_map,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The actual Mobile Allocation (ARFCN list) to be used */</span><br><span style="color: hsl(120, 100%, 40%);">+ L1ctlMA ma</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type record ConnHdlrPars {</span><br><span> RslChannelNr chan_nr,</span><br><span> RSL_IE_ChannelMode chan_mode,</span><br><span>@@ -246,13 +257,9 @@</span><br><span> RSL_IE_EncryptionInfo encr optional,</span><br><span> BtsBand bts0_band optional,</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Frequency hopping parameters (disabled if absent) */</span><br><span style="color: hsl(0, 100%, 40%);">- MaioHsn maio_hsn optional,</span><br><span style="color: hsl(0, 100%, 40%);">- /* MA bitmap to be indicated in RR Immediate Assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- MobileAllocationLV ma_map,</span><br><span style="color: hsl(0, 100%, 40%);">- /* The actual Mobile Allocation (ARFCN list) to be used */</span><br><span style="color: hsl(0, 100%, 40%);">- L1ctlMA ma</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Frequency hopping parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ FreqHopPars fhp</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> /* Test-specific parameters */</span><br><span> private type union TestSpecUnion {</span><br><span>@@ -529,36 +536,40 @@</span><br><span> uint6_t maio</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-friend function f_resolve_fh_params(inout ConnHdlrPars pars, uint8_t trx_nr := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_resolve_fh_params(inout FreqHopPars fhp, uint8_t tn,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t trx_nr := 0)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- var FreqHopGroups groups := mp_fh_config[pars.chan_nr.tn];</span><br><span style="color: hsl(120, 100%, 40%);">+ var FreqHopGroups groups := mp_fh_config[tn];</span><br><span> var integer i, j;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.enabled := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> for (i := 0; i < lengthof(groups); i := i + 1) {</span><br><span> var FreqHopGroup g := groups[i];</span><br><span> for (j := 0; j < lengthof(g.trx_maio); j := j + 1) {</span><br><span> var FreqHopGroupItem gi := g.trx_maio[j];</span><br><span> if (gi.trx_nr == trx_nr) {</span><br><span style="color: hsl(0, 100%, 40%);">- pars.maio_hsn := valueof(ts_HsnMaio(g.hsn, gi.maio));</span><br><span style="color: hsl(0, 100%, 40%);">- pars.ma := { }; /* to be composed below */</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.maio_hsn.maio := gi.maio;</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.maio_hsn.hsn := g.hsn;</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.enabled := true;</span><br><span> break;</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (ispresent(pars.maio_hsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fhp.enabled) {</span><br><span> /* Prepare the Mobile Allocation bitmask (length & padding) */</span><br><span style="color: hsl(0, 100%, 40%);">- pars.ma_map.len := (mp_transceiver_num + 8 - 1) / 8; /* in bytes */</span><br><span style="color: hsl(0, 100%, 40%);">- pars.ma_map.ma := f_pad_bit('0'B, pars.ma_map.len * 8, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.ma_map.len := (mp_transceiver_num + 8 - 1) / 8; /* in bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.ma_map.ma := f_pad_bit('0'B, fhp.ma_map.len * 8, '0'B);</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.ma := { }; /* to be composed below */</span><br><span> </span><br><span> /* Compose the actual Mobile Allocation and the bitmask */</span><br><span> for (j := 0; j < lengthof(g.trx_maio); j := j + 1) {</span><br><span> var FreqHopGroupItem gi := g.trx_maio[j];</span><br><span style="color: hsl(0, 100%, 40%);">- pars.ma := pars.ma & { l1ctl_ma_def[gi.trx_nr] };</span><br><span style="color: hsl(0, 100%, 40%);">- pars.ma_map.ma[gi.trx_nr] := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.ma := fhp.ma & { l1ctl_ma_def[gi.trx_nr] };</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp.ma_map.ma[gi.trx_nr] := '1'B;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- log("Freq. hopping parameters: maio_hsn := ", pars.maio_hsn,</span><br><span style="color: hsl(0, 100%, 40%);">- ", ma := ", pars.ma, ", ma_map := ", pars.ma_map);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("Freq. hopping parameters: ", fhp);</span><br><span> break; /* We're done */</span><br><span> }</span><br><span> }</span><br><span>@@ -591,7 +602,7 @@</span><br><span> </span><br><span> /* Obtain frequency hopping parameters for a given timeslot */</span><br><span> if (mp_freq_hop_enabled and mp_transceiver_num > 1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_resolve_fh_params(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_resolve_fh_params(pars.fhp, pars.chan_nr.tn);</span><br><span> }</span><br><span> </span><br><span> vc_conn.start(f_handler_init(fn, id, pars));</span><br><span>@@ -700,7 +711,6 @@</span><br><span> </span><br><span> friend template ConnHdlrPars t_Pars(template RslChannelNr chan_nr,</span><br><span> template RSL_IE_ChannelMode chan_mode,</span><br><span style="color: hsl(0, 100%, 40%);">- template (omit) MaioHsn maio_hsn := omit,</span><br><span> float t_guard := 20.0) := {</span><br><span> chan_nr := valueof(chan_nr),</span><br><span> chan_mode := valueof(chan_mode),</span><br><span>@@ -726,9 +736,12 @@</span><br><span> spec := omit,</span><br><span> encr := omit,</span><br><span> bts0_band := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- maio_hsn := maio_hsn,</span><br><span style="color: hsl(0, 100%, 40%);">- ma_map := c_MA_null,</span><br><span style="color: hsl(0, 100%, 40%);">- ma := l1ctl_ma_def</span><br><span style="color: hsl(120, 100%, 40%);">+ fhp := {</span><br><span style="color: hsl(120, 100%, 40%);">+ enabled := false,</span><br><span style="color: hsl(120, 100%, 40%);">+ maio_hsn := ts_HsnMaio(0, 0),</span><br><span style="color: hsl(120, 100%, 40%);">+ ma_map := c_MA_null,</span><br><span style="color: hsl(120, 100%, 40%);">+ ma := l1ctl_ma_def</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /***********************************************************************</span><br><span>@@ -2002,16 +2015,16 @@</span><br><span> </span><br><span> /* Tune to a dedicated channel: L1CTL only */</span><br><span> private function f_l1ctl_est_dchan(L1CTL_PT pt, ConnHdlrPars pars) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (not ispresent(pars.maio_hsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not pars.fhp.enabled) {</span><br><span> pt.send(ts_L1CTL_DM_EST_REQ_H0(pars.chan_nr,</span><br><span> 7 /* TODO: mp_tsc */,</span><br><span> mp_trx0_arfcn));</span><br><span> } else {</span><br><span> pt.send(ts_L1CTL_DM_EST_REQ_H1(pars.chan_nr,</span><br><span> 7 /* TODO: mp_tsc */,</span><br><span style="color: hsl(0, 100%, 40%);">- pars.maio_hsn.hsn,</span><br><span style="color: hsl(0, 100%, 40%);">- pars.maio_hsn.maio,</span><br><span style="color: hsl(0, 100%, 40%);">- pars.ma));</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.fhp.maio_hsn.hsn,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.fhp.maio_hsn.maio,</span><br><span style="color: hsl(120, 100%, 40%);">+ pars.fhp.ma));</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -2029,14 +2042,14 @@</span><br><span> f_rsl_chan_act(g_pars.chan_mode, encr_enable, more_ies);</span><br><span> </span><br><span> /* Craft channel description (with or without frequency hopping parameters) */</span><br><span style="color: hsl(0, 100%, 40%);">- if (ispresent(g_pars.maio_hsn)) {</span><br><span style="color: hsl(0, 100%, 40%);">- ch_desc := valueof(ts_ChanDescH1(g_pars.chan_nr, g_pars.maio_hsn));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.fhp.enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ch_desc := valueof(ts_ChanDescH1(g_pars.chan_nr, g_pars.fhp.maio_hsn));</span><br><span> } else {</span><br><span> ch_desc := valueof(ts_ChanDescH0(g_pars.chan_nr, mp_trx0_arfcn));</span><br><span> }</span><br><span> </span><br><span> /* Send IMM.ASS via CCHAN */</span><br><span style="color: hsl(0, 100%, 40%);">- var GsmRrMessage rr_msg := valueof(ts_IMM_ASS(ra, fn, 0, ch_desc, g_pars.ma_map));</span><br><span style="color: hsl(120, 100%, 40%);">+ var GsmRrMessage rr_msg := valueof(ts_IMM_ASS(ra, fn, 0, ch_desc, g_pars.fhp.ma_map));</span><br><span> RSL.send(ts_RSL_IMM_ASSIGN(enc_GsmRrMessage(rr_msg)));</span><br><span> </span><br><span> /* receive IMM.ASS on MS side */</span><br><span>@@ -2049,7 +2062,7 @@</span><br><span> }</span><br><span> </span><br><span> /* enable dedicated mode */</span><br><span style="color: hsl(0, 100%, 40%);">- f_L1CTL_DM_EST_REQ_IA(L1CTL, ia_um, ma := g_pars.ma);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_L1CTL_DM_EST_REQ_IA(L1CTL, ia_um, ma := g_pars.fhp.ma);</span><br><span> /* enable encryption, if requested */</span><br><span> if (encr_enable) {</span><br><span> var uint8_t alg_id := f_alg_id_to_l1ctl(g_pars.encr.alg_id);</span><br><span>@@ -4661,7 +4674,7 @@</span><br><span> /* Tune trxcon to that PDCH channel */</span><br><span> var ConnHdlrPars pars := valueof(t_Pars(ts_RslChanNr_PDCH(7), ts_RSL_ChanMode_SIGN));</span><br><span> if (mp_freq_hop_enabled and mp_transceiver_num > 1)</span><br><span style="color: hsl(0, 100%, 40%);">- { f_resolve_fh_params(pars); }</span><br><span style="color: hsl(120, 100%, 40%);">+ { f_resolve_fh_params(pars.fhp, pars.chan_nr.tn); }</span><br><span> f_l1ctl_est_dchan(L1CTL, pars);</span><br><span> </span><br><span> /* Verify PTCCH/U: send several access bursts, make sure they're received */</span><br><span>@@ -4925,7 +4938,7 @@</span><br><span> /* Tune trxcon to that PDCH channel on TS7 */</span><br><span> var ConnHdlrPars pars := valueof(t_Pars(ts_RslChanNr_PDCH(7), ts_RSL_ChanMode_SIGN));</span><br><span> if (mp_freq_hop_enabled and mp_transceiver_num > 1)</span><br><span style="color: hsl(0, 100%, 40%);">- { f_resolve_fh_params(pars); }</span><br><span style="color: hsl(120, 100%, 40%);">+ { f_resolve_fh_params(pars.fhp, pars.chan_nr.tn); }</span><br><span> f_l1ctl_est_dchan(L1CTL, pars);</span><br><span> </span><br><span> /* C/I in centiBels, test range: -256 .. +1280, step 128 */</span><br><span>@@ -5395,7 +5408,7 @@</span><br><span> /* Verify hopping parameters in the INFO.ind message (version >= 10) */</span><br><span> testcase TC_pcu_info_ind_fh_params() runs on test_CT {</span><br><span> var PCUIF_info_ind info_ind;</span><br><span style="color: hsl(0, 100%, 40%);">- var ConnHdlrPars pars;</span><br><span style="color: hsl(120, 100%, 40%);">+ var FreqHopPars fhp;</span><br><span> </span><br><span> f_init();</span><br><span> </span><br><span>@@ -5408,17 +5421,18 @@</span><br><span> continue;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- pars := valueof(t_Pars(t_RslChanNr_PDCH(tn), ts_RSL_ChanMode_SIGN));</span><br><span> if (mp_freq_hop_enabled and mp_transceiver_num > 1)</span><br><span style="color: hsl(0, 100%, 40%);">- { f_resolve_fh_params(pars); }</span><br><span style="color: hsl(120, 100%, 40%);">+ { f_resolve_fh_params(fhp, tn); }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ { fhp.enabled := false; }</span><br><span> </span><br><span> var template PCUIF_InfoTrxTs tr_ts;</span><br><span style="color: hsl(0, 100%, 40%);">- if (ispresent(pars.maio_hsn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fhp.enabled) {</span><br><span> tr_ts := tr_PCUIF_InfoTrxTsH1(</span><br><span style="color: hsl(0, 100%, 40%);">- hsn := pars.maio_hsn.hsn,</span><br><span style="color: hsl(0, 100%, 40%);">- maio := pars.maio_hsn.maio,</span><br><span style="color: hsl(0, 100%, 40%);">- ma := f_pad_bit(pars.ma_map.ma, 64, '0'B),</span><br><span style="color: hsl(0, 100%, 40%);">- ma_bit_len := lengthof(pars.ma_map.ma));</span><br><span style="color: hsl(120, 100%, 40%);">+ hsn := fhp.maio_hsn.hsn,</span><br><span style="color: hsl(120, 100%, 40%);">+ maio := fhp.maio_hsn.maio,</span><br><span style="color: hsl(120, 100%, 40%);">+ ma := f_pad_bit(fhp.ma_map.ma, 64, '0'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ ma_bit_len := lengthof(fhp.ma_map.ma));</span><br><span> } else {</span><br><span> tr_ts := tr_PCUIF_InfoTrxTsH0;</span><br><span> }</span><br><span>diff --git a/bts/BTS_Tests_LAPDm.ttcn b/bts/BTS_Tests_LAPDm.ttcn</span><br><span>index 9981bbc..0e27ad1 100644</span><br><span>--- a/bts/BTS_Tests_LAPDm.ttcn</span><br><span>+++ b/bts/BTS_Tests_LAPDm.ttcn</span><br><span>@@ -54,13 +54,15 @@</span><br><span> /* master function switching to a dedicated radio channel */</span><br><span> function f_switch_dcch() runs on ConnHdlr {</span><br><span> var BCCH_tune_req tune_req := { arfcn := { false, mp_trx0_arfcn }, combined_ccch := true };</span><br><span style="color: hsl(0, 100%, 40%);">- var DCCH_switch_req sw_req := { ma := g_pars.ma };</span><br><span style="color: hsl(120, 100%, 40%);">+ var DCCH_switch_req sw_req;</span><br><span> </span><br><span> /* Craft channel description (with or without frequency hopping parameters) */</span><br><span style="color: hsl(0, 100%, 40%);">- if (ispresent(g_pars.maio_hsn)) {</span><br><span style="color: hsl(0, 100%, 40%);">- sw_req.chan_desc := valueof(ts_ChanDescH1(g_pars.chan_nr, g_pars.maio_hsn));</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_pars.fhp.enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+ sw_req.chan_desc := valueof(ts_ChanDescH1(g_pars.chan_nr, g_pars.fhp.maio_hsn));</span><br><span style="color: hsl(120, 100%, 40%);">+ sw_req.ma := g_pars.fhp.ma;</span><br><span> } else {</span><br><span> sw_req.chan_desc := valueof(ts_ChanDescH0(g_pars.chan_nr, mp_trx0_arfcn));</span><br><span style="color: hsl(120, 100%, 40%);">+ sw_req.ma := omit;</span><br><span> }</span><br><span> </span><br><span> LAPDM.send(tune_req);</span><br><span>@@ -239,7 +241,7 @@</span><br><span> </span><br><span> /* Obtain frequency hopping parameters for a given timeslot */</span><br><span> if (mp_freq_hop_enabled and mp_transceiver_num > 1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_resolve_fh_params(g_pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_resolve_fh_params(g_pars.fhp, g_pars.chan_nr.tn);</span><br><span> }</span><br><span> </span><br><span> /* activate the channel on the BTS side */</span><br><span>diff --git a/library/LAPDm_RAW_PT.ttcn b/library/LAPDm_RAW_PT.ttcn</span><br><span>index 77f0452..d0ad24b 100644</span><br><span>--- a/library/LAPDm_RAW_PT.ttcn</span><br><span>+++ b/library/LAPDm_RAW_PT.ttcn</span><br><span>@@ -39,7 +39,7 @@</span><br><span> /* directly switch to a dedicated channel (without RACH/IMM.ASS */</span><br><span> type record DCCH_switch_req {</span><br><span> ChannelDescription chan_desc,</span><br><span style="color: hsl(0, 100%, 40%);">- L1ctlMA ma</span><br><span style="color: hsl(120, 100%, 40%);">+ L1ctlMA ma optional</span><br><span> }</span><br><span> </span><br><span> type record DCCH_switch_res {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20101">change 20101</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/+/20101"/><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: Iedb5d858a2d4f5d5a45e7465ae6586b3ae4bbb72 </div>
<div style="display:none"> Gerrit-Change-Number: 20101 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>