<p>ipse has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18192">View Change</a></p><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, 120 insertions(+), 10 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/92/18192/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 17da79d..0c67d09 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,26 @@</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_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_LCHAN_REQUESTED,</span><br><span style="color: hsl(120, 100%, 40%);">+ BTS_CTR_TS_BORKEN_EV_LCHAN_UNUSED,</span><br><span style="color: hsl(120, 100%, 40%);">+    BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK,</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span>@@ -1441,6 +1461,28 @@</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_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_LCHAN_REQUESTED] =   {"ts_borken:event:lchan_requested", "LCHAN_REQUESTED received in the TS BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_TS_BORKEN_EV_LCHAN_UNUSED] =      {"ts_borken:event:lchan_unused", "LCHAN_UNUSED received in the TS BORKEN state"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK] =      {"ts_borken:event:pdch_act_ack", "PDCH_ACT_ACK received in the TS BORKEN state"},</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_group_desc bts_ctrg_desc = {</span><br><span>@@ -1474,6 +1516,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_BORKED,</span><br><span style="color: hsl(120, 100%, 40%);">+        BTS_STAT_TS_BORKED,</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 0fd462f..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>@@ -5007,9 +5007,9 @@</span><br><span>                 return CMD_WARNING;</span><br><span> </span><br><span>      if (!strcmp(argv[4], "borken")) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (lchan->fi->state == LCHAN_ST_UNUSED)</span><br><span style="color: hsl(120, 100%, 40%);">+                if (lchan->fi->state == LCHAN_ST_UNUSED) {</span><br><span>                     osmo_fsm_inst_state_chg(lchan->fi, LCHAN_ST_BORKEN, 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>@@ -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..5aef6c5 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_borked", "Number of lchans in the BORKEN state", "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+  { "ts_borked", "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..cd96461 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_BORKED], 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_BORKED], 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_BORKED], 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_BORKED], 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>diff --git a/src/osmo-bsc/timeslot_fsm.c b/src/osmo-bsc/timeslot_fsm.c</span><br><span>index f8adfb6..b81f9ab 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,23 +654,57 @@</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%);">+      if (prev_state != LCHAN_ST_BORKEN)</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_inc(ts->trx->bts->bts_statg->items[BTS_STAT_TS_BORKED], 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 style="color: hsl(120, 100%, 40%);">+   struct gsm_lchan *lchan = data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    switch (event) {</span><br><span>     case TS_EV_LCHAN_UNUSED:</span><br><span>             /* ignored */</span><br><span>                return;</span><br><span> </span><br><span>  case TS_EV_LCHAN_REQUESTED:</span><br><span style="color: hsl(0, 100%, 40%);">-             {</span><br><span style="color: hsl(0, 100%, 40%);">-                       struct gsm_lchan *lchan = data;</span><br><span style="color: hsl(0, 100%, 40%);">-                 lchan_dispatch(lchan, LCHAN_EV_TS_ERROR);</span><br><span style="color: hsl(0, 100%, 40%);">-                       return;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan_dispatch(lchan, LCHAN_EV_TS_ERROR);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span> </span><br><span>  case TS_EV_PDCH_ACT_ACK:</span><br><span>             /* Late PDCH activation ACK is not a crime.</span><br><span>           * Just go into the PDCH mode as normal. */</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_TS_BORKED], 1);</span><br><span>             osmo_fsm_inst_state_chg(fi, TS_ST_PDCH, 0, 0);</span><br><span>               return;</span><br><span> </span><br><span>@@ -822,6 +856,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></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: 1 </div>
<div style="display:none"> Gerrit-Owner: ipse <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>