<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12449">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fix vlr ops.subscr_assoc re-association<br><br>In rare cases, a conn is already associated with a subscriber. So far, we<br>abort()ed on that, bringing the entire osmo-msc down. Rather log an error and<br>keep the service running.<br><br>In vlr.ops.subscr_assoc, add success/failure return value, and abort the<br>LU/PARQ on error.<br><br>I haven't figured out in detail yet why/how a subscriber would re-launch a<br>LU/PARQ on a conn that is already associated, so far it is merely clear that we<br>do not want to crash the MSC if that happens. A log is in OS#3742.<br><br>Related: OS#3742, OS#3743<br>Change-Id: Ic0d54644bc735700220b1ef3a4384c217d57d20f<br>---<br>M include/osmocom/msc/vlr.h<br>M src/libmsc/gsm_04_08.c<br>M src/libvlr/vlr_access_req_fsm.c<br>M src/libvlr/vlr_lu_fsm.c<br>4 files changed, 26 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/49/12449/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h</span><br><span>index 20a9c0f..3c778a9 100644</span><br><span>--- a/include/osmocom/msc/vlr.h</span><br><span>+++ b/include/osmocom/msc/vlr.h</span><br><span>@@ -235,7 +235,7 @@</span><br><span>     void (*subscr_update)(struct vlr_subscr *vsub);</span><br><span>      /* notify MSC/SGSN that the given subscriber has been associated</span><br><span>      * with this msc_conn_ref */</span><br><span style="color: hsl(0, 100%, 40%);">-    void (*subscr_assoc)(void *msc_conn_ref, struct vlr_subscr *vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+    int (*subscr_assoc)(void *msc_conn_ref, struct vlr_subscr *vsub);</span><br><span> </span><br><span>        /* Forward a parsed GSUP message towards MSC message router */</span><br><span>       int (*forward_gsup_msg)(struct vlr_subscr *vsub, struct osmo_gsup_message *gsup_msg);</span><br><span>diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c</span><br><span>index dc0476b..2d34949 100644</span><br><span>--- a/src/libmsc/gsm_04_08.c</span><br><span>+++ b/src/libmsc/gsm_04_08.c</span><br><span>@@ -1764,12 +1764,22 @@</span><br><span> }</span><br><span> </span><br><span> /* VLR informs us that the subscriber has been associated with a conn */</span><br><span style="color: hsl(0, 100%, 40%);">-static void msc_vlr_subscr_assoc(void *msc_conn_ref,</span><br><span style="color: hsl(120, 100%, 40%);">+static int msc_vlr_subscr_assoc(void *msc_conn_ref,</span><br><span>                            struct vlr_subscr *vsub)</span><br><span> {</span><br><span>       struct ran_conn *conn = msc_conn_ref;</span><br><span>        OSMO_ASSERT(vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(!conn->vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (conn->vsub) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (conn->vsub == vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGPCONN(conn, LOGL_NOTICE, "msc_vlr_subscr_assoc(): conn already associated with %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             vlr_subscr_name(vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+              else {</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPCONN(conn, LOGL_ERROR, "msc_vlr_subscr_assoc(): conn already associated with a subscriber,"</span><br><span style="color: hsl(120, 100%, 40%);">+                              " cannot associate with %s\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+                     return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  conn->vsub = vlr_subscr_get(vsub);</span><br><span>        OSMO_ASSERT(conn->vsub);</span><br><span>  conn->vsub->cs.attached_via_ran = conn->via_ran;</span><br><span>@@ -1778,6 +1788,7 @@</span><br><span>     * associated with the conn: merge the new Classmark into vsub->classmark. Don't overwrite valid</span><br><span>       * vsub->classmark with unset classmark, though. */</span><br><span>       update_classmark(&conn->temporary_classmark, &conn->vsub->classmark);</span><br><span style="color: hsl(120, 100%, 40%);">+        return 0;</span><br><span> }</span><br><span> </span><br><span> static int msc_vlr_route_gsup_msg(struct vlr_subscr *vsub,</span><br><span>diff --git a/src/libvlr/vlr_access_req_fsm.c b/src/libvlr/vlr_access_req_fsm.c</span><br><span>index 3a0760d..3b40285 100644</span><br><span>--- a/src/libvlr/vlr_access_req_fsm.c</span><br><span>+++ b/src/libvlr/vlr_access_req_fsm.c</span><br><span>@@ -72,7 +72,7 @@</span><br><span>        bool implicitly_accepted_parq_by_ciphering_cmd;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+static int assoc_par_with_subscr(struct osmo_fsm_inst *fi, struct vlr_subscr *vsub)</span><br><span> {</span><br><span>      struct proc_arq_priv *par = fi->priv;</span><br><span>     struct vlr_instance *vlr = par->vlr;</span><br><span>@@ -81,7 +81,7 @@</span><br><span>  par->vsub = vsub;</span><br><span>         /* Tell MSC to associate this subscriber with the given</span><br><span>       * connection */</span><br><span style="color: hsl(0, 100%, 40%);">-        vlr->ops.subscr_assoc(par->msc_conn_ref, par->vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ return vlr->ops.subscr_assoc(par->msc_conn_ref, par->vsub);</span><br><span> }</span><br><span> </span><br><span> static const char *vlr_proc_arq_result_name(const struct osmo_fsm_inst *fi)</span><br><span>@@ -371,8 +371,10 @@</span><br><span>                                    GSM48_REJECT_NETWORK_FAILURE);</span><br><span>             }</span><br><span>            vsub->proc_arq_fsm = fi;</span><br><span style="color: hsl(0, 100%, 40%);">-             assoc_par_with_subscr(fi, vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-                proc_arq_vlr_fn_post_imsi(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (assoc_par_with_subscr(fi, vsub) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                     proc_arq_fsm_done(fi, GSM48_REJECT_NETWORK_FAILURE);</span><br><span style="color: hsl(120, 100%, 40%);">+          else</span><br><span style="color: hsl(120, 100%, 40%);">+                  proc_arq_vlr_fn_post_imsi(fi);</span><br><span>               vlr_subscr_put(vsub);</span><br><span>                return;</span><br><span>      }</span><br><span>@@ -414,8 +416,10 @@</span><br><span>             proc_arq_fsm_done(fi, GSM48_REJECT_IMSI_UNKNOWN_IN_VLR);</span><br><span>             return;</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-       assoc_par_with_subscr(fi, vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-        proc_arq_vlr_fn_post_imsi(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (assoc_par_with_subscr(fi, vsub))</span><br><span style="color: hsl(120, 100%, 40%);">+          proc_arq_fsm_done(fi, GSM48_REJECT_NETWORK_FAILURE);</span><br><span style="color: hsl(120, 100%, 40%);">+  else</span><br><span style="color: hsl(120, 100%, 40%);">+          proc_arq_vlr_fn_post_imsi(fi);</span><br><span>       vlr_subscr_put(vsub);</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c</span><br><span>index e635305..b00f8ce 100644</span><br><span>--- a/src/libvlr/vlr_lu_fsm.c</span><br><span>+++ b/src/libvlr/vlr_lu_fsm.c</span><br><span>@@ -954,7 +954,8 @@</span><br><span>        lfp->vsub = vsub;</span><br><span>         /* Tell MSC to associate this subscriber with the given</span><br><span>       * connection */</span><br><span style="color: hsl(0, 100%, 40%);">-        vlr->ops.subscr_assoc(lfp->msc_conn_ref, lfp->vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vlr->ops.subscr_assoc(lfp->msc_conn_ref, lfp->vsub))</span><br><span style="color: hsl(120, 100%, 40%);">+             lu_fsm_failure(fi, GSM48_REJECT_NETWORK_FAILURE);</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12449">change 12449</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12449"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ic0d54644bc735700220b1ef3a4384c217d57d20f </div>
<div style="display:none"> Gerrit-Change-Number: 12449 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>