<p>osmith <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25400">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add stats: pcu.bts.N.pdch.occupied.gprs/egprs<br><br>Add stats needed for performance measurements in<br>3GPP TS 52.402 § B.2.1.54-55.<br><br>Split m_num_tbfs to count GPRS and EGPRS TBFs separately. Move the code<br>that updates m_num_tbfs and sets the PDCH_OCCUPIED stats to a separate<br>function, as it's mostly the same in the TBF attach and detach.<br><br>Related: SYS#4878<br>Change-Id: I0c0a1121b4ae5f031782e7e63a0c28eb0b6c8b42<br>---<br>M src/bts.cpp<br>M src/bts.h<br>M src/pdch.cpp<br>M src/pdch.h<br>M src/tbf.cpp<br>M src/tbf.h<br>6 files changed, 65 insertions(+), 26 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/bts.cpp b/src/bts.cpp</span><br><span>index beb626d..c463606 100644</span><br><span>--- a/src/bts.cpp</span><br><span>+++ b/src/bts.cpp</span><br><span>@@ -201,7 +201,11 @@</span><br><span> OSMO_STAT_ITEM_NO_UNIT, 4, 0},</span><br><span> { "pdch.available", "PDCH available ",</span><br><span> OSMO_STAT_ITEM_NO_UNIT, 50, 0},</span><br><span style="color: hsl(0, 100%, 40%);">- { "pdch.occupied", "PDCH occupied ",</span><br><span style="color: hsl(120, 100%, 40%);">+ { "pdch.occupied", "PDCH occupied (all) ",</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_STAT_ITEM_NO_UNIT, 50, 0},</span><br><span style="color: hsl(120, 100%, 40%);">+ { "pdch.occupied.gprs", "PDCH occupied (GPRS) ",</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_STAT_ITEM_NO_UNIT, 50, 0},</span><br><span style="color: hsl(120, 100%, 40%);">+ { "pdch.occupied.egprs","PDCH occupied (EGPRS)",</span><br><span> OSMO_STAT_ITEM_NO_UNIT, 50, 0},</span><br><span> };</span><br><span> </span><br><span>diff --git a/src/bts.h b/src/bts.h</span><br><span>index a6e7150..d9a86eb 100644</span><br><span>--- a/src/bts.h</span><br><span>+++ b/src/bts.h</span><br><span>@@ -184,6 +184,8 @@</span><br><span> STAT_MS_PRESENT,</span><br><span> STAT_PDCH_AVAILABLE,</span><br><span> STAT_PDCH_OCCUPIED,</span><br><span style="color: hsl(120, 100%, 40%);">+ STAT_PDCH_OCCUPIED_GPRS,</span><br><span style="color: hsl(120, 100%, 40%);">+ STAT_PDCH_OCCUPIED_EGPRS,</span><br><span> };</span><br><span> </span><br><span> /* RACH.ind parameters (to be parsed) */</span><br><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index e213c28..d10ee4a 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -1036,6 +1036,33 @@</span><br><span> return tbf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_rlcmac_pdch::num_tbfs_update(gprs_rlcmac_tbf *tbf, bool is_attach)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int threshold = is_attach ? 0 : 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ int inc = is_attach ? 1 : -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ul_dl_gprs = m_num_tbfs_gprs[GPRS_RLCMAC_UL_TBF] +</span><br><span style="color: hsl(120, 100%, 40%);">+ m_num_tbfs_gprs[GPRS_RLCMAC_DL_TBF];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ul_dl_egprs = m_num_tbfs_egprs[GPRS_RLCMAC_UL_TBF] +</span><br><span style="color: hsl(120, 100%, 40%);">+ m_num_tbfs_egprs[GPRS_RLCMAC_DL_TBF];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Count PDCHs with at least one TBF as "occupied", as in</span><br><span style="color: hsl(120, 100%, 40%);">+ * 3GPP TS 52.402 § B.2.1.42-44. So if transitioning from 0 (threshold)</span><br><span style="color: hsl(120, 100%, 40%);">+ * TBFs in this PDCH to 1, increase the counter by 1 (inc). */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ul_dl_gprs + ul_dl_egprs == threshold)</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_stat_item_add(trx->bts, STAT_PDCH_OCCUPIED, inc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Update occupied GPRS/EGPRS stats (§ B.2.1.54-55) too */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tbf->is_egprs_enabled() && ul_dl_egprs == threshold)</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_stat_item_add(trx->bts, STAT_PDCH_OCCUPIED_EGPRS, inc);</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (!tbf->is_egprs_enabled() && ul_dl_gprs == threshold)</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_stat_item_add(trx->bts, STAT_PDCH_OCCUPIED_GPRS, inc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tbf->is_egprs_enabled())</span><br><span style="color: hsl(120, 100%, 40%);">+ m_num_tbfs_egprs[tbf->direction] += inc;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ m_num_tbfs_gprs[tbf->direction] += inc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void gprs_rlcmac_pdch::attach_tbf(gprs_rlcmac_tbf *tbf)</span><br><span> {</span><br><span> gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span>@@ -1045,13 +1072,7 @@</span><br><span> "%s has not been detached, overwriting it\n",</span><br><span> m_tbfs[tbf->direction][tbf->tfi()]->name());</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Count PDCHs with at least one TBF as "occupied", as in</span><br><span style="color: hsl(0, 100%, 40%);">- * 3GPP TS 52.402 § B.2.1.42-44. So if transitioning from 0 TBFs in</span><br><span style="color: hsl(0, 100%, 40%);">- * this PDCH to 1, increase the counter by 1. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (m_num_tbfs[GPRS_RLCMAC_UL_TBF] + m_num_tbfs[GPRS_RLCMAC_DL_TBF] == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- bts_stat_item_inc(trx->bts, STAT_PDCH_OCCUPIED);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- m_num_tbfs[tbf->direction] += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ num_tbfs_update(tbf, true);</span><br><span> if (tbf->direction == GPRS_RLCMAC_UL_TBF) {</span><br><span> ul_tbf = as_ul_tbf(tbf);</span><br><span> m_assigned_usf |= 1 << ul_tbf->m_usf[ts_no];</span><br><span>@@ -1061,7 +1082,7 @@</span><br><span> </span><br><span> LOGPDCH(this, DRLCMAC, LOGL_INFO, "Attaching %s, %d TBFs, "</span><br><span> "USFs = %02x, TFIs = %08x.\n",</span><br><span style="color: hsl(0, 100%, 40%);">- tbf->name(), m_num_tbfs[tbf->direction],</span><br><span style="color: hsl(120, 100%, 40%);">+ tbf->name(), num_tbfs(tbf->direction),</span><br><span> m_assigned_usf, m_assigned_tfi[tbf->direction]);</span><br><span> }</span><br><span> </span><br><span>@@ -1069,15 +1090,13 @@</span><br><span> {</span><br><span> gprs_rlcmac_ul_tbf *ul_tbf;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(m_num_tbfs[tbf->direction] > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (tbf->is_egprs_enabled()) {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(m_num_tbfs_egprs[tbf->direction] > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(m_num_tbfs_gprs[tbf->direction] > 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Count PDCHs with at least one TBF as "occupied", as in</span><br><span style="color: hsl(0, 100%, 40%);">- * 3GPP TS 52.402 § B.2.1.42-44. So if transitioning from 1 TBFs in</span><br><span style="color: hsl(0, 100%, 40%);">- * this PDCH to 0, decrease the counter by 1. */</span><br><span style="color: hsl(0, 100%, 40%);">- if (m_num_tbfs[GPRS_RLCMAC_UL_TBF] + m_num_tbfs[GPRS_RLCMAC_DL_TBF] == 1)</span><br><span style="color: hsl(0, 100%, 40%);">- bts_stat_item_dec(trx->bts, STAT_PDCH_OCCUPIED);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- m_num_tbfs[tbf->direction] -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ num_tbfs_update(tbf, false);</span><br><span> if (tbf->direction == GPRS_RLCMAC_UL_TBF) {</span><br><span> ul_tbf = as_ul_tbf(tbf);</span><br><span> m_assigned_usf &= ~(1 << ul_tbf->m_usf[ts_no]);</span><br><span>@@ -1089,7 +1108,7 @@</span><br><span> </span><br><span> LOGPDCH(this, DRLCMAC, LOGL_INFO, "Detaching %s, %d TBFs, "</span><br><span> "USFs = %02x, TFIs = %08x.\n",</span><br><span style="color: hsl(0, 100%, 40%);">- tbf->name(), m_num_tbfs[tbf->direction],</span><br><span style="color: hsl(120, 100%, 40%);">+ tbf->name(), num_tbfs(tbf->direction),</span><br><span> m_assigned_usf, m_assigned_tfi[tbf->direction]);</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/pdch.h b/src/pdch.h</span><br><span>index 00f0b9d..9405606 100644</span><br><span>--- a/src/pdch.h</span><br><span>+++ b/src/pdch.h</span><br><span>@@ -78,6 +78,7 @@</span><br><span> void detach_tbf(gprs_rlcmac_tbf *tbf);</span><br><span> </span><br><span> unsigned num_tbfs(enum gprs_rlcmac_tbf_direction dir) const;</span><br><span style="color: hsl(120, 100%, 40%);">+ void num_tbfs_update(gprs_rlcmac_tbf *tbf, bool is_attach);</span><br><span> </span><br><span> void reserve(enum gprs_rlcmac_tbf_direction dir);</span><br><span> void unreserve(enum gprs_rlcmac_tbf_direction dir);</span><br><span>@@ -147,7 +148,8 @@</span><br><span> void free_resources();</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t m_num_tbfs[2];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t m_num_tbfs_gprs[2];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t m_num_tbfs_egprs[2];</span><br><span> uint8_t m_num_reserved[2];</span><br><span> uint8_t m_assigned_usf; /* bit set */</span><br><span> uint32_t m_assigned_tfi[2]; /* bit set */</span><br><span>@@ -158,7 +160,7 @@</span><br><span> </span><br><span> inline unsigned gprs_rlcmac_pdch::num_tbfs(enum gprs_rlcmac_tbf_direction dir) const</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return m_num_tbfs[dir];</span><br><span style="color: hsl(120, 100%, 40%);">+ return m_num_tbfs_gprs[dir] + m_num_tbfs_egprs[dir];</span><br><span> }</span><br><span> </span><br><span> inline unsigned gprs_rlcmac_pdch::num_reserved(</span><br><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 4154d50..31dec72 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -763,6 +763,24 @@</span><br><span> return ts == control_ts;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void gprs_rlcmac_tbf::enable_egprs()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Decrease GPRS TBF count of attached PDCHs */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (size_t ts = 0; ts < ARRAY_SIZE(pdch); ts++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pdch[ts])</span><br><span style="color: hsl(120, 100%, 40%);">+ pdch[ts]->num_tbfs_update(this, false);</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%);">+ m_egprs_enabled = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ window()->set_sns(RLC_EGPRS_SNS);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Increase EGPRS TBF count of attached PDCHs */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (size_t ts = 0; ts < ARRAY_SIZE(pdch); ts++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pdch[ts])</span><br><span style="color: hsl(120, 100%, 40%);">+ pdch[ts]->num_tbfs_update(this, true);</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> /* C API */</span><br><span> enum tbf_fsm_states tbf_state(const struct gprs_rlcmac_tbf *tbf)</span><br><span> {</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 0932933..3aaf9fb 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -354,12 +354,6 @@</span><br><span> return m_egprs_enabled;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-inline void gprs_rlcmac_tbf::enable_egprs()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- m_egprs_enabled = true;</span><br><span style="color: hsl(0, 100%, 40%);">- window()->set_sns(RLC_EGPRS_SNS);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> inline enum gprs_rlcmac_tbf_direction reverse(enum gprs_rlcmac_tbf_direction dir)</span><br><span> {</span><br><span> return (enum gprs_rlcmac_tbf_direction)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25400">change 25400</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/+/25400"/><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: I0c0a1121b4ae5f031782e7e63a0c28eb0b6c8b42 </div>
<div style="display:none"> Gerrit-Change-Number: 25400 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </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>