diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2014-12-28 12:08:28 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2014-12-28 12:12:32 +0100 |
commit | 4dadbdebf53e72a70dabb91677b18d3d300dacc2 (patch) | |
tree | 90fdad1d003239407cf0860cb337fa4d5f6d2760 /openbsc | |
parent | 237dd5e283dbdf91c775f62e2cdcabed3fa2788e (diff) |
lchan: Remember why a channel is broken using static strings
Remember why a channel is being marked as broken. So we can
maybe understand what happend.
Diffstat (limited to 'openbsc')
-rw-r--r-- | openbsc/include/openbsc/abis_rsl.h | 1 | ||||
-rw-r--r-- | openbsc/include/openbsc/gsm_data_shared.h | 1 | ||||
-rw-r--r-- | openbsc/src/libbsc/abis_rsl.c | 22 | ||||
-rw-r--r-- | openbsc/src/libbsc/bsc_vty.c | 7 | ||||
-rw-r--r-- | openbsc/src/libbsc/chan_alloc.c | 2 |
5 files changed, 24 insertions, 9 deletions
diff --git a/openbsc/include/openbsc/abis_rsl.h b/openbsc/include/openbsc/abis_rsl.h index 0f188ee48..3a0f72d45 100644 --- a/openbsc/include/openbsc/abis_rsl.h +++ b/openbsc/include/openbsc/abis_rsl.h @@ -71,6 +71,7 @@ int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id, enum rsl_rel_mode release_mode); int rsl_lchan_set_state(struct gsm_lchan *lchan, int); +int rsl_lchan_mark_broken(struct gsm_lchan *lchan, const char *broken); /* to be provided by external code */ int rsl_deact_sacch(struct gsm_lchan *lchan); diff --git a/openbsc/include/openbsc/gsm_data_shared.h b/openbsc/include/openbsc/gsm_data_shared.h index 5d84969ae..84a58dbc6 100644 --- a/openbsc/include/openbsc/gsm_data_shared.h +++ b/openbsc/include/openbsc/gsm_data_shared.h @@ -195,6 +195,7 @@ struct gsm_lchan { enum lchan_csd_mode csd_mode; /* State */ enum gsm_lchan_state state; + const char *broken_reason; /* Power levels for MS and BTS */ uint8_t bs_power; uint8_t ms_power; diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c index d9fe92c96..eb914b1f4 100644 --- a/openbsc/src/libbsc/abis_rsl.c +++ b/openbsc/src/libbsc/abis_rsl.c @@ -207,7 +207,7 @@ static void lchan_act_tmr_cb(void *data) "%s Timeout during activation. Marked as broken.\n", gsm_lchan_name(lchan)); - rsl_lchan_set_state(lchan, LCHAN_S_BROKEN); + rsl_lchan_mark_broken(lchan, "activation timeout"); lchan_free(lchan); } @@ -219,7 +219,7 @@ static void lchan_deact_tmr_cb(void *data) "%s Timeout during deactivation! Marked as broken.\n", gsm_lchan_name(lchan)); - rsl_lchan_set_state(lchan, LCHAN_S_BROKEN); + rsl_lchan_mark_broken(lchan, "de-activation timeout"); lchan_free(lchan); } @@ -940,6 +940,13 @@ int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id, return 0; } +int rsl_lchan_mark_broken(struct gsm_lchan *lchan, const char *reason) +{ + lchan->state = LCHAN_S_BROKEN; + lchan->broken_reason = reason; + return 0; +} + int rsl_lchan_set_state(struct gsm_lchan *lchan, int state) { lchan->state = state; @@ -1010,13 +1017,14 @@ static int rsl_rx_chan_act_nack(struct msgb *msg) print_rsl_cause(LOGL_ERROR, cause, TLVP_LEN(&tp, RSL_IE_CAUSE)); msg->lchan->error_cause = *cause; - if (*cause != RSL_ERR_RCH_ALR_ACTV_ALLOC) - rsl_lchan_set_state(msg->lchan, LCHAN_S_BROKEN); - else + if (*cause != RSL_ERR_RCH_ALR_ACTV_ALLOC) { + rsl_lchan_mark_broken(msg->lchan, "NACK on activation"); + } else rsl_rf_chan_release(msg->lchan, 1, SACCH_DEACTIVATE); - } else - rsl_lchan_set_state(msg->lchan, LCHAN_S_BROKEN); + } else { + rsl_lchan_mark_broken(msg->lchan, "NACK on activation no IE"); + } LOGPC(DRSL, LOGL_ERROR, "\n"); diff --git a/openbsc/src/libbsc/bsc_vty.c b/openbsc/src/libbsc/bsc_vty.c index d6d66c638..cc2eefeb1 100644 --- a/openbsc/src/libbsc/bsc_vty.c +++ b/openbsc/src/libbsc/bsc_vty.c @@ -959,9 +959,12 @@ static void lchan_dump_full_vty(struct vty *vty, struct gsm_lchan *lchan) vty_out(vty, "BTS %u, TRX %u, Timeslot %u, Lchan %u: Type %s%s", lchan->ts->trx->bts->nr, lchan->ts->trx->nr, lchan->ts->nr, lchan->nr, gsm_lchant_name(lchan->type), VTY_NEWLINE); - vty_out(vty, " Connection: %u, State: %s%s", + vty_out(vty, " Connection: %u, State: %s%s%s%s", lchan->conn ? 1: 0, - gsm_lchans_name(lchan->state), VTY_NEWLINE); + gsm_lchans_name(lchan->state), + lchan->state == LCHAN_S_BROKEN ? "Error reason " : "", + lchan->state == LCHAN_S_BROKEN ? lchan->broken_reason : "", + VTY_NEWLINE); vty_out(vty, " BS Power: %u dBm, MS Power: %u dBm%s", lchan->ts->trx->nominal_power - lchan->ts->trx->max_power_red - lchan->bs_power*2, diff --git a/openbsc/src/libbsc/chan_alloc.c b/openbsc/src/libbsc/chan_alloc.c index cd96c1b38..64833dd8a 100644 --- a/openbsc/src/libbsc/chan_alloc.c +++ b/openbsc/src/libbsc/chan_alloc.c @@ -286,6 +286,8 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type, /* clear multi rate config */ memset(&lchan->mr_conf, 0, sizeof(lchan->mr_conf)); + + lchan->broken_reason = ""; } else { struct challoc_signal_data sig; sig.bts = bts; |