<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20968">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: Add infra to handle multitrx and multits envs<br><br>ARFCNs are allocated sequentially, so that conversion between<br>arfcn<->trx_nr is easily done.<br><br>Some helper functions are introduced to be able to submit and expect<br>messages on a given TRX+TS, which is required for setups with several<br>TRX and PDCH-enabled TS different than the default. These new APIs<br>will be used in PCU_Tests.ttcn in subsequent patches.<br><br>Change-Id: I28430e6d8c77d2b7dc630d186d425a5d82587b82<br>---<br>M library/PCUIF_Types.ttcn<br>M pcu/GPRS_Components.ttcn<br>M pcu/PCU_Tests.ttcn<br>3 files changed, 87 insertions(+), 18 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/PCUIF_Types.ttcn b/library/PCUIF_Types.ttcn</span><br><span>index 8af3757..a7a32ab 100644</span><br><span>--- a/library/PCUIF_Types.ttcn</span><br><span>+++ b/library/PCUIF_Types.ttcn</span><br><span>@@ -815,21 +815,21 @@</span><br><span> </span><br><span> template (value) PCUIF_InfoV09Trx ts_PCUIF_InfoV09TrxNULL := ts_PCUIF_InfoV09Trx(0, '00000000'B, '00'O);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PCUIF_InfoTrxs ts_PCUIF_InfoV09Trxs_def := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PCUIF_InfoTrxs ts_PCUIF_InfoV09Trxs_def(uint16_t base_arfcn) := {</span><br><span>        v09 := {</span><br><span style="color: hsl(0, 100%, 40%);">-                ts_PCUIF_InfoV09Trx, ts_PCUIF_InfoV09TrxNULL,</span><br><span style="color: hsl(120, 100%, 40%);">+         ts_PCUIF_InfoV09Trx(arfcn := base_arfcn + 0), ts_PCUIF_InfoV09TrxNULL,</span><br><span>               ts_PCUIF_InfoV09TrxNULL, ts_PCUIF_InfoV09TrxNULL,</span><br><span>            ts_PCUIF_InfoV09TrxNULL, ts_PCUIF_InfoV09TrxNULL,</span><br><span>            ts_PCUIF_InfoV09TrxNULL, ts_PCUIF_InfoV09TrxNULL</span><br><span>     }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PCUIF_InfoTrxs ts_PCUIF_InfoV10Trxs_def := {</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PCUIF_InfoTrxs ts_PCUIF_InfoV10Trxs_def(uint16_t base_arfcn) := {</span><br><span>         v10 := {</span><br><span style="color: hsl(0, 100%, 40%);">-                ts_PCUIF_InfoV10Trx(arfcn := 871), ts_PCUIF_InfoV10Trx(arfcn := 872),</span><br><span style="color: hsl(0, 100%, 40%);">-           ts_PCUIF_InfoV10Trx(arfcn := 873), ts_PCUIF_InfoV10Trx(arfcn := 874),</span><br><span style="color: hsl(0, 100%, 40%);">-           ts_PCUIF_InfoV10Trx(arfcn := 875), ts_PCUIF_InfoV10Trx(arfcn := 876),</span><br><span style="color: hsl(0, 100%, 40%);">-           ts_PCUIF_InfoV10Trx(arfcn := 877), ts_PCUIF_InfoV10Trx(arfcn := 878)</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 0), ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 1),</span><br><span style="color: hsl(120, 100%, 40%);">+           ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 2), ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 3),</span><br><span style="color: hsl(120, 100%, 40%);">+           ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 4), ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 5),</span><br><span style="color: hsl(120, 100%, 40%);">+           ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 6), ts_PCUIF_InfoV10Trx(arfcn := base_arfcn + 7)</span><br><span>   }</span><br><span> };</span><br><span> </span><br><span>@@ -972,12 +972,12 @@</span><br><span> </span><br><span> </span><br><span> /* TODO: remove this as soon as we drop version 9 support */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_PCUIF_ver_INFO_Trxs()</span><br><span style="color: hsl(120, 100%, 40%);">+function f_PCUIF_ver_INFO_Trxs(uint16_t base_arfcn)</span><br><span> return PCUIF_InfoTrxs {</span><br><span>  if (PCUIF_Types.mp_pcuif_version >= 10) {</span><br><span style="color: hsl(0, 100%, 40%);">-            return valueof(ts_PCUIF_InfoV10Trxs_def);</span><br><span style="color: hsl(120, 100%, 40%);">+             return valueof(ts_PCUIF_InfoV10Trxs_def(base_arfcn));</span><br><span>        } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                return valueof(ts_PCUIF_InfoV09Trxs_def);</span><br><span style="color: hsl(120, 100%, 40%);">+             return valueof(ts_PCUIF_InfoV09Trxs_def(base_arfcn));</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span>diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn</span><br><span>index 9dd4650..f2b0efb 100644</span><br><span>--- a/pcu/GPRS_Components.ttcn</span><br><span>+++ b/pcu/GPRS_Components.ttcn</span><br><span>@@ -29,6 +29,11 @@</span><br><span> import from PCUIF_Components all;</span><br><span> import from Native_Functions all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* ARFCN of 1st TRX. Subsequent TRX are allocated incrementing ARFCNs. Nth TRX => base_arfcn + N-1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      GsmArfcn mp_base_arfcn := 871;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type record TsTrxBtsNum {</span><br><span>    uint3_t         ts_nr,</span><br><span>       uint3_t         trx_nr,</span><br><span>@@ -64,7 +69,7 @@</span><br><span>  GsmRrMessage            rr_imm_ass optional,</span><br><span>         PacketDlAssignChan      ass optional,</span><br><span>        uint5_t                 tfi,</span><br><span style="color: hsl(0, 100%, 40%);">-    GsmArfcn                arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+        GsmArfcn                arfcn optional,</span><br><span>      BIT8                    ts_mask,</span><br><span>     AckNackDescription      acknack_desc</span><br><span> };</span><br><span>@@ -79,7 +84,7 @@</span><br><span>       GsmRrMessage            rr_imm_ass optional,</span><br><span>         PacketUlAssignChan      ass optional,</span><br><span>        uint5_t                 tfi,</span><br><span style="color: hsl(0, 100%, 40%);">-    GsmArfcn                arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+        GsmArfcn                arfcn optional,</span><br><span>      BIT8                    ts_mask,</span><br><span>     uint3_t                 usf[8],</span><br><span>      boolean                 is_egprs,</span><br><span>@@ -124,7 +129,7 @@</span><br><span>      rr_imm_ass := omit,</span><br><span>  ass := omit,</span><br><span>         tfi := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-       arfcn := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   arfcn := omit,</span><br><span>       ts_mask := '00000000'B,</span><br><span>      acknack_desc := t_AckNackDescription_init</span><br><span> };</span><br><span>@@ -133,7 +138,7 @@</span><br><span>        rr_imm_ass := omit,</span><br><span>  ass := omit,</span><br><span>         tfi := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-       arfcn := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   arfcn := omit,</span><br><span>       ts_mask := '00000000'B,</span><br><span>      usf := { USF_UNUSED, USF_UNUSED, USF_UNUSED, USF_UNUSED, USF_UNUSED, USF_UNUSED, USF_UNUSED, USF_UNUSED },</span><br><span>   is_egprs := false,</span><br><span>@@ -199,6 +204,18 @@</span><br><span>    mtc.stop;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_arfcn2trxnr(GsmArfcn arfcn) runs on MS_BTS_IFACE_CT return uint3_t {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (arfcn < mp_base_arfcn) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Unable to find TRX NR for arfcn ", arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+                f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return arfcn - mp_base_arfcn;</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%);">+function f_trxnr2arfcn(uint3_t trx_nr) return GsmArfcn {</span><br><span style="color: hsl(120, 100%, 40%);">+  return mp_base_arfcn + trx_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_ultbf_new_from_rr_imm_ass(in GsmRrMessage rr_imm_ass)</span><br><span> runs on MS_BTS_IFACE_CT return UlTbf {</span><br><span>    var UlTbf ul_tbf := valueof(t_UlTbf_def);</span><br><span>@@ -352,12 +369,63 @@</span><br><span>    return dl_tbf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_ms_tx_TsTrxBtsNum(inout GprsMS ms)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return TsTrxBtsNum {</span><br><span style="color: hsl(120, 100%, 40%);">+  var uint3_t ts_nr := f_ultbf_next_ts(ms.ul_tbf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var uint3_t trx_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ispresent(ms.ul_tbf.arfcn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             trx_nr := f_arfcn2trxnr(ms.ul_tbf.arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* FIXME: implement search by hsn+maio+ma when freq hopping is enabled */</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Asked for trx_nr but arfcn not available in ms.ul_tbf!");</span><br><span style="color: hsl(120, 100%, 40%);">+         f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return valueof(ts_TsTrxBtsNum(ts_nr, trx_nr));</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%);">+function f_dltbf_num_slots(DlTbf dl_tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return integer  {</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer n := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < lengthof(dl_tbf.ts_mask); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (dl_tbf.ts_mask[i] == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      n := n + 1;</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%);">+     return n;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_ultbf_inc_bsn(inout UlTbf ul_tbf)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span>  ul_tbf.bsn := ul_tbf.bsn + 1;</span><br><span>        ul_tbf.bsn := ul_tbf.bsn mod 128; /* FIXME: EGPRS SNS: 2048 */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_ultbf_next_ts(UlTbf ul_tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return uint3_t {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: in the future we probably want to store last used internally</span><br><span style="color: hsl(120, 100%, 40%);">+        /* and continue from there */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < lengthof(ul_tbf.ts_mask); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (ul_tbf.ts_mask[i] == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return i;</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%);">+     setverdict(fail, "No TS available for tx!");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</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%);">+function f_ultbf_num_slots(UlTbf ul_tbf)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MS_BTS_IFACE_CT return integer  {</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer n := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < lengthof(ul_tbf.ts_mask); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (ul_tbf.ts_mask[i] == '1'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      n := n + 1;</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%);">+     return n;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> function f_ms_use_ra(inout GprsMS ms, uint16_t ra, uint8_t ra_is_11bit := 0)</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span>  ms.ra_is_11bit := ra_is_11bit;</span><br><span>@@ -666,7 +734,7 @@</span><br><span>         BTS.send(ts_PCUIF_RACH_IND(nr.bts_nr, nr.trx_nr, ts_nr := 0,</span><br><span>                                    ra := ra, is_11bit := is_11bit,</span><br><span>                              burst_type := burst_type,</span><br><span style="color: hsl(0, 100%, 40%);">-                               fn := fn, arfcn := 871,</span><br><span style="color: hsl(120, 100%, 40%);">+                               fn := fn, arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),</span><br><span>                                qta := ta * 4));</span><br><span> </span><br><span>      /* 3GPP TS 44.018, table 9.1.8.1, note 2b: Request Reference shall be set to 127</span><br><span>@@ -685,7 +753,8 @@</span><br><span>       var template RAW_PCU_EventParam ev_param := {tdma_fn := ? };</span><br><span>         BTS.send(ts_PCUIF_DATA_IND(nr.bts_nr, nr.trx_nr, nr.ts_nr, nr.blk_nr,</span><br><span>                                   sapi := PCU_IF_SAPI_PDTCH, data := data,</span><br><span style="color: hsl(0, 100%, 40%);">-                                fn := fn, arfcn := 871, lqual_cb := lqual_cb));</span><br><span style="color: hsl(120, 100%, 40%);">+                               fn := fn, arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 lqual_cb := lqual_cb));</span><br><span>   if (fn != 0) {</span><br><span>               ev_param := {tdma_fn := fn };</span><br><span>        }</span><br><span>@@ -698,7 +767,7 @@</span><br><span> runs on MS_BTS_IFACE_CT {</span><br><span>         BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,</span><br><span>                              sapi := PCU_IF_SAPI_PDTCH, fn := 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                             arfcn := 871, block_nr := nr.blk_nr));</span><br><span style="color: hsl(120, 100%, 40%);">+                                arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)), block_nr := nr.blk_nr));</span><br><span>       BTS.receive(tr_PCUIF_DATA_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,</span><br><span>                                      sapi := PCU_IF_SAPI_PDTCH)) -> value pcu_msg;</span><br><span> }</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index 79a5564..1b5fb78 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -70,7 +70,7 @@</span><br><span> friend template (value) PCUIF_info_ind ts_PCUIF_INFO_default := {</span><br><span>    version := PCUIF_Types.mp_pcuif_version,</span><br><span>     flags := c_PCUIF_Flags_default,</span><br><span style="color: hsl(0, 100%, 40%);">- trx := f_PCUIF_ver_INFO_Trxs(),</span><br><span style="color: hsl(120, 100%, 40%);">+       trx := f_PCUIF_ver_INFO_Trxs(GPRS_Components.mp_base_arfcn),</span><br><span>         bsic := 7,</span><br><span>   mcc := 262,</span><br><span>  mnc := 42,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20968">change 20968</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/+/20968"/><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: I28430e6d8c77d2b7dc630d186d425a5d82587b82 </div>
<div style="display:none"> Gerrit-Change-Number: 20968 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>