Fill Last Used E-UTRAN PLMN Id when in CSFB

Since recently, osmo-bsc behaves strictly as per specs, meaning it will
only send the "Cell selection indicator after release of all TCH and SDCCH IE"
in RR Channel Release iff:
* "Last Used E-UTRAN PLMN Id" was received in the CommonID sent MSC->BSC
* "Last Used E-UTRAN PLMN Id" was received insider "old BSS to new BSS Information"
  in the HandoverRequest sent MSC->BSC.
On the other hand, CSFB_Indicator from ClearCommand MSC->BSC is nw
ignored and not taken into account.

Hence, let's update osmo-msc to also behave correctly by sending the
Last Used E-UTRAN PLMN ID at CommonID tx time to avoid regressions in
CSFB support when running against newer osmo-bsc.

Let's keep sending the CSFB Indicator in ClearCommand as we used too, in
order to keep compatibility with older BSCs (as per spec).

Related: SYS#5337
Change-Id: Ic5f175b179973d0a50d94f00e15f5a3e332605fc
diff --git a/include/osmocom/msc/ran_msg.h b/include/osmocom/msc/ran_msg.h
index 3b08b46..1303ba3 100644
--- a/include/osmocom/msc/ran_msg.h
+++ b/include/osmocom/msc/ran_msg.h
@@ -220,6 +220,8 @@
 		} cipher_mode_reject;
 		struct {
 			const char *imsi;
+			bool last_eutran_plmn_present;
+			struct osmo_plmn_id last_eutran_plmn;
 		} common_id;
 		struct {
 			enum gsm48_reject_value cause;
diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h
index 3b9bbc4..6e65283 100644
--- a/include/osmocom/msc/vlr.h
+++ b/include/osmocom/msc/vlr.h
@@ -193,6 +193,8 @@
 		vlr_sgs_lu_mminfo_cb_t mminfo_cb;
 		enum sgsap_service_ind paging_serv_ind;
 		struct osmo_timer_list Ts5;
+		bool last_eutran_plmn_present;
+		struct osmo_plmn_id last_eutran_plmn;
 	} sgs;
 
 	struct osmo_gsm48_classmark classmark;
@@ -398,6 +400,8 @@
 void vlr_subscr_set_imei(struct vlr_subscr *vsub, const char *imei);
 void vlr_subscr_set_imeisv(struct vlr_subscr *vsub, const char *imeisv);
 void vlr_subscr_set_msisdn(struct vlr_subscr *vsub, const char *msisdn);
+void vlr_subscr_set_last_used_eutran_plmn_id(struct vlr_subscr *vsub,
+					     const struct osmo_plmn_id *last_eutran_plmn);
 
 bool vlr_subscr_matches_imsi(struct vlr_subscr *vsub, const char *imsi);
 bool vlr_subscr_matches_tmsi(struct vlr_subscr *vsub, uint32_t tmsi);
diff --git a/include/osmocom/msc/vlr_sgs.h b/include/osmocom/msc/vlr_sgs.h
index fa9d948..1a4984d 100644
--- a/include/osmocom/msc/vlr_sgs.h
+++ b/include/osmocom/msc/vlr_sgs.h
@@ -97,7 +97,7 @@
 int vlr_sgs_loc_update(struct vlr_instance *vlr, struct vlr_sgs_cfg *cfg,
 		       vlr_sgs_lu_response_cb_t response_cb, vlr_sgs_lu_paging_cb_t paging_cb,
 		       vlr_sgs_lu_mminfo_cb_t mminfo_cb, char *mme_name, enum vlr_lu_type type, const char *imsi,
-		       struct osmo_location_area_id *new_lai);
+		       struct osmo_location_area_id *new_lai, struct osmo_plmn_id *last_eutran_plmn);
 void vlr_sgs_loc_update_acc_sent(struct vlr_subscr *vsub);
 void vlr_sgs_loc_update_rej_sent(struct vlr_subscr *vsub);
 void vlr_sgs_detach(struct vlr_instance *vlr, const char *imsi, bool eps);