<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25397">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fixup for Early IMM ASS: use proper TSC<br><br>Testing has shown that the Training Sequence Code in pre-chan-ack mode<br>is inaccurate (only worked with a BSIC that incidentally yielded the<br>same TSC value as the wrong TSC value sent in the IMM ASS msg).<br><br>Move the code setting the correct TSC and TSC-Set to the first stage of<br>channel activation (lchan_fsm_wait_ts_ready_onenter()) so that it is<br>available for both pre-chan-ack and pre-ts-ack Early-IA modes.<br><br>Have a separate function for setting the preliminary values requested in<br>Channel Activation (lchan->activate.*) into the accepted operative<br>places (lchan->*). Call this early for early-IA modes.<br><br>Hence the TSC and TSC-Set used in the early IMM ASS message is now the<br>correct one, and the same as sent during Channel Activation.<br>There shouldn't be any, but if there are other values besides TSC<br>suffering from the same problem, they are now also set to the right<br>values before sending IMM ASS early.<br><br>Related: SYS#5559<br>Related: I4479244b0c53648e62e84e1ebf986f51d659484f (osmo-ttcn3-hacks)<br>Change-Id: I9f26074154600d854a0b3baee2f38a6666f4cb56<br>---<br>M src/osmo-bsc/lchan_fsm.c<br>1 file changed, 40 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index c390662..1b59b45 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -672,6 +672,8 @@</span><br><span>  return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void post_activ_ack_accept_preliminary_settings(struct gsm_lchan *lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void lchan_fsm_wait_ts_ready_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span>   struct gsm_lchan *lchan = lchan_fi_lchan(fi);</span><br><span>@@ -717,6 +719,17 @@</span><br><span>         if (lchan_activate_set_ch_mode_rate_and_mr_config(lchan))</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* If enabling VAMOS mode and no specific TSC Set was selected, make sure to select a sane TSC Set by</span><br><span style="color: hsl(120, 100%, 40%);">+  * default: Set 1 for the primary and Set 2 for the shadow lchan. For non-VAMOS lchans, TSC Set 1. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lchan->activate.info.tsc_set > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan->activate.tsc_set = lchan->activate.info.tsc_set;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+          lchan->activate.tsc_set = lchan->vamos.is_secondary ? 2 : 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Use the TSC provided in the modification request, if any. Otherwise use the timeslot's configured</span><br><span style="color: hsl(120, 100%, 40%);">+       * TSC. */</span><br><span style="color: hsl(120, 100%, 40%);">+    lchan->activate.tsc = (lchan->activate.info.tsc >= 0) ? lchan->activate.info.tsc : gsm_ts_tsc(lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   use_mgwep_ci = lchan_use_mgw_endpoint_ci_bts(lchan);</span><br><span> </span><br><span>     LOG_LCHAN(lchan, LOGL_INFO,</span><br><span>@@ -742,7 +755,13 @@</span><br><span> </span><br><span>       if (lchan->activate.info.imm_ass_time == IMM_ASS_TIME_PRE_TS_ACK) {</span><br><span>               /* Send the Immediate Assignment even before the timeslot is ready, saving a dyn TS timeslot roundtrip</span><br><span style="color: hsl(0, 100%, 40%);">-           * on Abis (experimental). */</span><br><span style="color: hsl(120, 100%, 40%);">+          * on Abis (experimental).</span><br><span style="color: hsl(120, 100%, 40%);">+             *</span><br><span style="color: hsl(120, 100%, 40%);">+             * Until the Channel Activation ACK is received, various values still are preliminary and hence live in</span><br><span style="color: hsl(120, 100%, 40%);">+                * lchan->activate.*. We're doing things early here and need e.g. an accurate lchan->tsc, so already</span><br><span style="color: hsl(120, 100%, 40%);">+                 * copy the preliminary values from lchan->activate.* into the operative places in lchan->* prematurely.</span><br><span style="color: hsl(120, 100%, 40%);">+                 */</span><br><span style="color: hsl(120, 100%, 40%);">+           post_activ_ack_accept_preliminary_settings(lchan);</span><br><span>           lchan_send_imm_ass(fi);</span><br><span>      }</span><br><span> }</span><br><span>@@ -801,19 +820,13 @@</span><br><span>               break;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* rsl_tx_chan_activ() and build_encr_info() access lchan->encr, make sure it reflects the values requested for</span><br><span style="color: hsl(120, 100%, 40%);">+     * activation.</span><br><span style="color: hsl(120, 100%, 40%);">+         * TODO: rather leave it in lchan->activate.info.encr until the ACK is received, which means that</span><br><span style="color: hsl(120, 100%, 40%);">+   * rsl_tx_chan_activ() should use lchan->activate.info.encr and build_encr_info() should be passed encr as an</span><br><span style="color: hsl(120, 100%, 40%);">+       * explicit argument. */</span><br><span>     lchan->encr = lchan->activate.info.encr;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* If enabling VAMOS mode and no specific TSC Set was selected, make sure to select a sane TSC Set by</span><br><span style="color: hsl(0, 100%, 40%);">-    * default: Set 1 for the primary and Set 2 for the shadow lchan. For non-VAMOS lchans, TSC Set 1. */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (lchan->activate.info.tsc_set > 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan->activate.tsc_set = lchan->activate.info.tsc_set;</span><br><span style="color: hsl(0, 100%, 40%);">-   else</span><br><span style="color: hsl(0, 100%, 40%);">-            lchan->activate.tsc_set = lchan->vamos.is_secondary ? 2 : 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Use the TSC provided in the modification request, if any. Otherwise use the timeslot's configured</span><br><span style="color: hsl(0, 100%, 40%);">-         * TSC. */</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->activate.tsc = (lchan->activate.info.tsc >= 0) ? lchan->activate.info.tsc : gsm_ts_tsc(lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>     rc = rsl_tx_chan_activ(lchan, act_type, ho_ref);</span><br><span>     if (rc) {</span><br><span>            lchan_fail_to(LCHAN_ST_UNUSED, "Tx Chan Activ failed: %s (%d)", strerror(-rc), rc);</span><br><span>@@ -825,7 +838,13 @@</span><br><span> </span><br><span>     if (lchan->activate.info.imm_ass_time == IMM_ASS_TIME_PRE_CHAN_ACK) {</span><br><span>             /* Send the Immediate Assignment directly after the Channel Activation request, saving one Abis</span><br><span style="color: hsl(0, 100%, 40%);">-          * roundtrip between ChanRqd and Imm Ass. */</span><br><span style="color: hsl(120, 100%, 40%);">+           * roundtrip between ChanRqd and Imm Ass.</span><br><span style="color: hsl(120, 100%, 40%);">+              *</span><br><span style="color: hsl(120, 100%, 40%);">+             * Until the Channel Activation ACK is received, various values still are preliminary and hence live in</span><br><span style="color: hsl(120, 100%, 40%);">+                * lchan->activate.*. We're doing things early here and need e.g. an accurate lchan->tsc, so already</span><br><span style="color: hsl(120, 100%, 40%);">+                 * copy the preliminary values from lchan->activate.* into the operative places in lchan->* prematurely.</span><br><span style="color: hsl(120, 100%, 40%);">+                 */</span><br><span style="color: hsl(120, 100%, 40%);">+           post_activ_ack_accept_preliminary_settings(lchan);</span><br><span>           lchan_send_imm_ass(fi);</span><br><span>      }</span><br><span> }</span><br><span>@@ -886,15 +905,20 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void lchan_fsm_post_activ_ack(struct osmo_fsm_inst *fi)</span><br><span style="color: hsl(120, 100%, 40%);">+static void post_activ_ack_accept_preliminary_settings(struct gsm_lchan *lchan)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_lchan *lchan = lchan_fi_lchan(fi);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        lchan->current_ch_mode_rate = lchan->activate.ch_mode_rate;</span><br><span>    lchan->current_mr_conf = lchan->activate.mr_conf_filtered;</span><br><span>     lchan->vamos.enabled = lchan->activate.info.vamos;</span><br><span>     lchan->tsc_set = lchan->activate.tsc_set;</span><br><span>      lchan->tsc = lchan->activate.tsc;</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 lchan_fsm_post_activ_ack(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_lchan *lchan = lchan_fi_lchan(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       post_activ_ack_accept_preliminary_settings(lchan);</span><br><span>   LOG_LCHAN(lchan, LOGL_INFO, "Rx Activ ACK %s\n",</span><br><span>             gsm48_chan_mode_name(lchan->current_ch_mode_rate.chan_mode));</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25397">change 25397</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/c/osmo-bsc/+/25397"/><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-Change-Id: I9f26074154600d854a0b3baee2f38a6666f4cb56 </div>
<div style="display:none"> Gerrit-Change-Number: 25397 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: iedemam <michael@kapsulate.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>