diff options
author | Harald Welte <laforge@gnumonks.org> | 2019-02-03 12:11:12 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2019-02-05 16:04:35 +0100 |
commit | 963763dfec6843adef2bd61425192c39d14e3ba0 (patch) | |
tree | 766dab29918c861433dfec4dba2982d1ad2ed049 /src/osmo-bsc/osmo_bsc_bssap.c | |
parent | d6e57e347186f91e82788de1b87d05c704e26b35 (diff) |
Implement CSFB "Fast Return" Handling at RR RELEASE
When the MSC sends a BSSMAP CLEAR CMD containing a CSFB Indication IE,
it lets us know that the to-be-released connection related to a CSFB
call.
We as the BSC then subsequently should include the "Cell Selection
Indicator after release of all TCH and SDCCH" IE in the RR RELEASE
message sent to the MS/UE. This IE contains the LTE neighbor cells
that we're configured to broadcast in si2quater.
That in turn will make sure the MS/UE can return very quickly to
the LTE cell.
Closes: OS#3777
Change-Id: Ibfbb87e2e16b05032ad1cb91c11fad1b2f76d755
Requires: libosmocore Id4bd7f7543f5b0f4f6f876e283bd065039c37646
Requires: libosmocore I0e101af316438b56d63d43fc2cb16d7caf563d07
Requires: libosmocore I8980a6b6d1973b67a2d9ad411c878d956fb428d1
Diffstat (limited to 'src/osmo-bsc/osmo_bsc_bssap.c')
-rw-r--r-- | src/osmo-bsc/osmo_bsc_bssap.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c index f2ccf2cf1..ab7f79ce1 100644 --- a/src/osmo-bsc/osmo_bsc_bssap.c +++ b/src/osmo-bsc/osmo_bsc_bssap.c @@ -420,6 +420,23 @@ static int gsm0808_cipher_mode(struct gsm_subscriber_connection *conn, int ciphe return gsm48_send_rr_ciph_mode(conn->lchan, include_imeisv); } +static int bssmap_handle_clear_cmd(struct gsm_subscriber_connection *conn, + struct msgb *msg, unsigned int length) +{ + struct tlv_parsed tp; + bool is_csfb = false; + + tlv_parse(&tp, gsm0808_att_tlvdef(), msg->l4h + 1, length - 1, 0, 0); + + /* FIXME: Check for mandatory cause IE, and use that in RR RELEASE cause! */ + if (TLVP_PRESENT(&tp, GSM0808_IE_CSFB_INDICATION)) + is_csfb = true; + + osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CLEAR_CMD, &is_csfb); + + return 0; +} + /* * GSM 08.08 ยง 3.1.14 cipher mode handling. We will have to pick * the cipher to be used for this. In case we are already using @@ -867,7 +884,7 @@ static int bssmap_rcvmsg_dt1(struct gsm_subscriber_connection *conn, switch (msg->l4h[0]) { case BSS_MAP_MSG_CLEAR_CMD: - osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_A_CLEAR_CMD, msg); + ret = bssmap_handle_clear_cmd(conn, msg, length); break; case BSS_MAP_MSG_CIPHER_MODE_CMD: ret = bssmap_handle_cipher_mode(conn, msg, length); |