aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-12-12 18:35:49 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2023-12-12 19:13:20 +0100
commitc8d1bf8aa18938a8372ac29fd9f8c91e7ece005b (patch)
tree667d6f99e426230c29787c2f8b675cec8cd80dd4
parent7aee5de459f01223909334206a16e051e1c364d2 (diff)
-rw-r--r--src/osmo_ss7_as.c2
-rw-r--r--src/xua_asp_fsm.c31
-rw-r--r--src/xua_asp_fsm.h3
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,