aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-12-12 17:31:38 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2023-12-12 19:18:27 +0100
commit57444690212b1576eaf0a7156448ba2d27c59050 (patch)
tree667d6f99e426230c29787c2f8b675cec8cd80dd4
parent59bab0187cab7fce52eb2a9fe484c598243a349e (diff)
ipa: Use ASP name as ipa_unit_name on dynamic ASPs
A recent patch fixed a long problem where the ASP name (instead of expected AS name) was used as ipa_unit_name in IPA based ASPs. For server side it doesn't matter much, sense anyway the ipa_unit_name is actually restored on the struct with what's received in IPA GET_RESP message (see ipa_asp_fsm_wait_id_resp()). So the fix was actually for the client side in the scenario where a non-dynamic ASP with an assigned AS was configured in the VTY. However, dynamic ASPs usually have no assigned AS (because in general it is really not created/configured, as the ASP is created on the flight). As a result, the recent patch (see "Fixes" below), broke dynamic ASPs case because from then one ipa_asp_fsm_start() would fail and terminate the FSM because ipa_find_as_for_asp() was returning NULL. So improve the recent patch by applying the previous logic for dynamic ASPs: * On the server side, it really doesn't matter since as mentioned, the field will be repopulated later on, but allows the code to avoid terminating the FSM and hence be brought up and be ready to receive clients. * On the client case, this is how dynamic IPA ASPs were ment to be used when they were introduced anyway (use ASP as ipa_unit_id, meaning "AS name" == "ASP name"). Furthermore, on the client side, the non-dynamic IPA ASPs need their bring up be delayed until assigned to an AS, because the AS name is sent in ipa_unit_name field in Tx IPA ID RESP. This usually happens at a later point than ASP (FSM) creation, because first the ASP object is created (through VTY or API) and then assigned to an AS through osmo_ss7_as_add_asp() usually from a later "asp" vty command in the "as" node. Fixes: 65741dca056e3a16973ad156dd4c09760a6a945b Change-Id: I0a741449450c998253b1e44a76a3b7fc224e0903 Related: SYS#5914
-rw-r--r--src/osmo_ss7_as.c2
-rw-r--r--src/xua_asp_fsm.c46
-rw-r--r--src/xua_asp_fsm.h3
3 files changed, 43 insertions, 8 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 cc9a13a..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,
};
@@ -1191,30 +1207,44 @@ static struct osmo_fsm_inst *ipa_asp_fsm_start(struct osmo_ss7_asp *asp,
struct osmo_fsm_inst *fi;
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);
- if (!as) {
- osmo_fsm_inst_term(fi, OSMO_FSM_TERM_ERROR, NULL);
- return NULL;
- }
-
iafp = talloc_zero(fi, struct ipa_asp_fsm_priv);
if (!iafp) {
osmo_fsm_inst_term(fi, OSMO_FSM_TERM_ERROR, NULL);
return NULL;
}
+
+ if (as) {
+ unit_name = as->cfg.name;
+ } else if (asp->dyn_allocated) {
+ LOGPFSML(fi, LOGL_INFO, "Dynamic ASP is not assigned to any AS, "
+ "using ASP name instead of AS name as ipa_unit_name\n");
+ unit_name = asp->cfg.name;
+ } else {
+ /* 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;
iafp->asp = asp;
iafp->ipa_unit = talloc_zero(iafp, struct ipaccess_unit);
- iafp->ipa_unit->unit_name = talloc_strdup(iafp->ipa_unit, as->cfg.name);
+ iafp->ipa_unit->unit_name = talloc_strdup(iafp->ipa_unit, unit_name);
iafp->pong_timer.cb = ipa_pong_timer_cb;
iafp->pong_timer.data = fi;
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,