<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/21447">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: implement Downlink power control<br><br>Change-Id: I5b509e71d5f668b6b8b2abf8053c27f2a7c78451<br>Related: SYS#4918<br>---<br>M include/osmo-bts/gsm_data.h<br>M include/osmo-bts/power_control.h<br>M src/common/l1sap.c<br>M src/common/power_control.c<br>M src/common/rsl.c<br>M src/common/scheduler.c<br>M src/common/vty.c<br>7 files changed, 148 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/47/21447/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 04c6629..6af96fe 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -316,11 +316,9 @@</span><br><span>     /* RTP header Marker bit to indicate beginning of speech after pause  */</span><br><span>     bool rtp_tx_marker;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* MS power control */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* MS/BS power control */</span><br><span>    struct lchan_power_ctrl_state ms_power_ctrl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* BTS power reduction (in dB) */</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t bs_power_red;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct lchan_power_ctrl_state bs_power_ctrl;</span><br><span> </span><br><span>     struct msgb *pending_rel_ind_msg;</span><br><span> </span><br><span>diff --git a/include/osmo-bts/power_control.h b/include/osmo-bts/power_control.h</span><br><span>index cb566a8..f2e14cf 100644</span><br><span>--- a/include/osmo-bts/power_control.h</span><br><span>+++ b/include/osmo-bts/power_control.h</span><br><span>@@ -6,3 +6,6 @@</span><br><span> int lchan_ms_pwr_ctrl(struct gsm_lchan *lchan,</span><br><span>                     const uint8_t ms_power_lvl,</span><br><span>                  const int8_t ul_rssi_dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_bs_pwr_ctrl(struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const struct gsm48_hdr *gh);</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index 2038fba..33d10a5 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -1546,6 +1546,7 @@</span><br><span>              lchan->meas.flags |= LC_UL_M_F_L1_VALID;</span><br><span> </span><br><span>              lchan_ms_pwr_ctrl(lchan, data[0] & 0x1f, data_ind->rssi);</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_bs_pwr_ctrl(lchan, (const struct gsm48_hdr *) &data[5]);</span><br><span>   } else</span><br><span>               le = &lchan->lapdm_ch.lapdm_dcch;</span><br><span> </span><br><span>diff --git a/src/common/power_control.c b/src/common/power_control.c</span><br><span>index 592e4f6..71808c8 100644</span><br><span>--- a/src/common/power_control.c</span><br><span>+++ b/src/common/power_control.c</span><br><span>@@ -219,3 +219,105 @@</span><br><span> </span><br><span>        return 1;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! compute the new Downlink attenuation value for the given logical channel.</span><br><span style="color: hsl(120, 100%, 40%);">+  *  \param lchan logical channel for which to compute (and in which to store) new power value.</span><br><span style="color: hsl(120, 100%, 40%);">+  *  \param[in] gh pointer to the beginning of (presumably) a Measurement Report.</span><br><span style="color: hsl(120, 100%, 40%);">+  */</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_bs_pwr_ctrl(struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const struct gsm48_hdr *gh)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx = lchan->ts->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t rxqual_full, rxqual_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t rxlev_full, rxlev_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t rxqual, rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+        int delta, new;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     const struct bts_power_ctrl_params *params = &bts->dl_power_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct lchan_power_ctrl_state *state = &lchan->bs_power_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Check if BS Power Control is enabled */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (state->fixed)</span><br><span style="color: hsl(120, 100%, 40%);">+          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Check if this is a Measurement Report */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (gh->proto_discr != GSM48_PDISC_RR)</span><br><span style="color: hsl(120, 100%, 40%);">+             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gh->msg_type != GSM48_MT_RR_MEAS_REP)</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%);">+   /* Check if the measurement results are valid */</span><br><span style="color: hsl(120, 100%, 40%);">+      if ((gh->data[1] & 0x40) == 0x40) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "The measurement results are not valid\n");</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%);">+   /* See 3GPP TS 44.018, section 10.5.2.20 */</span><br><span style="color: hsl(120, 100%, 40%);">+   rxqual_full = (gh->data[2] >> 4) & 0x7;</span><br><span style="color: hsl(120, 100%, 40%);">+  rxqual_sub = (gh->data[2] >> 1) & 0x7;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev_full = gh->data[0] & 0x3f;</span><br><span style="color: hsl(120, 100%, 40%);">+       rxlev_sub = gh->data[1] & 0x3f;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGPLCHAN(lchan, DLOOP, LOGL_DEBUG, "Rx DL Measurement Report: "</span><br><span style="color: hsl(120, 100%, 40%);">+              "RXLEV-FULL(%02u), RXQUAL-FULL(%u), "</span><br><span style="color: hsl(120, 100%, 40%);">+               "RXLEV-SUB(%02u), RXQUAL-SUB(%u), "</span><br><span style="color: hsl(120, 100%, 40%);">+                 "DTx is %s => using %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               rxqual_full, rxqual_sub, rxlev_full, rxlev_sub,</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan->tch.dtx.dl_active ? "enabled" : "disabled",</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->tch.dtx.dl_active ? "SUB" : "FULL");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* If DTx is active on Downlink, use the '-SUB' */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (lchan->tch.dtx.dl_active) {</span><br><span style="color: hsl(120, 100%, 40%);">+            rxqual = rxqual_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+          rxlev = rxlev_sub;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else { /* ... otherwise use the '-FULL' */</span><br><span style="color: hsl(120, 100%, 40%);">+          rxqual = rxqual_full;</span><br><span style="color: hsl(120, 100%, 40%);">+         rxlev = rxlev_full;</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%);">+   /* Bit Error Rate > 0 => reduce by 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rxqual > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "Reducing Downlink attenuation "</span><br><span style="color: hsl(120, 100%, 40%);">+                   "by half: %u -> %u dB due to RXQUAL %u > 0\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        state->current, state->current / 2, rxqual);</span><br><span style="color: hsl(120, 100%, 40%);">+          state->current /= 2;</span><br><span style="color: hsl(120, 100%, 40%);">+               return 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%);">+   /* Calculate a 'delta' for the current attenuation level */</span><br><span style="color: hsl(120, 100%, 40%);">+   delta = calc_delta(params, state, rxlev2dbm(rxlev));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Basic signal transmission / reception formula:</span><br><span style="color: hsl(120, 100%, 40%);">+      *</span><br><span style="color: hsl(120, 100%, 40%);">+     *   RxLev = TxPwr - (PathLoss + TxAtt)</span><br><span style="color: hsl(120, 100%, 40%);">+        *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Here we want to change RxLev at the MS side, so:</span><br><span style="color: hsl(120, 100%, 40%);">+    *</span><br><span style="color: hsl(120, 100%, 40%);">+     *   RxLev + Delta = TxPwr - (PathLoss + TxAtt) + Delta</span><br><span style="color: hsl(120, 100%, 40%);">+        *</span><br><span style="color: hsl(120, 100%, 40%);">+     * The only parameter we can change here is TxAtt, so:</span><br><span style="color: hsl(120, 100%, 40%);">+         *</span><br><span style="color: hsl(120, 100%, 40%);">+     *   RxLev + Delta = TxPwr - PathLoss -  TxAtt + Delta</span><br><span style="color: hsl(120, 100%, 40%);">+         *   RxLev + Delta = TxPwr - PathLoss - (TxAtt - Delta)</span><br><span style="color: hsl(120, 100%, 40%);">+        */</span><br><span style="color: hsl(120, 100%, 40%);">+   new = state->current - delta;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (new > state->max)</span><br><span style="color: hsl(120, 100%, 40%);">+           new = state->max;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (new < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+               new = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (state->current != new) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "Changing Downlink attenuation: "</span><br><span style="color: hsl(120, 100%, 40%);">+                          "%u -> %u dB (maximum %u dB, target %d dBm, delta %d dB)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     state->current, new, state->max, params->target, delta);</span><br><span style="color: hsl(120, 100%, 40%);">+           state->current = new;</span><br><span style="color: hsl(120, 100%, 40%);">+              return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPLCHAN(lchan, DLOOP, LOGL_INFO, "Keeping Downlink attenuation "</span><br><span style="color: hsl(120, 100%, 40%);">+                    "at %u dB (maximum %u dB, target %d dBm, delta %d dB)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   state->current, state->max, params->target, delta);</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>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 8760c24..2ebfb32 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -1036,8 +1036,8 @@</span><br><span>    lchan->tch_mode = 0;</span><br><span>      memset(&lchan->encr, 0, sizeof(lchan->encr));</span><br><span>      memset(&lchan->ho, 0, sizeof(lchan->ho));</span><br><span style="color: hsl(0, 100%, 40%);">-     lchan->bs_power_red = 0;</span><br><span>  memset(&lchan->ms_power_ctrl, 0, sizeof(lchan->ms_power_ctrl));</span><br><span style="color: hsl(120, 100%, 40%);">+     memset(&lchan->bs_power_ctrl, 0, sizeof(lchan->bs_power_ctrl));</span><br><span>    lchan->rqd_ta = 0;</span><br><span>        copy_sacch_si_to_lchan(lchan);</span><br><span>       memset(&lchan->tch, 0, sizeof(lchan->tch));</span><br><span>@@ -1153,11 +1153,16 @@</span><br><span>      LOGPLCHAN(lchan, DRSL, LOGL_DEBUG, "rx Channel Activation in state: %s.\n",</span><br><span>                  gsm_lchans_name(lchan->state));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        /* Initialize channel defaults */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Initialize MS Power Control defaults */</span><br><span>   lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(lchan->ts->trx->bts->band, 0);</span><br><span>      lchan->ms_power_ctrl.current = lchan->ms_power_ctrl.max;</span><br><span>       lchan->ms_power_ctrl.fixed = true;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* Initialize BS Power Control defaults */</span><br><span style="color: hsl(120, 100%, 40%);">+    lchan->bs_power_ctrl.max = 2 * 15;</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan->bs_power_ctrl.current = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->bs_power_ctrl.fixed = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      rsl_tlv_parse(&tp, msgb_l3(msg), msgb_l3len(msg));</span><br><span> </span><br><span>   /* 9.3.3 Activation Type */</span><br><span>@@ -1209,9 +1214,11 @@</span><br><span>                         return rsl_tx_chan_act_nack(lchan, RSL_ERR_SERV_OPT_UNIMPL);</span><br><span>                 }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           lchan->bs_power_red = BS_POWER2DB(*TLVP_VAL(&tp, RSL_IE_BS_POWER));</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->bs_power_ctrl.max = BS_POWER2DB(*TLVP_VAL(&tp, RSL_IE_BS_POWER));</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan->bs_power_ctrl.current = lchan->bs_power_ctrl.max;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             LOGPLCHAN(lchan, DRSL, LOGL_DEBUG, "BS Power attenuation %u dB\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan->bs_power_red);</span><br><span style="color: hsl(120, 100%, 40%);">+                      lchan->bs_power_ctrl.current);</span><br><span>  }</span><br><span> </span><br><span>        /* 9.3.13 MS Power */</span><br><span>@@ -1224,7 +1231,6 @@</span><br><span>        if (TLVP_PRES_LEN(&tp, RSL_IE_TIMING_ADVANCE, 1))</span><br><span>                lchan->rqd_ta = *TLVP_VAL(&tp, RSL_IE_TIMING_ADVANCE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* 9.3.32 BS Power Parameters */</span><br><span>     /* 9.3.31 MS Power Parameters */</span><br><span>     if (TLVP_PRESENT(&tp, RSL_IE_MS_POWER_PARAM)) {</span><br><span>          /* Spec explicitly states BTS should only perform</span><br><span>@@ -1232,6 +1238,14 @@</span><br><span>           * Parameters' IE is present! */</span><br><span>          lchan->ms_power_ctrl.fixed = false;</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 9.3.32 BS Power Parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (TLVP_PRESENT(&tp, RSL_IE_BS_POWER_PARAM)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* NOTE: it's safer to start from 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->bs_power_ctrl.current = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          lchan->bs_power_ctrl.fixed = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* 9.3.16 Physical Context */</span><br><span> </span><br><span>    /* 9.3.29 SACCH Information */</span><br><span>@@ -1753,7 +1767,7 @@</span><br><span>       struct abis_rsl_dchan_hdr *dch = msgb_l2(msg);</span><br><span>       struct gsm_lchan *lchan = msg->lchan;</span><br><span>     struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t old_bs_power_red;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t old, new;</span><br><span> </span><br><span>        rsl_tlv_parse(&tp, msgb_l3(msg), msgb_l3len(msg));</span><br><span> </span><br><span>@@ -1766,18 +1780,24 @@</span><br><span>                 return rsl_tx_error_report(msg->trx, RSL_ERR_SERV_OPT_UNIMPL, &dch->chan_nr, NULL, msg);</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   old_bs_power_red = lchan->bs_power_red;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->bs_power_red = BS_POWER2DB(*TLVP_VAL(&tp, RSL_IE_BS_POWER));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      LOGPLCHAN(lchan, DRSL, LOGL_INFO, "BS POWER CONTROL Attenuation %d -> %d dB\n",</span><br><span style="color: hsl(0, 100%, 40%);">-              old_bs_power_red, lchan->bs_power_red);</span><br><span style="color: hsl(120, 100%, 40%);">+  new = BS_POWER2DB(*TLVP_VAL(&tp, RSL_IE_BS_POWER));</span><br><span style="color: hsl(120, 100%, 40%);">+       old = lchan->bs_power_ctrl.current;</span><br><span> </span><br><span>   /* 9.3.31 MS Power Parameters (O) */</span><br><span>         if (TLVP_PRESENT(&tp, RSL_IE_BS_POWER_PARAM)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Spec explicitly states BTS should perform autonomous</span><br><span style="color: hsl(0, 100%, 40%);">-          * BS power control loop in BTS if 'BS Power Parameters'</span><br><span style="color: hsl(0, 100%, 40%);">-                 * IE is present!  WE don't support that. */</span><br><span style="color: hsl(0, 100%, 40%);">-                return rsl_tx_error_report(msg->trx, RSL_ERR_OPT_IE_ERROR, &dch->chan_nr, NULL, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               /* NOTE: it's safer to start from 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->bs_power_ctrl.current = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          lchan->bs_power_ctrl.max = new;</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->bs_power_ctrl.fixed = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan->bs_power_ctrl.current = new;</span><br><span style="color: hsl(120, 100%, 40%);">+                lchan->bs_power_ctrl.fixed = true;</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 (lchan->bs_power_ctrl.current != old) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPLCHAN(lchan, DRSL, LOGL_INFO, "BS POWER CONTROL: "</span><br><span style="color: hsl(120, 100%, 40%);">+                        "attenuation change %u -> %u dB\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                      old, lchan->bs_power_ctrl.current);</span><br><span>     }</span><br><span> </span><br><span>        return 0;</span><br><span>@@ -2975,7 +2995,7 @@</span><br><span>            msgb_tlv_put(msg, RSL_IE_UPLINK_MEAS, ie_len, meas_res);</span><br><span>             lchan->meas.flags &= ~LC_UL_M_F_RES_VALID;</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       msgb_tv_put(msg, RSL_IE_BS_POWER, lchan->bs_power_red / 2);</span><br><span style="color: hsl(120, 100%, 40%);">+        msgb_tv_put(msg, RSL_IE_BS_POWER, lchan->bs_power_ctrl.current / 2);</span><br><span>      if (lchan->meas.flags & LC_UL_M_F_L1_VALID) {</span><br><span>                 msgb_tv_fixed_put(msg, RSL_IE_L1_INFO, 2, lchan->meas.l1_info);</span><br><span>           lchan->meas.flags &= ~LC_UL_M_F_L1_VALID;</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index 84918e3..3d780fd 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -1237,7 +1237,7 @@</span><br><span> </span><br><span>    /* BS Power reduction (in dB) per logical channel */</span><br><span>         if (l1cs->lchan != NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-             br->att = l1cs->lchan->bs_power_red;</span><br><span style="color: hsl(120, 100%, 40%);">+         br->att = l1cs->lchan->bs_power_ctrl.current;</span><br><span> </span><br><span>   /* encrypt */</span><br><span>        if (br->burst_len && l1cs->dl_encr_algo) {</span><br><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index 0e78ad3..f366956 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -1381,10 +1381,13 @@</span><br><span>              lchan->state == LCHAN_S_BROKEN ? " Error reason: " : "",</span><br><span>              lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "",</span><br><span>          VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TODO: print more info about MS/BS Power Control */</span><br><span>        vty_out(vty, "  BS Power: %d dBm, MS Power: %u dBm%s",</span><br><span>             lchan->ts->trx->nominal_power - (lchan->ts->trx->max_power_red + lchan->bs_power_red),</span><br><span>          ms_pwr_dbm(lchan->ts->trx->bts->band, lchan->ms_power_ctrl.max),</span><br><span>              VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>        vty_out(vty, "  Channel Mode / Codec: %s%s",</span><br><span>               gsm48_chan_mode_name(lchan->tch_mode),</span><br><span>            VTY_NEWLINE);</span><br><span>@@ -1426,7 +1429,6 @@</span><br><span>        if (lchan->loopback)</span><br><span>              vty_out(vty, "  RTP/PDCH Loopback Enabled%s", VTY_NEWLINE);</span><br><span>        vty_out(vty, "  Radio Link Failure Counter 'S': %d%s", lchan->s, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     /* TODO: MS Power Control */</span><br><span> }</span><br><span> </span><br><span> static void lchan_dump_short_vty(struct vty *vty, const struct gsm_lchan *lchan)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/21447">change 21447</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/+/21447"/><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: I5b509e71d5f668b6b8b2abf8053c27f2a7c78451 </div>
<div style="display:none"> Gerrit-Change-Number: 21447 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>