<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>