diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-12-12 18:35:49 +0100 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2023-12-12 19:13:20 +0100 |
commit | c8d1bf8aa18938a8372ac29fd9f8c91e7ece005b (patch) | |
tree | 667d6f99e426230c29787c2f8b675cec8cd80dd4 | |
parent | 7aee5de459f01223909334206a16e051e1c364d2 (diff) |
WIPpespin/ipa
Change-Id: Iacf12cbebde9e8cc33e0f9ebcd1f93238cd43802
-rw-r--r-- | src/osmo_ss7_as.c | 2 | ||||
-rw-r--r-- | src/xua_asp_fsm.c | 31 | ||||
-rw-r--r-- | src/xua_asp_fsm.h | 3 |
3 files changed, 31 insertions, 5 deletions
diff --git a/src/osmo_ss7_as.c b/src/osmo_ss7_as.c index 34baf52..9d78897 100644 --- a/src/osmo_ss7_as.c +++ b/src/osmo_ss7_as.c @@ -35,6 +35,7 @@ #include "ss7_internal.h" #include "xua_as_fsm.h" +#include "xua_asp_fsm.h" /*********************************************************************** * SS7 Application Server @@ -114,6 +115,7 @@ int osmo_ss7_as_add_asp(struct osmo_ss7_as *as, const char *asp_name) for (i = 0; i < ARRAY_SIZE(as->cfg.asps); i++) { if (!as->cfg.asps[i]) { as->cfg.asps[i] = asp; + osmo_fsm_inst_dispatch(asp->fi, XUA_ASP_E_AS_ASSIGNED, as); return 0; } } diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c index 6d81ce2..701e081 100644 --- a/src/xua_asp_fsm.c +++ b/src/xua_asp_fsm.c @@ -65,6 +65,8 @@ static const struct value_string xua_asp_event_names[] = { { XUA_ASP_E_ASPSM_BEAT, "ASPSM_BEAT" }, { XUA_ASP_E_ASPSM_BEAT_ACK, "ASPSM_BEAT_ACK" }, + { XUA_ASP_E_AS_ASSIGNED, "AS_ASSIGNED" }, + { IPA_ASP_E_ID_RESP, "IPA_CCM_ID_RESP" }, { IPA_ASP_E_ID_GET, "IPA_CCM_ID_GET" }, { IPA_ASP_E_ID_ACK, "IPA_CCM_ID_ACK" }, @@ -687,6 +689,9 @@ static void xua_asp_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *dat case XUA_ASP_E_ASPSM_BEAT_ACK: /* FIXME: stop timer, if any */ break; + case XUA_ASP_E_AS_ASSIGNED: + /* Ignore, only used in IPA asps so far. */ + break; default: break; } @@ -1058,6 +1063,7 @@ static void ipa_asp_fsm_inactive(struct osmo_fsm_inst *fi, uint32_t event, void static void ipa_asp_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct ipa_asp_fsm_priv *iafp = fi->priv; + struct osmo_ss7_as *as; int fd; switch (event) { @@ -1077,6 +1083,15 @@ static void ipa_asp_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *dat /* stop timer, if any */ osmo_timer_del(&iafp->pong_timer); break; + case XUA_ASP_E_AS_ASSIGNED: + as = data; + osmo_talloc_replace_string(iafp->ipa_unit, &iafp->ipa_unit->unit_name, as->cfg.name); + /* Now that the AS is known, start the client side: */ + if (iafp->role == OSMO_SS7_ASP_ROLE_ASP && fi->state == IPA_ASP_S_DOWN) { + LOGPFSML(fi, LOGL_NOTICE, "Bringing up ASP now once it has been assigned to an AS\n"); + osmo_fsm_inst_dispatch(fi, XUA_ASP_E_M_ASP_UP_REQ, NULL); + } + break; default: break; } @@ -1175,7 +1190,8 @@ struct osmo_fsm ipa_asp_fsm = { .allstate_event_mask = S(XUA_ASP_E_SCTP_COMM_DOWN_IND) | S(XUA_ASP_E_SCTP_RESTART_IND) | S(XUA_ASP_E_ASPSM_BEAT) | - S(XUA_ASP_E_ASPSM_BEAT_ACK), + S(XUA_ASP_E_ASPSM_BEAT_ACK) | + S(XUA_ASP_E_AS_ASSIGNED), .allstate_action = ipa_asp_allstate, }; @@ -1192,6 +1208,7 @@ static struct osmo_fsm_inst *ipa_asp_fsm_start(struct osmo_ss7_asp *asp, struct ipa_asp_fsm_priv *iafp; struct osmo_ss7_as *as = ipa_find_as_for_asp(asp); const char *unit_name; + bool can_start = true; /* allocate as child of AS? */ fi = osmo_fsm_inst_alloc(&ipa_asp_fsm, asp, NULL, log_level, asp->cfg.name); @@ -1209,9 +1226,13 @@ static struct osmo_fsm_inst *ipa_asp_fsm_start(struct osmo_ss7_asp *asp, "using ASP name instead of AS name as ipa_unit_name\n"); unit_name = asp->cfg.name; } else { - LOGPFSML(fi, LOGL_ERROR, "ASP is not assigned to any AS, fix your config!\n"); - osmo_fsm_inst_term(fi, OSMO_FSM_TERM_ERROR, NULL); - return NULL; + /* ASP in client mode will be brought up when this ASP is added + * to an AS, see XUA_ASP_E_AS_ASSIGNED. */ + if (role == OSMO_SS7_ASP_ROLE_ASP) { + LOGPFSML(fi, LOGL_NOTICE, "ASP is not assigned to any AS. ASP bring up delayed\n"); + can_start = false; + } + unit_name = asp->cfg.name; } iafp->role = role; @@ -1223,7 +1244,7 @@ static struct osmo_fsm_inst *ipa_asp_fsm_start(struct osmo_ss7_asp *asp, fi->priv = iafp; - if (role == OSMO_SS7_ASP_ROLE_ASP) + if (can_start && role == OSMO_SS7_ASP_ROLE_ASP) osmo_fsm_inst_dispatch(fi, XUA_ASP_E_M_ASP_UP_REQ, NULL); return fi; diff --git a/src/xua_asp_fsm.h b/src/xua_asp_fsm.h index 2b36220..ca44514 100644 --- a/src/xua_asp_fsm.h +++ b/src/xua_asp_fsm.h @@ -28,6 +28,9 @@ enum xua_asp_event { XUA_ASP_E_ASPSM_BEAT, XUA_ASP_E_ASPSM_BEAT_ACK, + /* The ASP was added to an AS. data: (struct osmo_ss7_as *) */ + XUA_ASP_E_AS_ASSIGNED, + /* IPA specific */ IPA_ASP_E_ID_RESP, IPA_ASP_E_ID_ACK, |