This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
pespin gerrit-no-reply at lists.osmocom.orgpespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/25457 ) Change subject: abis.c: Transition to CONNECTED state only when OML link is up ...................................................................... abis.c: Transition to CONNECTED state only when OML link is up This clarifies the different states and transitions between them: OML LINK UP: CONNECTING->CONNECTED ANY LINK DOWN: CONNECTING->CONNECTING, CONNECTED->FAILED In follow up commits, support to reconnect instead of exit after the BTS has already connected will be added, so only the last transition needs to be changed. Related: SYS#4971 Change-Id: I43e83b1b04fbaa1f87818c096e6ad3920801b1f6 --- M include/osmo-bts/abis.h M src/common/abis.c 2 files changed, 73 insertions(+), 46 deletions(-) Approvals: Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve osmith: Looks good to me, but someone else must approve pespin: Looks good to me, approved diff --git a/include/osmo-bts/abis.h b/include/osmo-bts/abis.h index b05461b..1939faf 100644 --- a/include/osmo-bts/abis.h +++ b/include/osmo-bts/abis.h @@ -7,6 +7,7 @@ #include <osmo-bts/gsm_data.h> enum abis_link_fsm_event { + ABIS_LINK_EV_SIGN_LINK_OML_UP, ABIS_LINK_EV_SIGN_LINK_DOWN, ABIS_LINK_EV_VTY_RM_ADDR, }; diff --git a/src/common/abis.c b/src/common/abis.c index ff9e5fa..551670c 100644 --- a/src/common/abis.c +++ b/src/common/abis.c @@ -63,12 +63,13 @@ #define S(x) (1 << (x)) enum abis_link_fsm_state { - ABIS_LINK_ST_CONNECTING, - ABIS_LINK_ST_CONNECTED, - ABIS_LINK_ST_FAILED, + ABIS_LINK_ST_CONNECTING, /* OML link has not yet been established */ + ABIS_LINK_ST_CONNECTED, /* OML link is established, RSL links may be established or not */ + ABIS_LINK_ST_FAILED, /* There used to be an active OML connection but it became broken */ }; static const struct value_string abis_link_fsm_event_names[] = { + { ABIS_LINK_EV_SIGN_LINK_OML_UP, "SIGN_LINK_OML_UP", }, { ABIS_LINK_EV_SIGN_LINK_DOWN, "SIGN_LINK_DOWN" }, { ABIS_LINK_EV_VTY_RM_ADDR, "VTY_RM_ADDR" }, {} @@ -81,6 +82,39 @@ int line_ctr; }; +static void reset_oml_link(struct gsm_bts *bts) +{ + if (bts->oml_link) { + struct timespec now; + + e1inp_sign_link_destroy(bts->oml_link); + + /* Log a special notice if the OML connection was dropped relatively quickly. */ + if (bts->oml_conn_established_timestamp.tv_sec != 0 && clock_gettime(CLOCK_MONOTONIC, &now) == 0 && + bts->oml_conn_established_timestamp.tv_sec + OSMO_BTS_OML_CONN_EARLY_DISCONNECT >= now.tv_sec) { + LOGP(DABIS, LOGL_FATAL, "OML link was closed early within %" PRIu64 " seconds. " + "If this situation persists, please check your BTS and BSC configuration files for errors. " + "A common error is a mismatch between unit_id configuration parameters of BTS and BSC.\n", + (uint64_t) (now.tv_sec - bts->oml_conn_established_timestamp.tv_sec)); + } + bts->oml_link = NULL; + } + memset(&bts->oml_conn_established_timestamp, 0, sizeof(bts->oml_conn_established_timestamp)); +} + +static void drain_oml_queue(struct gsm_bts *bts) +{ + struct msgb *msg, *msg2; + + llist_for_each_entry_safe(msg, msg2, &bts->oml_queue, list) { + /* osmo-bts uses msg->trx internally, but libosmo-abis uses + * the signalling link at msg->dst */ + llist_del(&msg->list); + msg->dst = bts->oml_link; + abis_sendmsg(msg); + } +} + static void abis_link_connecting_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state) { struct e1inp_line *line; @@ -135,8 +169,32 @@ return; } - /* The TCP connection to the BSC is now in progress. */ - osmo_fsm_inst_state_chg(fi, ABIS_LINK_ST_CONNECTED, 0, 0); + /* The TCP connection to the BSC is now in progress. + * Wait for OML Link UP to transition to CONNECTED. */ +} + +static void abis_link_connecting(struct osmo_fsm_inst *fi, uint32_t event, void *data) +{ + struct abis_link_fsm_priv *priv = fi->priv; + struct gsm_bts *bts = priv->bts; + + switch (event) { + case ABIS_LINK_EV_SIGN_LINK_OML_UP: + osmo_fsm_inst_state_chg(fi, ABIS_LINK_ST_CONNECTED, 0, 0); + break; + case ABIS_LINK_EV_SIGN_LINK_DOWN: + reset_oml_link(bts); + osmo_fsm_inst_state_chg(fi, ABIS_LINK_ST_CONNECTING, 0, 0); + break; + default: + OSMO_ASSERT(0); + } +} + +static void abis_link_connected_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + drain_oml_queue(g_bts); + bts_link_estab(g_bts); } static void abis_link_connected(struct osmo_fsm_inst *fi, uint32_t event, void *data) @@ -144,35 +202,16 @@ struct abis_link_fsm_priv *priv = fi->priv; struct gsm_bts *bts = priv->bts; struct gsm_bts_trx *trx; - bool oml_rsl_was_connected = false; - OSMO_ASSERT(event == ABIS_LINK_EV_SIGN_LINK_DOWN); /* First remove the OML signalling link */ - if (bts->oml_link) { - struct timespec now; - - e1inp_sign_link_destroy(bts->oml_link); - - /* Log a special notice if the OML connection was dropped relatively quickly. */ - if (bts->oml_conn_established_timestamp.tv_sec != 0 && clock_gettime(CLOCK_MONOTONIC, &now) == 0 && - bts->oml_conn_established_timestamp.tv_sec + OSMO_BTS_OML_CONN_EARLY_DISCONNECT >= now.tv_sec) { - LOGP(DABIS, LOGL_FATAL, "OML link was closed early within %" PRIu64 " seconds. " - "If this situation persists, please check your BTS and BSC configuration files for errors. " - "A common error is a mismatch between unit_id configuration parameters of BTS and BSC.\n", - (uint64_t) (now.tv_sec - bts->oml_conn_established_timestamp.tv_sec)); - } - bts->oml_link = NULL; - oml_rsl_was_connected = true; - } - memset(&bts->oml_conn_established_timestamp, 0, sizeof(bts->oml_conn_established_timestamp)); + reset_oml_link(bts); /* Then iterate over the RSL signalling links */ llist_for_each_entry(trx, &bts->trx_list, list) { if (trx->rsl_link) { e1inp_sign_link_destroy(trx->rsl_link); trx->rsl_link = NULL; - oml_rsl_was_connected = true; } } @@ -180,10 +219,7 @@ * to connect to an alternate BSC. Instead we will shut down the BTS process. This will ensure that all states * in the BTS (hardware and software) are reset properly. It is then up to the process management of the host * to restart osmo-bts. */ - if (oml_rsl_was_connected) - osmo_fsm_inst_state_chg(fi, ABIS_LINK_ST_FAILED, 0, 0); - else - osmo_fsm_inst_state_chg(fi, ABIS_LINK_ST_CONNECTING, 0, 0); + osmo_fsm_inst_state_chg(fi, ABIS_LINK_ST_FAILED, 0, 0); } static void abis_link_failed_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state) @@ -216,19 +252,23 @@ static struct osmo_fsm_state abis_link_fsm_states[] = { [ABIS_LINK_ST_CONNECTING] = { .name = "CONNECTING", + .in_event_mask = + S(ABIS_LINK_EV_SIGN_LINK_OML_UP) | + S(ABIS_LINK_EV_SIGN_LINK_DOWN), .out_state_mask = S(ABIS_LINK_ST_CONNECTING) | S(ABIS_LINK_ST_CONNECTED) | S(ABIS_LINK_ST_FAILED), .onenter = abis_link_connecting_onenter, + .action = abis_link_connecting, }, [ABIS_LINK_ST_CONNECTED] = { .name = "CONNECTED", .in_event_mask = S(ABIS_LINK_EV_SIGN_LINK_DOWN), .out_state_mask = - S(ABIS_LINK_ST_CONNECTING) | S(ABIS_LINK_ST_FAILED), + .onenter = abis_link_connected_onenter, .action = abis_link_connected, }, [ABIS_LINK_ST_FAILED] = { @@ -262,19 +302,6 @@ } } -static void drain_oml_queue(struct gsm_bts *bts) -{ - struct msgb *msg, *msg2; - - llist_for_each_entry_safe(msg, msg2, &bts->oml_queue, list) { - /* osmo-bts uses msg->trx internally, but libosmo-abis uses - * the signalling link at msg->dst */ - llist_del(&msg->list); - msg->dst = bts->oml_link; - abis_sendmsg(msg); - } -} - int abis_bts_rsl_sendmsg(struct msgb *msg) { OSMO_ASSERT(msg->trx); @@ -309,8 +336,7 @@ sizeof(g_bts->oml_conn_established_timestamp)); g_bts->osmo_link = e1inp_sign_link_create(sign_ts, E1INP_SIGN_OSMO, g_bts->c0, IPAC_PROTO_OSMO, 0); - drain_oml_queue(g_bts); - bts_link_estab(g_bts); + osmo_fsm_inst_dispatch(g_bts->abis_link_fi, ABIS_LINK_EV_SIGN_LINK_OML_UP, NULL); return g_bts->oml_link; case E1INP_SIGN_RSL: @@ -456,7 +482,7 @@ abis_link_fsm_priv->model_name = model_name; bts->abis_link_fi->priv = abis_link_fsm_priv; - osmo_fsm_inst_state_chg_ms(bts->abis_link_fi, ABIS_LINK_ST_CONNECTING, 1, 0); + osmo_fsm_inst_state_chg(bts->abis_link_fi, ABIS_LINK_ST_CONNECTING, 0, 0); return 0; } -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/25457 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I43e83b1b04fbaa1f87818c096e6ad3920801b1f6 Gerrit-Change-Number: 25457 Gerrit-PatchSet: 4 Gerrit-Owner: pespin <pespin at sysmocom.de> Gerrit-Reviewer: Hoernchen <ewild at sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: dexter <pmaier at sysmocom.de> Gerrit-Reviewer: fixeria <vyanitskiy at sysmocom.de> Gerrit-Reviewer: laforge <laforge at osmocom.org> Gerrit-Reviewer: neels <nhofmeyr at sysmocom.de> Gerrit-Reviewer: osmith <osmith at sysmocom.de> Gerrit-Reviewer: pespin <pespin at sysmocom.de> Gerrit-MessageType: merged -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210920/63d69d4a/attachment.htm>