<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25166">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">early IMM ASS 3/n: implement 'pre-ts-ack'<br><br>Add experimental 'pre-ts-ack' to the 'immediate-assignment' options:<br>send the IMM ASS even before a dynamic timeslot is switched. This<br>possibly saves an Abis roundtrip, but may be racy.<br><br>When pre-ts-ack is chosen, already do the IMM ASS before the dyn TS<br>pchan switch is ACKed.<br><br>In Immediate Assignment, in case the dyn TS is not ready yet, get the<br>pchan kind from lchan->type, which already reflects the target type, and<br>not from ts->pchan_is, which still reflects the previous pchan type.<br><br>Related test is in I2ae28cd92910d4bc341a88571599347a64a18fe5<br><br>Related: SYS#5559<br>Change-Id: I19e6a3d614aa5ae24d64eed96caf53e6f0e8bb74<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/bts_vty.c<br>M src/osmo-bsc/lchan_fsm.c<br>M tests/osmo-bsc.vty<br>5 files changed, 35 insertions(+), 4 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/66/25166/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index ba3af3b..d6c06de 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -604,6 +604,7 @@</span><br><span> enum imm_ass_time {</span><br><span>        IMM_ASS_TIME_POST_CHAN_ACK = 0,</span><br><span>      IMM_ASS_TIME_PRE_CHAN_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+    IMM_ASS_TIME_PRE_TS_ACK,</span><br><span> };</span><br><span> </span><br><span> struct lchan_activate_info {</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index df31982..26231ac 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -2072,6 +2072,7 @@</span><br><span>  struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span>  uint8_t buf[GSM_MACBLOCK_LEN];</span><br><span>       struct gsm48_imm_ass *ia = (struct gsm48_imm_ass *) buf;</span><br><span style="color: hsl(120, 100%, 40%);">+      enum gsm_phys_chan_config pchan;</span><br><span> </span><br><span>         /* create IMMEDIATE ASSIGN 04.08 message */</span><br><span>  memset(ia, 0, sizeof(*ia));</span><br><span>@@ -2079,7 +2080,15 @@</span><br><span>         ia->proto_discr = GSM48_PDISC_RR;</span><br><span>         ia->msg_type = GSM48_MT_RR_IMM_ASS;</span><br><span>       ia->page_mode = GSM48_PM_SAME;</span><br><span style="color: hsl(0, 100%, 40%);">-       rc = gsm48_lchan2chan_desc(&ia->chan_desc, lchan, lchan->tsc, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* In case the dyn TS is not ready yet, ts->pchan_is still reflects the previous pchan type; so get the pchan</span><br><span style="color: hsl(120, 100%, 40%);">+       * kind from lchan->type, which already reflects the target type. This only happens for dynamic timeslots.</span><br><span style="color: hsl(120, 100%, 40%);">+  * gsm_pchan_by_lchan_type() isn't always exact, which is fine for dyn TS with their limited pchan kinds. */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (lchan_state_is(lchan, LCHAN_ST_WAIT_TS_READY))</span><br><span style="color: hsl(120, 100%, 40%);">+            pchan = gsm_pchan_by_lchan_type(lchan->type);</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          pchan = lchan->ts->pchan_is;</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = gsm48_lchan_and_pchan2chan_desc(&ia->chan_desc, lchan, pchan, lchan->tsc, true);</span><br><span>      if (rc) {</span><br><span>            LOG_LCHAN(lchan, LOGL_ERROR, "Error encoding Channel Number\n");</span><br><span>           return rc;</span><br><span>diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c</span><br><span>index cba0bb0..577feec 100644</span><br><span>--- a/src/osmo-bsc/bts_vty.c</span><br><span>+++ b/src/osmo-bsc/bts_vty.c</span><br><span>@@ -2807,16 +2807,20 @@</span><br><span> }</span><br><span> </span><br><span> DEFUN_ATTR(cfg_bts_immediate_assignment, cfg_bts_immediate_assignment_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-           "immediate-assignment (post-chan-ack|pre-chan-ack)",</span><br><span style="color: hsl(120, 100%, 40%);">+        "immediate-assignment (post-chan-ack|pre-chan-ack|pre-ts-ack)",</span><br><span>            "Configure time of Immediate Assignment after ChanRqd RACH (Abis optimization)\n"</span><br><span>          "Send the Immediate Assignment after the Channel Activation ACK (normal sequence)\n"</span><br><span>       "Send the Immediate Assignment directly after Channel Activation (early), without waiting for the ACK;"</span><br><span style="color: hsl(0, 100%, 40%);">-       " This may help with double allocations on high latency Abis links\n",</span><br><span style="color: hsl(120, 100%, 40%);">+      " This may help with double allocations on high latency Abis links\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "EXPERIMENTAL: If a dynamic timeslot switch is necessary, send the Immediate Assignment even before the"</span><br><span style="color: hsl(120, 100%, 40%);">+    " timeslot is switched, i.e. even before the Channel Activation is sent (very early)\n",</span><br><span>           CMD_ATTR_IMMEDIATE)</span><br><span> {</span><br><span>  struct gsm_bts *bts = vty->index;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (!strcmp(argv[0], "pre-chan-ack"))</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!strcmp(argv[0], "pre-ts-ack"))</span><br><span style="color: hsl(120, 100%, 40%);">+         bts->imm_ass_time = IMM_ASS_TIME_PRE_TS_ACK;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if (!strcmp(argv[0], "pre-chan-ack"))</span><br><span>                 bts->imm_ass_time = IMM_ASS_TIME_PRE_CHAN_ACK;</span><br><span>    else</span><br><span>                 bts->imm_ass_time = IMM_ASS_TIME_POST_CHAN_ACK;</span><br><span>@@ -4005,6 +4009,9 @@</span><br><span>   case IMM_ASS_TIME_PRE_CHAN_ACK:</span><br><span>              vty_out(vty, "  immediate-assignment pre-chan-ack%s", VTY_NEWLINE);</span><br><span>                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case IMM_ASS_TIME_PRE_TS_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "  immediate-assignment pre-ts-ack%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span>       }</span><br><span> </span><br><span>        /* BS/MS Power Control parameters */</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index 1eb9505..def70de 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -739,6 +739,12 @@</span><br><span>     /* Prepare an MGW endpoint CI if appropriate. */</span><br><span>     if (lchan->activate.info.requires_voice_stream)</span><br><span>           lchan_rtp_fsm_start(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (lchan->activate.info.imm_ass_time == IMM_ASS_TIME_PRE_TS_ACK) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Send the Immediate Assignment even before the timeslot is ready, saving a dyn TS timeslot roundtrip</span><br><span style="color: hsl(120, 100%, 40%);">+                 * on Abis (experimental). */</span><br><span style="color: hsl(120, 100%, 40%);">+         lchan_send_imm_ass(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> }</span><br><span> </span><br><span> static void lchan_fsm_wait_ts_ready(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>diff --git a/tests/osmo-bsc.vty b/tests/osmo-bsc.vty</span><br><span>index b837d25..4027502 100644</span><br><span>--- a/tests/osmo-bsc.vty</span><br><span>+++ b/tests/osmo-bsc.vty</span><br><span>@@ -210,6 +210,7 @@</span><br><span> OsmoBSC(config-net-bts)# immediate-assignment ?</span><br><span>   post-chan-ack  Send the Immediate Assignment after the Channel Activation ACK (normal sequence)</span><br><span>   pre-chan-ack   Send the Immediate Assignment directly after Channel Activation (early), without waiting for the ACK; This may help with double allocations on high latency Abis links</span><br><span style="color: hsl(120, 100%, 40%);">+  pre-ts-ack     EXPERIMENTAL: If a dynamic timeslot switch is necessary, send the Immediate Assignment even before the timeslot is switched, i.e. even before the Channel Activation is sent (very early)</span><br><span> OsmoBSC(config-net-bts)# show running-config</span><br><span> ... !immediate-assignment</span><br><span> OsmoBSC(config-net-bts)# immediate-assignment pre-chan-ack</span><br><span>@@ -219,6 +220,13 @@</span><br><span> ...</span><br><span>   immediate-assignment pre-chan-ack</span><br><span> ...</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# immediate-assignment pre-ts-ack</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  immediate-assignment pre-ts-ack</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span> OsmoBSC(config-net-bts)# immediate-assignment post-chan-ack</span><br><span> OsmoBSC(config-net-bts)# show running-config</span><br><span> ... !immediate-assignment</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25166">change 25166</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/+/25166"/><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: I19e6a3d614aa5ae24d64eed96caf53e6f0e8bb74 </div>
<div style="display:none"> Gerrit-Change-Number: 25166 </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>