<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/24854">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Indicate to the BTS whether DATA.req contains a dummy block<br><br>This will allow the BTS to decide whether transmission of a given<br>DATA.req can be avoided on non-BCCH carriers for the purpose of energy<br>saving.  The idea is simple: if a PDCH timeslot has no Uplink nor<br>Downlink TBFs allocated, then (most likely) nobody is listening to it.<br><br>Add a new field 'flags' to DATA.req message, and use the first LSB bit<br>to indicate that it contains a potentially ignorable RLC/MAC block.<br><br>Given that INFO.ind is currently the longest possible message, we<br>can easily add new fields to shorter messages like DATA.{ind,req}.<br><br>Change-Id: I72c7f0f0853f2bda77c20e3ec1bcd0c7c815c750<br>Related: SYS#4919, OS#4772<br>---<br>M include/osmocom/pcu/pcuif_proto.h<br>M src/gprs_rlcmac_sched.cpp<br>M src/pcu_l1_if.cpp<br>M src/pcu_l1_if.h<br>4 files changed, 32 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/54/24854/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/pcu/pcuif_proto.h b/include/osmocom/pcu/pcuif_proto.h</span><br><span>index 23b7a2c..caa52bb 100644</span><br><span>--- a/include/osmocom/pcu/pcuif_proto.h</span><br><span>+++ b/include/osmocom/pcu/pcuif_proto.h</span><br><span>@@ -70,6 +70,9 @@</span><br><span>   char            text[TXT_MAX_LEN]; /* Text to be transmitted to BTS */</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Indicates that the PDU contains a dummy RLC/MAC block */</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCU_IF_DATA_F_DUMMY             (1 << 0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_pcu_if_data {</span><br><span>         uint8_t         sapi;</span><br><span>        uint8_t         len;</span><br><span>@@ -83,6 +86,7 @@</span><br><span>     uint16_t        ber10k;         /* !< \brief BER in units of 0.01% */</span><br><span>     int16_t         ta_offs_qbits;  /* !< \brief Burst TA Offset in quarter bits */</span><br><span>   int16_t         lqual_cb;       /* !< \brief Link quality in centiBel */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t         flags;          /* !< \brief See PCU_IF_DATA_F_* above */</span><br><span> } __attribute__ ((packed));</span><br><span> </span><br><span> /* data confirmation with direct tlli (instead of raw mac block with tlli) */</span><br><span>diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp</span><br><span>index 2adf1f3..c99c45b 100644</span><br><span>--- a/src/gprs_rlcmac_sched.cpp</span><br><span>+++ b/src/gprs_rlcmac_sched.cpp</span><br><span>@@ -421,6 +421,7 @@</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 style="color: hsl(120, 100%, 40%);">+      uint8_t flags = 0x00;</span><br><span> </span><br><span>    if (trx >= 8 || ts >= 8)</span><br><span>               return -EINVAL;</span><br><span>@@ -495,6 +496,12 @@</span><br><span>       else if ((msg = sched_dummy())) {</span><br><span>            /* increase counter */</span><br><span>               gsmtap_cat = PCU_GSMTAP_C_DL_DUMMY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* the BTS can potentially suspend transmission of this block */</span><br><span style="color: hsl(120, 100%, 40%);">+              const unsigned num_tbfs = pdch->num_tbfs(GPRS_RLCMAC_DL_TBF)</span><br><span style="color: hsl(120, 100%, 40%);">+                                       + pdch->num_tbfs(GPRS_RLCMAC_UL_TBF);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (num_tbfs == 0 && usf_tbf == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                 flags |= PCU_IF_DATA_F_DUMMY;</span><br><span>        } else {</span><br><span>             return -ENOMEM;</span><br><span>      }</span><br><span>@@ -520,7 +527,7 @@</span><br><span>      tap_n_acc(msg, bts, trx, ts, fn, gsmtap_cat);</span><br><span> </span><br><span>    /* send PDTCH/PACCH to L1 */</span><br><span style="color: hsl(0, 100%, 40%);">-    pcu_l1if_tx_pdtch(msg, bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   pcu_l1if_tx_pdtch(msg, bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr, flags);</span><br><span> </span><br><span>       return 0;</span><br><span> }</span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index 5aa8849..0432923 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -170,8 +170,7 @@</span><br><span> }</span><br><span> </span><br><span> static int pcu_tx_data_req(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint8_t sapi,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t *data,</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t *data, uint8_t len, uint8_t flags)</span><br><span> {</span><br><span>       struct msgb *msg;</span><br><span>    struct gsm_pcu_if *pcu_prim;</span><br><span>@@ -196,12 +195,13 @@</span><br><span>         data_req->block_nr = block_nr;</span><br><span>    memcpy(data_req->data, data, len);</span><br><span>        data_req->len = len;</span><br><span style="color: hsl(120, 100%, 40%);">+       data_req->flags = flags;</span><br><span> </span><br><span>      return pcu_sock_send(msg);</span><br><span> }</span><br><span> </span><br><span> void pcu_l1if_tx_pdtch(msgb *msg, struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span style="color: hsl(0, 100%, 40%);">-  uint32_t fn, uint8_t block_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint32_t fn, uint8_t block_nr, uint8_t flags)</span><br><span> {</span><br><span> #ifdef ENABLE_DIRECT_PHY</span><br><span>        if (bts->trx[trx].fl1h) {</span><br><span>@@ -212,14 +212,15 @@</span><br><span>         }</span><br><span> #endif</span><br><span>  pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PDTCH, arfcn, fn, block_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                   msg->data, msg->len);</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg->data, msg->len, flags);</span><br><span>   msgb_free(msg);</span><br><span> }</span><br><span> </span><br><span> void pcu_l1if_tx_ptcch(struct gprs_rlcmac_bts *bts,</span><br><span>                     uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span>                     uint32_t fn, uint8_t block_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint8_t *data, size_t data_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t *data, size_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t flags)</span><br><span> {</span><br><span>   if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PTCCH))</span><br><span>          gsmtap_send(the_pcu->gsmtap, arfcn, ts, GSMTAP_CHANNEL_PTCCH, 0, fn, 0, 0, data, data_len);</span><br><span>@@ -229,7 +230,7 @@</span><br><span>                 return;</span><br><span>      }</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-     pcu_tx_data_req(bts, trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, 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, data, data_len, flags);</span><br><span> }</span><br><span> </span><br><span> void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen)</span><br><span>@@ -243,7 +244,7 @@</span><br><span>         if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_AGCH))</span><br><span>           gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_AGCH, 0, 0, 0, 0, data, GSM_MACBLOCK_LEN);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+        pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, GSM_MACBLOCK_LEN, 0x00);</span><br><span> }</span><br><span> </span><br><span> void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen, uint16_t pgroup)</span><br><span>@@ -268,7 +269,7 @@</span><br><span>  if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PCH))</span><br><span>            gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_PCH, 0, 0, 0, 0, data + 3, GSM_MACBLOCK_LEN);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, PAGING_GROUP_LEN + GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+      pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_PCH, 0, 0, 0, data, PAGING_GROUP_LEN + GSM_MACBLOCK_LEN, 0x00);</span><br><span> }</span><br><span> </span><br><span> void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no)</span><br><span>@@ -471,6 +472,7 @@</span><br><span>     uint32_t fn, uint8_t block_nr)</span><br><span> {</span><br><span>  struct gprs_rlcmac_pdch *pdch;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t flags = 0x00;</span><br><span> </span><br><span>    /* Prevent buffer overflow */</span><br><span>        if (trx >= ARRAY_SIZE(bts->trx) || ts >= 8)</span><br><span>@@ -481,8 +483,14 @@</span><br><span>  if (!pdch->m_is_enabled)</span><br><span>          return -EAGAIN;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* determine if the BTS can suspend transmission of this block */</span><br><span style="color: hsl(120, 100%, 40%);">+     const unsigned num_tbfs = pdch->num_tbfs(GPRS_RLCMAC_DL_TBF)</span><br><span style="color: hsl(120, 100%, 40%);">+                               + pdch->num_tbfs(GPRS_RLCMAC_UL_TBF);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (num_tbfs == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+            flags |= PCU_IF_DATA_F_DUMMY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      pcu_l1if_tx_ptcch(bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                     pdch->ptcch_msg, GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+                        pdch->ptcch_msg, GSM_MACBLOCK_LEN, flags);</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h</span><br><span>index 2a4f0ea..26e092e 100644</span><br><span>--- a/src/pcu_l1_if.h</span><br><span>+++ b/src/pcu_l1_if.h</span><br><span>@@ -145,11 +145,12 @@</span><br><span> #ifdef __cplusplus</span><br><span> struct gprs_rlcmac_bts;</span><br><span> void pcu_l1if_tx_pdtch(msgb *msg, struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,</span><br><span style="color: hsl(0, 100%, 40%);">-                uint16_t arfcn, uint32_t fn, uint8_t block_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint16_t arfcn, uint32_t fn, uint8_t block_nr, uint8_t flags);</span><br><span> void pcu_l1if_tx_ptcch(struct gprs_rlcmac_bts *bts,</span><br><span>                        uint8_t trx, uint8_t ts, uint16_t arfcn,</span><br><span>                     uint32_t fn, uint8_t block_nr,</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint8_t *data, size_t data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t *data, size_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+                       uint8_t flags);</span><br><span> void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec * block, int len);</span><br><span> </span><br><span> void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec * block, int plen, uint16_t pgroup);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/24854">change 24854</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/+/24854"/><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: I72c7f0f0853f2bda77c20e3ec1bcd0c7c815c750 </div>
<div style="display:none"> Gerrit-Change-Number: 24854 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>