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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcuif_proto: version 10: add frequency hopping parameters<br><br>Change-Id: I04782222b499d0488269544910fbd4ed9929c05d<br>Related: Idf11bc4ba3ff0b00b32f2beab8fd020c67119d05<br>Related: SYS#4868, OS#4546, OS#4547<br>---<br>M include/osmo-bts/pcuif_proto.h<br>M src/common/pcu_sock.c<br>2 files changed, 99 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/pcuif_proto.h b/include/osmo-bts/pcuif_proto.h</span><br><span>index e88607e..80d4f90 100644</span><br><span>--- a/include/osmo-bts/pcuif_proto.h</span><br><span>+++ b/include/osmo-bts/pcuif_proto.h</span><br><span>@@ -5,7 +5,7 @@</span><br><span> </span><br><span> #define PCU_SOCK_DEFAULT   "/tmp/pcu_bts"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define PCU_IF_VERSION              0x09</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_IF_VERSION            0x0a</span><br><span> #define TXT_MAX_LEN     128</span><br><span> </span><br><span> /* msg_type */</span><br><span>@@ -112,12 +112,21 @@</span><br><span>    uint8_t         ts_nr;</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_pcu_if_info_trx_ts {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t         tsc;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t         hopping;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t         hsn;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t         maio;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t         ma_bit_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t         ma[8];</span><br><span style="color: hsl(120, 100%, 40%);">+} __attribute__ ((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_pcu_if_info_trx {</span><br><span>        uint16_t        arfcn;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t         pdch_mask;              /* PDCH channels per TS */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t         pdch_mask;              /* PDCH timeslot mask */</span><br><span>     uint8_t         spare;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t         tsc[8];                 /* TSC per channel */</span><br><span>        uint32_t        hlayer1;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_pcu_if_info_trx_ts ts[8];</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span> struct gsm_pcu_if_info_ind {</span><br><span>diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c</span><br><span>index 9464311..f5ead3b 100644</span><br><span>--- a/src/common/pcu_sock.c</span><br><span>+++ b/src/common/pcu_sock.c</span><br><span>@@ -115,6 +115,82 @@</span><br><span>      }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* As a BTS, we do not (and neither need to) know the Mobile Allocation, because</span><br><span style="color: hsl(120, 100%, 40%);">+ * in CS domain it's responsibility of the BSC to encode RR messages containing</span><br><span style="color: hsl(120, 100%, 40%);">+ * this IE.  However, a BTS co-located PCU needs to know all hopping parameters,</span><br><span style="color: hsl(120, 100%, 40%);">+ * including the Mobile Allocation, because it's responsible for encoding of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * packet resource assignment messages.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This function, similar to generate_ma_for_ts() in osmo-bsc, computes the</span><br><span style="color: hsl(120, 100%, 40%);">+ * Mobile Allocation bit-mask and populates the given part of INFO.ind with</span><br><span style="color: hsl(120, 100%, 40%);">+ * the hopping parameters for the given timeslot. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void info_ind_fill_fhp(struct gsm_pcu_if_info_trx_ts *ts_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct gsm_bts *bts = ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t ca_buf[1024 / 8] = { 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t sa_buf[1024 / 8] = { 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bitvec ca, sa, ma;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ts_info->maio = ts->hopping.maio;</span><br><span style="color: hsl(120, 100%, 40%);">+       ts_info->hsn = ts->hopping.hsn;</span><br><span style="color: hsl(120, 100%, 40%);">+ ts_info->hopping = 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Cell Allocation bit-mask */</span><br><span style="color: hsl(120, 100%, 40%);">+        ca = (struct bitvec) {</span><br><span style="color: hsl(120, 100%, 40%);">+                .data_len = sizeof(ca_buf),</span><br><span style="color: hsl(120, 100%, 40%);">+           .data = &ca_buf[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%);">+  llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Skip non-provisioned transceivers */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (trx->mo.nm_attr == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPTRX(trx, DPCU, LOGL_NOTICE, "not (yet) provisioned\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</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%);">+           bitvec_set_bit_pos(&ca, trx->arfcn, ONE);</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_info->ma_bit_len++;</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%);">+   /* Slot Allocation bit-mask */</span><br><span style="color: hsl(120, 100%, 40%);">+        sa = (struct bitvec) {</span><br><span style="color: hsl(120, 100%, 40%);">+                .data_len = sizeof(sa_buf),</span><br><span style="color: hsl(120, 100%, 40%);">+           .data = &sa_buf[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%);">+  for (i = 0; i < ts->hopping.arfcn_num; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           bitvec_set_bit_pos(&sa, ts->hopping.arfcn_list[i], ONE);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (bitvec_get_bit_pos(&ca, ts->hopping.arfcn_list[i]) != ONE) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGP(DPCU, LOGL_NOTICE, "A transceiver with ARFCN %u "</span><br><span style="color: hsl(120, 100%, 40%);">+                           "is not (yet) provisioned\n", ts->hopping.arfcn_list[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+                   bitvec_set_bit_pos(&ca, ts->hopping.arfcn_list[i], ONE);</span><br><span style="color: hsl(120, 100%, 40%);">+                       ts_info->ma_bit_len++;</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%);">+   /* Mobile Allocation bit-mask */</span><br><span style="color: hsl(120, 100%, 40%);">+      ma = (struct bitvec) {</span><br><span style="color: hsl(120, 100%, 40%);">+                .cur_bit = sizeof(ts_info->ma) * 8 - 1,</span><br><span style="color: hsl(120, 100%, 40%);">+            .data_len = sizeof(ts_info->ma),</span><br><span style="color: hsl(120, 100%, 40%);">+           .data = &ts_info->ma[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%);">+  /* Skip ARFCN 0, it goes to the end of MA bit-mask */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 1; i < sizeof(ca_buf) * 8; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (bitvec_get_bit_pos(&ca, i) != ONE)</span><br><span style="color: hsl(120, 100%, 40%);">+                    continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bitvec_get_bit_pos(&sa, i) == ONE)</span><br><span style="color: hsl(120, 100%, 40%);">+                    bitvec_set_bit_pos(&ma, ma.cur_bit, ONE);</span><br><span style="color: hsl(120, 100%, 40%);">+         ma.cur_bit--;</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%);">+   if (bitvec_get_bit_pos(&sa, 0) == ONE)</span><br><span style="color: hsl(120, 100%, 40%);">+            bitvec_set_bit_pos(&ma, ma.cur_bit, ONE);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void info_ind_fill_trx(struct gsm_pcu_if_info_trx *trx_info,</span><br><span>                          const struct gsm_bts_trx *trx)</span><br><span> {</span><br><span>@@ -141,10 +217,19 @@</span><br><span>                    continue;</span><br><span> </span><br><span>                trx_info->pdch_mask |= (1 << tn);</span><br><span style="color: hsl(0, 100%, 40%);">-              trx_info->tsc[tn] = gsm_ts_tsc(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+                trx_info->ts[tn].tsc = gsm_ts_tsc(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ts->hopping.enabled)</span><br><span style="color: hsl(120, 100%, 40%);">+                   info_ind_fill_fhp(&trx_info->ts[tn], ts);</span><br><span> </span><br><span>                 LOGPTRX(trx, DPCU, LOGL_INFO, "PDCH on ts=%u is available "</span><br><span style="color: hsl(0, 100%, 40%);">-                   "(tsc=%u arfcn=%u)\n", ts->nr, trx_info->tsc[tn], trx->arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+                     "(tsc=%u ", ts->nr, trx_info->ts[tn].tsc);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (ts->hopping.enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGPC(DPCU, LOGL_INFO, "hopping=yes hsn=%u maio=%u ma_bit_len=%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             ts->hopping.hsn, ts->hopping.maio, trx_info->ts[tn].ma_bit_len);</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPC(DPCU, LOGL_INFO, "hopping=no arfcn=%u)\n", trx->arfcn);</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/19513">change 19513</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-bts/+/19513"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I04782222b499d0488269544910fbd4ed9929c05d </div>
<div style="display:none"> Gerrit-Change-Number: 19513 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@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: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>