parent
7aee5de459
commit
c8d1bf8aa1
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue