<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/23734">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  dexter: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  laforge: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Send EUTRAN neighs based on whether Common Id msg contained Last used E-UTRAN PLMN ID<br><br>From 3GPP TS 48.008 sec 3.1.30 "Common ID":<br>"""<br>If the SCCP connection is established due to CSFB from E-UTRAN and the MSC supports<br>return to the last used PLMN after CS fallback, then it should send the COMMON ID message<br>to the BSS including the Last used E-UTRAN PLMN ID information element if available at<br>the MSC immediately following the successful SCCP connection setup.<br>"""<br><br>Furthermore, 3GPP TS 48.008 version 16.0.0 Release 16 "3.2.1.21 CLEAR COMMAND",<br>for field CSFB Indication, states:<br>"""<br>NOTE: This information element doesn't serve any useful purpose. MSCs should not send the<br>information element unless it is required by the recipients (due to the need to interwork<br>with older versions of the protocol). It is expected that in future versions of the present<br>document, this information element will be deleted from this message.<br>"""<br><br>Hence, build up the EUTRAN neighbor list based on whether we received<br>the Last E-UTRAN PLMN ID IE during Common Id. In the future, we should<br>probably filter the list while populating it based on the received IE.<br><br>This change will also allow reusing same mechanism for SRVCC<br>EUTRAN->GERAN support, where te Last E-UTRAN PLMN ID IE can be found<br>inside "Old BSS to New BSS information" IE in msg HANDOVER REQUEST.<br><br>Related: SYS#5337<br>Change-Id: I5d290ac55eca5adde1c33396422f4c10b83c03d5<br>---<br>M include/osmocom/bsc/bsc_subscr_conn_fsm.h<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/lchan_fsm.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/assignment_fsm.c<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/gsm_04_08_rr.c<br>M src/osmo-bsc/gsm_08_08.c<br>M src/osmo-bsc/handover_fsm.c<br>M src/osmo-bsc/lchan_fsm.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M tests/handover/handover_test.c<br>13 files changed, 76 insertions(+), 47 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bsc_subscr_conn_fsm.h b/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>index 142d535..a681bc4 100644</span><br><span>--- a/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>+++ b/include/osmocom/bsc/bsc_subscr_conn_fsm.h</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #include <osmocom/gsm/protocol/gsm_08_08.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> #include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "osmocom/bsc/gsm_data.h"</span><br><span> </span><br><span> #define BSUB_USE_CONN "conn"</span><br><span> </span><br><span>@@ -48,11 +49,6 @@</span><br><span>     GSCON_EV_LCS_LOC_REQ_END,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gscon_clear_cmd_data {</span><br><span style="color: hsl(0, 100%, 40%);">-        enum gsm0808_cause cause_0808;</span><br><span style="color: hsl(0, 100%, 40%);">-  bool is_csfb;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct gsm_subscriber_connection;</span><br><span> struct gsm_network;</span><br><span> struct msgb;</span><br><span>@@ -93,3 +89,10 @@</span><br><span> </span><br><span> bool gscon_is_aoip(struct gsm_subscriber_connection *conn);</span><br><span> bool gscon_is_sccplite(struct gsm_subscriber_connection *conn);</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%);">+static inline const struct osmo_plmn_id *gscon_last_eutran_plmn(const struct gsm_subscriber_connection *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return (conn && conn->last_eutran_plmn_valid) ?</span><br><span style="color: hsl(120, 100%, 40%);">+            &conn->last_eutran_plmn : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 2a9da26..448098b 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -334,6 +334,9 @@</span><br><span> </span><br><span>     struct gsm48_classmark3 cm3;</span><br><span>         bool cm3_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     bool last_eutran_plmn_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_plmn_id last_eutran_plmn;</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -614,6 +617,8 @@</span><br><span>            bool requested;</span><br><span>              bool do_rr_release;</span><br><span>          enum gsm48_rr_cause rr_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+         bool last_eutran_plmn_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct osmo_plmn_id last_eutran_plmn;</span><br><span> </span><br><span>            /* There is an RSL error cause of value 0, so we need a separate flag. */</span><br><span>            bool in_error;</span><br><span>@@ -623,9 +628,6 @@</span><br><span>                 /* If a release event is being handled, ignore other ricocheting release events until that</span><br><span>            * release handling has concluded. */</span><br><span>                bool in_release_handler;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                /* is this release at the end of a CSFB call? */</span><br><span style="color: hsl(0, 100%, 40%);">-                bool is_csfb;</span><br><span>        } release;</span><br><span> </span><br><span>       /* The logical channel type */</span><br><span>diff --git a/include/osmocom/bsc/lchan_fsm.h b/include/osmocom/bsc/lchan_fsm.h</span><br><span>index 9fe7db1..ded7f54 100644</span><br><span>--- a/include/osmocom/bsc/lchan_fsm.h</span><br><span>+++ b/include/osmocom/bsc/lchan_fsm.h</span><br><span>@@ -53,7 +53,8 @@</span><br><span> </span><br><span> void lchan_fsm_alloc(struct gsm_lchan *lchan);</span><br><span> void lchan_release(struct gsm_lchan *lchan, bool do_rr_release,</span><br><span style="color: hsl(0, 100%, 40%);">-               bool err, enum gsm48_rr_cause cause_rr);</span><br><span style="color: hsl(120, 100%, 40%);">+              bool err, enum gsm48_rr_cause cause_rr,</span><br><span style="color: hsl(120, 100%, 40%);">+               const struct osmo_plmn_id *last_eutran_plmn);</span><br><span> </span><br><span> void lchan_activate(struct gsm_lchan *lchan, struct lchan_activate_info *info);</span><br><span> void lchan_ready_to_switch_rtp(struct gsm_lchan *lchan);</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index 6445b6d..20fb759 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -998,7 +998,7 @@</span><br><span>    * the connection will presumably be torn down and lead to an lchan release. During initial</span><br><span>   * Channel Request from the MS, an lchan has no conn yet, so in that case release now. */</span><br><span>    if (!lchan->conn)</span><br><span style="color: hsl(0, 100%, 40%);">-            lchan_release(lchan, false, true, *cause_p);</span><br><span style="color: hsl(120, 100%, 40%);">+          lchan_release(lchan, false, true, *cause_p, NULL);</span><br><span>   else</span><br><span>                 osmo_fsm_inst_dispatch(lchan->conn->fi, GSCON_EV_RSL_CONN_FAIL, (void*)cause_p);</span><br><span> </span><br><span>@@ -1672,7 +1672,8 @@</span><br><span>                   "CHAN RQD/EMERGENCY-PRIORITY: inducing termination of lchan %s (state:%s) in favor of incoming EMERGENCY CALL!\n",</span><br><span>                         gsm_lchan_name(rqd->release_lchan), osmo_fsm_inst_state_name(rqd->release_lchan->fi));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             lchan_release(rqd->release_lchan, !!(rqd->release_lchan->conn), true, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan_release(rqd->release_lchan, !!(rqd->release_lchan->conn), true, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           gscon_last_eutran_plmn(rqd->release_lchan->conn));</span><br><span>       } else {</span><br><span>             /* BTS is shutting down, give up... */</span><br><span>               if (rqd->release_lchan->ts->fi->state == TS_ST_NOT_INITIALIZED)</span><br><span>diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c</span><br><span>index 2f241e3..faaec53 100644</span><br><span>--- a/src/osmo-bsc/assignment_fsm.c</span><br><span>+++ b/src/osmo-bsc/assignment_fsm.c</span><br><span>@@ -117,7 +117,7 @@</span><br><span>   if (conn->assignment.new_lchan) {</span><br><span>                 struct gsm_lchan *lchan = conn->assignment.new_lchan;</span><br><span>             conn->assignment.new_lchan = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-           lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>     }</span><br><span> </span><br><span>        if (conn->assignment.created_ci_for_msc) {</span><br><span>@@ -262,7 +262,8 @@</span><br><span>  if (!conn->assignment.fi) {</span><br><span>               /* The lchan was ready, and we failed to tell the MSC about it. By releasing this lchan,</span><br><span>              * the conn will notice that its primary lchan is gone and should clean itself up. */</span><br><span style="color: hsl(0, 100%, 40%);">-           lchan_release(conn->lchan, true, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan_release(conn->lchan, true, true, RSL_ERR_EQUIPMENT_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+                           gscon_last_eutran_plmn(conn));</span><br><span>                 return;</span><br><span>      }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index a0c53cb..f169c32 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -195,7 +195,8 @@</span><br><span>             conn->ho.new_lchan = NULL;</span><br><span>        if (conn->assignment.new_lchan == lchan)</span><br><span>          conn->assignment.new_lchan = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   lchan_release(lchan, do_rr_release, err, cause_rr);</span><br><span style="color: hsl(120, 100%, 40%);">+   lchan_release(lchan, do_rr_release, err, cause_rr,</span><br><span style="color: hsl(120, 100%, 40%);">+                  gscon_last_eutran_plmn(conn));</span><br><span> }</span><br><span> </span><br><span> void gscon_release_lchans(struct gsm_subscriber_connection *conn, bool do_rr_release, enum gsm48_rr_cause cause_rr)</span><br><span>@@ -808,7 +809,7 @@</span><br><span> static void gscon_fsm_allstate(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>      struct gsm_subscriber_connection *conn = fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-   const struct gscon_clear_cmd_data *ccd;</span><br><span style="color: hsl(120, 100%, 40%);">+       const enum gsm0808_cause *cause_0808;</span><br><span>        const struct tlv_parsed *tp;</span><br><span>         struct osmo_mobile_identity mi_imsi;</span><br><span> </span><br><span>@@ -826,14 +827,12 @@</span><br><span>                     osmo_fsm_inst_dispatch(conn->lcs.loc_req->fi, LCS_LOC_REQ_EV_CONN_CLEAR, NULL);</span><br><span> </span><br><span>            OSMO_ASSERT(data);</span><br><span style="color: hsl(0, 100%, 40%);">-              ccd = data;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (conn->lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-                     conn->lchan->release.is_csfb = ccd->is_csfb;</span><br><span style="color: hsl(120, 100%, 40%);">+         cause_0808 = data;</span><br><span>           /* MSC tells us to cleanly shut down */</span><br><span>              if (conn->fi->state != ST_CLEARING)</span><br><span>                    osmo_fsm_inst_state_chg(fi, ST_CLEARING, 60, -4);</span><br><span>            LOGPFSML(fi, LOGL_DEBUG, "Releasing all lchans (if any) after BSSMAP Clear Command\n");</span><br><span style="color: hsl(0, 100%, 40%);">-               gscon_release_lchans(conn, true, bsc_gsm48_rr_cause_from_gsm0808_cause(ccd->cause_0808));</span><br><span style="color: hsl(120, 100%, 40%);">+          gscon_release_lchans(conn, true, bsc_gsm48_rr_cause_from_gsm0808_cause(*cause_0808));</span><br><span>                /* FIXME: Release all terestrial resources in ST_CLEARING */</span><br><span>                 /* According to 3GPP 48.008 3.1.9.1. "The BSS need not wait for the radio channel</span><br><span>                * release to be completed or for the guard timer to expire before returning the</span><br><span>@@ -883,6 +882,12 @@</span><br><span>                      if (!conn->bsub->imsi[0])</span><br><span>                              bsc_subscr_set_imsi(conn->bsub, mi_imsi.imsi);</span><br><span>            }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (TLVP_PRESENT(tp, GSM0808_IE_LAST_USED_EUTRAN_PLMN_ID)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  conn->last_eutran_plmn_valid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_plmn_from_bcd(TLVP_VAL(tp, GSM0808_IE_LAST_USED_EUTRAN_PLMN_ID), &conn->last_eutran_plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGPFSML(fi, LOGL_DEBUG, "subscr comes from E-UTRAN PLMN %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                              osmo_plmn_name(&conn->last_eutran_plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            gscon_update_id(conn);</span><br><span>               break;</span><br><span>       default:</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 1d29f1b..3c60f5f 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -77,6 +77,7 @@</span><br><span> #include <osmocom/bsc/osmo_bsc.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/mgcp_client/mgcp_client_endpoint_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_subscr_conn_fsm.h></span><br><span> </span><br><span> #include <inttypes.h></span><br><span> </span><br><span>@@ -6111,7 +6112,8 @@</span><br><span>             }</span><br><span>            vty_out(vty, "%% Asking for release of %s in state %s%s", gsm_lchan_name(lchan),</span><br><span>                   osmo_fsm_inst_state_name(lchan->fi), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           lchan_release(lchan, !!(lchan->conn), false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan_release(lchan, !!(lchan->conn), false, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                          gscon_last_eutran_plmn(lchan->conn));</span><br><span>       }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>diff --git a/src/osmo-bsc/gsm_04_08_rr.c b/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>index 58913e2..5e9bc69 100644</span><br><span>--- a/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>+++ b/src/osmo-bsc/gsm_04_08_rr.c</span><br><span>@@ -313,10 +313,10 @@</span><br><span>         cause = msgb_put(msg, 1);</span><br><span>    cause[0] = lchan->release.rr_cause;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (lchan->release.is_csfb) {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (lchan->release.last_eutran_plmn_valid) {</span><br><span>              uint8_t buf[CELL_SEL_IND_AFTER_REL_MAX_BYTES];</span><br><span>               int len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+              /* FIXME: so far we assume all configured neigbhors match last_eutran_plmn */</span><br><span>                len = generate_cell_sel_ind_after_rel(buf, sizeof(buf), lchan->ts->trx->bts);</span><br><span>               if (len == 0) {</span><br><span>                      LOGPLCHAN(lchan, DRR, LOGL_NOTICE, "MSC indicated CSFB Fast Return, but "</span><br><span>@@ -996,13 +996,15 @@</span><br><span>                  if (msg->lchan->ts->trx->bts->si_common.rach_control.t2 & 0x4) {</span><br><span>                          LOG_LCHAN(msg->lchan, LOGL_NOTICE, "MS attempts EMERGENCY SETUP although EMERGENCY CALLS"</span><br><span>                                           " are not allowed in sysinfo (spec violation by MS!)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                         lchan_release(msg->lchan, true, true, GSM48_RR_CAUSE_PREMPTIVE_REL);</span><br><span style="color: hsl(120, 100%, 40%);">+                               lchan_release(msg->lchan, true, true, GSM48_RR_CAUSE_PREMPTIVE_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              gscon_last_eutran_plmn(msg->lchan->conn));</span><br><span>                               break;</span><br><span>                       }</span><br><span>                    if (!conn->sccp.msc->allow_emerg) {</span><br><span>                            LOG_LCHAN(msg->lchan, LOGL_NOTICE, "MS attempts EMERGENCY SETUP, but EMERGENCY CALLS are"</span><br><span>                                           " denied on this BSC (check BTS config!)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                             lchan_release(msg->lchan, true, true, GSM48_RR_CAUSE_PREMPTIVE_REL);</span><br><span style="color: hsl(120, 100%, 40%);">+                               lchan_release(msg->lchan, true, true, GSM48_RR_CAUSE_PREMPTIVE_REL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              gscon_last_eutran_plmn(msg->lchan->conn));</span><br><span>                               break;</span><br><span>                       }</span><br><span>            }</span><br><span>diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c</span><br><span>index 52a92c8..e943ec1 100644</span><br><span>--- a/src/osmo-bsc/gsm_08_08.c</span><br><span>+++ b/src/osmo-bsc/gsm_08_08.c</span><br><span>@@ -541,7 +541,8 @@</span><br><span> </span><br><span> early_exit:</span><br><span>      if (release_lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-              lchan_release(lchan, true, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan_release(lchan, true, true, RSL_ERR_EQUIPMENT_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+                            gscon_last_eutran_plmn(conn));</span><br><span>         log_set_context(LOG_CTX_BSC_SUBSCR, NULL);</span><br><span>   return rc;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 70e479f..f6dad9d 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -272,7 +272,8 @@</span><br><span>       struct osmo_mgcpc_ep_ci *ci;</span><br><span>         if (conn->ho.new_lchan)</span><br><span>           /* New lchan was activated but never passed to a conn */</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan_release(conn->ho.new_lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan_release(conn->ho.new_lchan, false, true, RSL_ERR_EQUIPMENT_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+                           NULL);</span><br><span> </span><br><span>     ci = conn->ho.created_ci_for_msc;</span><br><span>         if (ci) {</span><br><span>@@ -908,7 +909,8 @@</span><br><span>                              /* 3GPP TS 48.008 3.1.5.3.3 "Abnormal Conditions": if neither MS reports</span><br><span>                            * HO Failure nor the MSC sends a Clear Command, we should release the</span><br><span>                                * dedicated radio resources and send a Clear Request to the MSC. */</span><br><span style="color: hsl(0, 100%, 40%);">-                            lchan_release(conn->lchan, true, true, GSM48_RR_CAUSE_ABNORMAL_TIMER);</span><br><span style="color: hsl(120, 100%, 40%);">+                             lchan_release(conn->lchan, true, true, GSM48_RR_CAUSE_ABNORMAL_TIMER,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            gscon_last_eutran_plmn(conn));</span><br><span>                                 /* Once the channel release is through, the BSSMAP Clear will follow. */</span><br><span>                             break;</span><br><span>                       }</span><br><span>@@ -964,7 +966,7 @@</span><br><span>      /* Detach the new_lchan last, so we can still see it in above logging */</span><br><span>     if (ho->new_lchan) {</span><br><span>              /* Release new lchan, it didn't work out */</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan_release(ho->new_lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+         lchan_release(ho->new_lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>          ho->new_lchan = NULL;</span><br><span>     }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index 0e2eb82..d58aac5 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -165,14 +165,14 @@</span><br><span>                   LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for assignment succeeded, but lchan has no conn:"</span><br><span>                                " cannot trigger appropriate actions. Release.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            if (!lchan->conn->assignment.fi) {</span><br><span>                     LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for assignment succeeded, but lchan has no"</span><br><span>                              " assignment ongoing: cannot trigger appropriate actions. Release.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                     lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            osmo_fsm_inst_dispatch(lchan->conn->assignment.fi, ASSIGNMENT_EV_LCHAN_ESTABLISHED,</span><br><span>@@ -186,14 +186,14 @@</span><br><span>            if (!lchan->conn) {</span><br><span>                       LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for handover succeeded, but lchan has no conn\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                        lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            if (!lchan->conn->ho.fi) {</span><br><span>                     LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for handover succeeded, but lchan has no"</span><br><span>                                " handover ongoing\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                     lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            osmo_fsm_inst_dispatch(lchan->conn->ho.fi, HO_EV_LCHAN_ESTABLISHED, lchan);</span><br><span>@@ -793,14 +793,14 @@</span><br><span>                    LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for assignment succeeded, but lchan has no conn:"</span><br><span>                                " cannot trigger appropriate actions. Release.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            if (!lchan->conn->assignment.fi) {</span><br><span>                     LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for assignment succeeded, but lchan has no"</span><br><span>                              " assignment ongoing: cannot trigger appropriate actions. Release.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                     lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            /* After the Chan Activ Ack, the MS expects to receive an RR Assignment Command.</span><br><span>@@ -813,14 +813,14 @@</span><br><span>                     LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for handover succeeded, but lchan has no conn:"</span><br><span>                                  " cannot trigger appropriate actions. Release.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                 lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            if (!lchan->conn->ho.fi) {</span><br><span>                     LOG_LCHAN(lchan, LOGL_ERROR,</span><br><span>                                   "lchan activation for handover succeeded, but lchan has no"</span><br><span>                                " handover ongoing: cannot trigger appropriate actions. Release.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_release(lchan, false, true, RSL_ERR_EQUIPMENT_FAIL, NULL);</span><br><span>                     break;</span><br><span>               }</span><br><span>            /* After the Chan Activ Ack of the new lchan, send the MS an RR Handover Command on the</span><br><span>@@ -1589,7 +1589,8 @@</span><br><span> }</span><br><span> </span><br><span> void lchan_release(struct gsm_lchan *lchan, bool do_rr_release,</span><br><span style="color: hsl(0, 100%, 40%);">-                bool err, enum gsm48_rr_cause cause_rr)</span><br><span style="color: hsl(120, 100%, 40%);">+               bool err, enum gsm48_rr_cause cause_rr,</span><br><span style="color: hsl(120, 100%, 40%);">+               const struct osmo_plmn_id *last_eutran_plmn)</span><br><span> {</span><br><span>         if (!lchan || !lchan->fi)</span><br><span>                 return;</span><br><span>@@ -1603,6 +1604,10 @@</span><br><span>     lchan->release.in_error = err;</span><br><span>    lchan->release.do_rr_release = do_rr_release;</span><br><span>     lchan->release.rr_cause = cause_rr;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (last_eutran_plmn) {</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan->release.last_eutran_plmn_valid = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(&lchan->release.last_eutran_plmn, last_eutran_plmn, sizeof(*last_eutran_plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span>        /* States waiting for events will notice the desire to release when done waiting, so it is enough</span><br><span>     * to mark for release. */</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index b558fae..fc1484e 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -448,23 +448,27 @@</span><br><span>                             struct msgb *msg, unsigned int length)</span><br><span> {</span><br><span>       struct tlv_parsed tp;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gscon_clear_cmd_data ccd = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .is_csfb = false,</span><br><span style="color: hsl(0, 100%, 40%);">-       };</span><br><span style="color: hsl(120, 100%, 40%);">+    enum gsm0808_cause cause_0808;</span><br><span> </span><br><span>   tlv_parse(&tp, gsm0808_att_tlvdef(), msg->l4h + 1, length - 1, 0, 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        ccd.cause_0808 = gsm0808_get_cause(&tp);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ccd.cause_0808 < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+  cause_0808 = gsm0808_get_cause(&tp);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (cause_0808 < 0) {</span><br><span>             LOGPFSML(conn->fi, LOGL_ERROR, "Clear Command: Mandatory Cause IE not present.\n");</span><br><span>             /* Clear anyway, but without a proper cause. */</span><br><span style="color: hsl(0, 100%, 40%);">-         ccd.cause_0808 = GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE;</span><br><span style="color: hsl(120, 100%, 40%);">+               cause_0808 = GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE;</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (TLVP_PRESENT(&tp, GSM0808_IE_CSFB_INDICATION))</span><br><span style="color: hsl(0, 100%, 40%);">-          ccd.is_csfb = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (TLVP_PRESENT(&tp, GSM0808_IE_CSFB_INDICATION) &&</span><br><span style="color: hsl(120, 100%, 40%);">+          !conn->last_eutran_plmn_valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPFSML(conn->fi, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                     "Clear Command: CSFB Indication present, "</span><br><span style="color: hsl(120, 100%, 40%);">+                  "but subscriber has no Last Used E-UTRAN PLMN Id! "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "This probably means MSC doesn't support proper return "</span><br><span style="color: hsl(120, 100%, 40%);">+                        "to the last used PLMN after CS fallback.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CLEAR_CMD, &ccd);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CLEAR_CMD, &cause_0808);</span><br><span> </span><br><span>      return 0;</span><br><span> }</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 332c94c..917372b 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -449,7 +449,7 @@</span><br><span> </span><br><span> static void lchan_clear(struct gsm_lchan *lchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  lchan_release(lchan, true, false, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan_release(lchan, true, false, 0, NULL);</span><br><span>  lchan_release_ack(lchan);</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/23734">change 23734</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/c/osmo-bsc/+/23734"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I5d290ac55eca5adde1c33396422f4c10b83c03d5 </div>
<div style="display:none"> Gerrit-Change-Number: 23734 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>