aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmo-bts/Makefile.am1
-rw-r--r--include/osmo-bts/gsm_data.h9
-rw-r--r--include/osmo-bts/nm_channel_fsm.h44
-rw-r--r--src/common/Makefile.am1
-rw-r--r--src/common/bts.c2
-rw-r--r--src/common/bts_trx.c7
-rw-r--r--src/common/nm_bb_transc_fsm.c22
-rw-r--r--src/common/nm_channel_fsm.c220
-rw-r--r--src/common/nm_radio_carrier_fsm.c9
-rw-r--r--src/common/oml.c12
-rw-r--r--src/common/pcu_sock.c4
-rw-r--r--src/common/vty.c2
-rw-r--r--src/osmo-bts-litecell15/l1_if.c3
-rw-r--r--src/osmo-bts-litecell15/oml.c58
-rw-r--r--src/osmo-bts-oc2g/l1_if.c3
-rw-r--r--src/osmo-bts-oc2g/oml.c56
-rw-r--r--src/osmo-bts-octphy/l1_if.c5
-rw-r--r--src/osmo-bts-octphy/l1_oml.c41
-rw-r--r--src/osmo-bts-omldummy/bts_model.c11
-rw-r--r--src/osmo-bts-sysmo/l1_if.c4
-rw-r--r--src/osmo-bts-sysmo/oml.c59
-rw-r--r--src/osmo-bts-trx/l1_if.c16
-rw-r--r--src/osmo-bts-virtual/bts_model.c11
23 files changed, 446 insertions, 154 deletions
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 <info@sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/core/fsm.h>
+
+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 <osmo-bts/phy_link.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
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 <osmo-bts/bts.h>
#include <osmo-bts/rsl.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#include <osmo-bts/phy_link.h>
#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 <info@sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+#include <osmocom/core/fsm.h>
+#include <osmocom/core/tdef.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
+
+#include <osmo-bts/logging.h>
+#include <osmo-bts/gsm_data.h>
+#include <osmo-bts/bts_model.h>
+#include <osmo-bts/bts.h>
+#include <osmo-bts/rsl.h>
+#include <osmo-bts/nm_channel_fsm.h>
+
+#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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
/* 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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#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 <osmo-bts/nm_bts_fsm.h>
#include <osmo-bts/nm_radio_carrier_fsm.h>
#include <osmo-bts/nm_bb_transc_fsm.h>
+#include <osmo-bts/nm_channel_fsm.h>
#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: