<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13559">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sgs_iface: detect and react to VLR/HLR failure<br><br>The HLR (which is connected via the GSUP interface) may fail and<br>disconnect. On the next location update the VLR will try to talk to the<br>HLR and fail. This failure event is not communicated towards the SGs<br>related code and the SGs-association will remain in the LA-PRESENT state<br>forever. Lets add code to report the problem to the SGs code and trigger<br>a RESET an the SGs interface.<br><br>- Add a flag to report an HLR problem back to the SGs code<br>- Fix the FSM that controls the reset<br>- Make sure the all SGs associations are reset when the failure occurs.<br><br>Change-Id: Icc7df92879728bc98c85fc1d5d8b4c6246501b12<br>Related: OS#3859<br>---<br>M include/osmocom/msc/vlr_sgs.h<br>M src/libmsc/sgs_iface.c<br>M src/libvlr/vlr.c<br>M src/libvlr/vlr_sgs_fsm.c<br>4 files changed, 50 insertions(+), 20 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/59/13559/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/vlr_sgs.h b/include/osmocom/msc/vlr_sgs.h</span><br><span>index cc07807..615b56c 100644</span><br><span>--- a/include/osmocom/msc/vlr_sgs.h</span><br><span>+++ b/include/osmocom/msc/vlr_sgs.h</span><br><span>@@ -72,6 +72,7 @@</span><br><span> /* This callback function is called when an SGs location update is complete */</span><br><span> struct sgs_lu_response {</span><br><span>     bool accepted;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool error;</span><br><span>  struct vlr_subscr *vsub;</span><br><span> };</span><br><span> typedef void (*vlr_sgs_lu_response_cb_t) (struct sgs_lu_response *response);</span><br><span>diff --git a/src/libmsc/sgs_iface.c b/src/libmsc/sgs_iface.c</span><br><span>index 450d552..6ee2075 100644</span><br><span>--- a/src/libmsc/sgs_iface.c</span><br><span>+++ b/src/libmsc/sgs_iface.c</span><br><span>@@ -369,15 +369,26 @@</span><br><span>  unsigned int new_id_len = 0;</span><br><span>         uint8_t resp_msg_type;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* Determine message type that is sent next (needed for logging) */</span><br><span>  if (response->accepted)</span><br><span>           resp_msg_type = SGSAP_MSGT_LOC_UPD_ACK;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if(response->error)</span><br><span style="color: hsl(120, 100%, 40%);">+           resp_msg_type = SGSAP_MSGT_RESET_IND;</span><br><span>        else</span><br><span>                 resp_msg_type = SGSAP_MSGT_LOC_UPD_REJ;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Determine MME */</span><br><span>  mme = sgs_mme_ctx_by_vsub(vsub, resp_msg_type);</span><br><span>      if (!mme)</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Handle error (HLR failure) */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (response->error) {</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_fsm_inst_dispatch(mme->fi, SGS_VLRR_E_START_RESET, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</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%);">+   /* Handle LU accept/reject */</span><br><span>        if (response->accepted) {</span><br><span>                 if (vsub->tmsi_new != GSM_RESERVED_TMSI) {</span><br><span>                        new_id_len = gsm48_generate_mid_from_tmsi(new_id, vsub->tmsi_new);</span><br><span>@@ -1101,6 +1112,10 @@</span><br><span>               reset_params.vlr_name_present = true;</span><br><span>                reset_ind = gsm29118_create_reset_ind(&reset_params);</span><br><span>            sgs_tx(sgc, reset_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Perform a reset of the SGS FSM of all subscribers that are present in the VLR */</span><br><span style="color: hsl(120, 100%, 40%);">+           vlr_sgs_reset(gsm_network->vlr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                osmo_fsm_inst_state_chg(fi, SGS_VLRR_ST_WAIT_ACK, sgs->cfg.timer[SGS_STATE_TS11], 11);</span><br><span>            break;</span><br><span>       default:</span><br><span>@@ -1168,6 +1183,7 @@</span><br><span> static struct osmo_fsm sgs_vlr_reset_fsm = {</span><br><span>     .name = "SGs-VLR-RESET",</span><br><span>   .states = sgs_vlr_reset_fsm_states,</span><br><span style="color: hsl(120, 100%, 40%);">+   .num_states = ARRAY_SIZE(sgs_vlr_reset_fsm_states),</span><br><span>  .allstate_event_mask = S(SGS_VLRR_E_START_RESET),</span><br><span>    .allstate_action = sgs_vlr_reset_fsm_allstate,</span><br><span>       .timer_cb = sgs_vlr_reset_fsm_timer_cb,</span><br><span>diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c</span><br><span>index cd4209d..957b7e7 100644</span><br><span>--- a/src/libvlr/vlr.c</span><br><span>+++ b/src/libvlr/vlr.c</span><br><span>@@ -864,7 +864,7 @@</span><br><span> static int vlr_subscr_handle_lu_res(struct vlr_subscr *vsub,</span><br><span>                               const struct osmo_gsup_message *gsup)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct sgs_lu_response sgs_lu_response;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct sgs_lu_response sgs_lu_response = {0};</span><br><span>        bool sgs_lu_in_progress = false;</span><br><span> </span><br><span>         if (vsub->sgs_fsm->state == SGS_UE_ST_LA_UPD_PRES)</span><br><span>@@ -895,7 +895,7 @@</span><br><span> static int vlr_subscr_handle_lu_err(struct vlr_subscr *vsub,</span><br><span>                                   const struct osmo_gsup_message *gsup)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct sgs_lu_response sgs_lu_response;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct sgs_lu_response sgs_lu_response = {0};</span><br><span>        bool sgs_lu_in_progress = false;</span><br><span> </span><br><span>         if (vsub->sgs_fsm->state == SGS_UE_ST_LA_UPD_PRES)</span><br><span>diff --git a/src/libvlr/vlr_sgs_fsm.c b/src/libvlr/vlr_sgs_fsm.c</span><br><span>index ee1d748..053701e 100644</span><br><span>--- a/src/libvlr/vlr_sgs_fsm.c</span><br><span>+++ b/src/libvlr/vlr_sgs_fsm.c</span><br><span>@@ -47,24 +47,6 @@</span><br><span>   {0, NULL}</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Initiate location update and change to SGS_UE_ST_LA_UPD_PRES state */</span><br><span style="color: hsl(0, 100%, 40%);">-static void perform_lu(struct osmo_fsm_inst *fi)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct vlr_subscr *vsub = fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-  int rc;</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_chg(fi, SGS_UE_ST_LA_UPD_PRES, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-       vsub->ms_not_reachable_flag = false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Note: At the moment we allocate a new TMSI on each LU. */</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = vlr_subscr_alloc_tmsi(vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPFSML(fi, LOGL_ERROR, "(sub %s) VLR LU tmsi allocation failed\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = vlr_subscr_req_lu(vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPFSML(fi, LOGL_ERROR, "(sub %s) HLR LU request failed\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Send the SGs Association to NULL state immediately */</span><br><span> static void to_null(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span>@@ -84,6 +66,37 @@</span><br><span>               osmo_timer_del(&vsub->sgs.Ts5);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Initiate location update and change to SGS_UE_ST_LA_UPD_PRES state */</span><br><span style="color: hsl(120, 100%, 40%);">+static void perform_lu(struct osmo_fsm_inst *fi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct vlr_subscr *vsub = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct sgs_lu_response sgs_lu_response = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Note: At the moment we allocate a new TMSI on each LU. */</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = vlr_subscr_alloc_tmsi(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPFSML(fi, LOGL_ERROR, "(sub %s) VLR LU tmsi allocation failed\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+                goto error;</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%);">+   rc = vlr_subscr_req_lu(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPFSML(fi, LOGL_ERROR, "(sub %s) HLR LU request failed\n", vlr_subscr_name(vsub));</span><br><span style="color: hsl(120, 100%, 40%);">+                goto error;</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%);">+   osmo_fsm_inst_state_chg(fi, SGS_UE_ST_LA_UPD_PRES, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     vsub->ms_not_reachable_flag = false;</span><br><span style="color: hsl(120, 100%, 40%);">+       return;</span><br><span style="color: hsl(120, 100%, 40%);">+       </span><br><span style="color: hsl(120, 100%, 40%);">+error:</span><br><span style="color: hsl(120, 100%, 40%);">+      to_null(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+  sgs_lu_response.error = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ sgs_lu_response.vsub = vsub;</span><br><span style="color: hsl(120, 100%, 40%);">+  vsub->sgs.response_cb(&sgs_lu_response);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Respawn a pending paging (Timer is reset and a new paging request is sent) */</span><br><span> static void respawn_paging(struct vlr_subscr *vsub)</span><br><span> {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13559">change 13559</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/13559"/><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: Icc7df92879728bc98c85fc1d5d8b4c6246501b12 </div>
<div style="display:none"> Gerrit-Change-Number: 13559 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>