diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2018-12-28 21:22:32 +0100 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2019-01-04 01:46:46 +0000 |
commit | 1035d90c1761d4ab94c998908a475a8dbc09b50c (patch) | |
tree | 0f2d22b8039c4a7bc1cfac1a9bba51bc9bf13d3c /src/libmsc/gsm_04_08.c | |
parent | 3350bf9f78253eb9f647c8377b6446a4fc7b26e8 (diff) |
fix vlr ops.subscr_assoc re-association
In rare cases, a conn is already associated with a subscriber. So far, we
abort()ed on that, bringing the entire osmo-msc down. Rather log an error and
keep the service running.
In vlr.ops.subscr_assoc, add success/failure return value, and abort the
LU/PARQ on error.
I haven't figured out in detail yet why/how a subscriber would re-launch a
LU/PARQ on a conn that is already associated, so far it is merely clear that we
do not want to crash the MSC if that happens. A log is in OS#3742.
Related: OS#3742, OS#3743
Change-Id: Ic0d54644bc735700220b1ef3a4384c217d57d20f
Diffstat (limited to 'src/libmsc/gsm_04_08.c')
-rw-r--r-- | src/libmsc/gsm_04_08.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c index b042baf71..81bda76ea 100644 --- a/src/libmsc/gsm_04_08.c +++ b/src/libmsc/gsm_04_08.c @@ -1764,12 +1764,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; + } + } + conn->vsub = vlr_subscr_get(vsub); OSMO_ASSERT(conn->vsub); conn->vsub->cs.attached_via_ran = conn->via_ran; @@ -1778,6 +1788,7 @@ static void msc_vlr_subscr_assoc(void *msc_conn_ref, * associated with the conn: merge the new Classmark into vsub->classmark. Don't overwrite valid * vsub->classmark with unset classmark, though. */ update_classmark(&conn->temporary_classmark, &conn->vsub->classmark); + return 0; } static int msc_vlr_route_gsup_msg(struct vlr_subscr *vsub, |