<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13584">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fix inter-BSC-HO-incoming for AoIP (1/2)<br><br>Move the HO_ST_WAIT_MGW_ENDPOINT_TO_MSC state up to right after the lchan is<br>done establishing. For AoIP, the local RTP address towards the MSC already<br>needs to be known before the Handover Request Acknowledge is sent, so the AoIP<br>Transport Layer Address IE can be included. This patch only modifies the<br>handover FSM, a subsequent patch adds the IE.<br><br>Change-Id: I4a5acdb2d4a0b947cc0c62067a67be88a3d467ff<br>---<br>M include/osmocom/bsc/handover_fsm.h<br>M src/osmo-bsc/handover_fsm.c<br>2 files changed, 106 insertions(+), 85 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/84/13584/1</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 4db0890..7c2145e 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(120, 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(0, 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(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_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(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_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 421c32e..3b5a660 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(120, 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(0, 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,10 +876,24 @@</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(120, 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%);">-                ho_fsm_state_chg(HO_ST_WAIT_RR_HO_DETECT);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* - If the lchan is voiceless, no need to even think about the MGW.</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+            *   touching it.</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+               *   skip the part that would CRCX towards the MSC.</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+            * handover on AoIP. Otherwise go on to send a Handover Command and wait for the Detect.</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%);">+               && gscon_is_aoip(conn))</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_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>@@ -892,6 +906,76 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Only for voice, only for inter-BSC Handover into this BSC, and only for AoIP:</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 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(120, 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(120, 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(120, 100%, 40%);">+ * Request Acknowledge message.</span><br><span style="color: hsl(120, 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(120, 100%, 40%);">+ * Handover Request Acknowledge.)</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 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(120, 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(120, 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(120, 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(120, 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(120, 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(120, 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(120, 100%, 40%);">+ * decision for now is to leave it here.</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%);">+      const struct mgcp_conn_peer *mgw_info;</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+                /* Ensure the endpoint is really there, and log it. This state is only entered for AoIP connections, see</span><br><span style="color: hsl(120, 100%, 40%);">+               * ho_fsm_wait_lchan_active() above. */</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%);">+         ho_fsm_state_chg(HO_ST_WAIT_RR_HO_DETECT);</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 style="color: hsl(120, 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>@@ -1009,24 +1093,24 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void ho_fsm_post_lchan_established(struct osmo_fsm_inst *fi);</span><br><span style="color: hsl(0, 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_fsm_post_lchan_established(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+            ho_success();</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(120, 100%, 40%);">+    struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span style="color: hsl(120, 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_fsm_post_lchan_established(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+            ho_success();</span><br><span>                break;</span><br><span> </span><br><span>   default:</span><br><span>@@ -1034,69 +1118,6 @@</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void ho_fsm_post_lchan_established(struct osmo_fsm_inst *fi)</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 (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%);">-            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_success();</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_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%);">-        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%);">-          /* For AoIP, we created the MGW endpoint. Ensure it is really there, and log it. */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (gscon_is_aoip(conn)) {</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%);">-                  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%);">-           }</span><br><span style="color: hsl(0, 100%, 40%);">-               ho_success();</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> /* Inter-BSC OUT */</span><br><span> </span><br><span> static void handover_start_inter_bsc_out(struct gsm_subscriber_connection *conn,</span><br><span>@@ -1185,6 +1206,19 @@</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(120, 100%, 40%);">+                  | S(HO_ST_WAIT_MGW_ENDPOINT_TO_MSC)</span><br><span style="color: hsl(120, 100%, 40%);">+                   | S(HO_ST_WAIT_RR_HO_DETECT)</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%);">+    [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%);">+             .out_state_mask = 0</span><br><span>                  | S(HO_ST_WAIT_RR_HO_DETECT)</span><br><span>                         ,</span><br><span>    },</span><br><span>@@ -1222,20 +1256,7 @@</span><br><span>          .in_event_mask = 0</span><br><span>                   | S(HO_EV_LCHAN_ESTABLISHED)</span><br><span>                         ,</span><br><span style="color: hsl(0, 100%, 40%);">-               .out_state_mask = 0</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%);">-                     ,</span><br><span>    },</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%);">-       },</span><br><span style="color: hsl(0, 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/13584">change 13584</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/13584"/><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: I4a5acdb2d4a0b947cc0c62067a67be88a3d467ff </div>
<div style="display:none"> Gerrit-Change-Number: 13584 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>