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