diff options
Diffstat (limited to 'src/osmo-bsc/bsc_rf_ctrl.c')
-rw-r--r-- | src/osmo-bsc/bsc_rf_ctrl.c | 98 |
1 files changed, 92 insertions, 6 deletions
diff --git a/src/osmo-bsc/bsc_rf_ctrl.c b/src/osmo-bsc/bsc_rf_ctrl.c index 1e04f21c3..749d2eb49 100644 --- a/src/osmo-bsc/bsc_rf_ctrl.c +++ b/src/osmo-bsc/bsc_rf_ctrl.c @@ -124,6 +124,96 @@ enum osmo_bsc_rf_policy osmo_bsc_rf_get_policy_by_bts(struct gsm_bts *bts) } } +enum osmo_bsc_rf_opstate osmo_bsc_rf_get_opstate_by_trx(struct gsm_bts_trx *trx) +{ + if (trx->mo.nm_state.operational == NM_OPSTATE_ENABLED) + return OSMO_BSC_RF_OPSTATE_OPERATIONAL; + return OSMO_BSC_RF_OPSTATE_INOPERATIONAL; +} + +enum osmo_bsc_rf_adminstate osmo_bsc_rf_get_adminstate_by_trx(struct gsm_bts_trx *trx) +{ + if (trx->mo.nm_state.administrative == NM_STATE_UNLOCKED) + return OSMO_BSC_RF_ADMINSTATE_UNLOCKED; + return OSMO_BSC_RF_ADMINSTATE_LOCKED; +} + +/* Return a string listing the state of the given TRX. + * For details, see bsc_rf_states_c(). + */ +static int bsc_rf_state_of_trx_buf(char *buf, size_t buflen, struct gsm_bts_trx *trx) +{ + struct osmo_strbuf sb = { .buf = buf, .len = buflen }; + OSMO_STRBUF_PRINTF(sb, "%u,%u,%s,%s,%s,%s;", + trx->bts->nr, trx->nr, + osmo_bsc_rf_get_opstate_name(osmo_bsc_rf_get_opstate_by_trx(trx)), + osmo_bsc_rf_get_adminstate_name(osmo_bsc_rf_get_adminstate_by_trx(trx)), + osmo_bsc_rf_get_policy_name(osmo_bsc_rf_get_policy_by_bts(trx->bts)), + trx->rsl_link_primary ? "rsl-up" : "rsl-down"); + return sb.chars_needed; +} + +/* Same as bsc_rf_states_of_bts_c() but return result in a fixed-size buffer. + * For details, see bsc_rf_states_c(). + * Return the amount of characters that would be written to the buffer if it is large enough, like snprintf(). */ +static int bsc_rf_states_of_bts_buf(char *buf, size_t buflen, struct gsm_bts *bts) +{ + struct gsm_bts_trx *trx; + struct osmo_strbuf sb = { .buf = buf, .len = buflen }; + + llist_for_each_entry(trx, &bts->trx_list, list) { + OSMO_STRBUF_APPEND(sb, bsc_rf_state_of_trx_buf, trx); + } + return sb.chars_needed; +} + +/* Return a string listing the states of each TRX for the given BTS. + * For details, see bsc_rf_states_c(). + * + * \param ctx Talloc context to allocate the returned string from. + * \param bts BTS of which to list the TRX states. + * \return talloc allocated string. + */ +char *bsc_rf_states_of_bts_c(void *ctx, struct gsm_bts *bts) +{ + OSMO_NAME_C_IMPL(ctx, 256, "ERROR", bsc_rf_states_of_bts_buf, bts); +} + +/* Same as bsc_rf_states_c() but return result in a fixed-size buffer. + * For details, see bsc_rf_states_c(). + * Return the amount of characters that would be written to the buffer if it is large enough, like snprintf(). */ +static int bsc_rf_states_buf(char *buf, size_t buflen) +{ + struct gsm_bts *bts; + struct osmo_strbuf sb = { .buf = buf, .len = buflen }; + + llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) { + OSMO_STRBUF_APPEND(sb, bsc_rf_states_of_bts_buf, bts); + } + return sb.chars_needed; +} + +/* Return a string listing the states of all TRX of all BTS. + * The string has the form: + * <bts_nr>,<trx_nr>,<opstate>,<adminstate>,<rf_policy>,<rsl_status>;<bts_nr>,<trx_nr>,...;...; + * (always terminates in a semicolon). + * + * Meaning of the elements: + * - bts_nr: 0..255 -- BTS index. + * - trx_nr: 0..255 -- TRX index. + * - opstate: inoperational|operational -- whether RF is active. + * - adminstate: unlocked|locked -- whether the TRX is configured as RF-locked. + * - rf_policy: off|on|grace|unknown -- which state RF should be in according to user rf_lock requests. + * - rsl_status: rsl-up|rsl-down -- 'rsl-up' if an RSL link to the TRX is currently present. + * + * \param ctx Talloc context to allocate the returned string from. + * \return talloc allocated string. + */ +char *bsc_rf_states_c(void *ctx) +{ + OSMO_NAME_C_IMPL(ctx, 4096, "ERROR", bsc_rf_states_buf); +} + static int lock_each_trx(struct gsm_network *net, bool lock) { struct gsm_bts *bts; @@ -372,9 +462,7 @@ static int rf_ctrl_accept(struct osmo_fd *bfd, unsigned int what) } osmo_wqueue_init(&conn->queue, 10); - conn->queue.bfd.data = conn; - conn->queue.bfd.fd = fd; - conn->queue.bfd.when = OSMO_FD_READ | OSMO_FD_WRITE; + osmo_fd_setup(&conn->queue.bfd, fd, OSMO_FD_READ | OSMO_FD_WRITE, osmo_wqueue_bfd_cb, conn, 0); conn->queue.read_cb = rf_read_cmd; conn->queue.write_cb = rf_write_cmd; conn->rf = rf; @@ -484,9 +572,7 @@ static int rf_create_socket(struct osmo_bsc_rf *rf, const char *path) return -1; } - bfd->when = OSMO_FD_READ; - bfd->cb = rf_ctrl_accept; - bfd->data = rf; + osmo_fd_setup(bfd, bfd->fd, OSMO_FD_READ, rf_ctrl_accept, rf, 0); if (osmo_fd_register(bfd) != 0) { LOGP(DLINP, LOGL_ERROR, "Failed to register bfd.\n"); |