diff options
-rw-r--r-- | include/osmo-bts/nm_common_fsm.h | 8 | ||||
-rw-r--r-- | include/osmo-bts/oml.h | 1 | ||||
-rw-r--r-- | src/common/nm_bb_transc_fsm.c | 12 | ||||
-rw-r--r-- | src/common/nm_bts_fsm.c | 11 | ||||
-rw-r--r-- | src/common/nm_bts_sm_fsm.c | 11 | ||||
-rw-r--r-- | src/common/nm_channel_fsm.c | 19 | ||||
-rw-r--r-- | src/common/nm_common_fsm.c | 2 | ||||
-rw-r--r-- | src/common/nm_radio_carrier_fsm.c | 16 | ||||
-rw-r--r-- | src/osmo-bts-lc15/oml.c | 37 | ||||
-rw-r--r-- | src/osmo-bts-oc2g/oml.c | 37 | ||||
-rw-r--r-- | src/osmo-bts-octphy/l1_oml.c | 31 | ||||
-rw-r--r-- | src/osmo-bts-omldummy/bts_model.c | 28 | ||||
-rw-r--r-- | src/osmo-bts-sysmo/oml.c | 33 | ||||
-rw-r--r-- | src/osmo-bts-trx/l1_if.c | 27 | ||||
-rw-r--r-- | src/osmo-bts-virtual/bts_model.c | 28 |
15 files changed, 262 insertions, 39 deletions
diff --git a/include/osmo-bts/nm_common_fsm.h b/include/osmo-bts/nm_common_fsm.h index 13d7e0cc..1f0accc5 100644 --- a/include/osmo-bts/nm_common_fsm.h +++ b/include/osmo-bts/nm_common_fsm.h @@ -25,10 +25,13 @@ #include <osmocom/core/fsm.h> #include <osmocom/core/utils.h> +#include <osmocom/core/msgb.h> /* Common */ enum nm_fsm_events { NM_EV_SW_ACT, + NM_EV_SETATTR_ACK, /* data: struct nm_fsm_ev_setattr_data */ + NM_EV_SETATTR_NACK, /* data: struct nm_fsm_ev_setattr_data */ NM_EV_OPSTART_ACK, NM_EV_OPSTART_NACK, NM_EV_SHUTDOWN_START, @@ -46,6 +49,11 @@ enum nm_fsm_events { }; extern const struct value_string nm_fsm_event_names[]; +struct nm_fsm_ev_setattr_data { + struct msgb *msg; /* msgb ownership is transferred to FSM */ + int cause; +}; + /* BTS SiteManager */ enum nm_bts_sm_op_fsm_states { diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h index 42284f92..90c90770 100644 --- a/include/osmo-bts/oml.h +++ b/include/osmo-bts/oml.h @@ -32,6 +32,7 @@ struct gsm_abis_mo { struct gsm_bts *bts; /* NM BTS Site Manager FSM */ struct osmo_fsm_inst *fi; + bool setattr_success; bool opstart_success; }; diff --git a/src/common/nm_bb_transc_fsm.c b/src/common/nm_bb_transc_fsm.c index 1b83cbd0..40d5134e 100644 --- a/src/common/nm_bb_transc_fsm.c +++ b/src/common/nm_bb_transc_fsm.c @@ -59,6 +59,7 @@ static void ev_dispatch_children(struct gsm_bts_bb_trx *bb_transc, uint32_t even static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv; + bb_transc->mo.setattr_success = false; bb_transc->mo.opstart_success = false; oml_mo_state_chg(&bb_transc->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED, NM_STATE_LOCKED); } @@ -99,6 +100,7 @@ static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t p struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc); int i; + bb_transc->mo.setattr_success = false; bb_transc->mo.opstart_success = false; oml_mo_state_chg(&bb_transc->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE, -1); @@ -114,10 +116,17 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi { struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv; struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc); + struct nm_fsm_ev_setattr_data *setattr_data; bool phy_state_connected; bool rsl_link_connected; switch (event) { + case NM_EV_SETATTR_ACK: + case NM_EV_SETATTR_NACK: + setattr_data = (struct nm_fsm_ev_setattr_data *)data; + bb_transc->mo.setattr_success = setattr_data->cause == 0; + oml_fom_ack_nack(setattr_data->msg, setattr_data->cause); + break; case NM_EV_OPSTART_ACK: bb_transc->mo.opstart_success = true; oml_mo_opstart_ack(&bb_transc->mo); @@ -150,6 +159,7 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi rsl_link_connected = true; } + /* We so far don't expect any SetAttributes for this NM object */ if (rsl_link_connected && phy_state_connected && bb_transc->mo.opstart_success) { nm_bb_transc_fsm_state_chg(fi, NM_BBTRANSC_ST_OP_ENABLED); @@ -232,6 +242,8 @@ static struct osmo_fsm_state nm_bb_transc_fsm_states[] = { }, [NM_BBTRANSC_ST_OP_DISABLED_OFFLINE] = { .in_event_mask = + X(NM_EV_SETATTR_ACK) | + X(NM_EV_SETATTR_NACK) | X(NM_EV_OPSTART_ACK) | X(NM_EV_OPSTART_NACK) | X(NM_EV_RSL_UP) | diff --git a/src/common/nm_bts_fsm.c b/src/common/nm_bts_fsm.c index 9210e7aa..54737bf0 100644 --- a/src/common/nm_bts_fsm.c +++ b/src/common/nm_bts_fsm.c @@ -57,6 +57,7 @@ static void ev_dispatch_children(struct gsm_bts *bts, uint32_t event) static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts *bts = (struct gsm_bts *)fi->priv; + bts->mo.setattr_success = false; bts->mo.opstart_success = false; oml_mo_state_chg(&bts->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED, NM_STATE_LOCKED); } @@ -78,6 +79,7 @@ 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 *bts = (struct gsm_bts *)fi->priv; + bts->mo.setattr_success = false; bts->mo.opstart_success = false; oml_mo_state_chg(&bts->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE, -1); } @@ -85,8 +87,15 @@ static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t p static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct gsm_bts *bts = (struct gsm_bts *)fi->priv; + struct nm_fsm_ev_setattr_data *setattr_data; switch (event) { + case NM_EV_SETATTR_ACK: + case NM_EV_SETATTR_NACK: + setattr_data = (struct nm_fsm_ev_setattr_data *)data; + bts->mo.setattr_success = setattr_data->cause == 0; + oml_fom_ack_nack(setattr_data->msg, setattr_data->cause); + break; case NM_EV_OPSTART_ACK: bts->mo.opstart_success = true; oml_mo_opstart_ack(&bts->mo); @@ -146,6 +155,8 @@ static struct osmo_fsm_state nm_bts_fsm_states[] = { }, [NM_BTS_ST_OP_DISABLED_OFFLINE] = { .in_event_mask = + X(NM_EV_SETATTR_ACK) | + X(NM_EV_SETATTR_NACK) | X(NM_EV_OPSTART_ACK) | X(NM_EV_OPSTART_NACK), .out_state_mask = diff --git a/src/common/nm_bts_sm_fsm.c b/src/common/nm_bts_sm_fsm.c index 267341e7..2d433153 100644 --- a/src/common/nm_bts_sm_fsm.c +++ b/src/common/nm_bts_sm_fsm.c @@ -55,6 +55,7 @@ static void ev_dispatch_children(struct gsm_bts_sm *site_mgr, uint32_t event) static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts_sm *site_mgr = (struct gsm_bts_sm *)fi->priv; + site_mgr->mo.setattr_success = false; site_mgr->mo.opstart_success = false; oml_mo_state_chg(&site_mgr->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED, NM_STATE_LOCKED); } @@ -76,6 +77,7 @@ 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_sm *site_mgr = (struct gsm_bts_sm *)fi->priv; + site_mgr->mo.setattr_success = false; site_mgr->mo.opstart_success = false; oml_mo_state_chg(&site_mgr->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE, -1); } @@ -83,8 +85,15 @@ static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t p static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct gsm_bts_sm *site_mgr = (struct gsm_bts_sm *)fi->priv; + struct nm_fsm_ev_setattr_data *setattr_data; switch (event) { + case NM_EV_SETATTR_ACK: + case NM_EV_SETATTR_NACK: + setattr_data = (struct nm_fsm_ev_setattr_data *)data; + site_mgr->mo.setattr_success = setattr_data->cause == 0; + oml_fom_ack_nack(setattr_data->msg, setattr_data->cause); + break; case NM_EV_OPSTART_ACK: site_mgr->mo.opstart_success = true; oml_mo_opstart_ack(&site_mgr->mo); @@ -144,6 +153,8 @@ static struct osmo_fsm_state nm_bts_sm_fsm_states[] = { }, [NM_BTS_SM_ST_OP_DISABLED_OFFLINE] = { .in_event_mask = + X(NM_EV_SETATTR_ACK) | + X(NM_EV_SETATTR_NACK) | X(NM_EV_OPSTART_ACK) | X(NM_EV_OPSTART_NACK), .out_state_mask = diff --git a/src/common/nm_channel_fsm.c b/src/common/nm_channel_fsm.c index e6c296f3..f933a163 100644 --- a/src/common/nm_channel_fsm.c +++ b/src/common/nm_channel_fsm.c @@ -55,6 +55,7 @@ static bool ts_can_be_enabled(const struct gsm_bts_trx_ts *ts) 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->mo.setattr_success = false; ts->mo.opstart_success = false; oml_mo_state_chg(&ts->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED, NM_STATE_LOCKED); } @@ -86,8 +87,15 @@ static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_ 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; + struct nm_fsm_ev_setattr_data *setattr_data; switch (event) { + case NM_EV_SETATTR_ACK: + case NM_EV_SETATTR_NACK: + setattr_data = (struct nm_fsm_ev_setattr_data *)data; + ts->mo.setattr_success = setattr_data->cause == 0; + oml_fom_ack_nack(setattr_data->msg, setattr_data->cause); + break; case NM_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"); @@ -123,8 +131,15 @@ static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t p 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; + struct nm_fsm_ev_setattr_data *setattr_data; switch (event) { + case NM_EV_SETATTR_ACK: + case NM_EV_SETATTR_NACK: + setattr_data = (struct nm_fsm_ev_setattr_data *)data; + ts->mo.setattr_success = setattr_data->cause == 0; + oml_fom_ack_nack(setattr_data->msg, setattr_data->cause); + break; case NM_EV_OPSTART_ACK: ts->mo.opstart_success = true; oml_mo_opstart_ack(&ts->mo); @@ -199,6 +214,8 @@ static struct osmo_fsm_state nm_chan_fsm_states[] = { }, [NM_CHAN_ST_OP_DISABLED_DEPENDENCY] = { .in_event_mask = + X(NM_EV_SETATTR_ACK) | + X(NM_EV_SETATTR_NACK) | X(NM_EV_OPSTART_ACK) | /* backward compatibility, buggy BSC */ X(NM_EV_OPSTART_NACK) | X(NM_EV_BBTRANSC_ENABLED) | @@ -215,6 +232,8 @@ static struct osmo_fsm_state nm_chan_fsm_states[] = { }, [NM_CHAN_ST_OP_DISABLED_OFFLINE] = { .in_event_mask = + X(NM_EV_SETATTR_ACK) | + X(NM_EV_SETATTR_NACK) | X(NM_EV_OPSTART_ACK) | X(NM_EV_OPSTART_NACK) | X(NM_EV_BBTRANSC_DISABLED) | diff --git a/src/common/nm_common_fsm.c b/src/common/nm_common_fsm.c index 2182fefa..be11bef3 100644 --- a/src/common/nm_common_fsm.c +++ b/src/common/nm_common_fsm.c @@ -25,6 +25,8 @@ const struct value_string nm_fsm_event_names[] = { { NM_EV_SW_ACT, "SW_ACT" }, + { NM_EV_SETATTR_ACK, "SETATTR_ACK" }, + { NM_EV_SETATTR_NACK, "SETATTR_NACK" }, { NM_EV_OPSTART_ACK, "OPSTART_ACK" }, { NM_EV_OPSTART_NACK, "OPSTART_NACK" }, { NM_EV_SHUTDOWN_START, "SHUTDOWN_START" }, diff --git a/src/common/nm_radio_carrier_fsm.c b/src/common/nm_radio_carrier_fsm.c index 839632ce..be03d1d9 100644 --- a/src/common/nm_radio_carrier_fsm.c +++ b/src/common/nm_radio_carrier_fsm.c @@ -48,6 +48,7 @@ static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; + trx->mo.setattr_success = false; trx->mo.opstart_success = false; oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED, NM_STATE_LOCKED); } @@ -81,6 +82,7 @@ static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t p struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; unsigned int i; + trx->mo.setattr_success = false; trx->mo.opstart_success = false; oml_mo_state_chg(&trx->mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE, -1); @@ -95,10 +97,17 @@ static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t p static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct gsm_bts_trx *trx = (struct gsm_bts_trx *)fi->priv; + struct nm_fsm_ev_setattr_data *setattr_data; bool phy_state_connected; bool rsl_link_connected; switch (event) { + case NM_EV_SETATTR_ACK: + case NM_EV_SETATTR_NACK: + setattr_data = (struct nm_fsm_ev_setattr_data *)data; + trx->mo.setattr_success = setattr_data->cause == 0; + oml_fom_ack_nack(setattr_data->msg, setattr_data->cause); + break; case NM_EV_OPSTART_ACK: trx->mo.opstart_success = true; oml_mo_opstart_ack(&trx->mo); @@ -131,12 +140,13 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi } if (rsl_link_connected && phy_state_connected && - trx->mo.opstart_success) { + trx->mo.setattr_success && trx->mo.opstart_success) { nm_rcarrier_fsm_state_chg(fi, NM_RCARRIER_ST_OP_ENABLED); } else { - LOGPFSML(fi, LOGL_INFO, "Delay switch to operative state Enabled, wait for:%s%s%s\n", + LOGPFSML(fi, LOGL_INFO, "Delay switch to operative state Enabled, wait for:%s%s%s%s\n", rsl_link_connected ? "" : " rsl", phy_state_connected ? "" : " phy", + trx->mo.setattr_success ? "" : " setattr", trx->mo.opstart_success ? "" : " opstart"); } @@ -206,6 +216,8 @@ static struct osmo_fsm_state nm_rcarrier_fsm_states[] = { }, [NM_RCARRIER_ST_OP_DISABLED_OFFLINE] = { .in_event_mask = + X(NM_EV_SETATTR_ACK) | + X(NM_EV_SETATTR_NACK) | X(NM_EV_OPSTART_ACK) | X(NM_EV_OPSTART_NACK) | X(NM_EV_RSL_UP) | diff --git a/src/osmo-bts-lc15/oml.c b/src/osmo-bts-lc15/oml.c index 9d0d99af..6169ef74 100644 --- a/src/osmo-bts-lc15/oml.c +++ b/src/osmo-bts-lc15/oml.c @@ -1834,11 +1834,31 @@ int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type, int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { - if (kind == NM_OC_RADIO_CARRIER) { - struct gsm_bts_trx *trx = obj; - struct lc15l1_hdl *fl1h = trx_lc15l1_hdl(trx); + struct abis_om_fom_hdr *foh = msgb_l3(msg); + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + struct gsm_bts_trx *trx; + struct lc15l1_hdl *fl1h; + uint8_t cell_size; + + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } + + switch (foh->msg_type) { + case NM_MT_SET_RADIO_ATTR: + trx = obj; + fl1h = trx_lc15l1_hdl(trx); /* convert max TA to max cell size in qbits */ - uint8_t cell_size = bts->max_ta << 2; + cell_size = bts->max_ta << 2; #if LITECELL15_API_VERSION >= LITECELL15_API(2,1,7) /* We do not need to check for L1 handle @@ -1870,9 +1890,14 @@ int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, } #endif } + break; } - /* FIXME: we actually need to send a ACK or NACK for the OML message */ - return oml_fom_ack_nack(msg, 0); + + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } /* callback from OML */ diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c index b50e151e..ba85f36e 100644 --- a/src/osmo-bts-oc2g/oml.c +++ b/src/osmo-bts-oc2g/oml.c @@ -1843,11 +1843,31 @@ int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type, int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { - if (kind == NM_OC_RADIO_CARRIER) { - struct gsm_bts_trx *trx = obj; - struct oc2gl1_hdl *fl1h = trx_oc2gl1_hdl(trx); + struct abis_om_fom_hdr *foh = msgb_l3(msg); + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + struct gsm_bts_trx *trx; + struct oc2gl1_hdl *fl1h; + uint8_t cell_size; + + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } + + switch (foh->msg_type) { + case NM_MT_SET_RADIO_ATTR: + trx = obj; + fl1h = trx_oc2gl1_hdl(trx); /* convert max TA to max cell size in qbits */ - uint8_t cell_size = bts->max_ta << 2; + cell_size = bts->max_ta << 2; /* We do not need to check for L1 handle * because the max cell size parameter can receive before MphInit */ @@ -1876,11 +1896,14 @@ int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, l1if_set_txpower_c0_idle_pwr_red(fl1h, fl1h->phy_inst->u.oc2g.tx_c0_idle_pwr_red); } } - + break; } - /* FIXME: we actually need to send a ACK or NACK for the OML message */ - return oml_fom_ack_nack(msg, 0); + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownsership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } /* callback from OML */ diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c index 18305997..73ab9bde 100644 --- a/src/osmo-bts-octphy/l1_oml.c +++ b/src/osmo-bts-octphy/l1_oml.c @@ -1748,13 +1748,36 @@ int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type, int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { - if (kind == NM_OC_RADIO_CARRIER) { - struct gsm_bts_trx *trx = obj; - /*struct octphy_hdl *fl1h = trx_octphy_hdl(trx); */ + struct abis_om_fom_hdr *foh = msgb_l3(msg); + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + struct gsm_bts_trx *trx; + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } + + switch (foh->msg_type) { + case NM_MT_SET_RADIO_ATTR: + trx = obj; + /*struct octphy_hdl *fl1h = trx_octphy_hdl(trx); */ power_ramp_start(trx, get_p_target_mdBm(trx, 0), 0, NULL); + break; } - return oml_fom_ack_nack(msg, 0); + + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownsership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c index 5bfcfca4..f5d59a30 100644 --- a/src/osmo-bts-omldummy/bts_model.c +++ b/src/osmo-bts-omldummy/bts_model.c @@ -97,20 +97,38 @@ int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - int cause = 0; + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } switch (foh->msg_type) { case NM_MT_SET_BTS_ATTR: - cause = vbts_set_bts(obj); + ev_data.cause = vbts_set_bts(obj); break; case NM_MT_SET_RADIO_ATTR: - cause = vbts_set_trx(obj); + ev_data.cause = vbts_set_trx(obj); break; case NM_MT_SET_CHAN_ATTR: - cause = vbts_set_ts(obj); + ev_data.cause = vbts_set_ts(obj); break; } - return oml_fom_ack_nack(msg, cause); + + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownsership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } /* MO: TS 12.21 Managed Object */ diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c index 194afcd3..74af56b0 100644 --- a/src/osmo-bts-sysmo/oml.c +++ b/src/osmo-bts-sysmo/oml.c @@ -1748,17 +1748,40 @@ int bts_model_check_oml(struct gsm_bts *bts, uint8_t msg_type, int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { - if (kind == NM_OC_RADIO_CARRIER) { - struct gsm_bts_trx *trx = obj; - struct femtol1_hdl *fl1h = trx_femtol1_hdl(trx); + struct abis_om_fom_hdr *foh = msgb_l3(msg); + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + struct gsm_bts_trx *trx; + struct femtol1_hdl *fl1h; + + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } + + switch (foh->msg_type) { + case NM_MT_SET_RADIO_ATTR: + trx = obj; + fl1h = trx_femtol1_hdl(trx); /* Did we go through MphInit yet? If yes fire and forget */ if (fl1h->hLayer1) power_ramp_start(trx, get_p_target_mdBm(trx, 0), 0, NULL); + break; } - /* FIXME: we actually need to send a ACK or NACK for the OML message */ - return oml_fom_ack_nack(msg, 0); + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownsership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } /* callback from OML */ diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c index 6b417f40..90adde29 100644 --- a/src/osmo-bts-trx/l1_if.c +++ b/src/osmo-bts-trx/l1_if.c @@ -555,21 +555,38 @@ int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - int cause = 0; + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } switch (foh->msg_type) { case NM_MT_SET_BTS_ATTR: - cause = trx_set_bts(obj, new_attr); + ev_data.cause = trx_set_bts(obj, new_attr); break; case NM_MT_SET_RADIO_ATTR: - cause = trx_set_trx(obj); + ev_data.cause = trx_set_trx(obj); break; case NM_MT_SET_CHAN_ATTR: - cause = trx_set_ts(obj); + ev_data.cause = trx_set_ts(obj); break; } - return oml_fom_ack_nack(msg, cause); + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownsership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } /* callback from OML */ diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c index 48e9400e..87040566 100644 --- a/src/osmo-bts-virtual/bts_model.c +++ b/src/osmo-bts-virtual/bts_model.c @@ -110,20 +110,38 @@ int bts_model_apply_oml(struct gsm_bts *bts, struct msgb *msg, struct tlv_parsed *new_attr, int kind, void *obj) { struct abis_om_fom_hdr *foh = msgb_l3(msg); - int cause = 0; + struct gsm_abis_mo *mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst); + struct nm_fsm_ev_setattr_data ev_data = { + .msg = msg, + .cause = 0, + }; + int rc; + + /* TODO: NM Object without FSM: */ + switch (foh->obj_class) { + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + case NM_OC_GPRS_NSVC: + return oml_fom_ack_nack(ev_data.msg, ev_data.cause); + } switch (foh->msg_type) { case NM_MT_SET_BTS_ATTR: - cause = vbts_set_bts(obj); + ev_data.cause = vbts_set_bts(obj); break; case NM_MT_SET_RADIO_ATTR: - cause = vbts_set_trx(obj); + ev_data.cause = vbts_set_trx(obj); break; case NM_MT_SET_CHAN_ATTR: - cause = vbts_set_ts(obj); + ev_data.cause = vbts_set_ts(obj); break; } - return oml_fom_ack_nack(msg, cause); + + rc = osmo_fsm_inst_dispatch(mo->fi, + ev_data.cause == 0 ? NM_EV_SETATTR_ACK : NM_EV_SETATTR_NACK, + &ev_data); + /* msgb ownsership is transferred to FSM if it received ev: */ + return rc == 0 ? 1 : 0; } /* MO: TS 12.21 Managed Object */ |