From 6722250579246a790364dda033e7879b55ddd340 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Mon, 28 Sep 2020 12:36:09 +0200 Subject: Introduce NM Channel FSM Change-Id: I288cbfb4730b25a334ef1c3d6b9679d6f1d4cfc5 --- include/osmo-bts/Makefile.am | 1 + include/osmo-bts/gsm_data.h | 9 +- include/osmo-bts/nm_channel_fsm.h | 44 ++++++++ src/common/Makefile.am | 1 + src/common/bts.c | 2 +- src/common/bts_trx.c | 7 +- src/common/nm_bb_transc_fsm.c | 22 ++++ src/common/nm_channel_fsm.c | 220 ++++++++++++++++++++++++++++++++++++++ src/common/nm_radio_carrier_fsm.c | 9 -- src/common/oml.c | 12 +-- src/common/pcu_sock.c | 4 +- src/common/vty.c | 2 +- src/osmo-bts-litecell15/l1_if.c | 3 - src/osmo-bts-litecell15/oml.c | 58 +++++----- src/osmo-bts-oc2g/l1_if.c | 3 - src/osmo-bts-oc2g/oml.c | 56 +++++----- src/osmo-bts-octphy/l1_if.c | 5 - src/osmo-bts-octphy/l1_oml.c | 41 +++---- src/osmo-bts-omldummy/bts_model.c | 11 +- src/osmo-bts-sysmo/l1_if.c | 4 - src/osmo-bts-sysmo/oml.c | 59 +++++----- src/osmo-bts-trx/l1_if.c | 16 +-- src/osmo-bts-virtual/bts_model.c | 11 +- 23 files changed, 446 insertions(+), 154 deletions(-) create mode 100644 include/osmo-bts/nm_channel_fsm.h create mode 100644 src/common/nm_channel_fsm.c diff --git a/include/osmo-bts/Makefile.am b/include/osmo-bts/Makefile.am index 8f5a4517..01a52099 100644 --- a/include/osmo-bts/Makefile.am +++ b/include/osmo-bts/Makefile.am @@ -30,5 +30,6 @@ noinst_HEADERS = \ nm_bts_sm_fsm.h \ nm_bts_fsm.h \ nm_bb_transc_fsm.h \ + nm_channel_fsm.h \ nm_radio_carrier_fsm.h \ $(NULL) diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h index 3d01d55c..98fb481b 100644 --- a/include/osmo-bts/gsm_data.h +++ b/include/osmo-bts/gsm_data.h @@ -306,6 +306,13 @@ enum gsm_bts_trx_ts_flags { TS_F_PDCH_ACT_PENDING | TS_F_PDCH_DEACT_PENDING */ }; +struct nm_chan { + /* NM Channel FSM */ + struct osmo_fsm_inst *fi; + bool opstart_success; /* OPSTART went OK in lower layers and was acked */ + struct gsm_abis_mo mo; +}; + /* One Timeslot in a TRX */ struct gsm_bts_trx_ts { struct gsm_bts_trx *trx; @@ -321,7 +328,7 @@ struct gsm_bts_trx_ts { } dyn; unsigned int flags; - struct gsm_abis_mo mo; + struct nm_chan nm_chan; int tsc; /* -1 == use BTS TSC */ /* Frequency hopping parameters (configured via OML) */ diff --git a/include/osmo-bts/nm_channel_fsm.h b/include/osmo-bts/nm_channel_fsm.h new file mode 100644 index 00000000..4f76db66 --- /dev/null +++ b/include/osmo-bts/nm_channel_fsm.h @@ -0,0 +1,44 @@ +/* NM Channel FSM. Following 3GPP TS 12.21 Figure 2/GSM 12.21: + GSM 12.21 Objects' Operational state and availability status behaviour during initialization */ + +/* (C) 2020 by sysmocom - s.m.f.c. GmbH + * Author: Pau Espin Pedrol + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#pragma once + +#include + +enum nm_chan_op_fsm_states { + NM_CHAN_ST_OP_DISABLED_NOTINSTALLED, + NM_CHAN_ST_OP_DISABLED_DEPENDENCY, + NM_CHAN_ST_OP_DISABLED_OFFLINE, + NM_CHAN_ST_OP_ENABLED, +}; + +enum nm_chan_op_fsm_events { + NM_CHAN_EV_BBTRANSC_INSTALLED, + NM_CHAN_EV_BBTRANSC_ENABLED, + NM_CHAN_EV_BBTRANSC_DISABLED, + NM_CHAN_EV_OPSTART_ACK, + NM_CHAN_EV_OPSTART_NACK, + NM_CHAN_EV_DISABLE, +}; + +extern struct osmo_fsm nm_chan_fsm; diff --git a/src/common/Makefile.am b/src/common/Makefile.am index fa2d2885..25b835eb 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -40,6 +40,7 @@ libbts_a_SOURCES = \ nm_bts_sm_fsm.c \ nm_bts_fsm.c \ nm_bb_transc_fsm.c \ + nm_channel_fsm.c \ nm_radio_carrier_fsm.c \ $(NULL) diff --git a/src/common/bts.c b/src/common/bts.c index fdd1ede8..3e167244 100644 --- a/src/common/bts.c +++ b/src/common/bts.c @@ -418,7 +418,7 @@ int bts_link_estab(struct gsm_bts *bts) for (j = 0; j < ARRAY_SIZE(trx->ts); j++) { struct gsm_bts_trx_ts *ts = &trx->ts[j]; - oml_tx_state_changed(&ts->mo); + oml_tx_state_changed(&ts->nm_chan.mo); } } diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c index 6ffae9ee..9551b73c 100644 --- a/src/common/bts_trx.c +++ b/src/common/bts_trx.c @@ -30,6 +30,7 @@ #include #include #include +#include struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) { @@ -65,7 +66,11 @@ struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts) ts->dyn.pchan_want = GSM_PCHAN_NONE; ts->tsc = -1; - gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL, + ts->nm_chan.fi = osmo_fsm_inst_alloc(&nm_chan_fsm, trx, ts, + LOGL_INFO, NULL); + osmo_fsm_inst_update_id_f(ts->nm_chan.fi, "bts%d-trx%d-ts%d", + bts->nr, trx->nr, ts->nr); + gsm_mo_init(&ts->nm_chan.mo, bts, NM_OC_CHANNEL, bts->nr, trx->nr, ts->nr); for (l = 0; l < TS_MAX_LCHAN; l++) { diff --git a/src/common/nm_bb_transc_fsm.c b/src/common/nm_bb_transc_fsm.c index 1e92457a..6c07445a 100644 --- a/src/common/nm_bb_transc_fsm.c +++ b/src/common/nm_bb_transc_fsm.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #define X(s) (1 << (s)) @@ -55,11 +56,16 @@ static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint3 static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; + int i; switch (event) { case NM_BBTRANSC_EV_SW_ACT: oml_mo_tx_sw_act_rep(&trx->bb_transc.mo); nm_bb_transc_fsm_state_chg(fi, NM_BBTRANSC_ST_OP_DISABLED_OFFLINE); + for (i = 0; i < TRX_NR_TS; i++) { + struct gsm_bts_trx_ts *ts = &trx->ts[i]; + osmo_fsm_inst_dispatch(ts->nm_chan.fi, NM_CHAN_EV_BBTRANSC_INSTALLED, NULL); + } return; case NM_BBTRANSC_EV_RSL_UP: return; @@ -79,8 +85,17 @@ static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; + int i; + trx->bb_transc.opstart_success = false; oml_mo_state_chg(&trx->bb_transc.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE); + + if (prev_state == NM_BBTRANSC_ST_OP_ENABLED) { + for (i = 0; i < TRX_NR_TS; i++) { + struct gsm_bts_trx_ts *ts = &trx->ts[i]; + osmo_fsm_inst_dispatch(ts->nm_chan.fi, NM_CHAN_EV_BBTRANSC_DISABLED, NULL); + } + } } static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, void *data) @@ -137,7 +152,14 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi static void st_op_enabled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; + uint8_t tn; + oml_mo_state_chg(&trx->bb_transc.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); + /* Mark Dependency TS as Offline (ready to be Opstarted) */ + for (tn = 0; tn < TRX_NR_TS; tn++) { + struct gsm_bts_trx_ts *ts = &trx->ts[tn]; + osmo_fsm_inst_dispatch(ts->nm_chan.fi, NM_CHAN_EV_BBTRANSC_ENABLED, NULL); + } } static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data) diff --git a/src/common/nm_channel_fsm.c b/src/common/nm_channel_fsm.c new file mode 100644 index 00000000..ce0b74aa --- /dev/null +++ b/src/common/nm_channel_fsm.c @@ -0,0 +1,220 @@ +/* NM Radio Carrier FSM */ + +/* (C) 2020 by sysmocom - s.m.f.c. GmbH + * Author: Pau Espin Pedrol + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#define X(s) (1 << (s)) + +#define nm_chan_fsm_state_chg(fi, NEXT_STATE) \ + osmo_fsm_inst_state_chg(fi, NEXT_STATE, 0, 0) + +////////////////////////// +// FSM STATE ACTIONS +////////////////////////// + +static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + ts->nm_chan.opstart_success = false; + oml_mo_state_chg(&ts->nm_chan.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED); +} + +static void st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event, void *data) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + + switch (event) { + case NM_CHAN_EV_BBTRANSC_INSTALLED: + oml_mo_tx_sw_act_rep(&ts->nm_chan.mo); + if (ts->trx->bb_transc.mo.nm_state.operational == NM_OPSTATE_ENABLED) + nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_OFFLINE); + else + nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_DEPENDENCY); + return; + default: + OSMO_ASSERT(0); + } +} + +static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + ts->nm_chan.opstart_success = false; + oml_mo_state_chg(&ts->nm_chan.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); +} + +static void st_op_disabled_dependency(struct osmo_fsm_inst *fi, uint32_t event, void *data) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + + switch (event) { + case NM_CHAN_EV_OPSTART_ACK: + LOGPFSML(fi, LOGL_NOTICE, "BSC trying to activate TS while still in avail=dependency. " + "Allowing it to stay backward-compatible with older osmo-bts versions, but BSC is wrong.\n"); + ts->nm_chan.opstart_success = true; + oml_mo_opstart_ack(&ts->nm_chan.mo); + nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_ENABLED); + return; + case NM_CHAN_EV_OPSTART_NACK: + ts->nm_chan.opstart_success = false; + oml_mo_opstart_nack(&ts->nm_chan.mo, (int)(intptr_t)data); + return; + case NM_CHAN_EV_BBTRANSC_ENABLED: + oml_mo_state_chg(&ts->nm_chan.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE); + return; + default: + OSMO_ASSERT(0); + } +} + +static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + ts->nm_chan.opstart_success = false; + oml_mo_state_chg(&ts->nm_chan.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE); +} + +static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, void *data) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + + switch (event) { + case NM_CHAN_EV_OPSTART_ACK: + ts->nm_chan.opstart_success = true; + oml_mo_opstart_ack(&ts->nm_chan.mo); + nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_ENABLED); + return; + case NM_CHAN_EV_OPSTART_NACK: + ts->nm_chan.opstart_success = false; + oml_mo_opstart_nack(&ts->nm_chan.mo, (int)(intptr_t)data); + return; + case NM_CHAN_EV_BBTRANSC_DISABLED: + oml_mo_state_chg(&ts->nm_chan.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); + return; + default: + OSMO_ASSERT(0); + } +} + +static void st_op_enabled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv; + oml_mo_state_chg(&ts->nm_chan.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); +} + +static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data) +{ + switch (event) { + case NM_CHAN_EV_BBTRANSC_DISABLED: + nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_DEPENDENCY); + return; + case NM_CHAN_EV_DISABLE: + nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_OFFLINE); + return; + default: + OSMO_ASSERT(0); + } +} + +static struct osmo_fsm_state nm_chan_fsm_states[] = { + [NM_CHAN_ST_OP_DISABLED_NOTINSTALLED] = { + .in_event_mask = + X(NM_CHAN_EV_BBTRANSC_INSTALLED), + .out_state_mask = + X(NM_CHAN_ST_OP_DISABLED_OFFLINE) | + X(NM_CHAN_ST_OP_DISABLED_DEPENDENCY), + .name = "DISABLED_NOTINSTALLED", + .onenter = st_op_disabled_notinstalled_on_enter, + .action = st_op_disabled_notinstalled, + }, + [NM_CHAN_ST_OP_DISABLED_DEPENDENCY] = { + .in_event_mask = + X(NM_CHAN_EV_OPSTART_ACK) | /* backward compatibility, buggy BSC */ + X(NM_CHAN_EV_OPSTART_NACK) | + X(NM_CHAN_EV_BBTRANSC_ENABLED), + .out_state_mask = + X(NM_CHAN_ST_OP_DISABLED_OFFLINE) | + X(NM_CHAN_ST_OP_ENABLED), /* backward compatibility, buggy BSC */ + .name = "DISABLED_DEPENDENCY", + .onenter = st_op_disabled_dependency_on_enter, + .action = st_op_disabled_dependency, + }, + [NM_CHAN_ST_OP_DISABLED_OFFLINE] = { + .in_event_mask = + X(NM_CHAN_EV_OPSTART_ACK) | + X(NM_CHAN_EV_OPSTART_NACK) | + X(NM_CHAN_EV_BBTRANSC_DISABLED), + .out_state_mask = + X(NM_CHAN_ST_OP_ENABLED) | + X(NM_CHAN_ST_OP_DISABLED_DEPENDENCY), + .name = "DISABLED_OFFLINE", + .onenter = st_op_disabled_offline_on_enter, + .action = st_op_disabled_offline, + }, + [NM_CHAN_ST_OP_ENABLED] = { + .in_event_mask = + X(NM_CHAN_EV_BBTRANSC_DISABLED) | + X(NM_CHAN_EV_DISABLE), + .out_state_mask = + X(NM_CHAN_ST_OP_DISABLED_OFFLINE) | + X(NM_CHAN_ST_OP_DISABLED_DEPENDENCY), + .name = "ENABLED", + .onenter = st_op_enabled_on_enter, + .action = st_op_enabled, + }, +}; + +const struct value_string nm_chan_fsm_event_names[] = { + { NM_CHAN_EV_BBTRANSC_INSTALLED, "BBTRANSC_INSTALLED" }, + { NM_CHAN_EV_BBTRANSC_ENABLED, "BBTRANSC_ENABLED" }, + { NM_CHAN_EV_BBTRANSC_DISABLED, "BBTRANSC_DISABLED" }, + { NM_CHAN_EV_OPSTART_ACK, "OPSTART_ACK" }, + { NM_CHAN_EV_OPSTART_NACK, "OPSTART_NACK" }, + { NM_CHAN_EV_DISABLE, "DISABLE" }, + { 0, NULL } +}; + +struct osmo_fsm nm_chan_fsm = { + .name = "NM_CHAN_OP", + .states = nm_chan_fsm_states, + .num_states = ARRAY_SIZE(nm_chan_fsm_states), + .event_names = nm_chan_fsm_event_names, + .log_subsys = DOML, +}; + +static __attribute__((constructor)) void nm_chan_fsm_init(void) +{ + OSMO_ASSERT(osmo_fsm_register(&nm_chan_fsm) == 0); +} diff --git a/src/common/nm_radio_carrier_fsm.c b/src/common/nm_radio_carrier_fsm.c index 5facb5dc..e16a7006 100644 --- a/src/common/nm_radio_carrier_fsm.c +++ b/src/common/nm_radio_carrier_fsm.c @@ -136,16 +136,7 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi static void st_op_enabled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; - uint8_t tn; oml_mo_state_chg(&trx->rc.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); - - /* Mark Dependency TS as Offline (ready to be Opstarted) */ - for (tn = 0; tn < TRX_NR_TS; tn++) { - if (trx->ts[tn].mo.nm_state.operational == NM_OPSTATE_DISABLED && - trx->ts[tn].mo.nm_state.availability == NM_AVSTATE_DEPENDENCY) { - oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE); - } - } } static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data) diff --git a/src/common/oml.c b/src/common/oml.c index 1a31f8e2..cb63b90d 100644 --- a/src/common/oml.c +++ b/src/common/oml.c @@ -880,7 +880,7 @@ static int oml_rx_set_chan_attr(struct gsm_bts_trx_ts *ts, struct msgb *msg) rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh)); if (rc < 0) { - oml_tx_failure_event_rep(&ts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR, + oml_tx_failure_event_rep(&ts->nm_chan.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR, "New value for Set Channel Attribute not supported"); return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT); } @@ -927,11 +927,11 @@ static int oml_rx_set_chan_attr(struct gsm_bts_trx_ts *ts, struct msgb *msg) } /* merge existing BTS attributes with new attributes */ - tp_merged = osmo_tlvp_copy(ts->mo.nm_attr, bts); + tp_merged = osmo_tlvp_copy(ts->nm_chan.mo.nm_attr, bts); osmo_tlvp_merge(tp_merged, &tp); /* Call into BTS driver to check attribute values */ - rc = bts_model_check_oml(bts, foh->msg_type, ts->mo.nm_attr, tp_merged, ts); + rc = bts_model_check_oml(bts, foh->msg_type, ts->nm_chan.mo.nm_attr, tp_merged, ts); if (rc < 0) { LOGPFOH(DOML, LOGL_ERROR, foh, "SET CHAN ATTR: invalid attribute value, rc=%d\n", rc); talloc_free(tp_merged); @@ -940,8 +940,8 @@ static int oml_rx_set_chan_attr(struct gsm_bts_trx_ts *ts, struct msgb *msg) } /* Success: replace old BTS attributes with new */ - talloc_free(ts->mo.nm_attr); - ts->mo.nm_attr = tp_merged; + talloc_free(ts->nm_chan.mo.nm_attr); + ts->nm_chan.mo.nm_attr = tp_merged; /* 9.4.13 Channel Combination */ if (TLVP_PRES_LEN(&tp, NM_ATT_CHAN_COMB, 1)) { @@ -1551,7 +1551,7 @@ gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class, trx = gsm_bts_trx_num(bts, obj_inst->trx_nr); if (obj_inst->ts_nr >= TRX_NR_TS) return NULL; - mo = &trx->ts[obj_inst->ts_nr].mo; + mo = &trx->ts[obj_inst->ts_nr].nm_chan.mo; break; case NM_OC_SITE_MANAGER: mo = &bts->site_mgr.mo; diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c index 45047ba5..0ecc5264 100644 --- a/src/common/pcu_sock.c +++ b/src/common/pcu_sock.c @@ -211,7 +211,7 @@ static void info_ind_fill_trx(struct gsm_pcu_if_info_trx *trx_info, for (tn = 0; tn < 8; tn++) { const struct gsm_bts_trx_ts *ts = &trx->ts[tn]; - if (ts->mo.nm_state.operational != NM_OPSTATE_ENABLED) + if (ts->nm_chan.mo.nm_state.operational != NM_OPSTATE_ENABLED) continue; if (!ts_should_be_pdch(ts)) continue; @@ -907,7 +907,7 @@ static void pcu_sock_close(struct pcu_sock_state *state) break; for (j = 0; j < 8; j++) { ts = &trx->ts[j]; - if (ts->mo.nm_state.operational == NM_OPSTATE_ENABLED + if (ts->nm_chan.mo.nm_state.operational == NM_OPSTATE_ENABLED && ts->pchan == GSM_PCHAN_PDCH) { ts->lchan[0].rel_act_kind = LCHAN_REL_ACT_PCU; l1sap_chan_rel(trx, diff --git a/src/common/vty.c b/src/common/vty.c index afa97e2b..1bcb1b7d 100644 --- a/src/common/vty.c +++ b/src/common/vty.c @@ -1041,7 +1041,7 @@ static void ts_dump_vty(struct vty *vty, const struct gsm_bts_trx_ts *ts) ts->flags & TS_F_PDCH_ACTIVE ? "PDCH" : "TCH/F"); vty_out(vty, "%s", VTY_NEWLINE); vty_out(vty, " NM State: "); - net_dump_nmstate(vty, &ts->mo.nm_state); + net_dump_nmstate(vty, &ts->nm_chan.mo.nm_state); } DEFUN(show_ts, diff --git a/src/osmo-bts-litecell15/l1_if.c b/src/osmo-bts-litecell15/l1_if.c index b61d963b..00e6723b 100644 --- a/src/osmo-bts-litecell15/l1_if.c +++ b/src/osmo-bts-litecell15/l1_if.c @@ -1274,9 +1274,6 @@ static int activate_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp, /* signal availability */ osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_SW_ACT, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); - - for (i = 0; i < ARRAY_SIZE(trx->ts); i++) - oml_mo_state_chg(&trx->ts[i].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); } else { if (bts_lc15->led_ctrl_mode == LC15_LED_CONTROL_BTS) bts_update_status(BTS_STATUS_RF_ACTIVE, 0); diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c index a2d34609..4b1f3562 100644 --- a/src/osmo-bts-litecell15/oml.c +++ b/src/osmo-bts-litecell15/oml.c @@ -47,6 +47,7 @@ #include #include #include +#include #include "l1_if.h" #include "lc15bts.h" @@ -280,38 +281,41 @@ static int opstart_compl(struct gsm_abis_mo *mo, struct msgb *l1_msg) get_value_string(lc15bts_l1prim_names, l1p->id), get_value_string(lc15bts_l1status_names, status)); msgb_free(l1_msg); - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_NACK, (void*)(intptr_t)NM_NACK_CANT_PERFORM); - else - return oml_mo_opstart_nack(mo, NM_NACK_CANT_PERFORM); + case NM_OC_CHANNEL: + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, NM_CHAN_EV_OPSTART_NACK, + (void*)(intptr_t)NM_NACK_CANT_PERFORM); + default: + OSMO_ASSERT(0); + } } msgb_free(l1_msg); - - /* We already have a FSM for Radio Carrier, handle it there */ - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_ACK, NULL); - - /* Set to Operational State: Enabled */ - oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); - - /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ - if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 && - mo->obj_inst.ts_nr == 0) { - struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); - DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); - mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = - LCHAN_REL_ACT_OML; - lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); - if (cbch) { - cbch->rel_act_kind = LCHAN_REL_ACT_OML; - lchan_activate(cbch); + case NM_OC_CHANNEL: + /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ + if (mo->obj_inst.trx_nr == 0 && + mo->obj_inst.ts_nr == 0) { + struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); + DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); + mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = + LCHAN_REL_ACT_OML; + lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); + if (cbch) { + cbch->rel_act_kind = LCHAN_REL_ACT_OML; + lchan_activate(cbch); + } } + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, + NM_CHAN_EV_OPSTART_ACK, NULL); + default: + OSMO_ASSERT(0); } - - /* Send OPSTART ack */ - return oml_mo_opstart_ack(mo); } static int opstart_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, @@ -321,7 +325,7 @@ static int opstart_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, GsmL1_Prim_t *l1p = msgb_l1prim(l1_msg); GsmL1_MphConnectCnf_t *cnf = &l1p->u.mphConnectCnf; - mo = &trx->ts[cnf->u8Tn].mo; + mo = &trx->ts[cnf->u8Tn].nm_chan.mo; return opstart_compl(mo, l1_msg); } @@ -1888,6 +1892,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) { struct gsm_bts_trx *trx; + struct gsm_bts_trx_ts *ts; int rc; switch (mo->obj_class) { @@ -1906,7 +1911,8 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, rc = osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_OPSTART_ACK, NULL); break; case NM_OC_CHANNEL: - rc = ts_opstart(obj); + ts = (struct gsm_bts_trx_ts*) obj; + rc = ts_opstart(ts); break; case NM_OC_GPRS_NSE: case NM_OC_GPRS_CELL: diff --git a/src/osmo-bts-oc2g/l1_if.c b/src/osmo-bts-oc2g/l1_if.c index d281dbb2..1b7576dd 100644 --- a/src/osmo-bts-oc2g/l1_if.c +++ b/src/osmo-bts-oc2g/l1_if.c @@ -1329,9 +1329,6 @@ static int activate_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp, /* signal availability */ osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_SW_ACT, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); - - for (i = 0; i < ARRAY_SIZE(trx->ts); i++) - oml_mo_state_chg(&trx->ts[i].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); } else { bts_update_status(BTS_STATUS_RF_ACTIVE, 0); osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_DISABLE, NULL); diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c index 737afd31..f441be29 100644 --- a/src/osmo-bts-oc2g/oml.c +++ b/src/osmo-bts-oc2g/oml.c @@ -47,6 +47,7 @@ #include #include #include +#include #include "l1_if.h" #include "oc2gbts.h" @@ -280,38 +281,41 @@ static int opstart_compl(struct gsm_abis_mo *mo, struct msgb *l1_msg) get_value_string(oc2gbts_l1prim_names, l1p->id), get_value_string(oc2gbts_l1status_names, status)); msgb_free(l1_msg); - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_NACK, (void*)(intptr_t)NM_NACK_CANT_PERFORM); - else - return oml_mo_opstart_nack(mo, NM_NACK_CANT_PERFORM); + case NM_OC_CHANNEL: + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, NM_CHAN_EV_OPSTART_NACK, + (void*)(intptr_t)NM_NACK_CANT_PERFORM); + default: + OSMO_ASSERT(0); + } } msgb_free(l1_msg); - - /* We already have a FSM for Radio Carrier, handle it there */ - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_ACK, NULL); - - /* Set to Operational State: Enabled */ - oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); - - /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ - if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 && - mo->obj_inst.ts_nr == 0) { - struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); - DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); - mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = - LCHAN_REL_ACT_OML; - lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); - if (cbch) { - cbch->rel_act_kind = LCHAN_REL_ACT_OML; - lchan_activate(cbch); + case NM_OC_CHANNEL: + /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ + if (mo->obj_inst.trx_nr == 0 && + mo->obj_inst.ts_nr == 0) { + struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); + DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); + mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = + LCHAN_REL_ACT_OML; + lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); + if (cbch) { + cbch->rel_act_kind = LCHAN_REL_ACT_OML; + lchan_activate(cbch); + } } + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, + NM_CHAN_EV_OPSTART_ACK, NULL); + default: + OSMO_ASSERT(0); } - - /* Send OPSTART ack */ - return oml_mo_opstart_ack(mo); } static int opstart_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, @@ -321,7 +325,7 @@ static int opstart_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, GsmL1_Prim_t *l1p = msgb_l1prim(l1_msg); GsmL1_MphConnectCnf_t *cnf = &l1p->u.mphConnectCnf; - mo = &trx->ts[cnf->u8Tn].mo; + mo = &trx->ts[cnf->u8Tn].nm_chan.mo; return opstart_compl(mo, l1_msg); } @@ -1896,6 +1900,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) { struct gsm_bts_trx* trx; + struct gsm_bts_trx_ts *ts; int rc; switch (mo->obj_class) { @@ -1918,6 +1923,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, rc = osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_OPSTART_ACK, NULL); break; case NM_OC_CHANNEL: + ts = (struct gsm_bts_trx_ts*) obj; rc = ts_opstart(obj); break; case NM_OC_GPRS_NSE: diff --git a/src/osmo-bts-octphy/l1_if.c b/src/osmo-bts-octphy/l1_if.c index 37a3e65c..15353d0c 100644 --- a/src/osmo-bts-octphy/l1_if.c +++ b/src/osmo-bts-octphy/l1_if.c @@ -311,15 +311,10 @@ int l1if_req_compl(struct octphy_hdl *fl1h, struct msgb *msg, /* For OctPHY, this only about sending state changes to BSC */ int l1if_activate_rf(struct gsm_bts_trx *trx, int on) { - int i; if (on) { /* signal availability */ osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_SW_ACT, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); - - for (i = 0; i < ARRAY_SIZE(trx->ts); i++) - oml_mo_state_chg(&trx->ts[i].mo, NM_OPSTATE_DISABLED, - NM_AVSTATE_DEPENDENCY); } else { osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_DISABLE, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_DISABLE, NULL); diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c index f036fe95..651f70d0 100644 --- a/src/osmo-bts-octphy/l1_oml.c +++ b/src/osmo-bts-octphy/l1_oml.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "l1_if.h" #include "l1_oml.h" @@ -193,28 +194,28 @@ static int opstart_compl(struct gsm_abis_mo *mo) struct gsm_bts_trx *trx = gsm_bts_trx_num(mo->bts, mo->obj_inst.trx_nr); /* TODO: Send NACK in case of error! */ - /* We already have a FSM for Radio Carrier, handle it there */ - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_ACK, NULL); - - /* Set to Operational State: Enabled */ - oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); - - /* hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ - if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 && - mo->obj_inst.ts_nr == 7) { - struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); - mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = - LCHAN_REL_ACT_OML; - lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); - if (cbch) { - cbch->rel_act_kind = LCHAN_REL_ACT_OML; - lchan_activate(cbch); + case NM_OC_CHANNEL: + /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ + if (mo->obj_inst.trx_nr == 0 && + mo->obj_inst.ts_nr == 0) { + struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); + DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); + mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = + LCHAN_REL_ACT_OML; + lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); + if (cbch) { + cbch->rel_act_kind = LCHAN_REL_ACT_OML; + lchan_activate(cbch); + } } + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, + NM_CHAN_EV_OPSTART_ACK, NULL); + default: + OSMO_ASSERT(0); } - - /* Send OPSTART ack */ - return oml_mo_opstart_ack(mo); } static @@ -1504,7 +1505,7 @@ static int pchan_act_compl_cb(struct octphy_hdl *fl1, struct msgb *resp, void *d } trx = ts->trx; - mo = &trx->ts[ar->PchId.byTimeslotNb].mo; + mo = &trx->ts[ar->PchId.byTimeslotNb].nm_chan.mo; msgb_free(resp); diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c index 60ab107f..8d74597b 100644 --- a/src/osmo-bts-omldummy/bts_model.c +++ b/src/osmo-bts-omldummy/bts_model.c @@ -39,6 +39,7 @@ #include #include #include +#include /* TODO: check if dummy method is sufficient, else implement */ int bts_model_lchan_deactivate(struct gsm_lchan *lchan) @@ -79,13 +80,8 @@ int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type, static uint8_t vbts_set_bts(struct gsm_bts *bts) { struct gsm_bts_trx *trx; - uint8_t tn; llist_for_each_entry(trx, &bts->trx_list, list) { - - for (tn = 0; tn < TRX_NR_TS; tn++) - oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); - /* report availability of trx to the bts. this will trigger the rsl connection */ osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_SW_ACT, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); @@ -129,6 +125,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) { int rc; struct gsm_bts_trx* trx; + struct gsm_bts_trx_ts* ts; switch (mo->obj_class) { case NM_OC_SITE_MANAGER: @@ -145,6 +142,10 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) trx = (struct gsm_bts_trx *) obj; rc = osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_OPSTART_ACK, NULL); break; + case NM_OC_CHANNEL: + ts = (struct gsm_bts_trx_ts *) obj; + rc = osmo_fsm_inst_dispatch(ts->nm_chan.fi, NM_CHAN_EV_OPSTART_ACK, NULL); + break; case NM_OC_GPRS_NSE: case NM_OC_GPRS_CELL: case NM_OC_GPRS_NSVC: diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c index e766cea0..99b17e8e 100644 --- a/src/osmo-bts-sysmo/l1_if.c +++ b/src/osmo-bts-sysmo/l1_if.c @@ -1219,7 +1219,6 @@ static int activate_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp, SuperFemto_Prim_t *sysp = msgb_sysprim(resp); GsmL1_Status_t status; int on = 0; - unsigned int i; if (sysp->id == SuperFemto_PrimId_ActivateRfCnf) on = 1; @@ -1244,9 +1243,6 @@ static int activate_rf_compl_cb(struct gsm_bts_trx *trx, struct msgb *resp, /* signal availability */ osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_SW_ACT, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); - - for (i = 0; i < ARRAY_SIZE(trx->ts); i++) - oml_mo_state_chg(&trx->ts[i].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); } else { bts_update_status(BTS_STATUS_RF_ACTIVE, 0); osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_DISABLE, NULL); diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c index 46dfa813..cf86f078 100644 --- a/src/osmo-bts-sysmo/oml.c +++ b/src/osmo-bts-sysmo/oml.c @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include "l1_if.h" #include "femtobts.h" @@ -279,38 +281,41 @@ static int opstart_compl(struct gsm_abis_mo *mo, struct msgb *l1_msg) get_value_string(femtobts_l1prim_names, l1p->id), get_value_string(femtobts_l1status_names, status)); msgb_free(l1_msg); - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_NACK, (void*)(intptr_t)NM_NACK_CANT_PERFORM); - else - return oml_mo_opstart_nack(mo, NM_NACK_CANT_PERFORM); + case NM_OC_CHANNEL: + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, NM_CHAN_EV_OPSTART_NACK, + (void*)(intptr_t)NM_NACK_CANT_PERFORM); + default: + OSMO_ASSERT(0); + } } msgb_free(l1_msg); - - /* We already have a FSM for Radio Carrier, handle it there */ - if (mo->obj_class == NM_OC_RADIO_CARRIER) + switch (mo->obj_class) { + case NM_OC_RADIO_CARRIER: return osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_OPSTART_ACK, NULL); - - /* Set to Operational State: Enabled */ - oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK); - - /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ - if (mo->obj_class == NM_OC_CHANNEL && mo->obj_inst.trx_nr == 0 && - mo->obj_inst.ts_nr == 0) { - struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); - DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); - mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = - LCHAN_REL_ACT_OML; - lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); - if (cbch) { - cbch->rel_act_kind = LCHAN_REL_ACT_OML; - lchan_activate(cbch); + case NM_OC_CHANNEL: + /* ugly hack to auto-activate all SAPIs for the BCCH/CCCH on TS0 */ + if (mo->obj_inst.trx_nr == 0 && + mo->obj_inst.ts_nr == 0) { + struct gsm_lchan *cbch = gsm_bts_get_cbch(mo->bts); + DEBUGP(DL1C, "====> trying to activate lchans of BCCH\n"); + mo->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind = + LCHAN_REL_ACT_OML; + lchan_activate(&mo->bts->c0->ts[0].lchan[CCCH_LCHAN]); + if (cbch) { + cbch->rel_act_kind = LCHAN_REL_ACT_OML; + lchan_activate(cbch); + } } + return osmo_fsm_inst_dispatch(trx->ts[mo->obj_inst.ts_nr].nm_chan.fi, + NM_CHAN_EV_OPSTART_ACK, NULL); + default: + OSMO_ASSERT(0); } - - /* Send OPSTART ack */ - return oml_mo_opstart_ack(mo); } static int opstart_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, @@ -320,7 +325,7 @@ static int opstart_compl_cb(struct gsm_bts_trx *trx, struct msgb *l1_msg, GsmL1_Prim_t *l1p = msgb_l1prim(l1_msg); GsmL1_MphConnectCnf_t *cnf = &l1p->u.mphConnectCnf; - mo = &trx->ts[cnf->u8Tn].mo; + mo = &trx->ts[cnf->u8Tn].nm_chan.mo; return opstart_compl(mo, l1_msg); } @@ -1774,6 +1779,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) { struct gsm_bts_trx* trx; + struct gsm_bts_trx_ts *ts; int rc; switch (mo->obj_class) { @@ -1796,7 +1802,8 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, rc = osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_OPSTART_ACK, NULL); break; case NM_OC_CHANNEL: - rc = ts_opstart(obj); + ts = (struct gsm_bts_trx_ts*) obj; + rc = ts_opstart(ts); break; case NM_OC_GPRS_NSE: case NM_OC_GPRS_CELL: diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c index 2c58c2f7..5e0df86a 100644 --- a/src/osmo-bts-trx/l1_if.c +++ b/src/osmo-bts-trx/l1_if.c @@ -48,6 +48,7 @@ #include #include #include +#include #include "l1_if.h" #include "trx_if.h" @@ -94,7 +95,6 @@ static void check_transceiver_availability_trx(struct trx_l1h *l1h, int avail) { struct phy_instance *pinst = l1h->phy_inst; struct gsm_bts_trx *trx = pinst->trx; - uint8_t tn; /* HACK, we should change state when we receive first clock from * transceiver */ @@ -105,19 +105,9 @@ static void check_transceiver_availability_trx(struct trx_l1h *l1h, int avail) osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); pinst->u.osmotrx.sw_act_reported = true; } - - for (tn = 0; tn < TRX_NR_TS; tn++) - oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, - (l1h->config.slotmask & (1 << tn)) ? - NM_AVSTATE_DEPENDENCY : - NM_AVSTATE_NOT_INSTALLED); } else { osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_DISABLE, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_DISABLE, NULL); - - for (tn = 0; tn < TRX_NR_TS; tn++) - oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, - NM_AVSTATE_OFF_LINE); } } @@ -606,6 +596,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) { struct gsm_bts_trx *trx; + struct gsm_bts_trx_ts *ts; int rc; switch (mo->obj_class) { @@ -625,6 +616,9 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, rc = osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_OPSTART_ACK, NULL); break; case NM_OC_CHANNEL: + ts = (struct gsm_bts_trx_ts *) obj; + rc = osmo_fsm_inst_dispatch(ts->nm_chan.fi, NM_CHAN_EV_OPSTART_ACK, NULL); + break; case NM_OC_GPRS_NSE: case NM_OC_GPRS_CELL: case NM_OC_GPRS_NSVC: diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c index c2d68cb7..b5b46ca8 100644 --- a/src/osmo-bts-virtual/bts_model.c +++ b/src/osmo-bts-virtual/bts_model.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "virtual_um.h" @@ -86,13 +87,8 @@ int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type, static uint8_t vbts_set_bts(struct gsm_bts *bts) { struct gsm_bts_trx *trx; - uint8_t tn; llist_for_each_entry(trx, &bts->trx_list, list) { - - for (tn = 0; tn < TRX_NR_TS; tn++) - oml_mo_state_chg(&trx->ts[tn].mo, NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY); - /* report availability of trx to the bts. this will trigger the rsl connection */ osmo_fsm_inst_dispatch(trx->rc.fi, NM_RCARRIER_EV_SW_ACT, NULL); osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_SW_ACT, NULL); @@ -143,6 +139,7 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) { int rc; struct gsm_bts_trx* trx; + struct gsm_bts_trx_ts *ts; switch (mo->obj_class) { case NM_OC_SITE_MANAGER: @@ -159,6 +156,10 @@ int bts_model_opstart(struct gsm_bts *bts, struct gsm_abis_mo *mo, void *obj) trx = (struct gsm_bts_trx *) obj; rc = osmo_fsm_inst_dispatch(trx->bb_transc.fi, NM_BBTRANSC_EV_OPSTART_ACK, NULL); break; + case NM_OC_CHANNEL: + ts = (struct gsm_bts_trx_ts *) obj; + rc = osmo_fsm_inst_dispatch(ts->nm_chan.fi, NM_CHAN_EV_OPSTART_ACK, NULL); + break; case NM_OC_GPRS_NSE: case NM_OC_GPRS_CELL: case NM_OC_GPRS_NSVC: -- cgit v1.2.3