<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/25201">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">early IMM ASS: add configurable delay for RR IMM ASS<br><br>During live testing, it has become apparent that some IMM ASS still fail<br>when sending the RR IMM ASS directly upon the target channel becoming<br>active.<br><br>Add a bit of delay after activation, to give some time for the channel<br>to light up for the MS. Default is 50ms.<br><br>Related: OS#5559<br>Change-Id: Ia1e63b98944dc840cde212fc732e20277cdc5585<br>---<br>M include/osmo-bts/gsm_data.h<br>M src/common/bts.c<br>M src/common/gsm_data.c<br>M src/common/lchan.c<br>M tests/osmo-bts.vty<br>5 files changed, 53 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/01/25201/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 80f1833..215b9d8 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -418,6 +418,7 @@</span><br><span>       * confirmed active, then cache it here and send it once the channel is confirmed to be active. This is related</span><br><span>       * to the Early IA feature, see OsmoBSC config option 'immediate-assignment pre-chan-ack'. */</span><br><span>        struct msgb *early_rr_ia;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_timer_list early_rr_ia_delay;</span><br><span> };</span><br><span> </span><br><span> extern const struct value_string lchan_ciph_state_names[];</span><br><span>@@ -524,6 +525,7 @@</span><br><span> </span><br><span> extern struct osmo_tdef_group bts_tdef_groups[];</span><br><span> extern struct osmo_tdef bts_T_defs[];</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct osmo_tdef abis_T_defs[];</span><br><span> </span><br><span> extern const struct value_string gsm_pchant_names[13];</span><br><span> extern const struct value_string gsm_pchant_descs[13];</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index b6af4c6..a8a23f1 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -143,6 +143,11 @@</span><br><span>         {}</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_tdef abis_T_defs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      { .T=-15, .default_val=50, .unit=OSMO_TDEF_MS, .desc="Time to wait between Channel Activation and dispatching a cached early Immediate Assignment" },</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 const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };</span><br><span> static const uint8_t bts_cell_timer_default[] =</span><br><span>                             { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };</span><br><span>@@ -234,6 +239,7 @@</span><br><span> </span><br><span>    bts->T_defs = bts_T_defs;</span><br><span>         osmo_tdefs_reset(bts->T_defs);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_tdefs_reset(abis_T_defs);</span><br><span>       bts->shutdown_fi = osmo_fsm_inst_alloc(&bts_shutdown_fsm, bts, bts,</span><br><span>                                          LOGL_INFO, NULL);</span><br><span>     osmo_fsm_inst_update_id_f(bts->shutdown_fi, "bts%d", bts->nr);</span><br><span>diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c</span><br><span>index b1f695b..9c8d6f3 100644</span><br><span>--- a/src/common/gsm_data.c</span><br><span>+++ b/src/common/gsm_data.c</span><br><span>@@ -42,6 +42,7 @@</span><br><span> </span><br><span> struct osmo_tdef_group bts_tdef_groups[] = {</span><br><span>      { .name = "bts", .tdefs = bts_T_defs, .desc = "BTS process timers" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .name = "abis", .tdefs = abis_T_defs, .desc = "Abis (RSL) related timers" },</span><br><span>   {}</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/common/lchan.c b/src/common/lchan.c</span><br><span>index 987f78a..a5863a0 100644</span><br><span>--- a/src/common/lchan.c</span><br><span>+++ b/src/common/lchan.c</span><br><span>@@ -25,6 +25,34 @@</span><br><span> #include <osmo-bts/bts.h></span><br><span> #include <osmo-bts/rsl.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void early_rr_ia_delay_cb(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_lchan *lchan = data;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!lchan->early_rr_ia) {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* The IA message has disappeared since the timer was started. */</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (lchan->state != LCHAN_S_ACTIVE) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Release has happened since the timer was started. */</span><br><span style="color: hsl(120, 100%, 40%);">+               msgb_free(lchan->early_rr_ia);</span><br><span style="color: hsl(120, 100%, 40%);">+             lchan->early_rr_ia = NULL;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Put RR IA msg into the AGCH queue of the BTS. */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Activation is done, send the RR IA now. Put RR IA msg into the AGCH queue of the BTS. */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bts_agch_enqueue(bts, lchan->early_rr_ia) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* if there is no space in the queue: send DELETE IND */</span><br><span style="color: hsl(120, 100%, 40%);">+              rsl_tx_delete_ind(bts, lchan->early_rr_ia->data, lchan->early_rr_ia->len);</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc2(bts->ctrs, BTS_CTR_AGCH_DELETED);</span><br><span style="color: hsl(120, 100%, 40%);">+            msgb_free(lchan->early_rr_ia);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->early_rr_ia = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void lchan_set_state(struct gsm_lchan *lchan, enum gsm_lchan_state state)</span><br><span> {</span><br><span>         DEBUGP(DL1C, "%s state %s -> %s\n",</span><br><span>@@ -43,18 +71,17 @@</span><br><span>                        * even before a dynamic timeslot is done switching to a different pchan kind (experimental). */</span><br><span>                     break;</span><br><span>               case LCHAN_S_ACTIVE:</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* Activation is done, send the RR IA now. Put RR IA msg into the AGCH queue of the BTS. */</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (bts_agch_enqueue(bts, lchan->early_rr_ia) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              /* if there is no space in the queue: send DELETE IND */</span><br><span style="color: hsl(0, 100%, 40%);">-                                rsl_tx_delete_ind(bts, lchan->early_rr_ia->data, lchan->early_rr_ia->len);</span><br><span style="color: hsl(0, 100%, 40%);">-                          rate_ctr_inc2(bts->ctrs, BTS_CTR_AGCH_DELETED);</span><br><span style="color: hsl(0, 100%, 40%);">-                              msgb_free(lchan->early_rr_ia);</span><br><span style="color: hsl(0, 100%, 40%);">-                       }</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan->early_rr_ia = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Activation is done, send the RR IA now. Delay a bit more to give Um time to let the lchan</span><br><span style="color: hsl(120, 100%, 40%);">+                   * light up for the MS */</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_timer_del(&lchan->early_rr_ia_delay);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_timer_setup(&lchan->early_rr_ia_delay, early_rr_ia_delay_cb, lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_timer_schedule(&lchan->early_rr_ia_delay, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          osmo_tdef_get(abis_T_defs, -15, OSMO_TDEF_US, -1));</span><br><span>                      break;</span><br><span>               default:</span><br><span>                     /* Transition to any other state means whatever IA the BSC has sent shall now not be relevant</span><br><span>                         * anymore. */</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_timer_del(&lchan->early_rr_ia_delay);</span><br><span>                    msgb_free(lchan->early_rr_ia);</span><br><span>                    lchan->early_rr_ia = NULL;</span><br><span>                        break;</span><br><span>diff --git a/tests/osmo-bts.vty b/tests/osmo-bts.vty</span><br><span>index eb10d4d..336dc1b 100644</span><br><span>--- a/tests/osmo-bts.vty</span><br><span>+++ b/tests/osmo-bts.vty</span><br><span>@@ -7,7 +7,7 @@</span><br><span>   show lchan summary [<0-255>] [<0-255>] [<0-7>] [<0-7>]</span><br><span>   show bts <0-255> gprs</span><br><span> ...</span><br><span style="color: hsl(0, 100%, 40%);">-  show timer [(bts)] [TNNNN]</span><br><span style="color: hsl(120, 100%, 40%);">+  show timer [(bts|abis)] [TNNNN]</span><br><span>   show e1_driver</span><br><span>   show e1_line [<0-255>] [stats]</span><br><span>   show e1_timeslot [<0-255>] [<0-31>]</span><br><span>@@ -63,10 +63,12 @@</span><br><span>   [<0-7>]  Logical Channel Number</span><br><span> </span><br><span> OsmoBTS> show timer ?</span><br><span style="color: hsl(0, 100%, 40%);">-  [bts]  BTS process timers</span><br><span style="color: hsl(120, 100%, 40%);">+  [bts]   BTS process timers</span><br><span style="color: hsl(120, 100%, 40%);">+  [abis]  Abis (RSL) related timers</span><br><span> OsmoBTS> show timer</span><br><span> bts: X1 = 300 s Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)</span><br><span> bts: X2 = 3 s     Time after which osmo-bts exits if requesting transceivers to stop during shut down process does not finish (s) (default: 3 s)</span><br><span style="color: hsl(120, 100%, 40%);">+abis: X15 = 50 ms       Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 50 ms)</span><br><span> OsmoBTS> show timer bts ?</span><br><span>   [TNNNN]  T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.</span><br><span> OsmoBTS> show timer bts</span><br><span>@@ -76,6 +78,10 @@</span><br><span> bts: X1 = 300 s       Time after which osmo-bts exits if regular ramp down during shut down process does not finish (s) (default: 300 s)</span><br><span> OsmoBTS> show timer bts X2</span><br><span> bts: X2 = 3 s    Time after which osmo-bts exits if requesting transceivers to stop during shut down process does not finish (s) (default: 3 s)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBTS> show timer abis ?</span><br><span style="color: hsl(120, 100%, 40%);">+  [TNNNN]  T- or X-timer-number -- 3GPP compliant timer number of the format '1234' or 'T1234' or 't1234'; Osmocom-specific timer number of the format: 'X1234' or 'x1234'.</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBTS> show timer abis X15</span><br><span style="color: hsl(120, 100%, 40%);">+abis: X15 = 50 ms  Time to wait between Channel Activation and dispatching a cached early Immediate Assignment (default: 50 ms)</span><br><span> </span><br><span> OsmoBTS> show e1_driver ?</span><br><span>   <cr>  </span><br><span>@@ -98,7 +104,7 @@</span><br><span>   show lchan summary [<0-255>] [<0-255>] [<0-7>] [<0-7>]</span><br><span>   show bts <0-255> gprs</span><br><span> ...</span><br><span style="color: hsl(0, 100%, 40%);">-  show timer [(bts)] [TNNNN]</span><br><span style="color: hsl(120, 100%, 40%);">+  show timer [(bts|abis)] [TNNNN]</span><br><span>   bts <0-0> trx <0-255> ts <0-7> (lchan|shadow-lchan) <0-7> rtp jitter-buffer <0-10000></span><br><span>   test send-failure-event-report <0-255></span><br><span>   bts <0-255> c0-power-red <0-6></span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/25201">change 25201</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-bts/+/25201"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia1e63b98944dc840cde212fc732e20277cdc5585 </div>
<div style="display:none"> Gerrit-Change-Number: 25201 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>