<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11734">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">handover_fsm: send HANDOVER PERFORMED msg on internal ho<br><br>When an internal handover is done the specification demands to inform<br>the MSC about the event.<br><br>- Add sending of BSSMAP HANDOVER PERFORMED msg.<br><br>Change-Id: If26e5807280e0f75a423b3b04f8e3c698c82a351<br>Depends: libosmocore I825106858bd89afc9837811b8fed2e8accc82441<br>Related: OS#3645<br>---<br>M src/osmo-bsc/handover_fsm.c<br>M tests/handover/handover_test.c<br>2 files changed, 55 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/34/11734/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 0107ef0..e2b0f06 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -670,6 +670,55 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void send_handover_performed(struct gsm_subscriber_connection *conn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_lchan *lchan = conn->lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct handover *ho = &conn->ho;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_cell_global_id *cell;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm0808_handover_performed ho_perf_params;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm0808_speech_codec sc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     memset(&ho_perf_params, 0, sizeof(ho_perf_params));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Cause 3.2.2.5 */</span><br><span style="color: hsl(120, 100%, 40%);">+   ho_perf_params.cause = GSM0808_CAUSE_HANDOVER_SUCCESSFUL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Cell Identifier 3.2.2.17 */</span><br><span style="color: hsl(120, 100%, 40%);">+        cell = cgi_for_msc(conn->sccp.msc, conn_get_bts(conn));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!cell)</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(&ho_perf_params.cell, cell, sizeof(ho_perf_params.cell));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Chosen Channel 3.2.2.33 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ho_perf_params.chosen_channel = gsm0808_chosen_channel(lchan->type, lchan->tch_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!ho_perf_params.chosen_channel)</span><br><span style="color: hsl(120, 100%, 40%);">+           return;</span><br><span style="color: hsl(120, 100%, 40%);">+       ho_perf_params.chosen_channel_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Chosen Encryption Algorithm 3.2.2.44 */</span><br><span style="color: hsl(120, 100%, 40%);">+    ho_perf_params.chosen_encr_alg = lchan->encr.alg_id;</span><br><span style="color: hsl(120, 100%, 40%);">+       ho_perf_params.chosen_encr_alg_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ho->new_lchan->activate.requires_voice_stream) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Speech Version (chosen) 3.2.2.51 */</span><br><span style="color: hsl(120, 100%, 40%);">+                ho_perf_params.speech_version_chosen = gsm0808_permitted_speech(lchan->type, lchan->tch_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+          ho_perf_params.speech_version_chosen_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Speech Codec (chosen) 3.2.2.104 */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (gscon_is_aoip(conn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* Extrapolate speech codec from speech mode */</span><br><span style="color: hsl(120, 100%, 40%);">+                       gsm0808_speech_codec_from_chan_type(&sc, ho_perf_params.speech_version_chosen);</span><br><span style="color: hsl(120, 100%, 40%);">+                   sc.cfg = conn->assignment.req.s15_s0;</span><br><span style="color: hsl(120, 100%, 40%);">+                      memcpy(&ho_perf_params.speech_codec_chosen, &sc, sizeof(sc));</span><br><span style="color: hsl(120, 100%, 40%);">+                 ho_perf_params.speech_codec_chosen_present = true;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = gsm0808_create_handover_performed(&ho_perf_params);</span><br><span style="color: hsl(120, 100%, 40%);">+ gscon_sigtran_send(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Notify the handover decision algorithm of failure and clear out any handover state. */</span><br><span> void handover_end(struct gsm_subscriber_connection *conn, enum handover_result result)</span><br><span> {</span><br><span>@@ -738,6 +787,10 @@</span><br><span>       if (result == HO_RESULT_OK)</span><br><span>          conn->ho.created_ci_for_msc = NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* If the performed handover was an INTRA BSC HANDOVER, inform the MSC that a handover has happend */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (result == HO_RESULT_OK && (ho->scope & HO_INTRA_CELL || ho->scope & HO_INTRA_BSC))</span><br><span style="color: hsl(120, 100%, 40%);">+          send_handover_performed(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     hdc = handover_decision_callbacks_get(ho->from_hodec_id);</span><br><span>         if (hdc && hdc->on_handover_end)</span><br><span>          hdc->on_handover_end(conn, result);</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 7cb4086..c0a2833 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -219,6 +219,8 @@</span><br><span> void create_conn(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>  static struct bsc_msc_data fake_msc_data = {};</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_network fake_bsc_gsmnet = {};</span><br><span style="color: hsl(120, 100%, 40%);">+      fake_msc_data.network = &fake_bsc_gsmnet;</span><br><span>        static unsigned int next_imsi = 0;</span><br><span>   char imsi[sizeof(lchan->conn->bsub->imsi)];</span><br><span>         struct gsm_network *net = lchan->ts->trx->bts->network;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11734">change 11734</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/11734"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: If26e5807280e0f75a423b3b04f8e3c698c82a351 </div>
<div style="display:none"> Gerrit-Change-Number: 11734 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>