<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10040">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;">MSC_ConnectionHandler: make as_handover more race robust<br><br>The IPACC and MDCX interaction happens nearly in parallel to the<br>normal RSL connection that handles the handover, in particular the<br>channel relase from the old BTS may arrive in between IPACC and MGCP<br>operations.<br><br>- When the channel release arrives, check if MGCP and IPACC<br> operations are done (we have seen one MDCX on MGCP and an CRCX<br> plus an MDCX on IPACC level)<br><br>Change-Id: I207e9ece48ec53f872f82d981435cee7c2d0b094<br>Related: OS#3396<br>---<br>M bsc/MSC_ConnectionHandler.ttcn<br>1 file changed, 32 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index 589ccf1..a82728a 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -74,6 +74,7 @@</span><br><span> /* BTS media state */</span><br><span> type record BtsMediaState {</span><br><span> boolean ipa_crcx_seen,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean ipa_mdcx_seen,</span><br><span> uint16_t conn_id,</span><br><span> uint7_t rtp_pt,</span><br><span> HostPort bts,</span><br><span>@@ -91,6 +92,7 @@</span><br><span> /* BTS Side */</span><br><span> g_media.bts := {</span><br><span> ipa_crcx_seen := false,</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_mdcx_seen := false,</span><br><span> conn_id := nr,</span><br><span> rtp_pt := 0,</span><br><span> bts := {</span><br><span>@@ -102,6 +104,7 @@</span><br><span> </span><br><span> g_media.bts1 := {</span><br><span> ipa_crcx_seen := false,</span><br><span style="color: hsl(120, 100%, 40%);">+ ipa_mdcx_seen := false,</span><br><span> conn_id := nr,</span><br><span> rtp_pt := 0,</span><br><span> bts := {</span><br><span>@@ -204,7 +207,7 @@</span><br><span> oct2int(f_inet_addr(g_media.bts.peer.host)),</span><br><span> g_media.bts.peer.port_nr,</span><br><span> g_media.bts.rtp_pt));</span><br><span style="color: hsl(0, 100%, 40%);">- //g_media.bts.ipa_mdcx_seen := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ g_media.bts.ipa_mdcx_seen := true;</span><br><span> repeat;</span><br><span> }</span><br><span> </span><br><span>@@ -248,7 +251,7 @@</span><br><span> oct2int(f_inet_addr(g_media.bts1.peer.host)),</span><br><span> g_media.bts1.peer.port_nr,</span><br><span> g_media.bts1.rtp_pt));</span><br><span style="color: hsl(0, 100%, 40%);">- //g_media.bts1.ipa_mdcx_seen := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ g_media.bts1.ipa_mdcx_seen := true;</span><br><span> repeat;</span><br><span> }</span><br><span> </span><br><span>@@ -257,7 +260,7 @@</span><br><span> </span><br><span> /* altstep for handling of MGCP media related commands. Activated by as_Media() to test</span><br><span> * MGW level media handling */</span><br><span style="color: hsl(0, 100%, 40%);">-altstep as_Media_mgw() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_Media_mgw(boolean norepeat := false) runs on MSC_ConnHdlr {</span><br><span> var MgcpCommand mgcp_cmd;</span><br><span> </span><br><span> [] MGCP.receive(tr_CRCX) -> value mgcp_cmd {</span><br><span>@@ -290,7 +293,9 @@</span><br><span> f_mgcp_par_append(mgcp_resp.params, ts_MgcpParSpecEP(g_media.mgcp_ep));</span><br><span> MGCP.send(mgcp_resp);</span><br><span> g_media.mgcp_conn[cid].crcx_seen := g_media.mgcp_conn[cid].crcx_seen + 1;</span><br><span style="color: hsl(0, 100%, 40%);">- repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+ if(norepeat == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+ repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> [] MGCP.receive(tr_MDCX) -> value mgcp_cmd {</span><br><span> var SDP_Message sdp;</span><br><span>@@ -311,7 +316,9 @@</span><br><span> valueof(ts_SDP_ptime(mgcp_conn.ptime)) } ));</span><br><span> MGCP.send(ts_MDCX_ACK(mgcp_cmd.line.trans_id, mgcp_conn.conn_id, sdp));</span><br><span> g_media.mgcp_conn[cid].mdcx_seen := g_media.mgcp_conn[cid].mdcx_seen + 1;</span><br><span style="color: hsl(0, 100%, 40%);">- repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+ if(norepeat == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+ repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -969,6 +976,7 @@</span><br><span> type record HandoverState {</span><br><span> /* Assignment related bits */</span><br><span> boolean rr_ho_cmpl_seen,</span><br><span style="color: hsl(120, 100%, 40%);">+ integer mdcx_seen_before_ho,</span><br><span> boolean handover_done,</span><br><span> RslChannelNr old_chan_nr</span><br><span> };</span><br><span>@@ -1004,13 +1012,18 @@</span><br><span> st.old_chan_nr := g_chan_nr;</span><br><span> g_chan_nr := new_chan_nr;</span><br><span> st.rr_ho_cmpl_seen := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Memorize how many MDCX we have seen before. We need this number to detect</span><br><span style="color: hsl(120, 100%, 40%);">+ * that we have received the handover related MDCX */</span><br><span style="color: hsl(120, 100%, 40%);">+ st.mdcx_seen_before_ho := g_media.mgcp_conn[0].mdcx_seen;</span><br><span> repeat;</span><br><span> } else {</span><br><span> setverdict(fail, "Unexpected L3 received", l3);</span><br><span> self.stop;</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [st.rr_ho_cmpl_seen] as_Media();</span><br><span style="color: hsl(120, 100%, 40%);">+ [st.rr_ho_cmpl_seen] as_Media_ipacc();</span><br><span style="color: hsl(120, 100%, 40%);">+ [st.rr_ho_cmpl_seen] as_Media_mgw(true); </span><br><span> [st.rr_ho_cmpl_seen] RSL.receive(tr_RSL_REL_REQ(st.old_chan_nr, tr_RslLinkID_DCCH(0))) {</span><br><span> RSL.send(ts_RSL_REL_CONF(st.old_chan_nr, valueof(ts_RslLinkID_DCCH(0))));</span><br><span> repeat;</span><br><span>@@ -1020,7 +1033,19 @@</span><br><span> /* unregister for old channel number in RSL emulation */</span><br><span> /* FIXME: Determine TRX NR by ARFCN, instead of hard-coded TRX0! */</span><br><span> f_rslem_unregister(0, st.old_chan_nr);</span><br><span style="color: hsl(0, 100%, 40%);">- st.handover_done := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The channel release must not necessarly be synchronized to the RSL handover</span><br><span style="color: hsl(120, 100%, 40%);">+ * procedure since those events may happen independently nearly at the same</span><br><span style="color: hsl(120, 100%, 40%);">+ * time. When we receive the RSL_RF_CHAN_REL command the media negotiation on</span><br><span style="color: hsl(120, 100%, 40%);">+ * IPACC or MGCP level may be still in progress. In order to make sure that</span><br><span style="color: hsl(120, 100%, 40%);">+ * we do only stop when we have seen an MDCX on MGCP level and another a CRCX</span><br><span style="color: hsl(120, 100%, 40%);">+ * as well as an MDCX on IPACC level. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_media.mgcp_conn[0].mdcx_seen <= st.mdcx_seen_before_ho or</span><br><span style="color: hsl(120, 100%, 40%);">+ g_media.bts1.ipa_mdcx_seen == false or g_media.bts1.ipa_crcx_seen == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+ repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ st.handover_done := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10040">change 10040</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/10040"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I207e9ece48ec53f872f82d981435cee7c2d0b094 </div>
<div style="display:none"> Gerrit-Change-Number: 10040 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>