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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stats: Add counters and gauges for BORKEN lchans/TS<br><br>Now we can monitor the situation with the BORKEN lchans and TS in our<br>BTS's over time.<br><br>Change-Id: I427bbe1613a0e92bff432a7d76592fe50f620ebe<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/lchan_fsm.c<br>M src/osmo-bsc/timeslot_fsm.c<br>5 files changed, 148 insertions(+), 11 deletions(-)<br><br></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 17da79d..276fc02 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1396,7 +1396,7 @@</span><br><span> void conn_update_ms_power_class(struct gsm_subscriber_connection *conn, uint8_t power_class);</span><br><span> void lchan_update_ms_power_ctrl_level(struct gsm_lchan *lchan, int ms_power_dbm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(120, 100%, 40%);">+enum bts_counter_id {</span><br><span>  BTS_CTR_CHREQ_TOTAL,</span><br><span>         BTS_CTR_CHREQ_NO_CHANNEL,</span><br><span>    BTS_CTR_CHAN_RF_FAIL,</span><br><span>@@ -1417,6 +1417,27 @@</span><br><span>       BTS_CTR_RSL_UNKNOWN,</span><br><span>         BTS_CTR_RSL_IPA_NACK,</span><br><span>        BTS_CTR_MODE_MODIFY_NACK,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_LCHAN_BORKEN_FROM_UNUSED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_CTR_LCHAN_BORKEN_FROM_BORKEN,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+    BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK,</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS_CTR_LCHAN_BORKEN_EV_VTY,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_TS_BORKEN_FROM_UNUSED,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT,</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS_CTR_TS_BORKEN_FROM_PDCH,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_TS_BORKEN_FROM_IN_USE,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_CTR_TS_BORKEN_FROM_BORKEN,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_CTR_TS_BORKEN_FROM_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_TS_BORKEN_EV_TEARDOWN,</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span>@@ -1441,6 +1462,29 @@</span><br><span>     [BTS_CTR_RSL_UNKNOWN] =                 {"rsl:unknown", "Number of unknown/unsupported RSL messages received from BTS"},</span><br><span>         [BTS_CTR_RSL_IPA_NACK] =                {"rsl:ipa_nack", "Number of IPA (RTP/dyn-PDCH) related NACKs received from BTS"},</span><br><span>        [BTS_CTR_MODE_MODIFY_NACK] =            {"chan:mode_modify_nack", "Number of Channel Mode Modify NACKs received from BTS"},</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* lchan/TS BORKEN state counters */</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_LCHAN_BORKEN_FROM_UNUSED] =              {"lchan_borken:from_state:unused", "Transitions from lchan UNUSED state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK] =      {"lchan_borken:from_state:wait_activ_ack", "Transitions from lchan WAIT_ACTIV_ACK state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK] = {"lchan_borken:from_state:wait_rf_release_ack", "Transitions from lchan WAIT_RF_RELEASE_ACK state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_LCHAN_BORKEN_FROM_BORKEN] =              {"lchan_borken:from_state:borken", "Transitions from lchan BORKEN state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN] =             {"lchan_borken:from_state:unknown", "Transitions from an unknown lchan state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK] =        {"lchan_borken:event:chan_activ_ack", "CHAN_ACTIV_ACK received in the lchan BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK] =       {"lchan_borken:event:chan_activ_nack", "CHAN_ACTIV_NACK received in the lchan BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK] =       {"lchan_borken:event:rf_chan_rel_ack", "RF_CHAN_REL_ACK received in the lchan BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_LCHAN_BORKEN_EV_VTY] =                   {"lchan_borken:event:vty", "VTY commands received in the lchan BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN] =              {"lchan_borken:event:teardown", "lchan in a BORKEN state is shutting down (BTS disconnected?)"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED] =   {"ts_borken:from_state:not_initialized", "Transitions from TS NOT_INITIALIZED state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_TS_BORKEN_FROM_UNUSED] =            {"ts_borken:from_state:unused", "Transitions from TS UNUSED state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT] =     {"ts_borken:from_state:wait_pdch_act", "Transitions from TS WAIT_PDCH_ACT state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_TS_BORKEN_FROM_PDCH] =              {"ts_borken:from_state:pdch", "Transitions from TS PDCH state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT] =   {"ts_borken:from_state:wait_pdch_deact", "Transitions from TS WAIT_PDCH_DEACT state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_TS_BORKEN_FROM_IN_USE] =            {"ts_borken:from_state:in_use", "Transitions from TS IN_USE state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_TS_BORKEN_FROM_BORKEN] =            {"ts_borken:from_state:borken", "Transitions from TS BORKEN state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_TS_BORKEN_FROM_UNKNOWN] =           {"ts_borken:from_state:unknown", "Transitions from an unknown TS state to BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK] =   {"ts_borken:event:pdch_act_ack_nack", "PDCH_ACT_ACK/NACK received in the TS BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK] = {"ts_borken:event:pdch_deact_ack_nack", "PDCH_DEACT_ACK/NACK received in the TS BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_TS_BORKEN_EV_TEARDOWN] =            {"ts_borken:event:teardown", "TS in a BORKEN state is shutting down (BTS disconnected?)"},</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_group_desc bts_ctrg_desc = {</span><br><span>@@ -1474,6 +1518,8 @@</span><br><span>   BTS_STAT_RACH_ACCESS,</span><br><span>        BTS_STAT_OML_CONNECTED,</span><br><span>      BTS_STAT_RSL_CONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_STAT_LCHAN_BORKEN,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_STAT_TS_BORKEN,</span><br><span> };</span><br><span> </span><br><span> enum {</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 30f685f..d699cf7 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -5018,9 +5018,10 @@</span><br><span>                        return CMD_WARNING;</span><br><span>          }</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                if (lchan->fi->state == LCHAN_ST_BORKEN)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (lchan->fi->state == LCHAN_ST_BORKEN) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_VTY]);</span><br><span>                   osmo_fsm_inst_state_chg(lchan->fi, LCHAN_ST_UNUSED, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-           else {</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span>                     vty_out(vty,</span><br><span>                                 "%% lchan is in state %s, only lchans that are in state %s may be moved to state %s manually%s",</span><br><span>                           osmo_fsm_state_name(lchan->fi->fsm, lchan->fi->state),</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 2847f38..c34f06c 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -392,6 +392,8 @@</span><br><span>    { "rach_access", "RACH slots with access bursts in them", "%", 16, 0 },</span><br><span>        { "oml_connected", "Number of OML links connected", "", 16, 0 },</span><br><span>       { "rsl_connected", "Number of RSL links connected", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "lchan_borken", "Number of lchans in the BORKEN state", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+  { "ts_borken", "Number of timeslots in the BORKEN state", "", 16, 0 },</span><br><span> };</span><br><span> </span><br><span> static const struct osmo_stat_item_group_desc bts_statg_desc = {</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index fc8cd3f..a1bf857 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -1071,6 +1071,28 @@</span><br><span> static void lchan_fsm_borken_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span>         struct gsm_lchan *lchan = lchan_fi_lchan(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ enum bts_counter_id ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (prev_state) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case LCHAN_ST_UNUSED:</span><br><span style="color: hsl(120, 100%, 40%);">+         ctr = BTS_CTR_LCHAN_BORKEN_FROM_UNUSED;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case LCHAN_ST_WAIT_ACTIV_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+         ctr = BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case LCHAN_ST_WAIT_RF_RELEASE_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+            ctr = BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case LCHAN_ST_BORKEN:</span><br><span style="color: hsl(120, 100%, 40%);">+         ctr = BTS_CTR_LCHAN_BORKEN_FROM_BORKEN;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              ctr = BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[ctr]);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (prev_state != LCHAN_ST_BORKEN)</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_inc(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The actual action besides all the beancounting above */</span><br><span>   lchan_reset(lchan);</span><br><span> }</span><br><span> </span><br><span>@@ -1081,6 +1103,8 @@</span><br><span> </span><br><span>     case LCHAN_EV_RSL_CHAN_ACTIV_ACK:</span><br><span>            /* A late Chan Activ ACK? Release. */</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span>          lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span>            lchan_fsm_state_chg(LCHAN_ST_WAIT_RF_RELEASE_ACK);</span><br><span>@@ -1088,11 +1112,15 @@</span><br><span> </span><br><span>     case LCHAN_EV_RSL_CHAN_ACTIV_NACK:</span><br><span>           /* A late Chan Activ NACK? Ok then, unused. */</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span>          lchan_fsm_state_chg(LCHAN_ST_UNUSED);</span><br><span>                return;</span><br><span> </span><br><span>  case LCHAN_EV_RSL_RF_CHAN_REL_ACK:</span><br><span>           /* A late Release ACK? */</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span>          lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span>            lchan_fsm_state_chg(LCHAN_ST_WAIT_AFTER_ERROR);</span><br><span>@@ -1384,6 +1412,10 @@</span><br><span> void lchan_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)</span><br><span> {</span><br><span>    struct gsm_lchan *lchan = lchan_fi_lchan(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lchan->fi->state == LCHAN_ST_BORKEN) {</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span>    lchan_reset(lchan);</span><br><span>  if (lchan->last_error) {</span><br><span>          talloc_free(lchan->last_error);</span><br><span>diff --git a/src/osmo-bsc/timeslot_fsm.c b/src/osmo-bsc/timeslot_fsm.c</span><br><span>index 84ffb7f..4816daf 100644</span><br><span>--- a/src/osmo-bsc/timeslot_fsm.c</span><br><span>+++ b/src/osmo-bsc/timeslot_fsm.c</span><br><span>@@ -654,6 +654,39 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void ts_fsm_borken_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+     enum bts_counter_id ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (prev_state) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case TS_ST_NOT_INITIALIZED:</span><br><span style="color: hsl(120, 100%, 40%);">+           ctr = BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TS_ST_UNUSED:</span><br><span style="color: hsl(120, 100%, 40%);">+            ctr = BTS_CTR_TS_BORKEN_FROM_UNUSED;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TS_ST_WAIT_PDCH_ACT:</span><br><span style="color: hsl(120, 100%, 40%);">+             ctr = BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT;</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TS_ST_PDCH:</span><br><span style="color: hsl(120, 100%, 40%);">+              ctr = BTS_CTR_TS_BORKEN_FROM_PDCH;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TS_ST_WAIT_PDCH_DEACT:</span><br><span style="color: hsl(120, 100%, 40%);">+           ctr = BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TS_ST_IN_USE:</span><br><span style="color: hsl(120, 100%, 40%);">+            ctr = BTS_CTR_TS_BORKEN_FROM_IN_USE;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TS_ST_BORKEN:</span><br><span style="color: hsl(120, 100%, 40%);">+            ctr = BTS_CTR_TS_BORKEN_FROM_BORKEN;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              ctr = BTS_CTR_TS_BORKEN_FROM_UNKNOWN;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(&ts->trx->bts->bts_ctrs->ctr[ctr]);</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_stat_item_inc(ts->trx->bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void ts_fsm_borken(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>  switch (event) {</span><br><span>@@ -670,17 +703,29 @@</span><br><span> </span><br><span>         case TS_EV_PDCH_ACT_ACK:</span><br><span>     case TS_EV_PDCH_ACT_NACK:</span><br><span style="color: hsl(0, 100%, 40%);">-               /* Late PDCH activation ACK/NACK is not a crime.</span><br><span style="color: hsl(0, 100%, 40%);">-                 * Just process them as normal. */</span><br><span style="color: hsl(0, 100%, 40%);">-              ts_fsm_wait_pdch_act(fi, event, data);</span><br><span style="color: hsl(0, 100%, 40%);">-          return;</span><br><span style="color: hsl(120, 100%, 40%);">+               {</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct gsm_bts *bts = ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Late PDCH activation ACK/NACK is not a crime.</span><br><span style="color: hsl(120, 100%, 40%);">+                       * Just process them as normal. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                       ts_fsm_wait_pdch_act(fi, event, data);</span><br><span style="color: hsl(120, 100%, 40%);">+                        return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span> </span><br><span>        case TS_EV_PDCH_DEACT_ACK:</span><br><span>   case TS_EV_PDCH_DEACT_NACK:</span><br><span style="color: hsl(0, 100%, 40%);">-             /* Late PDCH deactivation ACK/NACK is also not a crime.</span><br><span style="color: hsl(0, 100%, 40%);">-          * Just process them as normal. */</span><br><span style="color: hsl(0, 100%, 40%);">-              ts_fsm_wait_pdch_deact(fi, event, data);</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(120, 100%, 40%);">+               {</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct gsm_bts *bts = ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* Late PDCH deactivation ACK/NACK is also not a crime.</span><br><span style="color: hsl(120, 100%, 40%);">+                        * Just process them as normal. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                       ts_fsm_wait_pdch_deact(fi, event, data);</span><br><span style="color: hsl(120, 100%, 40%);">+                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span> </span><br><span>        default:</span><br><span>             OSMO_ASSERT(false);</span><br><span>@@ -733,6 +778,15 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void ts_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ts->fi->state == TS_ST_BORKEN) {</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(&ts->trx->bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_TEARDOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_dec(ts->trx->bts->bts_statg->items[BTS_STAT_TS_BORKEN], 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%);">+</span><br><span> #define S(x)  (1 << (x))</span><br><span> </span><br><span> static const struct osmo_fsm_state ts_fsm_states[] = {</span><br><span>@@ -830,6 +884,7 @@</span><br><span>         },</span><br><span>   [TS_ST_BORKEN] = {</span><br><span>           .name = "BORKEN",</span><br><span style="color: hsl(120, 100%, 40%);">+           .onenter = ts_fsm_borken_onenter,</span><br><span>            .action = ts_fsm_borken,</span><br><span>             .in_event_mask = 0</span><br><span>                   | S(TS_EV_LCHAN_REQUESTED)</span><br><span>@@ -875,6 +930,7 @@</span><br><span>             | S(TS_EV_RSL_DOWN)</span><br><span>          ,</span><br><span>    .allstate_action = ts_fsm_allstate,</span><br><span style="color: hsl(120, 100%, 40%);">+   .cleanup = ts_fsm_cleanup,</span><br><span> };</span><br><span> </span><br><span> /* Return true if any lchans are waiting for this timeslot to become a specific PCHAN. If target_pchan is</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18192">change 18192</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/+/18192"/><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: I427bbe1613a0e92bff432a7d76592fe50f620ebe </div>
<div style="display:none"> Gerrit-Change-Number: 18192 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-Assignee: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>