aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-12-07 19:36:54 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2023-12-07 19:36:57 +0100
commit65741dca056e3a16973ad156dd4c09760a6a945b (patch)
tree2082d2dc8d2f3db250277d104ba8f3e9de9997be
parent04ca01eaeb28a32670aa23898bab5c2d186851af (diff)
ipa: Fix client setting unit_id with ASP name instead of AS
This was broken since ever. The client was submitting the ASP name in the unit_id field during IPA handshake, and the server was expecting it to contain the AS, so it failed with message: "Cannot find any definition for IPA Unit Name '%s'" in ipa_asp_fsm_wait_id_resp(). Fixes: 5f0a8df34cae20455a520c3a85cf94124f486bf2 Change-Id: I249964e171f578726439c40e01ae85aa447afada
-rw-r--r--src/ipa.c4
-rw-r--r--src/xua_asp_fsm.c8
-rw-r--r--src/xua_internal.h1
3 files changed, 10 insertions, 3 deletions
diff --git a/src/ipa.c b/src/ipa.c
index a77d331..82ece8b 100644
--- a/src/ipa.c
+++ b/src/ipa.c
@@ -131,7 +131,7 @@ static int ipa_rx_msg_ccm(struct osmo_ss7_asp *asp, struct msgb *msg)
return 0;
}
-static struct osmo_ss7_as *find_as_for_asp(struct osmo_ss7_asp *asp)
+struct osmo_ss7_as *ipa_find_as_for_asp(struct osmo_ss7_asp *asp)
{
struct osmo_ss7_as *as;
@@ -216,7 +216,7 @@ static int ipa_rx_msg_sccp(struct osmo_ss7_asp *asp, struct msgb *msg, uint8_t s
int rc;
struct m3ua_data_hdr data_hdr;
struct xua_msg *xua;
- struct osmo_ss7_as *as = find_as_for_asp(asp);
+ struct osmo_ss7_as *as = ipa_find_as_for_asp(asp);
uint32_t opc, dpc;
if (!as) {
diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c
index 2d81bc3..cc94ac7 100644
--- a/src/xua_asp_fsm.c
+++ b/src/xua_asp_fsm.c
@@ -1190,10 +1190,16 @@ 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);
/* 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);
@@ -1202,7 +1208,7 @@ static struct osmo_fsm_inst *ipa_asp_fsm_start(struct osmo_ss7_asp *asp,
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, asp->cfg.name);
+ iafp->ipa_unit->unit_name = talloc_strdup(iafp->ipa_unit, as->cfg.name);
iafp->pong_timer.cb = ipa_pong_timer_cb;
iafp->pong_timer.data = fi;
diff --git a/src/xua_internal.h b/src/xua_internal.h
index 93f6140..b6b33af 100644
--- a/src/xua_internal.h
+++ b/src/xua_internal.h
@@ -117,6 +117,7 @@ int xua_find_as_for_asp(struct osmo_ss7_as **as, const struct osmo_ss7_asp *asp,
int ipa_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua);
int ipa_rx_msg(struct osmo_ss7_asp *asp, struct msgb *msg, uint8_t sls);
+struct osmo_ss7_as *ipa_find_as_for_asp(struct osmo_ss7_asp *asp);
int osmo_isup_party_parse(char *out_digits, const uint8_t *in,
unsigned int in_num_bytes, bool odd);