<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22801">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use ALPHA value received in SI13 from PCUIF<br><br>The old VTY command is marked as deprecated and still overrides the use<br>in case it's used.<br><br>Related: SYS#5358<br>Depends: libosmocore.git Change-Id I74fb0a3afc1ac4aadbfc609b882d929401f790eb<br>Depends: osmo-bsc.git Change-Id I8b97ea11bad5fe05f2f634945b5703ee9abde81d<br>Change-Id: I46f2a955b157a409055fca7fb917dc4f75482426<br>---<br>M doc/examples/osmo-pcu.cfg<br>M doc/manuals/chapters/configuration.adoc<br>M src/bts.cpp<br>M src/bts.h<br>M src/gprs_pcu.c<br>M src/gprs_pcu.h<br>M src/pcu_l1_if.cpp<br>M src/pcu_vty.c<br>M src/tbf.cpp<br>M tests/emu/pcu_emu.cpp<br>10 files changed, 40 insertions(+), 19 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/01/22801/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/examples/osmo-pcu.cfg b/doc/examples/osmo-pcu.cfg</span><br><span>index b88e6e7..4a3842d 100644</span><br><span>--- a/doc/examples/osmo-pcu.cfg</span><br><span>+++ b/doc/examples/osmo-pcu.cfg</span><br><span>@@ -2,5 +2,4 @@</span><br><span>  flow-control-interval 10</span><br><span>  cs 2</span><br><span>  alloc-algorithm dynamic</span><br><span style="color: hsl(0, 100%, 40%);">- alpha 0</span><br><span>  gamma 0</span><br><span>diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc</span><br><span>index 01e4d65..5cb21ba 100644</span><br><span>--- a/doc/manuals/chapters/configuration.adoc</span><br><span>+++ b/doc/manuals/chapters/configuration.adoc</span><br><span>@@ -15,14 +15,12 @@</span><br><span>  flow-control-interval 10 <1></span><br><span>  cs 2 <2></span><br><span>  alloc-algorithm dynamic <3></span><br><span style="color: hsl(0, 100%, 40%);">- alpha 0 <4></span><br><span>  gamma 0</span><br><span> ----</span><br><span> <1> send a BSSGP flow-control PDU every 10 seconds</span><br><span> <2> start a TBF with the initial coding scheme 2</span><br><span> <3> dynamically chose between single-slot or multi-slot TBF allocations</span><br><span>     depending on system load</span><br><span style="color: hsl(0, 100%, 40%);">-<4> disable MS power control loop</span><br><span> </span><br><span> However, there are plenty of tuning parameters for people interested to</span><br><span> optimize PCU throughput or latency according to their requirements.</span><br><span>@@ -212,13 +210,12 @@</span><br><span> </span><br><span> You can set those parameters at the `pcu` VTY config node as follows:</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-`alpha <0-10>`::</span><br><span style="color: hsl(0, 100%, 40%);">-   Alpha parameter for MS power control in units of 0.1.</span><br><span style="color: hsl(0, 100%, 40%);">-   Make sure to set the alpha value at System Information 13 (in</span><br><span style="color: hsl(0, 100%, 40%);">-   the BSC), too!</span><br><span> `gamma <0-62>`::</span><br><span>     Set the gamma parameter for MS power control in units of dB.</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+Parameter `ALPHA` is set on the BSC VTY configuration file on a per-BTS basis,</span><br><span style="color: hsl(120, 100%, 40%);">+and forwarded by OsmoPCU to the MS through the SI13 received from the former</span><br><span style="color: hsl(120, 100%, 40%);">+over PCUIF.</span><br><span> </span><br><span> === Configuring Network Assisted Cell Change (NACC)</span><br><span> </span><br><span>diff --git a/src/bts.cpp b/src/bts.cpp</span><br><span>index fb7de64..11aef3f 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -918,7 +918,7 @@</span><br><span>            plen = Encoding::write_immediate_assignment(</span><br><span>                         &bts->trx[trx_no].pdch[ts_no], tbf, bv,</span><br><span>                       false, rip->ra, Fn, ta, usf, false, sb_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                   bts->pcu->vty.alpha, bts->pcu->vty.gamma, -1,</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_get_ms_pwr_alpha(bts), bts->pcu->vty.gamma, -1,</span><br><span>                    rip->burst_type);</span><br><span>                 bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF);</span><br><span>       }</span><br><span>@@ -999,7 +999,7 @@</span><br><span>                                                  tbf, immediate_assignment, true, 125,</span><br><span>                                                (tbf->pdch[ts_no]->last_rts_fn + 21216) % GSM_MAX_FN,</span><br><span>                                                  tbf->ta(), 7, poll, tbf->poll_fn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 bts->pcu->vty.alpha, bts->pcu->vty.gamma, -1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             bts_get_ms_pwr_alpha(bts), bts->pcu->vty.gamma, -1,</span><br><span>                                                    GSM_L1_BURST_TYPE_ACCESS_0);</span><br><span>     if (plen >= 0) {</span><br><span>          bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_DL_TBF);</span><br><span>@@ -1292,3 +1292,14 @@</span><br><span> {</span><br><span>         return bts_ms_store(bts)->ms_list();</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bts->pcu->vty.force_alpha != (uint8_t)-1)</span><br><span style="color: hsl(120, 100%, 40%);">+           return bts->pcu->vty.force_alpha;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bts->si13_is_set)</span><br><span style="color: hsl(120, 100%, 40%);">+              return bts->si31_ro_decoded.pwr_ctrl_pars.alpha;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* default if no SI13 is received yet: closed loop control, TS 44.060</span><br><span style="color: hsl(120, 100%, 40%);">+  * B.2 Closed loop control */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index e67668c..90367ac 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> #include <osmocom/gsm/l1sap.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48_rest_octets.h></span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span> #include "mslot_class.h"</span><br><span> #include "gsm_rlcmac.h"</span><br><span>@@ -224,6 +225,7 @@</span><br><span>        uint8_t si3[GSM_MACBLOCK_LEN];</span><br><span>       bool si3_is_set;</span><br><span>     uint8_t si13[GSM_MACBLOCK_LEN];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_gsm48_si13_info si31_ro_decoded;</span><br><span>         bool si13_is_set;</span><br><span> </span><br><span>        /* State for dynamic algorithm selection */</span><br><span>@@ -346,6 +348,7 @@</span><br><span> void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);</span><br><span> bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);</span><br><span> const struct llist_head* bts_ms_list(struct gprs_rlcmac_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts);</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>diff --git a/src/gprs_pcu.c b/src/gprs_pcu.c</span><br><span>index 554007e..52e9825 100644</span><br><span>--- a/src/gprs_pcu.c</span><br><span>+++ b/src/gprs_pcu.c</span><br><span>@@ -65,7 +65,7 @@</span><br><span>    pcu->vty.max_cs_dl = MAX_GPRS_CS;</span><br><span>         pcu->vty.max_mcs_ul = MAX_EDGE_MCS;</span><br><span>       pcu->vty.max_mcs_dl = MAX_EDGE_MCS;</span><br><span style="color: hsl(0, 100%, 40%);">-  pcu->vty.alpha = 0; /* a = 0.0 */</span><br><span style="color: hsl(120, 100%, 40%);">+  pcu->vty.force_alpha = (uint8_t)-1; /* don't force by default, use BTS SI13 provided value */</span><br><span>         pcu->vty.dl_tbf_preemptive_retransmission = true;</span><br><span>         /* By default resegmentation is supported in DL can also be configured</span><br><span>        * through VTY */</span><br><span>diff --git a/src/gprs_pcu.h b/src/gprs_pcu.h</span><br><span>index 9f75fb8..76e3937 100644</span><br><span>--- a/src/gprs_pcu.h</span><br><span>+++ b/src/gprs_pcu.h</span><br><span>@@ -90,7 +90,7 @@</span><br><span>           uint8_t max_cs_dl, max_cs_ul;</span><br><span>                uint8_t max_mcs_dl, max_mcs_ul;</span><br><span>              uint8_t force_two_phase;</span><br><span style="color: hsl(0, 100%, 40%);">-                uint8_t alpha, gamma;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t force_alpha, gamma;</span><br><span>          bool dl_tbf_preemptive_retransmission;</span><br><span>               enum egprs_arq_type dl_arq_type; /* EGPRS_ARQ1 to support resegmentation in DL, EGPRS_ARQ2 for no reseg */</span><br><span>           bool cs_adj_enabled; /* whether cs_adj_{upper,lower}_limit are used to adjust DL CS */</span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index 9873469..803f513 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -42,6 +42,7 @@</span><br><span> #include <osmocom/gprs/gprs_ns2.h></span><br><span> #include <osmocom/gsm/l1sap.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48_rest_octets.h></span><br><span> #include <osmocom/gsm/sysinfo.h></span><br><span> }</span><br><span> </span><br><span>@@ -291,6 +292,7 @@</span><br><span> </span><br><span> static int pcu_rx_data_ind_bcch(struct gprs_rlcmac_bts *bts, uint8_t *data, uint8_t len)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  const uint8_t *si_ro;</span><br><span>        switch (len) {</span><br><span>       case 0:</span><br><span>              /* Due to historical reasons also accept a completely empty message as</span><br><span>@@ -337,6 +339,9 @@</span><br><span>                 case GSM48_MT_RR_SYSINFO_13:</span><br><span>                         memcpy(bts->si13, data, GSM_MACBLOCK_LEN);</span><br><span>                        bts->si13_is_set = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                   si_ro = ((struct gsm48_system_information_type_13*)data)->rest_octets;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (osmo_gsm48_rest_octets_si13_decode(&bts->si31_ro_decoded, si_ro) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                           LOGP(DPCU, LOGL_ERROR, "Error decoding SI13\n");</span><br><span>                   break;</span><br><span>               default:</span><br><span>                     LOGP(DL1IF, LOGL_ERROR,</span><br><span>diff --git a/src/pcu_vty.c b/src/pcu_vty.c</span><br><span>index 6db8b05..7e9a75a 100644</span><br><span>--- a/src/pcu_vty.c</span><br><span>+++ b/src/pcu_vty.c</span><br><span>@@ -230,7 +230,8 @@</span><br><span>               vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);</span><br><span>   if (the_pcu->vty.force_two_phase)</span><br><span>                 vty_out(vty, " two-phase-access%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, " alpha %d%s", the_pcu->vty.alpha, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (the_pcu->vty.force_alpha != (uint8_t)-1)</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, " alpha %u%s", the_pcu->vty.force_alpha, VTY_NEWLINE);</span><br><span>     vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);</span><br><span>       if (!the_pcu->vty.dl_tbf_preemptive_retransmission)</span><br><span>               vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);</span><br><span>@@ -730,13 +731,19 @@</span><br><span> </span><br><span> DEFUN_ATTR(cfg_pcu_alpha,</span><br><span>         cfg_pcu_alpha_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-      "alpha <0-10>",</span><br><span style="color: hsl(120, 100%, 40%);">+       "alpha (si13|<0-10>)",</span><br><span>       "Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "</span><br><span>     "NOTE: Be sure to set Alpha value at System information 13 too.\n"</span><br><span style="color: hsl(0, 100%, 40%);">-    "Alpha in units of 0.1\n",</span><br><span style="color: hsl(0, 100%, 40%);">-    CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+           "Use value received from BSC in System Intormation 13 (default)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Force Alpha in units of 0.1\n",</span><br><span style="color: hsl(120, 100%, 40%);">+    CMD_ATTR_IMMEDIATE | CMD_ATTR_DEPRECATED)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       the_pcu->vty.alpha = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        vty_out(vty, "%% 'alpha <0-10>' is now deprecated: use osmo-bsc's 'gprs power-control alpha <0-10>' instead%s",</span><br><span style="color: hsl(120, 100%, 40%);">+             VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (strcmp(argv[0], "si13") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           the_pcu->vty.force_alpha = (uint8_t) -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   else</span><br><span style="color: hsl(120, 100%, 40%);">+          the_pcu->vty.force_alpha = atoi(argv[0]);</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 7caa2ce..1885927 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -930,7 +930,7 @@</span><br><span>  Encoding::write_packet_downlink_assignment(mac_control_block,</span><br><span>                old_tfi_is_valid, m_tfi, (direction == GPRS_RLCMAC_DL_TBF),</span><br><span>          new_dl_tbf, poll_ass_dl, rrbp,</span><br><span style="color: hsl(0, 100%, 40%);">-          the_pcu->vty.alpha, the_pcu->vty.gamma, -1, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          bts_get_ms_pwr_alpha(new_dl_tbf->bts), the_pcu->vty.gamma, -1, 0,</span><br><span>              is_egprs_enabled());</span><br><span>         LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++\n");</span><br><span>   rc = encode_gsm_rlcmac_downlink(&bv, mac_control_block);</span><br><span>@@ -1033,7 +1033,7 @@</span><br><span>         mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);</span><br><span>         Encoding::write_packet_uplink_assignment(mac_control_block, m_tfi,</span><br><span>           (direction == GPRS_RLCMAC_DL_TBF), tlli(),</span><br><span style="color: hsl(0, 100%, 40%);">-              is_tlli_valid(), new_tbf, 1, rrbp, the_pcu->vty.alpha,</span><br><span style="color: hsl(120, 100%, 40%);">+             is_tlli_valid(), new_tbf, 1, rrbp, bts_get_ms_pwr_alpha(new_tbf->bts),</span><br><span>            the_pcu->vty.gamma, -1, is_egprs_enabled());</span><br><span> </span><br><span>  LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++\n");</span><br><span>diff --git a/tests/emu/pcu_emu.cpp b/tests/emu/pcu_emu.cpp</span><br><span>index ef573a7..0f2d305 100644</span><br><span>--- a/tests/emu/pcu_emu.cpp</span><br><span>+++ b/tests/emu/pcu_emu.cpp</span><br><span>@@ -77,7 +77,6 @@</span><br><span>        if (!pcu->alloc_algorithm)</span><br><span>                pcu->alloc_algorithm = alloc_algorithm_b;</span><br><span>         pcu->vty.fc_interval = 100;</span><br><span style="color: hsl(0, 100%, 40%);">-  pcu->vty.alpha = 0; /* a = 0.0 */</span><br><span> }</span><br><span> </span><br><span> static void bvci_unblocked(struct gprs_bssgp_pcu *pcu)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/22801">change 22801</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-pcu/+/22801"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I46f2a955b157a409055fca7fb917dc4f75482426 </div>
<div style="display:none"> Gerrit-Change-Number: 22801 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>