diff options
author | Pau Espin Pedrol <pespin@espeweb.net> | 2020-12-04 14:22:18 +0100 |
---|---|---|
committer | Pau Espin Pedrol <pespin@espeweb.net> | 2020-12-04 15:54:34 +0100 |
commit | 44a0e0fc088eeb814e94957fa2525271a26e8cf0 (patch) | |
tree | 60c8adb567fdc1bbf8a212f04a1b1d9bfb568407 /src/osmo-bsc/nm_bts_fsm.c | |
parent | 396eb76fcd64b3e801005a1d8ec32ac53b725d7b (diff) |
oml: Delay configuring NSVC until BTS features are negotiated
This is needed in order to to proper feature support verification for
IPv6 when configuring the NSVC.
Before this patch, there could be a race condition where NSVC FSM
checked for BTS feature BTS_FEAT_IPV6_NSVC before it was negotiated
through BTS Get Attributes (Ack).
Fixes: OS#4870
Change-Id: I7c207eee0e331995ae04acec014fbd13d4d16280
Diffstat (limited to 'src/osmo-bsc/nm_bts_fsm.c')
-rw-r--r-- | src/osmo-bsc/nm_bts_fsm.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/osmo-bsc/nm_bts_fsm.c b/src/osmo-bsc/nm_bts_fsm.c index 731b5785b..c951edd61 100644 --- a/src/osmo-bsc/nm_bts_fsm.c +++ b/src/osmo-bsc/nm_bts_fsm.c @@ -127,6 +127,21 @@ static void configure_loop(struct gsm_bts *bts, struct gsm_nm_state *state, bool } } +static void rx_get_attr_rep(struct gsm_bts *bts, bool allow_opstart) +{ + struct gsm_gprs_nsvc *nsvc; + + bts->mo.get_attr_rep_received = true; + bts->mo.get_attr_sent = false; + + /* Announce bts_features are available to related NSVC MOs */ + nsvc = gsm_bts_sm_nsvc_num(bts->site_mgr, 0); /* we only support NSVC0 so far */ + osmo_fsm_inst_dispatch(nsvc->mo.fi, NM_EV_FEATURE_NEGOTIATED, NULL); + + /* Move FSM forward */ + configure_loop(bts, &bts->mo.nm_state, allow_opstart); +} + static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct gsm_bts *bts = (struct gsm_bts *)fi->priv; @@ -149,9 +164,7 @@ static void st_op_disabled_dependency(struct osmo_fsm_inst *fi, uint32_t event, switch (event) { case NM_EV_GET_ATTR_REP: - bts->mo.get_attr_rep_received = true; - bts->mo.get_attr_sent = false; - configure_loop(bts, &bts->mo.nm_state, false); + rx_get_attr_rep(bts, false); return; case NM_EV_SET_ATTR_ACK: bts->mo.set_attr_ack_received = true; @@ -203,9 +216,7 @@ static void st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, voi switch (event) { case NM_EV_GET_ATTR_REP: - bts->mo.get_attr_rep_received = true; - bts->mo.get_attr_sent = false; - configure_loop(bts, &bts->mo.nm_state, true); + rx_get_attr_rep(bts, true); return; case NM_EV_SET_ATTR_ACK: bts->mo.set_attr_ack_received = true; |