<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13706">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Revert "fix inter-BSC-HO-incoming for AoIP (1/2)"<br><br>This reverts commit 94c9324fe07cd0ba1277278270c8979d949e49ec.<br>Multiple ttcn3 handover tests were broken due to this commit. Let's<br>merge this once all the other commits pertaining to that fix can be<br>merged as well.<br><br>Fixes: OS#3942<br>Change-Id: I01d93778fb19c601c21f99ec4d2a3ab8a4a48f67<br>---<br>M include/osmocom/bsc/handover_fsm.h<br>M src/osmo-bsc/handover_fsm.c<br>2 files changed, 85 insertions(+), 106 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/handover_fsm.h b/include/osmocom/bsc/handover_fsm.h</span><br><span>index 7c2145e..4db0890 100644</span><br><span>--- a/include/osmocom/bsc/handover_fsm.h</span><br><span>+++ b/include/osmocom/bsc/handover_fsm.h</span><br><span>@@ -28,10 +28,10 @@</span><br><span>       HO_ST_NOT_STARTED,</span><br><span> </span><br><span>       HO_ST_WAIT_LCHAN_ACTIVE,</span><br><span style="color: hsl(0, 100%, 40%);">-        HO_ST_WAIT_MGW_ENDPOINT_TO_MSC,</span><br><span>      HO_ST_WAIT_RR_HO_DETECT,</span><br><span>     HO_ST_WAIT_RR_HO_COMPLETE,</span><br><span>   HO_ST_WAIT_LCHAN_ESTABLISHED,</span><br><span style="color: hsl(120, 100%, 40%);">+ HO_ST_WAIT_MGW_ENDPOINT_TO_MSC,</span><br><span> </span><br><span>  /* The inter-BSC Outgoing Handover FSM has completely separate states, but since it makes sense for it</span><br><span>        * to also live in conn->ho.fi, it should share the same event enum. From there it is merely</span><br><span>@@ -46,11 +46,11 @@</span><br><span>        HO_EV_LCHAN_ACTIVE,</span><br><span>  HO_EV_LCHAN_ESTABLISHED,</span><br><span>     HO_EV_LCHAN_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-      HO_EV_MSC_MGW_OK,</span><br><span style="color: hsl(0, 100%, 40%);">-       HO_EV_MSC_MGW_FAIL,</span><br><span>  HO_EV_RR_HO_DETECT,</span><br><span>  HO_EV_RR_HO_COMPLETE,</span><br><span>        HO_EV_RR_HO_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+     HO_EV_MSC_MGW_OK,</span><br><span style="color: hsl(120, 100%, 40%);">+     HO_EV_MSC_MGW_FAIL,</span><br><span>  HO_EV_CONN_RELEASING,</span><br><span> </span><br><span>    HO_OUT_EV_BSSMAP_HO_COMMAND,</span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 3b5a660..421c32e 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -161,10 +161,10 @@</span><br><span> </span><br><span> static const struct state_timeout ho_fsm_timeouts[32] = {</span><br><span>       [HO_ST_WAIT_LCHAN_ACTIVE] = { .T = 23042 },</span><br><span style="color: hsl(0, 100%, 40%);">-     [HO_ST_WAIT_MGW_ENDPOINT_TO_MSC] = { .T = 23042 },</span><br><span>   [HO_ST_WAIT_RR_HO_DETECT] = { .T = 23042 },</span><br><span>  [HO_ST_WAIT_RR_HO_COMPLETE] = { .T = 23042 },</span><br><span>        [HO_ST_WAIT_LCHAN_ESTABLISHED] = { .T = 23042 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [HO_ST_WAIT_MGW_ENDPOINT_TO_MSC] = { .T = 23042 },</span><br><span>   [HO_OUT_ST_WAIT_HO_COMMAND] = { .T = 7 },</span><br><span>    [HO_OUT_ST_WAIT_CLEAR] = { .T = 8 },</span><br><span> };</span><br><span>@@ -876,24 +876,10 @@</span><br><span> static void ho_fsm_wait_lchan_active(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>        struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-        struct handover *ho = &conn->ho;</span><br><span>      switch (event) {</span><br><span> </span><br><span>         case HO_EV_LCHAN_ACTIVE:</span><br><span style="color: hsl(0, 100%, 40%);">-                /* - If the lchan is voiceless, no need to even think about the MGW.</span><br><span style="color: hsl(0, 100%, 40%);">-             * - If this is an intra-BSC Handover, we already have an RTP stream towards the MSC and aren't</span><br><span style="color: hsl(0, 100%, 40%);">-              *   touching it.</span><br><span style="color: hsl(0, 100%, 40%);">-                * - If we're on SCCPlite, the MSC manages the MGW endpoint, all we do is the BTS side CI, so we can</span><br><span style="color: hsl(0, 100%, 40%);">-                 *   skip the part that would CRCX towards the MSC.</span><br><span style="color: hsl(0, 100%, 40%);">-              * So create an MSC side endpoint CI only if a voice lchan is established for an incoming inter-BSC</span><br><span style="color: hsl(0, 100%, 40%);">-              * handover on AoIP. Otherwise go on to send a Handover Command and wait for the Detect.</span><br><span style="color: hsl(0, 100%, 40%);">-                 */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (ho->new_lchan->activate.info.requires_voice_stream</span><br><span style="color: hsl(0, 100%, 40%);">-                && (ho->scope & HO_INTER_BSC_IN)</span><br><span style="color: hsl(0, 100%, 40%);">-                 && gscon_is_aoip(conn))</span><br><span style="color: hsl(0, 100%, 40%);">-                     ho_fsm_state_chg(HO_ST_WAIT_MGW_ENDPOINT_TO_MSC);</span><br><span style="color: hsl(0, 100%, 40%);">-               else</span><br><span style="color: hsl(0, 100%, 40%);">-                    ho_fsm_state_chg(HO_ST_WAIT_RR_HO_DETECT);</span><br><span style="color: hsl(120, 100%, 40%);">+            ho_fsm_state_chg(HO_ST_WAIT_RR_HO_DETECT);</span><br><span>           return;</span><br><span> </span><br><span>  case HO_EV_LCHAN_ERROR:</span><br><span>@@ -906,76 +892,6 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Only for voice, only for inter-BSC Handover into this BSC, and only for AoIP:</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Establish the MGW endpoint CI that points towards the MSC. This needs to happen after the lchan (lchan_rtp_fsm) has</span><br><span style="color: hsl(0, 100%, 40%);">- * created an MGW endpoint with the first CRCX, so that an endpoint is available, and before sending the Handover</span><br><span style="color: hsl(0, 100%, 40%);">- * Request Acknowledge, so that the RTP address and port established towards the MSC can be included in the Handover</span><br><span style="color: hsl(0, 100%, 40%);">- * Request Acknowledge message.</span><br><span style="color: hsl(0, 100%, 40%);">- * (For SCCPlite, the MSC manages the CN side endpoint CI itself, and we don't need to send any RTP address in the</span><br><span style="color: hsl(0, 100%, 40%);">- * Handover Request Acknowledge.)</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * Actually, it should be possible to kick this off even above in handover_start_inter_bsc_in(), to do the CRCX towards</span><br><span style="color: hsl(0, 100%, 40%);">- * the MSC at the same time as establishing the lchan. The gscon_ensure_mgw_endpoint() doesn't care which one of</span><br><span style="color: hsl(0, 100%, 40%);">- * lchan_rtp_fsm or handover_start_inter_bsc_in() calls it first. The benefit would be that we'd send out the Handover</span><br><span style="color: hsl(0, 100%, 40%);">- * Command ever so slightly sooner -- which isn't critical really, because a) how long does a CRCX take, milliseconds?</span><br><span style="color: hsl(0, 100%, 40%);">- * and b) the time critical part is *after* the Handover Command was kicked off to keep the transition between cells as</span><br><span style="color: hsl(0, 100%, 40%);">- * short as possible. The drawback of doing this earlier is code complexity: receiving the HO_EV_MSC_MGW_OK /</span><br><span style="color: hsl(0, 100%, 40%);">- * HO_EV_MSC_MGW_FAIL events would need to be juggled in between the HO_EV_LCHAN_ACTIVE / HO_EV_LCHAN_ERROR. So the</span><br><span style="color: hsl(0, 100%, 40%);">- * decision for now is to leave it here.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-static void ho_fsm_wait_mgw_endpoint_to_msc_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-        struct handover *ho = &conn->ho;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!gscon_connect_mgw_to_msc(conn,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   ho->new_lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-                               ho->inter_bsc_in.msc_assigned_rtp_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      ho->inter_bsc_in.msc_assigned_rtp_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      fi,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     HO_EV_MSC_MGW_OK,</span><br><span style="color: hsl(0, 100%, 40%);">-                               HO_EV_MSC_MGW_FAIL,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     NULL,</span><br><span style="color: hsl(0, 100%, 40%);">-                                   &ho->created_ci_for_msc)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ho_fail(HO_RESULT_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                        "Unable to connect MGW endpoint to the MSC side");</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void ho_fsm_wait_mgw_endpoint_to_msc(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct mgcp_conn_peer *mgw_info;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (event) {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        case HO_EV_MSC_MGW_OK:</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Ensure the endpoint is really there, and log it. This state is only entered for AoIP connections, see</span><br><span style="color: hsl(0, 100%, 40%);">-                 * ho_fsm_wait_lchan_active() above. */</span><br><span style="color: hsl(0, 100%, 40%);">-         mgw_info = mgwep_ci_get_rtp_info(conn->user_plane.mgw_endpoint_ci_msc);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!mgw_info) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        ho_fail(HO_RESULT_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                                "Unable to retrieve RTP port info allocated by MGW for"</span><br><span style="color: hsl(0, 100%, 40%);">-                               " the MSC side.");</span><br><span style="color: hsl(0, 100%, 40%);">-                    return;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-               LOG_HO(conn, LOGL_DEBUG, "MGW's MSC side CI: %s:%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   mgw_info->addr, mgw_info->port);</span><br><span style="color: hsl(0, 100%, 40%);">-           ho_fsm_state_chg(HO_ST_WAIT_RR_HO_DETECT);</span><br><span style="color: hsl(0, 100%, 40%);">-              return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- case HO_EV_MSC_MGW_FAIL:</span><br><span style="color: hsl(0, 100%, 40%);">-                ho_fail(HO_RESULT_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                        "Unable to connect MGW endpoint to the MSC side");</span><br><span style="color: hsl(0, 100%, 40%);">-            return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(false);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void ho_fsm_wait_rr_ho_detect_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span>       int rc;</span><br><span>@@ -1093,24 +1009,24 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void ho_fsm_post_lchan_established(struct osmo_fsm_inst *fi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void ho_fsm_wait_lchan_established_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span>  struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span> </span><br><span>         if (conn->ho.fi && lchan_state_is(conn->ho.new_lchan, LCHAN_ST_ESTABLISHED)) {</span><br><span>                 LOG_HO(conn, LOGL_DEBUG, "lchan already established earlier\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              ho_success();</span><br><span style="color: hsl(120, 100%, 40%);">+         ho_fsm_post_lchan_established(fi);</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span> static void ho_fsm_wait_lchan_established(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     switch (event) {</span><br><span> </span><br><span>         case HO_EV_LCHAN_ESTABLISHED:</span><br><span style="color: hsl(0, 100%, 40%);">-           ho_success();</span><br><span style="color: hsl(120, 100%, 40%);">+         ho_fsm_post_lchan_established(fi);</span><br><span>           break;</span><br><span> </span><br><span>   default:</span><br><span>@@ -1118,6 +1034,69 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void ho_fsm_post_lchan_established(struct osmo_fsm_inst *fi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct handover *ho = &conn->ho;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ho->new_lchan->activate.info.requires_voice_stream</span><br><span style="color: hsl(120, 100%, 40%);">+      && (ho->scope & HO_INTER_BSC_IN))</span><br><span style="color: hsl(120, 100%, 40%);">+          ho_fsm_state_chg(HO_ST_WAIT_MGW_ENDPOINT_TO_MSC);</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          ho_success();</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%);">+static void ho_fsm_wait_mgw_endpoint_to_msc_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct handover *ho = &conn->ho;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!gscon_connect_mgw_to_msc(conn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 ho->new_lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     ho->inter_bsc_in.msc_assigned_rtp_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ho->inter_bsc_in.msc_assigned_rtp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    fi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   HO_EV_MSC_MGW_OK,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     HO_EV_MSC_MGW_FAIL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 &ho->created_ci_for_msc)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ho_fail(HO_RESULT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "Unable to connect MGW endpoint to the MSC side");</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%);">+static void ho_fsm_wait_mgw_endpoint_to_msc(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    case HO_EV_MSC_MGW_OK:</span><br><span style="color: hsl(120, 100%, 40%);">+                /* For AoIP, we created the MGW endpoint. Ensure it is really there, and log it. */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (gscon_is_aoip(conn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    const struct mgcp_conn_peer *mgw_info;</span><br><span style="color: hsl(120, 100%, 40%);">+                        mgw_info = mgwep_ci_get_rtp_info(conn->user_plane.mgw_endpoint_ci_msc);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (!mgw_info) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              ho_fail(HO_RESULT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "Unable to retrieve RTP port info allocated by MGW for"</span><br><span style="color: hsl(120, 100%, 40%);">+                                     " the MSC side.");</span><br><span style="color: hsl(120, 100%, 40%);">+                          return;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOG_HO(conn, LOGL_DEBUG, "MGW's MSC side CI: %s:%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         mgw_info->addr, mgw_info->port);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             ho_success();</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     case HO_EV_MSC_MGW_FAIL:</span><br><span style="color: hsl(120, 100%, 40%);">+              ho_fail(HO_RESULT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "Unable to connect MGW endpoint to the MSC side");</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(false);</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> /* Inter-BSC OUT */</span><br><span> </span><br><span> static void handover_start_inter_bsc_out(struct gsm_subscriber_connection *conn,</span><br><span>@@ -1206,19 +1185,6 @@</span><br><span>                       ,</span><br><span>            .out_state_mask = 0</span><br><span>                  | S(HO_ST_WAIT_LCHAN_ACTIVE)</span><br><span style="color: hsl(0, 100%, 40%);">-                    | S(HO_ST_WAIT_MGW_ENDPOINT_TO_MSC)</span><br><span style="color: hsl(0, 100%, 40%);">-                     | S(HO_ST_WAIT_RR_HO_DETECT)</span><br><span style="color: hsl(0, 100%, 40%);">-                    ,</span><br><span style="color: hsl(0, 100%, 40%);">-       },</span><br><span style="color: hsl(0, 100%, 40%);">-      [HO_ST_WAIT_MGW_ENDPOINT_TO_MSC] = {</span><br><span style="color: hsl(0, 100%, 40%);">-            .name = "WAIT_MGW_ENDPOINT_TO_MSC",</span><br><span style="color: hsl(0, 100%, 40%);">-           .onenter = ho_fsm_wait_mgw_endpoint_to_msc_onenter,</span><br><span style="color: hsl(0, 100%, 40%);">-             .action = ho_fsm_wait_mgw_endpoint_to_msc,</span><br><span style="color: hsl(0, 100%, 40%);">-              .in_event_mask = 0</span><br><span style="color: hsl(0, 100%, 40%);">-                      | S(HO_EV_MSC_MGW_OK)</span><br><span style="color: hsl(0, 100%, 40%);">-                   | S(HO_EV_MSC_MGW_FAIL)</span><br><span style="color: hsl(0, 100%, 40%);">-                 ,</span><br><span style="color: hsl(0, 100%, 40%);">-               .out_state_mask = 0</span><br><span>                  | S(HO_ST_WAIT_RR_HO_DETECT)</span><br><span>                         ,</span><br><span>    },</span><br><span>@@ -1256,7 +1222,20 @@</span><br><span>          .in_event_mask = 0</span><br><span>                   | S(HO_EV_LCHAN_ESTABLISHED)</span><br><span>                         ,</span><br><span style="color: hsl(120, 100%, 40%);">+             .out_state_mask = 0</span><br><span style="color: hsl(120, 100%, 40%);">+                   | S(HO_ST_WAIT_MGW_ENDPOINT_TO_MSC)</span><br><span style="color: hsl(120, 100%, 40%);">+                   ,</span><br><span>    },</span><br><span style="color: hsl(120, 100%, 40%);">+    [HO_ST_WAIT_MGW_ENDPOINT_TO_MSC] = {</span><br><span style="color: hsl(120, 100%, 40%);">+          .name = "WAIT_MGW_ENDPOINT_TO_MSC",</span><br><span style="color: hsl(120, 100%, 40%);">+         .onenter = ho_fsm_wait_mgw_endpoint_to_msc_onenter,</span><br><span style="color: hsl(120, 100%, 40%);">+           .action = ho_fsm_wait_mgw_endpoint_to_msc,</span><br><span style="color: hsl(120, 100%, 40%);">+            .in_event_mask = 0</span><br><span style="color: hsl(120, 100%, 40%);">+                    | S(HO_EV_MSC_MGW_OK)</span><br><span style="color: hsl(120, 100%, 40%);">+                 | S(HO_EV_MSC_MGW_FAIL)</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>         [HO_OUT_ST_WAIT_HO_COMMAND] = {</span><br><span>              .name = "inter-BSC-OUT:WAIT_HO_COMMAND",</span><br><span>           .action = ho_out_fsm_wait_ho_command,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13706">change 13706</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/13706"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I01d93778fb19c601c21f99ec4d2a3ab8a4a48f67 </div>
<div style="display:none"> Gerrit-Change-Number: 13706 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Daniel Willmann <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Daniel Willmann <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>