<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/14336">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;">l1sap: Compute statistics on FN advance in PH-RTS.ind<br><br>Let's keep some statistics about the min/max/average frame number<br>advance that we're observing above L1SAP when comparing the time in the<br>PH-RTS.ind and the frame number we observe in PH-DATA.ind of data<br>that was received on the uplink.<br><br>The statistics are currently only shown in the VTY, but this is a<br>precursor to using them to correctly advance the LAPDm timers in a<br>follow-up patch.<br><br>Change-Id: I8f739fdb808a614f080afbc4654641ec3df19eb2<br>Related: OS#2294<br>Related: OS#3906<br>---<br>M include/osmo-bts/bts.h<br>M include/osmo-bts/gsm_data_shared.h<br>M src/common/bts.c<br>M src/common/l1sap.c<br>M src/common/vty.c<br>5 files changed, 46 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index 970fb1b..4d13214 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -65,5 +65,7 @@</span><br><span> int bts_supports_cm(struct gsm_bts *bts, enum gsm_phys_chan_config pchan,</span><br><span>                     enum gsm48_chan_mode cm);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int32_t bts_get_avg_fn_advance(struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _BTS_H */</span><br><span> </span><br><span>diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h</span><br><span>index 90772e2..f972a67 100644</span><br><span>--- a/include/osmo-bts/gsm_data_shared.h</span><br><span>+++ b/include/osmo-bts/gsm_data_shared.h</span><br><span>@@ -738,6 +738,14 @@</span><br><span>             uint8_t tc4_ctr;</span><br><span>     } si;</span><br><span>        struct gsm_time gsm_time;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* frame number statistics (FN in PH-RTS.ind vs. PH-DATA.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              int32_t min;            /* minimum observed */</span><br><span style="color: hsl(120, 100%, 40%);">+                int32_t max;            /* maximum observed */</span><br><span style="color: hsl(120, 100%, 40%);">+                int32_t avg256;         /* accumulator */</span><br><span style="color: hsl(120, 100%, 40%);">+             uint32_t avg_count;     /* number of samples accumulated in avg256 */</span><br><span style="color: hsl(120, 100%, 40%);">+         uint32_t avg_window;    /* number of averages in avg_count */</span><br><span style="color: hsl(120, 100%, 40%);">+ } fn_stats;</span><br><span>  /* Radio Link Timeout counter. -1 disables timeout for</span><br><span>        * lab/measurement purpose */</span><br><span>        int radio_link_timeout;</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index 596e5e0..c57d9f4 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -223,6 +223,11 @@</span><br><span>  rc = osmo_fsm_register(&dtx_dl_amr_fsm);</span><br><span>         OSMO_ASSERT(rc == 0);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     bts->fn_stats.min = INT32_MAX;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->fn_stats.max = INT32_MIN;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->fn_stats.avg_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->fn_stats.avg_window = 256;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         return rc;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index 59d5b93..b730b85 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -719,6 +719,33 @@</span><br><span>         return l1sap_fn2ccch_block(fn) < num_agch(trx, "PH-RTS-IND");</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* return the measured average of frame numbers that the RTS clock is running in advance */</span><br><span style="color: hsl(120, 100%, 40%);">+int32_t bts_get_avg_fn_advance(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bts->fn_stats.avg_count == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return bts->fn_stats.avg256 / bts->fn_stats.avg_count;</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%);">+static void l1sap_update_fnstats(struct gsm_bts *bts, uint32_t rts_fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int32_t delta = (rts_fn + GSM_HYPERFRAME - bts->gsm_time.fn) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (delta < bts->fn_stats.min)</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->fn_stats.min = delta;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (delta > bts->fn_stats.max)</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->fn_stats.max = delta;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (bts->fn_stats.avg_count > bts->fn_stats.avg_window) {</span><br><span style="color: hsl(120, 100%, 40%);">+            /* reset and start old average and new sample */</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->fn_stats.avg256 = (bts->fn_stats.avg256 / bts->fn_stats.avg_count) + delta;</span><br><span style="color: hsl(120, 100%, 40%);">+             bts->fn_stats.avg_count = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->fn_stats.avg256 += delta;</span><br><span style="color: hsl(120, 100%, 40%);">+             bts->fn_stats.avg_count++;</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> /* PH-RTS-IND prim received from bts model */</span><br><span> static int l1sap_ph_rts_ind(struct gsm_bts_trx *trx,</span><br><span>      struct osmo_phsap_prim *l1sap, struct ph_data_param *rts_ind)</span><br><span>@@ -745,6 +772,8 @@</span><br><span> </span><br><span>      DEBUGPGT(DL1P, &g_time, "Rx PH-RTS.ind chan_nr=%s link_id=0x%02xd\n", rsl_chan_nr_str(chan_nr), link_id);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   l1sap_update_fnstats(trx->bts, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* reuse PH-RTS.ind for PH-DATA.req */</span><br><span>       if (!msg) {</span><br><span>          LOGPGT(DL1P, LOGL_FATAL, &g_time, "RTS without msg to be reused. Please fix!\n");</span><br><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index 1d25bfb..f4fc181 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -895,6 +895,8 @@</span><br><span>           VTY_NEWLINE);</span><br><span>        vty_out(vty, "  OML Link state: %s.%s",</span><br><span>            bts->oml_link ? "connected" : "disconnected", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, "  PH-RTS.ind FN advance average: %d, min: %d, max: %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+             bts_get_avg_fn_advance(bts), bts->fn_stats.min, bts->fn_stats.max, VTY_NEWLINE);</span><br><span> </span><br><span>   llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span>             struct phy_instance *pinst = trx_phy_instance(trx);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/14336">change 14336</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-bts/+/14336"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I8f739fdb808a614f080afbc4654641ec3df19eb2 </div>
<div style="display:none"> Gerrit-Change-Number: 14336 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>