Harald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/11734 )
Change subject: handover_fsm: send HANDOVER PERFORMED msg on internal ho ...................................................................... handover_fsm: send HANDOVER PERFORMED msg on internal ho When an internal handover is done the specification demands to inform the MSC about the event. - Add sending of BSSMAP HANDOVER PERFORMED msg. Change-Id: If26e5807280e0f75a423b3b04f8e3c698c82a351 Depends: libosmocore I825106858bd89afc9837811b8fed2e8accc82441 Related: OS#3645 --- M src/osmo-bsc/handover_fsm.c M tests/handover/handover_test.c 2 files changed, 69 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified Harald Welte: Looks good to me, approved diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c index f2836cf..aae50b9 100644 --- a/src/osmo-bsc/handover_fsm.c +++ b/src/osmo-bsc/handover_fsm.c @@ -670,6 +670,70 @@ } } +static void send_handover_performed(struct gsm_subscriber_connection *conn) +{ + struct gsm_lchan *lchan = conn->lchan; + struct handover *ho = &conn->ho; + struct osmo_cell_global_id *cell; + struct gsm0808_handover_performed ho_perf_params = {}; + struct msgb *msg; + struct gsm0808_speech_codec sc; + int rc; + + /* Cause 3.2.2.5 */ + ho_perf_params.cause = GSM0808_CAUSE_HANDOVER_SUCCESSFUL; + + /* Cell Identifier 3.2.2.17 */ + cell = cgi_for_msc(conn->sccp.msc, conn_get_bts(conn)); + if (!cell) { + LOG_HO(conn, LOGL_ERROR, "Failed to generate Cell Identifier IE, can't send HANDOVER PERFORMED!\n"); + return; + } + ho_perf_params.cell_id = (struct gsm0808_cell_id){ + .id_discr = CELL_IDENT_WHOLE_GLOBAL, + .id.global = *cell + }; + + /* Chosen Channel 3.2.2.33 */ + ho_perf_params.chosen_channel = gsm0808_chosen_channel(lchan->type, lchan->tch_mode); + if (!ho_perf_params.chosen_channel) { + LOG_HO(conn, LOGL_ERROR, "Failed to generate Chosen Channel IE, can't send HANDOVER PERFORMED!\n"); + return; + } + ho_perf_params.chosen_channel_present = true; + + /* Chosen Encryption Algorithm 3.2.2.44 */ + ho_perf_params.chosen_encr_alg = lchan->encr.alg_id; + ho_perf_params.chosen_encr_alg_present = true; + + if (ho->new_lchan->activate.requires_voice_stream) { + /* Speech Version (chosen) 3.2.2.51 */ + ho_perf_params.speech_version_chosen = gsm0808_permitted_speech(lchan->type, lchan->tch_mode); + ho_perf_params.speech_version_chosen_present = true; + + /* Speech Codec (chosen) 3.2.2.104 */ + if (gscon_is_aoip(conn)) { + /* Extrapolate speech codec from speech mode */ + gsm0808_speech_codec_from_chan_type(&sc, ho_perf_params.speech_version_chosen); + sc.cfg = conn->assignment.req.s15_s0; + memcpy(&ho_perf_params.speech_codec_chosen, &sc, sizeof(sc)); + ho_perf_params.speech_codec_chosen_present = true; + } + } + + msg = gsm0808_create_handover_performed(&ho_perf_params); + if (!msg) { + LOG_HO(conn, LOGL_ERROR, "Failed to generate message, can't send HANDOVER PERFORMED!\n"); + return; + } + + rc = gscon_sigtran_send(conn, msg); + if (rc < 0) { + LOG_HO(conn, LOGL_ERROR, "message sending failed, can't send HANDOVER PERFORMED!\n"); + return; + } +} + /* Notify the handover decision algorithm of failure and clear out any handover state. */ void handover_end(struct gsm_subscriber_connection *conn, enum handover_result result) { @@ -738,6 +802,10 @@ if (result == HO_RESULT_OK) conn->ho.created_ci_for_msc = NULL; + /* If the performed handover was an INTRA BSC HANDOVER, inform the MSC that a handover has happend */ + if (result == HO_RESULT_OK && ((ho->scope & HO_INTRA_CELL) || (ho->scope & HO_INTRA_BSC))) + send_handover_performed(conn); + hdc = handover_decision_callbacks_get(ho->from_hodec_id); if (hdc && hdc->on_handover_end) hdc->on_handover_end(conn, result); diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c index f728c5b..6217ca3 100644 --- a/tests/handover/handover_test.c +++ b/tests/handover/handover_test.c @@ -219,6 +219,7 @@ void create_conn(struct gsm_lchan *lchan) { static struct bsc_msc_data fake_msc_data = {}; + fake_msc_data.network = bsc_gsmnet; static unsigned int next_imsi = 0; char imsi[sizeof(lchan->conn->bsub->imsi)]; struct gsm_network *net = lchan->ts->trx->bts->network; -- To view, visit https://gerrit.osmocom.org/11734 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-MessageType: merged Gerrit-Change-Id: If26e5807280e0f75a423b3b04f8e3c698c82a351 Gerrit-Change-Number: 11734 Gerrit-PatchSet: 9 Gerrit-Owner: dexter <pma...@sysmocom.de> Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org> Gerrit-Reviewer: Jenkins Builder (1000002) Gerrit-Reviewer: Neels Hofmeyr <nhofm...@sysmocom.de> Gerrit-Reviewer: dexter <pma...@sysmocom.de> Gerrit-CC: Pau Espin Pedrol <pes...@sysmocom.de>