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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">pcuif: Submit data_req with len=0 as idle frames<br><br>This way PCU always answers DATA.ind and the BTS can still clearly<br>identify idle frames. It also simplifies testing and verification of<br>correct behavior.<br><br>Related: SYS#4919<br>Change-Id: Ife718eeed2af011479c03099ea109518f04567bc<br>---<br>M src/gprs_rlcmac_sched.cpp<br>M src/pcu_l1_if.cpp<br>2 files changed, 40 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp</span><br><span>index cdbf70d..8867d43 100644</span><br><span>--- a/src/gprs_rlcmac_sched.cpp</span><br><span>+++ b/src/gprs_rlcmac_sched.cpp</span><br><span>@@ -412,7 +412,7 @@</span><br><span>        uint8_t usf;</span><br><span>         struct msgb *msg = NULL;</span><br><span>     uint32_t poll_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-       enum pcu_gsmtap_category gsmtap_cat;</span><br><span style="color: hsl(120, 100%, 40%);">+  enum pcu_gsmtap_category gsmtap_cat = PCU_GSMTAP_C_DL_DUMMY; /* init: make gcc happy */</span><br><span>      bool tx_is_egprs = false;</span><br><span>    bool require_gprs_only;</span><br><span>      enum mcs_kind req_mcs_kind; /* Restrict CS/MCS if DL Data block is to be sent */</span><br><span>@@ -487,9 +487,9 @@</span><br><span>       }</span><br><span>    /* Prio 3: send dummy control message if need to poll or USF */</span><br><span>      else {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* If there's no TBF attached to this PDCH, we can early skip</span><br><span style="color: hsl(0, 100%, 40%);">-                * since there's nothing to transmit nor to poll/USF. This way</span><br><span style="color: hsl(0, 100%, 40%);">-               * we help BTS energy saving (on TRX!=C0) by sending nothing</span><br><span style="color: hsl(120, 100%, 40%);">+          /* If there's no TBF attached to this PDCH, we can submit an empty</span><br><span style="color: hsl(120, 100%, 40%);">+                 * data_req since there's nothing to transmit nor to poll/USF. This</span><br><span style="color: hsl(120, 100%, 40%);">+                * way we help BTS energy saving (on TRX!=C0) by sending nothing</span><br><span>              * instead of a dummy block. The early return is done here and</span><br><span>                * not at the start of the function because the condition below</span><br><span>               * (num_tbfs==0) may not be enough, because temporary dummy TBFs</span><br><span>@@ -505,13 +505,11 @@</span><br><span>              * TRX0, since BTS is not preparing dummy bursts on idle TS for us */</span><br><span>                skip_idle = skip_idle && trx != 0;</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-            if (skip_idle)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-               if ((msg = sched_dummy())) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!skip_idle && (msg = sched_dummy())) {</span><br><span>                   /* increase counter */</span><br><span>                       gsmtap_cat = PCU_GSMTAP_C_DL_DUMMY;</span><br><span>          } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg = NULL; /* submit empty frame */</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span>@@ -521,21 +519,23 @@</span><br><span>                pdch->fn_without_cs14 = 0;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* msg is now available */</span><br><span style="color: hsl(0, 100%, 40%);">-      bts_do_rate_ctr_add(bts, CTR_RLC_DL_BYTES, msgb_length(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* set USF */</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(msgb_length(msg) > 0);</span><br><span style="color: hsl(0, 100%, 40%);">-   usf = usf_tbf ? usf_tbf->m_usf[ts] : USF_UNUSED;</span><br><span style="color: hsl(0, 100%, 40%);">-     msg->data[0] = (msg->data[0] & 0xf8) | usf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        /* Used to measure the leak rate, count all blocks */</span><br><span>        gprs_bssgp_update_frames_sent();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* Send to GSMTAP */</span><br><span style="color: hsl(0, 100%, 40%);">-    tap_n_acc(msg, bts, trx, ts, fn, gsmtap_cat);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* msg is now available */</span><br><span style="color: hsl(120, 100%, 40%);">+            bts_do_rate_ctr_add(bts, CTR_RLC_DL_BYTES, msgb_length(msg));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* send PDTCH/PACCH to L1 */</span><br><span style="color: hsl(120, 100%, 40%);">+          /* set USF */</span><br><span style="color: hsl(120, 100%, 40%);">+         OSMO_ASSERT(msgb_length(msg) > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         usf = usf_tbf ? usf_tbf->m_usf[ts] : USF_UNUSED;</span><br><span style="color: hsl(120, 100%, 40%);">+           msg->data[0] = (msg->data[0] & 0xf8) | usf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Send to GSMTAP */</span><br><span style="color: hsl(120, 100%, 40%);">+          tap_n_acc(msg, bts, trx, ts, fn, gsmtap_cat);</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%);">+   /* send PDTCH/PACCH to L1. msg=NULL accepted too (idle block) */</span><br><span>     pcu_l1if_tx_pdtch(msg, bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr);</span><br><span> </span><br><span>      return 0;</span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index 1600da0..8d9defc 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -212,7 +212,8 @@</span><br><span>     data_req->trx_nr = trx;</span><br><span>   data_req->ts_nr = ts;</span><br><span>     data_req->block_nr = block_nr;</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(data_req->data, data, len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len)</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(data_req->data, data, len);</span><br><span>        data_req->len = len;</span><br><span> </span><br><span>  return pcu_sock_send(msg);</span><br><span>@@ -223,12 +224,20 @@</span><br><span> {</span><br><span> #ifdef ENABLE_DIRECT_PHY</span><br><span>  if (bts->trx[trx].fl1h) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!msg) /* Simply skip sending idle frames to L1 */</span><br><span style="color: hsl(120, 100%, 40%);">+                 return;</span><br><span>              l1if_pdch_req(bts->trx[trx].fl1h, ts, 0, fn, arfcn, block_nr,</span><br><span>                     msg->data, msg->len);</span><br><span>          msgb_free(msg);</span><br><span>              return;</span><br><span>      }</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                         NULL, 0);</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>  pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,</span><br><span>                        msg->data, msg->len);</span><br><span>  msgb_free(msg);</span><br><span>@@ -243,10 +252,17 @@</span><br><span>              gsmtap_send(the_pcu->gsmtap, arfcn, ts, GSMTAP_CHANNEL_PTCCH, 0, fn, 0, 0, data, data_len);</span><br><span> #ifdef ENABLE_DIRECT_PHY</span><br><span>   if (bts->trx[trx].fl1h) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!data_len) /* Simply skip sending idle frames to L1 */</span><br><span style="color: hsl(120, 100%, 40%);">+                    return;</span><br><span>              l1if_pdch_req(bts->trx[trx].fl1h, ts, 1, fn, arfcn, block_nr, data, data_len);</span><br><span>            return;</span><br><span>      }</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!data_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+              pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, NULL, 0);</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>  pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, data_len);</span><br><span> }</span><br><span> </span><br><span>@@ -544,8 +560,11 @@</span><br><span>                * TRX0, since BTS is not preparing dummy bursts on idle TS for us: */</span><br><span>               skip_idle = skip_idle && trx != 0;</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-    if (skip_idle)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (skip_idle) {</span><br><span style="color: hsl(120, 100%, 40%);">+              pcu_l1if_tx_ptcch(bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                           NULL, 0);</span><br><span>          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        pcu_l1if_tx_ptcch(bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr,</span><br><span>                          pdch->ptcch_msg, GSM_MACBLOCK_LEN);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25535">change 25535</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-pcu/+/25535"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ife718eeed2af011479c03099ea109518f04567bc </div>
<div style="display:none"> Gerrit-Change-Number: 25535 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Assignee: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>