aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libmsc/gsm_04_08.c15
-rw-r--r--src/libvlr/vlr_access_req_fsm.c16
-rw-r--r--src/libvlr/vlr_lu_fsm.c3
3 files changed, 25 insertions, 9 deletions
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index 7fdd3f447..2955632f5 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -1804,12 +1804,22 @@ static void update_classmark(const struct gsm_classmark *src, struct gsm_classma
}
/* VLR informs us that the subscriber has been associated with a conn */
-static void msc_vlr_subscr_assoc(void *msc_conn_ref,
+static int msc_vlr_subscr_assoc(void *msc_conn_ref,
struct vlr_subscr *vsub)
{
struct ran_conn *conn = msc_conn_ref;
OSMO_ASSERT(vsub);
- OSMO_ASSERT(!conn->vsub);
+ if (conn->vsub) {
+ if (conn->vsub == vsub)
+ LOGPCONN(conn, LOGL_NOTICE, "msc_vlr_subscr_assoc(): conn already associated with %s\n",
+ vlr_subscr_name(vsub));
+ else {
+ LOGPCONN(conn, LOGL_ERROR, "msc_vlr_subscr_assoc(): conn already associated with a subscriber,"
+ " cannot associate with %s\n", vlr_subscr_name(vsub));
+ return -EINVAL;
+ }
+ }
+ OSMO_ASSERT(!conn->vsub || conn->vsub );
conn->vsub = vlr_subscr_get(vsub);
OSMO_ASSERT(conn->vsub);
conn->vsub->cs.attached_via_ran = conn->via_ran;
@@ -1820,6 +1830,7 @@ static void msc_vlr_subscr_assoc(void *msc_conn_ref,
update_classmark(&conn->temporary_classmark, &conn->vsub->classmark);
ran_conn_update_id(conn);
+ return 0;
}
static int msc_vlr_route_gsup_msg(struct vlr_subscr *vsub,
diff --git a/src/libvlr/vlr_access_req_fsm.c b/src/libvlr/vlr_access_req_fsm.c
index 3a0760d84..3b4028524 100644
--- a/src/libvlr/vlr_access_req_fsm.c
+++ b/src/libvlr/vlr_access_req_fsm.c
@@ -72,7 +72,7 @@ struct proc_arq_priv {
bool implicitly_accepted_parq_by_ciphering_cmd;
};
-static void assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub)
+static int assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub)
{
struct proc_arq_priv *par = fi->priv;
struct vlr_instance *vlr = par->vlr;
@@ -81,7 +81,7 @@ static void assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *v
par->vsub = vsub;
/* Tell MSC to associate this subscriber with the given
* connection */
- vlr->ops.subscr_assoc(par->msc_conn_ref, par->vsub);
+ return vlr->ops.subscr_assoc(par->msc_conn_ref, par->vsub);
}
static const char *vlr_proc_arq_result_name(const struct osmo_fsm_inst *fi)
@@ -371,8 +371,10 @@ static void proc_arq_vlr_fn_init(struct osmo_fsm_inst *fi,
GSM48_REJECT_NETWORK_FAILURE);
}
vsub->proc_arq_fsm = fi;
- assoc_par_with_subscr(fi, vsub);
- proc_arq_vlr_fn_post_imsi(fi);
+ if (assoc_par_with_subscr(fi, vsub) != 0)
+ proc_arq_fsm_done(fi, GSM48_REJECT_NETWORK_FAILURE);
+ else
+ proc_arq_vlr_fn_post_imsi(fi);
vlr_subscr_put(vsub);
return;
}
@@ -414,8 +416,10 @@ static void proc_arq_vlr_fn_w_obt_imsi(struct osmo_fsm_inst *fi,
proc_arq_fsm_done(fi, GSM48_REJECT_IMSI_UNKNOWN_IN_VLR);
return;
}
- assoc_par_with_subscr(fi, vsub);
- proc_arq_vlr_fn_post_imsi(fi);
+ if (assoc_par_with_subscr(fi, vsub))
+ proc_arq_fsm_done(fi, GSM48_REJECT_NETWORK_FAILURE);
+ else
+ proc_arq_vlr_fn_post_imsi(fi);
vlr_subscr_put(vsub);
}
diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c
index e635305fa..b00f8cef0 100644
--- a/src/libvlr/vlr_lu_fsm.c
+++ b/src/libvlr/vlr_lu_fsm.c
@@ -954,7 +954,8 @@ static int assoc_lfp_with_sub(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub)
lfp->vsub = vsub;
/* Tell MSC to associate this subscriber with the given
* connection */
- vlr->ops.subscr_assoc(lfp->msc_conn_ref, lfp->vsub);
+ if (vlr->ops.subscr_assoc(lfp->msc_conn_ref, lfp->vsub))
+ lu_fsm_failure(fi, GSM48_REJECT_NETWORK_FAILURE);
return 0;
}