aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2022-05-04 19:07:14 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2022-05-13 14:06:37 +0200
commit50a42e7436db6e675d7e27b6fb1565d8f71ad03a (patch)
tree95c85d25533ba1a44756d3b5f8c366874a1badec /src
parentb7ef6884f91db7ffe7add51766abc311c9e7d05e (diff)
Introduce new signal S_NM_RUNNING_CHG and implement it for rcarrier,bbtransc
This allows different parts of the code to hook to some signals which allow start/stopping processes based, for instance, on whether C0 is available or not. This can be later used by paging or CBSP code. Also ACC code can be ported to this new system (acc_ramp_nm_sig_cb()). Same signal can be used for other NM objects, but is left unimplemented until there's use for them. Change-Id: I206d4c7863a77fbab6a600126742a6a6b8fc3614
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bsc/nm_bb_transc_fsm.c23
-rw-r--r--src/osmo-bsc/nm_common_fsm.c15
-rw-r--r--src/osmo-bsc/nm_rcarrier_fsm.c21
3 files changed, 57 insertions, 2 deletions
diff --git a/src/osmo-bsc/nm_bb_transc_fsm.c b/src/osmo-bsc/nm_bb_transc_fsm.c
index a4cef9cdf..957237741 100644
--- a/src/osmo-bsc/nm_bb_transc_fsm.c
+++ b/src/osmo-bsc/nm_bb_transc_fsm.c
@@ -40,6 +40,18 @@
#define nm_bb_transc_fsm_state_chg(fi, NEXT_STATE) \
osmo_fsm_inst_state_chg(fi, NEXT_STATE, 0, 0)
+static inline void nm_bb_transc_fsm_becomes_enabled(struct gsm_bts_bb_trx *bb_transc)
+{
+ struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc);
+ nm_obj_fsm_becomes_enabled_disabled(trx->bts, bb_transc, NM_OC_BASEB_TRANSC, true);
+}
+
+static inline void nm_bb_transc_fsm_becomes_disabled(struct gsm_bts_bb_trx *bb_transc)
+{
+ struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc);
+ nm_obj_fsm_becomes_enabled_disabled(trx->bts, bb_transc, NM_OC_BASEB_TRANSC, false);
+}
+
//////////////////////////
// FSM STATE ACTIONS
//////////////////////////
@@ -243,10 +255,13 @@ static void st_op_enabled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state
bb_transc->mo.get_attr_rep_received = false;
bb_transc->mo.opstart_sent = false;
bb_transc->mo.adm_unlock_sent = false;
+
+ nm_bb_transc_fsm_becomes_enabled(bb_transc);
}
static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
+ struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv;
struct nm_statechg_signal_data *nsd;
const struct gsm_nm_state *new_state;
@@ -259,13 +274,16 @@ static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data)
switch (new_state->availability) { /* operational = DISABLED */
case NM_AVSTATE_NOT_INSTALLED:
case NM_AVSTATE_POWER_OFF:
+ nm_bb_transc_fsm_becomes_disabled(bb_transc);
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_NOTINSTALLED);
return;
case NM_AVSTATE_DEPENDENCY:
+ nm_bb_transc_fsm_becomes_disabled(bb_transc);
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_DEPENDENCY);
return;
case NM_AVSTATE_OFF_LINE:
case NM_AVSTATE_OK:
+ nm_bb_transc_fsm_becomes_disabled(bb_transc);
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_OFFLINE);
return;
default:
@@ -287,8 +305,11 @@ static void st_op_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
bb_transc->mo.opstart_sent = false;
break;
case NM_EV_OML_DOWN:
- if (fi->state != NM_BB_TRANSC_ST_OP_DISABLED_NOTINSTALLED)
+ if (fi->state != NM_BB_TRANSC_ST_OP_DISABLED_NOTINSTALLED) {
+ if (fi->state == NM_BB_TRANSC_ST_OP_ENABLED)
+ nm_bb_transc_fsm_becomes_disabled(bb_transc);
nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_NOTINSTALLED);
+ }
break;
default:
OSMO_ASSERT(0);
diff --git a/src/osmo-bsc/nm_common_fsm.c b/src/osmo-bsc/nm_common_fsm.c
index 2f19ed411..b0902b171 100644
--- a/src/osmo-bsc/nm_common_fsm.c
+++ b/src/osmo-bsc/nm_common_fsm.c
@@ -21,6 +21,7 @@
*/
#include <osmocom/bsc/nm_common_fsm.h>
+#include <osmocom/bsc/signal.h>
const struct value_string nm_fsm_event_names[] = {
{ NM_EV_SW_ACT_REP, "SW_ACT_REP" },
@@ -34,3 +35,17 @@ const struct value_string nm_fsm_event_names[] = {
{ NM_EV_FEATURE_NEGOTIATED, "FEATURE_NEGOTIATED" },
{ 0, NULL }
};
+
+void nm_obj_fsm_becomes_enabled_disabled(struct gsm_bts *bts, void *obj,
+ enum abis_nm_obj_class obj_class, bool running)
+{
+ struct nm_running_chg_signal_data nsd;
+
+ memset(&nsd, 0, sizeof(nsd));
+ nsd.bts = bts;
+ nsd.obj_class = obj_class;
+ nsd.obj = obj;
+ nsd.running = running;
+
+ osmo_signal_dispatch(SS_NM, S_NM_RUNNING_CHG, &nsd);
+}
diff --git a/src/osmo-bsc/nm_rcarrier_fsm.c b/src/osmo-bsc/nm_rcarrier_fsm.c
index f3c230d70..657abea92 100644
--- a/src/osmo-bsc/nm_rcarrier_fsm.c
+++ b/src/osmo-bsc/nm_rcarrier_fsm.c
@@ -40,6 +40,16 @@
#define nm_rcarrier_fsm_state_chg(fi, NEXT_STATE) \
osmo_fsm_inst_state_chg(fi, NEXT_STATE, 0, 0)
+static inline void nm_rcarrier_fsm_becomes_enabled(struct gsm_bts_trx *trx)
+{
+ nm_obj_fsm_becomes_enabled_disabled(trx->bts, trx, NM_OC_RADIO_CARRIER, true);
+}
+
+static inline void nm_rcarrier_fsm_becomes_disabled(struct gsm_bts_trx *trx)
+{
+ nm_obj_fsm_becomes_enabled_disabled(trx->bts, trx, NM_OC_RADIO_CARRIER, false);
+}
+
//////////////////////////
// FSM STATE ACTIONS
//////////////////////////
@@ -228,10 +238,13 @@ static void st_op_enabled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state
trx->mo.adm_unlock_sent = false;
trx->mo.set_attr_ack_received = false;
trx->mo.set_attr_sent = false;
+
+ nm_rcarrier_fsm_becomes_enabled(trx);
}
static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
+ struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv;
struct nm_statechg_signal_data *nsd;
const struct gsm_nm_state *new_state;
@@ -244,13 +257,16 @@ static void st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data)
switch (new_state->availability) { /* operational = DISABLED */
case NM_AVSTATE_NOT_INSTALLED:
case NM_AVSTATE_POWER_OFF:
+ nm_rcarrier_fsm_becomes_disabled(trx);
nm_rcarrier_fsm_state_chg(fi, NM_RCARRIER_ST_OP_DISABLED_NOTINSTALLED);
return;
case NM_AVSTATE_DEPENDENCY:
+ nm_rcarrier_fsm_becomes_disabled(trx);
nm_rcarrier_fsm_state_chg(fi, NM_RCARRIER_ST_OP_DISABLED_DEPENDENCY);
return;
case NM_AVSTATE_OFF_LINE:
case NM_AVSTATE_OK:
+ nm_rcarrier_fsm_becomes_disabled(trx);
nm_rcarrier_fsm_state_chg(fi, NM_RCARRIER_ST_OP_DISABLED_OFFLINE);
return;
default:
@@ -278,8 +294,11 @@ static void st_op_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)
trx->mo.force_rf_lock ? NM_STATE_LOCKED : NM_STATE_UNLOCKED);
break;
case NM_EV_OML_DOWN:
- if (fi->state != NM_RCARRIER_ST_OP_DISABLED_NOTINSTALLED)
+ if (fi->state != NM_RCARRIER_ST_OP_DISABLED_NOTINSTALLED) {
+ if (fi->state == NM_RCARRIER_ST_OP_ENABLED)
+ nm_rcarrier_fsm_becomes_disabled(trx);
nm_rcarrier_fsm_state_chg(fi, NM_RCARRIER_ST_OP_DISABLED_NOTINSTALLED);
+ }
break;
default:
OSMO_ASSERT(0);