<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24883">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">RES IND: parse msg and store interference levels in lchans<br><br>Also show the current interference levels of unused lchans in the vty.<br><br>Change-Id: Iccc1391e8419604bb09e464db8455e053dfbc982<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/lchan_fsm.c<br>4 files changed, 108 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/83/24883/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index b07345d..0632944 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -646,6 +646,9 @@</span><br><span>         bool vamos;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define INTERF_DBM_UNKNOWN 0</span><br><span style="color: hsl(120, 100%, 40%);">+#define INTERF_BAND_UNKNOWN 0xff</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_lchan {</span><br><span>        /* The TS that we're part of */</span><br><span>  struct gsm_bts_trx_ts *ts;</span><br><span>@@ -781,6 +784,14 @@</span><br><span>            /* Whether this lchan is activated/modified into a mode that allows VAMOS multiplexing at this moment */</span><br><span>             bool enabled;</span><br><span>        } vamos;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* dBm value of interference level as reported in the most recent Resource Indication, if any for this lchan. Or</span><br><span style="color: hsl(120, 100%, 40%);">+       * INTERF_DBM_UNKNOWN if this lchan was not included in the most recent Resource Indication.</span><br><span style="color: hsl(120, 100%, 40%);">+   * The range is typically -115 to -85 dBm, here stored 1:1 as a signed integer, to ease comparison. */</span><br><span style="color: hsl(120, 100%, 40%);">+        int16_t interf_dbm;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Actual reported interference band index, or INTERF_BAND_UNKNOWN if this lchan was not included in the most</span><br><span style="color: hsl(120, 100%, 40%);">+  * recent Resource Indication. */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t interf_band;</span><br><span> };</span><br><span> </span><br><span> /* One Timeslot in a TRX */</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index f0adc56..08e9411 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -1467,6 +1467,77 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int rsl_rx_resource_indication(struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct abis_rsl_common_hdr *rslh = msgb_l2(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct tlv_parsed tp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_sign_link *sign_link = msg->dst;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct tlv_p_entry *res_info_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_trx *trx = sign_link->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      int ts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(120, 100%, 40%);">+    int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      rsl_tlv_parse(&tp, rslh->data, msgb_l2len(msg)-sizeof(*rslh));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGP(DRSL, LOGL_DEBUG, "%s Resource Indication\n", gsm_trx_name(trx));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* First clear out all ratings, because only the last resource indication counts. If we can't parse the message,</span><br><span style="color: hsl(120, 100%, 40%);">+   * then there are no ratings. */</span><br><span style="color: hsl(120, 100%, 40%);">+      for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ts = &trx->ts[ts_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+          ts_for_n_lchans(lchan, ts, ts->max_lchans_possible) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      lchan->interf_dbm = INTERF_DBM_UNKNOWN;</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan->interf_band = INTERF_BAND_UNKNOWN;</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%);">+   res_info_ie = TLVP_GET_MINLEN(&tp, RSL_IE_RESOURCE_INFO, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!res_info_ie) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DRSL, LOGL_ERROR, "Resource Indication: missing Resource Info IE\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          return -ENOENT;</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%);">+   /* The IE value is defined in 3GPP TS 48.058 9.3.21 Resource Information:</span><br><span style="color: hsl(120, 100%, 40%);">+      * one octet channel nr, one octet interference level, channel nr, interference level, ...</span><br><span style="color: hsl(120, 100%, 40%);">+     * Where channel nr is cbits + tn (as usual),</span><br><span style="color: hsl(120, 100%, 40%);">+  * and interference level is a 3bit value in the most significant bits of the octet.</span><br><span style="color: hsl(120, 100%, 40%);">+   * Evaluate each pair and update interference ratings for all lchans in this trx. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* There must be an even amount of octets in the value */</span><br><span style="color: hsl(120, 100%, 40%);">+     if (res_info_ie->len & 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DRSL, LOGL_ERROR, "Resource Indication: Resource Info IE has odd length\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           return -EINVAL;</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%);">+   /* Now iterate the reported levels and update corresponding lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < res_info_ie->len; i += 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+             struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t chan_nr = res_info_ie->val[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t interf_band = res_info_ie->val[i + 1] >> 5;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                lchan = lchan_lookup(trx, chan_nr, "Abis RSL rx Resource Indication: ");</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!lchan)</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%);">+           bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Store the actual received index */</span><br><span style="color: hsl(120, 100%, 40%);">+         lchan->interf_band = interf_band;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Clamp the index to 5 before accessing array of interference band bounds */</span><br><span style="color: hsl(120, 100%, 40%);">+         interf_band = OSMO_MIN(interf_band, ARRAY_SIZE(bts->interf_meas_params.bounds_dbm)-1);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* FIXME: when testing with ip.access nanoBTS, we observe a value range of 1..6. According to spec, it</span><br><span style="color: hsl(120, 100%, 40%);">+                 * seems like values 0..5 are intended: 3GPP TS 48.058 9.3.21 Resource Information says:</span><br><span style="color: hsl(120, 100%, 40%);">+               * "The Interf Band field (bits 6-8) indicates in binary the interference level expressed as one of five</span><br><span style="color: hsl(120, 100%, 40%);">+          * possible interference level bands as defined by O&M."</span><br><span style="color: hsl(120, 100%, 40%);">+              * and 3GPP TS 52.021 9.4.25 "Interference level Boundaries" (OML) defines values 0, X1, X2, X3, X4, X5.</span><br><span style="color: hsl(120, 100%, 40%);">+             * If nanoBTS sends 6, the above code clamps it to 5, so that we lose one band in accuracy. */</span><br><span style="color: hsl(120, 100%, 40%);">+                lchan->interf_dbm = -((int16_t)bts->interf_meas_params.bounds_dbm[interf_band]);</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 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int abis_rsl_rx_trx(struct msgb *msg)</span><br><span> {</span><br><span>  struct abis_rsl_common_hdr *rslh = msgb_l2(msg);</span><br><span>@@ -1479,7 +1550,7 @@</span><br><span>             break;</span><br><span>       case RSL_MT_RF_RES_IND:</span><br><span>              /* interference on idle channels of TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-              //DEBUGP(DRSL, "%s RF Resource Indication\n", gsm_trx_name(sign_link->trx));</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = rsl_rx_resource_indication(msg);</span><br><span>                break;</span><br><span>       case RSL_MT_OVERLOAD:</span><br><span>                /* indicate CCCH / ACCH / processor overload */</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 070b660..07c8a9c 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -1682,6 +1682,14 @@</span><br><span>                - lchan->bs_power_db,</span><br><span>             ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power),</span><br><span>               VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, "  Interference Level: ");</span><br><span style="color: hsl(120, 100%, 40%);">+     if (lchan->interf_dbm == INTERF_DBM_UNKNOWN)</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "unknown");</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%d dBm (%u)", lchan->interf_dbm, lchan->interf_band);</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         vty_out(vty, "  Channel Mode / Codec: %s%s",</span><br><span>               gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode),</span><br><span>              VTY_NEWLINE);</span><br><span>@@ -1733,8 +1741,21 @@</span><br><span>               lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr,</span><br><span>               gsm_pchan_name(lchan->ts->pchan_on_init));</span><br><span>     vty_out_dyn_ts_status(vty, lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, ", Lchan %u, Type %s%s TSC-s%dc%u, State %s - L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan->nr,</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, ", Lchan %u", lchan->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lchan_state_is(lchan, LCHAN_ST_UNUSED)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, ", Type %s, State %s - Interference Level: ",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_pchan_name(lchan->ts->pchan_is),</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_state_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+             if (lchan->interf_dbm == INTERF_DBM_UNKNOWN)</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, "unknown");</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%d dBm (%u)", lchan->interf_dbm, lchan->interf_band);</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</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%);">+   vty_out(vty, ", Type %s%s TSC-s%dc%u, State %s - L1 MS Power: %u dBm RXL-FULL-dl: %4d dBm RXL-FULL-ul: %4d dBm%s",</span><br><span>                 gsm_lchant_name(lchan->type),</span><br><span>             lchan->vamos.enabled ? " (VAMOS)" : "",</span><br><span>               lchan->tsc_set > 0 ? lchan->tsc_set : 1,</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index 47a8f9e..efb5c62 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -488,6 +488,8 @@</span><br><span>                 .release.rr_cause = GSM48_RR_CAUSE_NORMAL,</span><br><span> </span><br><span>               .tsc_set = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .interf_dbm = INTERF_DBM_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+             .interf_band = INTERF_BAND_UNKNOWN,</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-bsc/+/24883">change 24883</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-bsc/+/24883"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iccc1391e8419604bb09e464db8455e053dfbc982 </div>
<div style="display:none"> Gerrit-Change-Number: 24883 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>