<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10040">View Change</a></p><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;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/40/10040/1</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 63d017f..0d83f7b 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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>