<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>