<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13797">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: I00c18b78573386145af71c4b39f7f22aec24579b<br>---<br>M include/osmocom/bsc/handover_fsm.h<br>M src/osmo-bsc/handover_fsm.c<br>2 files changed, 105 insertions(+), 86 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/97/13797/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 0d1449f..6a07fbe 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -162,10 +162,10 @@</span><br><span> </span><br><span> static const struct osmo_tdef_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>@@ -877,10 +877,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>@@ -893,6 +907,75 @@</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 = osmo_mgcpc_ep_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> 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>@@ -1010,24 +1093,23 @@</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(0, 100%, 40%);">- switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_subscriber_connection *conn = ho_fi_conn(fi);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ switch (event) {</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>@@ -1035,69 +1117,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 = osmo_mgcpc_ep_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>@@ -1186,6 +1205,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>@@ -1223,20 +1255,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/13797">change 13797</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/13797"/><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: I00c18b78573386145af71c4b39f7f22aec24579b </div>
<div style="display:none"> Gerrit-Change-Number: 13797 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>