<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23256">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcu: transmit PCUIF DATA.ind with len=0 when no UL data to transmit<br><br>older osmo-pcu versions can cope well with this change, they will simply<br>print an error upon ach data_len=0 messages received and submit a GSMTAP<br>block, then discard it, so tests still pass.<br><br>Related: OS#5020<br>Change-Id: Ib4f97a9bcfa68230945effeb6412218faa64ec78<br>---<br>M library/PCUIF_Types.ttcn<br>M pcu/PCUIF_Components.ttcn<br>2 files changed, 56 insertions(+), 23 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/56/23256/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/PCUIF_Types.ttcn b/library/PCUIF_Types.ttcn</span><br><span>index ef27b11..96b2bac 100644</span><br><span>--- a/library/PCUIF_Types.ttcn</span><br><span>+++ b/library/PCUIF_Types.ttcn</span><br><span>@@ -161,7 +161,7 @@</span><br><span> uint32_t hLayer1,</span><br><span> PCUIF_InfoTrxTsList ts</span><br><span> } with { variant (pdch_mask) "BITORDER(msb)" };</span><br><span style="color: hsl(0, 100%, 40%);">-private type record length(8) of PCUIF_InfoV10Trx PCUIF_InfoV10TrxList;</span><br><span style="color: hsl(120, 100%, 40%);">+type record length(8) of PCUIF_InfoV10Trx PCUIF_InfoV10TrxList;</span><br><span> </span><br><span> /* Version <= 9 specific coding */</span><br><span> private type record PCUIF_InfoV09Trx {</span><br><span>diff --git a/pcu/PCUIF_Components.ttcn b/pcu/PCUIF_Components.ttcn</span><br><span>index 50de700..2a505d2 100644</span><br><span>--- a/pcu/PCUIF_Components.ttcn</span><br><span>+++ b/pcu/PCUIF_Components.ttcn</span><br><span>@@ -308,6 +308,8 @@</span><br><span> </span><br><span> /* Whether to forward PTCCH/U burst events to the TC */</span><br><span> var boolean cfg_ptcch_burst_fwd := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PCUIF_info_ind g_info_ind;</span><br><span> }</span><br><span> </span><br><span> /* Queue received messages from Test Case, they will eventually be scheduled and</span><br><span>@@ -337,6 +339,55 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Get first message from queue. true if non-empty, false otherwise */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tx_data_ind_fn(integer bts_nr, integer fn)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_BTS_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ var PCUIF_Message pcu_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+ var boolean has_msg, use_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+ var PCUIF_InfoV10TrxList trx_list := g_info_ind.trx.v10;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var uint8_t ts_nr := 0; ts_nr < 8; ts_nr := ts_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer trx_nr := 0; trx_nr < lengthof(trx_list); trx_nr := trx_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ var charstring prefix := "BTS=" & int2str(bts_nr) & ",TRX=" & int2str(trx_nr) & ",TS=" & int2str(ts_nr) & ",FN=" & int2str(fn) & ": ";</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx_list[trx_nr].pdch_mask[ts_nr] == '0'B) {</span><br><span style="color: hsl(120, 100%, 40%);">+ log(prefix, "disabled");</span><br><span style="color: hsl(120, 100%, 40%);">+ continue; /* TRX+TS not activated */</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%);">+ /* Check if we reached time to serve the first DATA.ind message in the queue: */</span><br><span style="color: hsl(120, 100%, 40%);">+ has_msg := f_PCUIF_MsgQueue_first(pdtch_data_queue, pcu_msg) and</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_msg.u.data_ind.trx_nr == trx_nr and</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_msg.u.data_ind.ts_nr == ts_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ use_msg := has_msg and (pcu_msg.u.data_ind.fn == 0 or pcu_msg.u.data_ind.fn == fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (use_msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Dequeue a DATA.ind message */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_PCUIF_MsgQueue_dequeue(pdtch_data_queue, pcu_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Patch TDMA frame / block number */</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_msg.u.data_ind.fn := fn;</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_msg.u.data_ind.block_nr := 0; /* FIXME! */</span><br><span style="color: hsl(120, 100%, 40%);">+ log(prefix, "DATA.ind");</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (has_msg and pcu_msg.u.data_ind.fn < fn) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "We are late scheduling the block! ", pcu_msg.u.data_ind.fn, " < ", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* NOPE.ind: */</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_msg := valueof(ts_PCUIF_DATA_IND(bts_nr, trx_nr, ts_nr, 0 /* FIXME */,</span><br><span style="color: hsl(120, 100%, 40%);">+ PCU_IF_SAPI_PDTCH, ''O, fn,</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_list[trx_nr].arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+ rssi := -80, ber10k := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ ta_offs_qbits := 0, lqual_cb := 10));</span><br><span style="color: hsl(120, 100%, 40%);">+ log(prefix, "DATA.ind (len=0)");</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%);">+ PCUIF.send(pcu_msg); /* Send to the PCU and notify the TC */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (use_msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TC.send(ts_RAW_PCU_CLCK_EV(TDMA_EV_PDTCH_BLOCK_SENT, fn));</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 style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Handle schedule events and manage actions: Send msgs over PCUIF to PCU,</span><br><span> * advertise Test Case about sent messages, etc. */</span><br><span> private altstep as_BTS_CT_TDMASched(integer bts_nr)</span><br><span>@@ -344,7 +395,6 @@</span><br><span> var PCUIF_Message pcu_msg;</span><br><span> var RAW_PCU_Event event;</span><br><span> var integer ev_begin_fn;</span><br><span style="color: hsl(0, 100%, 40%);">- var integer next_fn;</span><br><span> </span><br><span> [] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_BEG)) -> value event {</span><br><span> /* If the RTS queue for PDTCH is not empty, send a message */</span><br><span>@@ -362,29 +412,10 @@</span><br><span> PCUIF.send(ts_PCUIF_TIME_IND(bts_nr, event.data.tdma_fn));</span><br><span> repeat;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [lengthof(pdtch_data_queue) > 0] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_END)) -> value event {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PDTCH_BLOCK_END)) -> value event {</span><br><span> /* FN matching the beginning of current block: */</span><br><span> ev_begin_fn := event.data.tdma_fn - 3;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Check if we reached time to serve the first DATA.ind message in the queue: */</span><br><span style="color: hsl(0, 100%, 40%);">- f_PCUIF_MsgQueue_first(pdtch_data_queue, pcu_msg);</span><br><span style="color: hsl(0, 100%, 40%);">- next_fn := pcu_msg.u.data_ind.fn;</span><br><span style="color: hsl(0, 100%, 40%);">- if (next_fn != 0 and next_fn != ev_begin_fn) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (next_fn < ev_begin_fn) {</span><br><span style="color: hsl(0, 100%, 40%);">- setverdict(fail, "We are late scheduling the block! ", next_fn, " < ", ev_begin_fn);</span><br><span style="color: hsl(0, 100%, 40%);">- mtc.stop;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- repeat;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* Dequeue a DATA.ind message */</span><br><span style="color: hsl(0, 100%, 40%);">- f_PCUIF_MsgQueue_dequeue(pdtch_data_queue, pcu_msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Patch TDMA frame / block number */</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_msg.u.data_ind.fn := ev_begin_fn;</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_msg.u.data_ind.block_nr := 0; /* FIXME! */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- PCUIF.send(pcu_msg); /* Send to the PCU and notify the TC */</span><br><span style="color: hsl(0, 100%, 40%);">- TC.send(ts_RAW_PCU_CLCK_EV(TDMA_EV_PDTCH_BLOCK_SENT, ev_begin_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_tx_data_ind_fn(bts_nr, ev_begin_fn);</span><br><span> repeat;</span><br><span> }</span><br><span> [lengthof(ptcch_rts_queue) > 0] CLCK.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_DL_BLOCK)) -> value event {</span><br><span>@@ -417,6 +448,8 @@</span><br><span> var BTS_PTCCH_Block pcu_msg_ptcch;</span><br><span> var BTS_CCCH_Block pcu_msg_rr;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ g_info_ind := info_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Init TDMA clock generator (so we can stop and start it) */</span><br><span> vc_CLCK_GEN := RAW_PCU_ClckGen_CT.create("ClckGen-" & int2str(bts_nr)) alive;</span><br><span> connect(vc_CLCK_GEN:CLCK, self:CLCK);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23256">change 23256</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-ttcn3-hacks/+/23256"/><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-Change-Id: Ib4f97a9bcfa68230945effeb6412218faa64ec78 </div>
<div style="display:none"> Gerrit-Change-Number: 23256 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>