aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-09-10 02:54:37 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-09-21 06:04:39 +0700
commite0a267839ce04701a155d8031941220fbef23354 (patch)
tree6851129ec19991151c8c72b7094497a8a3ce6064
parent0f70bef8d5af1cc8b982273ce2f01632151a5c79 (diff)
abis_nm: send Get Attributes to GPRS Cell MO(s)fixeria/ipacc_feat
-rw-r--r--src/osmo-bsc/nm_gprs_cell_fsm.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/osmo-bsc/nm_gprs_cell_fsm.c b/src/osmo-bsc/nm_gprs_cell_fsm.c
index 40514a81c..10d25e790 100644
--- a/src/osmo-bsc/nm_gprs_cell_fsm.c
+++ b/src/osmo-bsc/nm_gprs_cell_fsm.c
@@ -48,6 +48,8 @@ static void st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint3
{
struct gsm_gprs_cell *cell = (struct gsm_gprs_cell *)fi->priv;
+ cell->mo.get_attr_sent = false;
+ cell->mo.get_attr_rep_received = false;
cell->mo.set_attr_sent = false;
cell->mo.set_attr_ack_received = false;
cell->mo.adm_unlock_sent = false;
@@ -98,6 +100,23 @@ static void configure_loop(struct gsm_gprs_cell *cell, const struct gsm_nm_state
if (bts_setup_ramp_wait(bts))
return;
+ if (!cell->mo.get_attr_sent && !cell->mo.get_attr_rep_received) {
+ uint8_t attr_buf[2]; /* enlarge if needed */
+ uint8_t *ptr = &attr_buf[0];
+
+ *(ptr++) = NM_ATT_SW_CONFIG;
+ if (is_ipa_abisip_bts(bts))
+ *(ptr++) = NM_ATT_IPACC_SUPP_FEATURES;
+
+ OSMO_ASSERT((ptr - attr_buf) <= sizeof(attr_buf));
+ abis_nm_get_attr(bts, NM_OC_GPRS_CELL,
+ bts->bts_nr, 0x00, 0xff,
+ &attr_buf[0], (ptr - attr_buf));
+ cell->mo.get_attr_sent = true;
+ }
+
+ /* OS#6172: old osmo-bts versions do NACK Get Attributes for GPRS Cell,
+ * so we do not check if cell->mo.get_attr_rep_received is set here. */
if (!cell->mo.set_attr_sent && !cell->mo.set_attr_ack_received) {
cell->mo.set_attr_sent = true;
msgb = nanobts_gen_set_cell_attr(bts);
@@ -148,6 +167,11 @@ static void st_op_disabled_dependency(struct osmo_fsm_inst *fi, uint32_t event,
case NM_EV_SW_ACT_REP:
configure_loop(cell, &cell->mo.nm_state, false);
break;
+ case NM_EV_GET_ATTR_REP:
+ cell->mo.get_attr_rep_received = true;
+ cell->mo.get_attr_sent = false;
+ configure_loop(cell, &cell->mo.nm_state, false);
+ return;
case NM_EV_SET_ATTR_ACK:
cell->mo.set_attr_ack_received = true;
cell->mo.set_attr_sent = false;
@@ -202,6 +226,11 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi
case NM_EV_SW_ACT_REP:
configure_loop(cell, &cell->mo.nm_state, true);
break;
+ case NM_EV_GET_ATTR_REP:
+ cell->mo.get_attr_rep_received = true;
+ cell->mo.get_attr_sent = false;
+ configure_loop(cell, &cell->mo.nm_state, true);
+ return;
case NM_EV_SET_ATTR_ACK:
cell->mo.set_attr_ack_received = true;
cell->mo.set_attr_sent = false;
@@ -333,6 +362,7 @@ static struct osmo_fsm_state nm_gprs_cell_fsm_states[] = {
.in_event_mask =
X(NM_EV_SW_ACT_REP) |
X(NM_EV_STATE_CHG_REP) |
+ X(NM_EV_GET_ATTR_REP) |
X(NM_EV_SET_ATTR_ACK) |
X(NM_EV_SETUP_RAMP_READY),
.out_state_mask =
@@ -347,6 +377,7 @@ static struct osmo_fsm_state nm_gprs_cell_fsm_states[] = {
.in_event_mask =
X(NM_EV_SW_ACT_REP) |
X(NM_EV_STATE_CHG_REP) |
+ X(NM_EV_GET_ATTR_REP) |
X(NM_EV_SET_ATTR_ACK) |
X(NM_EV_SETUP_RAMP_READY),
.out_state_mask =