SRVCC: Parse Last Used E-UTRAN PLMN Id in Handover Request
Whenever SRVCC EUTRAN->GERAN is performed by the CN, it will set the Last Used E-UTRAN PLMN Id in order for the BSS to inform the MS about EUTRAN neighbors once the call is over. The last part (sending EUTRAN neighs) is already implemented, since same thing is done as per CSFB. However, we lacked the first part, where the EUTRAN PLMN Id is recorded for later use. Actually, in both cases, we end up building the list of neighbors without taking into accound the PLMN value (hence no filtering of configured neighs), but it only sends such a list if any PLMN was stored there, which means this patch is still necessary for a quick fallback to 4G after the call is over. Related: SYS#5337 Depends: libosmocore.git Change-Id I0e55e947b6fef6dad0cf1a6c16b781bef4cc76c5 Change-Id: Ia5008f11a4c36ef8085a2037d4abddd131086e6e
This commit is contained in:
parent
8831160631
commit
b0b76af0c3
|
@ -8,3 +8,4 @@
|
|||
# If any interfaces have been removed or changed since the last public release: c:r:0.
|
||||
#library what description / commit summary line
|
||||
libosmocore >1.5.1 needs osmo_bts_features_name(), osmo_bts_features_desc()
|
||||
libosmogsm >1.5.1 enum entry GSM0808_FE_IE_LAST_USED_EUTRAN_PLMN_ID
|
||||
|
|
|
@ -202,6 +202,8 @@ struct handover_in_req {
|
|||
uint16_t msc_assigned_cic;
|
||||
char msc_assigned_rtp_addr[INET6_ADDRSTRLEN];
|
||||
uint16_t msc_assigned_rtp_port;
|
||||
bool last_eutran_plmn_valid;
|
||||
struct osmo_plmn_id last_eutran_plmn;
|
||||
};
|
||||
|
||||
struct handover {
|
||||
|
|
|
@ -417,6 +417,32 @@ static void handover_start_intra_bsc(struct gsm_subscriber_connection *conn)
|
|||
lchan_activate(ho->new_lchan, &info);
|
||||
}
|
||||
|
||||
/* 3GPP TS 48.008 § 3.2.2.58 Old BSS to New BSS Information */
|
||||
static void parse_old2new_bss_info(struct gsm_subscriber_connection *conn,
|
||||
const uint8_t* data, uint16_t len,
|
||||
struct handover_in_req *req)
|
||||
{
|
||||
/* § 3.2.2.58: Information contained here shall take precedence over
|
||||
duplicate information from Information Elements in the HANDOVER
|
||||
REQUEST as long as the coding is understood by the new BSS */
|
||||
/* § 3.2.2.58: <<Reception of an erroneous "Old BSS to New BSS
|
||||
information" shall not cause a rejection of the HANDOVER REQUEST
|
||||
message; the "Old BSS to New BSS information" information element
|
||||
shall be discarded and the handover resource allocation procedure
|
||||
shall continue>>. See also 3.1.19.7. */
|
||||
struct tlv_parsed tp;
|
||||
if (tlv_parse(&tp, &gsm0808_old_bss_to_new_bss_info_att_tlvdef, data, len, 0, 0) <= 0) {
|
||||
LOG_HO(conn, LOGL_NOTICE, "Failed to parse IE \"Old BSS to New BSS information\"\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (TLVP_VAL(&tp, GSM0808_FE_IE_LAST_USED_EUTRAN_PLMN_ID)) {
|
||||
req->last_eutran_plmn_valid = true;
|
||||
osmo_plmn_from_bcd(TLVP_VAL(&tp, GSM0808_FE_IE_LAST_USED_EUTRAN_PLMN_ID),
|
||||
&req->last_eutran_plmn);
|
||||
}
|
||||
}
|
||||
|
||||
/* 3GPP TS 48.008 § 3.2.1.8 Handover Request */
|
||||
static bool parse_ho_request(struct gsm_subscriber_connection *conn, const struct msgb *msg,
|
||||
struct handover_in_req *req)
|
||||
|
@ -557,6 +583,10 @@ static bool parse_ho_request(struct gsm_subscriber_connection *conn, const struc
|
|||
return false;
|
||||
}
|
||||
|
||||
if ((e = TLVP_GET(tp, GSM0808_IE_OLD_BSS_TO_NEW_BSS_INFORMATION))) {
|
||||
parse_old2new_bss_info(conn, e->val, e->len, req);
|
||||
}
|
||||
|
||||
/* A lot of IEs remain ignored... */
|
||||
|
||||
return true;
|
||||
|
@ -691,6 +721,12 @@ void handover_start_inter_bsc_in(struct gsm_subscriber_connection *conn,
|
|||
info.encr.key_len = req->ei.key_len;
|
||||
}
|
||||
|
||||
if (req->last_eutran_plmn_valid) {
|
||||
conn->last_eutran_plmn_valid = true;
|
||||
memcpy(&conn->last_eutran_plmn, &req->last_eutran_plmn,
|
||||
sizeof(conn->last_eutran_plmn));
|
||||
}
|
||||
|
||||
lchan_activate(ho->new_lchan, &info);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue