<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25712">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">rsl_tx_rf_res(): separate interference AVG / band calculation<br><br>It's cleaner from the architectural point of view to have the<br>interference measurements processed in a separate function.<br><br>Change-Id: I3981608e01a50585359cad673c38c8a305027d30<br>Related: SYS#5313<br>---<br>M include/osmo-bts/lchan.h<br>M src/common/l1sap.c<br>M src/common/lchan.c<br>M src/common/rsl.c<br>4 files changed, 43 insertions(+), 18 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h</span><br><span>index fdb3144..8fcf36a 100644</span><br><span>--- a/include/osmo-bts/lchan.h</span><br><span>+++ b/include/osmo-bts/lchan.h</span><br><span>@@ -226,8 +226,10 @@</span><br><span>                         uint16_t toa256_std_dev;</span><br><span>             } ext;</span><br><span>               /* Interference levels reported by PHY (in dBm) */</span><br><span style="color: hsl(120, 100%, 40%);">+            int16_t interf_meas_avg_dbm; /* Average value */</span><br><span>             int16_t interf_meas_dbm[31]; /* Intave max is 31 */</span><br><span>          uint8_t interf_meas_num;</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t interf_band;</span><br><span>         } meas;</span><br><span>      struct {</span><br><span>             struct amr_multirate_conf amr_mr;</span><br><span>@@ -341,7 +343,7 @@</span><br><span>                                 enum gsm_phys_chan_config as_pchan);</span><br><span> </span><br><span> void gsm_lchan_interf_meas_push(struct gsm_lchan *lchan, int dbm);</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_lchan_interf_meas_calc_avg(struct gsm_lchan *lchan);</span><br><span> </span><br><span> int lchan2ecu_codec(const struct gsm_lchan *lchan);</span><br><span> </span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index a48287c..5c58aff 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -591,6 +591,29 @@</span><br><span>     return rach_frames_expired;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void l1sap_interf_meas_calc_avg(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int tn, ln;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct gsm_bts_trx_ts *ts = &trx->ts[tn];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            for (ln = 0; ln < ARRAY_SIZE(ts->lchan); ln++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        struct gsm_lchan *lchan = &ts->lchan[ln];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->meas.interf_meas_avg_dbm = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                       lchan->meas.interf_band = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* There must be at least one sample */</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (lchan->meas.interf_meas_num == 0)</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%);">+                   /* Average all collected samples */</span><br><span style="color: hsl(120, 100%, 40%);">+                   gsm_lchan_interf_meas_calc_avg(lchan);</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%);">+</span><br><span> static void l1sap_interf_meas_report(struct gsm_bts *bts)</span><br><span> {</span><br><span>     const uint32_t period = bts->interference.intave * 104;</span><br><span>@@ -601,8 +624,12 @@</span><br><span>    if (bts->gsm_time.fn % period != 0)</span><br><span>               return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry(trx, &bts->trx_list, list)</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%);">+              /* Calculate the average of all received samples */</span><br><span style="color: hsl(120, 100%, 40%);">+           l1sap_interf_meas_calc_avg(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Report to the BSC over the A-bis/RSL */</span><br><span>           rsl_tx_rf_res(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> }</span><br><span> </span><br><span> /* time information received from bts model */</span><br><span>diff --git a/src/common/lchan.c b/src/common/lchan.c</span><br><span>index 10a375e..f7ee33b 100644</span><br><span>--- a/src/common/lchan.c</span><br><span>+++ b/src/common/lchan.c</span><br><span>@@ -348,15 +348,14 @@</span><br><span> }</span><br><span> </span><br><span> /* Called by the higher layers every Intave * 104 TDMA frames */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_lchan_interf_meas_calc_avg(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>        const uint8_t meas_num = lchan->meas.interf_meas_num;</span><br><span>     const struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span>    int b, meas_avg, meas_sum = 0;</span><br><span> </span><br><span>   /* There must be at least one sample */</span><br><span style="color: hsl(0, 100%, 40%);">- if (meas_num == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-              return -EAGAIN;</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(meas_num > 0);</span><br><span> </span><br><span>    /* Calculate the sum of all collected samples (in -x dBm) */</span><br><span>         while (lchan->meas.interf_meas_num) {</span><br><span>@@ -377,7 +376,8 @@</span><br><span>                 "Interference AVG: %ddBm (band %d, samples %u)\n",</span><br><span>                 meas_avg, b, meas_num);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return b;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->meas.interf_meas_avg_dbm = meas_avg;</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan->meas.interf_band = b;</span><br><span> }</span><br><span> </span><br><span> /* determine the ECU codec constant for the codec used by given lchan */</span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 229a2af..e4531aa 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -440,29 +440,25 @@</span><br><span>    uint8_t *len = msgb_tl_put(nmsg, RSL_IE_RESOURCE_INFO);</span><br><span> </span><br><span>  for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++) {</span><br><span style="color: hsl(0, 100%, 40%);">-            struct gsm_bts_trx_ts *ts = &trx->ts[tn];</span><br><span style="color: hsl(120, 100%, 40%);">+              const struct gsm_bts_trx_ts *ts = &trx->ts[tn];</span><br><span> </span><br><span>           for (ln = 0; ln < ARRAY_SIZE(ts->lchan); ln++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  struct gsm_lchan *lchan = &ts->lchan[ln];</span><br><span style="color: hsl(120, 100%, 40%);">+                      const struct gsm_lchan *lchan = &ts->lchan[ln];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* No average interference value => no band */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (lchan->meas.interf_meas_avg_dbm == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                          continue;</span><br><span> </span><br><span>                        /* We're not interested in active lchans */</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (lchan->state == LCHAN_S_ACTIVE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                /* Avoid potential buffer overflow */</span><br><span style="color: hsl(0, 100%, 40%);">-                           lchan->meas.interf_meas_num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (lchan->state == LCHAN_S_ACTIVE)</span><br><span>                               continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span> </span><br><span>                        /* Only for GSM_LCHAN_{SDCCH,TCH_F,TCH_H} */</span><br><span>                         if (!lchan_is_dcch(lchan))</span><br><span>                           continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Average all collected samples */</span><br><span style="color: hsl(0, 100%, 40%);">-                     int band = gsm_lchan_interf_meas_calc_band(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (band < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                                continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>                    msgb_v_put(nmsg, gsm_lchan2chan_nr_rsl(lchan));</span><br><span style="color: hsl(0, 100%, 40%);">-                 msgb_v_put(nmsg, (band & 0x07) << 5);</span><br><span style="color: hsl(120, 100%, 40%);">+                       msgb_v_put(nmsg, (lchan->meas.interf_band & 0x07) << 5);</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/+/25712">change 25712</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/+/25712"/><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: I3981608e01a50585359cad673c38c8a305027d30 </div>
<div style="display:none"> Gerrit-Change-Number: 25712 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>