<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25823">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts_shutdown_fsm: Make sure pending power ramping are aborted before closing TRX<br><br>It can happen when using several TRX that all of them go alreadyunder<br>shutdown target tx power level, but that due to configuration the BTS<br>still may want to keep pushing the tx power level even lower. Hence, we<br>end up in a situation where the FSM is trying to close all the TRX while the<br>power ramp procedure is ongoing for some of them. As a result, race<br>conditions can happen where for instance the power ramping procedure for<br>one TRX ends and calls the cb to send SETPOWER after the TRX PHY has<br>been closed (and hence TRXC link is unavaialble).<br>If that happens, the trx_if lower layers store the SETPOWER and attempt<br>a later retransmit, which may take up to 2 seconds after TRX becomes<br>active if BTS reconnects immediatelly.<br>Hence, we end up in some test cases where BTS reconnects and configures<br>some TRX while others are kep unconfigured for a while due to the<br>mentioned delay, hence the test attempting to use the TS while it hasn't<br>been yet configured.<br><br>The solution is to avoid this kind of unexpected events with ongoing<br>powe ramp once we have decided tx power is lower enough to shutdown the<br>TRX completely. Hence we abort the pending power ramp procedure.<br><br>Change-Id: Ibca581131eb142d7c38c917a0d6990efec03123c<br>---<br>M include/osmo-bts/tx_power.h<br>M src/common/bts_shutdown_fsm.c<br>M src/common/tx_power.c<br>3 files changed, 16 insertions(+), 2 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/23/25823/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/tx_power.h b/include/osmo-bts/tx_power.h</span><br><span>index 8f68d8a..a7f846e 100644</span><br><span>--- a/include/osmo-bts/tx_power.h</span><br><span>+++ b/include/osmo-bts/tx_power.h</span><br><span>@@ -78,6 +78,7 @@</span><br><span> int get_p_trxout_actual_mdBm_lchan(const struct gsm_lchan *lchan);</span><br><span> </span><br><span> int power_ramp_start(struct gsm_bts_trx *trx, int p_total_tgt_mdBm, int bypass, ramp_compl_cb_t ramp_compl_cb);</span><br><span style="color: hsl(120, 100%, 40%);">+void power_ramp_abort(struct gsm_bts_trx *trx);</span><br><span> </span><br><span> void power_trx_change_compl(struct gsm_bts_trx *trx, int p_trxout_cur_mdBm);</span><br><span> </span><br><span>diff --git a/src/common/bts_shutdown_fsm.c b/src/common/bts_shutdown_fsm.c</span><br><span>index a663f5b..0c6d80c 100644</span><br><span>--- a/src/common/bts_shutdown_fsm.c</span><br><span>+++ b/src/common/bts_shutdown_fsm.c</span><br><span>@@ -112,8 +112,15 @@</span><br><span> </span><br><span>          LOGPFSML(fi, LOGL_INFO, "%s Ramping down complete, %u TRX remaining\n",</span><br><span>                     gsm_trx_name(src_trx), remaining);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (remaining == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           if (remaining == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Make sure we end up any remaining ongoing power ramp</span><br><span style="color: hsl(120, 100%, 40%);">+                        * down under target shutdown tx power level, then</span><br><span style="color: hsl(120, 100%, 40%);">+                     * finally transit to next state:</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%);">+                                power_ramp_abort(trx);</span><br><span>                       bts_shutdown_fsm_state_chg(fi, BTS_SHUTDOWN_ST_WAIT_TRX_CLOSED);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span>            break;</span><br><span>       }</span><br><span> }</span><br><span>diff --git a/src/common/tx_power.c b/src/common/tx_power.c</span><br><span>index 348aba5..0307422 100644</span><br><span>--- a/src/common/tx_power.c</span><br><span>+++ b/src/common/tx_power.c</span><br><span>@@ -259,7 +259,7 @@</span><br><span>        }</span><br><span> </span><br><span>        /* Cancel any pending request */</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_timer_del(&tpp->ramp.step_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+ power_ramp_abort(trx);</span><br><span> </span><br><span>   /* set the new target */</span><br><span>     tpp->p_total_tgt_mdBm = p_total_tgt_mdBm;</span><br><span>@@ -297,6 +297,12 @@</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Cancel any pending request */</span><br><span style="color: hsl(120, 100%, 40%);">+void power_ramp_abort(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_timer_del(&trx->power_params.ramp.step_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* determine the initial transceiver output power at start-up time */</span><br><span> int power_ramp_initial_power_mdBm(const struct gsm_bts_trx *trx)</span><br><span> {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25823">change 25823</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/+/25823"/><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: Ibca581131eb142d7c38c917a0d6990efec03123c </div>
<div style="display:none"> Gerrit-Change-Number: 25823 </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>