<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/19051">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce rate counter tx_stale_bursts<br><br>This allows checking if there's timing issues on the downlink side<br>between osmo-bts-trx and osmo-trx. This counter is useful to find<br>information about osmo-bts-trx 'fn-advance' setting, since this counter<br>basically counts if burstrs from it arrived too late to osmo-trx.<br><br>Change-Id: Id6df00da81f6d6884f4dddc5a2c4b354dca3af97<br>---<br>M CommonLibs/osmo_signal.h<br>M CommonLibs/trx_rate_ctr.cpp<br>M CommonLibs/trx_rate_ctr.h<br>M CommonLibs/trx_vty.c<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>6 files changed, 73 insertions(+), 7 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/51/19051/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/CommonLibs/osmo_signal.h b/CommonLibs/osmo_signal.h</span><br><span>index ceb7d6f..de17b1d 100644</span><br><span>--- a/CommonLibs/osmo_signal.h</span><br><span>+++ b/CommonLibs/osmo_signal.h</span><br><span>@@ -43,6 +43,7 @@</span><br><span>            (struct device_counters). Must be sent with PTHREAD_CANCEL_DISABLE</span><br><span>           to avoid deadlocks in case osmo-trx process is asked to exit. */</span><br><span>  S_DEVICE_COUNTER_CHANGE,</span><br><span style="color: hsl(120, 100%, 40%);">+      S_TRX_COUNTER_CHANGE, /* same, but for Transceiver class */</span><br><span> };</span><br><span> </span><br><span> /* signal cb for signal <SS_DEVICE,S_DEVICE_COUNTER_CHANGE> */</span><br><span>@@ -55,3 +56,9 @@</span><br><span>    unsigned int tx_dropped_events;</span><br><span>      unsigned int tx_dropped_samples;</span><br><span> };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* signal cb for signal <SS_DEVICE,S_TRX_COUNTER_CHANGE> */</span><br><span style="color: hsl(120, 100%, 40%);">+struct trx_counters {</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t chan;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int tx_stale_bursts; /* Amount of Tx bursts dropped to to arriving too late from TRXD */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/CommonLibs/trx_rate_ctr.cpp b/CommonLibs/trx_rate_ctr.cpp</span><br><span>index e941cf0..76aff7d 100644</span><br><span>--- a/CommonLibs/trx_rate_ctr.cpp</span><br><span>+++ b/CommonLibs/trx_rate_ctr.cpp</span><br><span>@@ -75,9 +75,12 @@</span><br><span> </span><br><span> static struct rate_ctr_group** rate_ctrs;</span><br><span> static struct device_counters* dev_ctrs_pending;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct trx_counters* trx_ctrs_pending;</span><br><span> static size_t chan_len;</span><br><span> static struct osmo_fd dev_rate_ctr_timerfd;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_fd trx_rate_ctr_timerfd;</span><br><span> static Mutex dev_rate_ctr_mutex;</span><br><span style="color: hsl(120, 100%, 40%);">+static Mutex trx_rate_ctr_mutex;</span><br><span> </span><br><span> struct osmo_timer_list threshold_timer;</span><br><span> static LLIST_HEAD(threshold_list);</span><br><span>@@ -99,6 +102,7 @@</span><br><span>       { TRX_CTR_DEV_RX_DROP_SMPL,     "rx_drop_samples" },</span><br><span>       { TRX_CTR_DEV_TX_DROP_EV,       "tx_drop_events" },</span><br><span>        { TRX_CTR_DEV_TX_DROP_SMPL,     "tx_drop_samples" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { TRX_CTR_TRX_TX_STALE_BURSTS,  "tx_stale_bursts" },</span><br><span>       { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -108,7 +112,8 @@</span><br><span>  [TRX_CTR_DEV_RX_DROP_EV]                = { "device:rx_drop_events",  "Number of times Rx samples were dropped by HW" },</span><br><span>         [TRX_CTR_DEV_RX_DROP_SMPL]              = { "device:rx_drop_samples", "Number of Rx samples dropped by HW" },</span><br><span>    [TRX_CTR_DEV_TX_DROP_EV]                = { "device:tx_drop_events",  "Number of times Tx samples were dropped by HW" },</span><br><span style="color: hsl(0, 100%, 40%);">-    [TRX_CTR_DEV_TX_DROP_SMPL]              = { "device:tx_drop_samples", "Number of Tx samples dropped by HW" }</span><br><span style="color: hsl(120, 100%, 40%);">+      [TRX_CTR_DEV_TX_DROP_SMPL]              = { "device:tx_drop_samples", "Number of Tx samples dropped by HW" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [TRX_CTR_TRX_TX_STALE_BURSTS]           = { "trx:tx_stale_bursts",    "Number of Tx burts dropped by TRX due to arriving too late" },</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_group_desc trx_chan_ctr_group_desc = {</span><br><span>@@ -150,11 +155,32 @@</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int trx_rate_ctr_timerfd_cb(struct osmo_fd *ofd, unsigned int what) {</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t chan;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct rate_ctr *ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGC(DMAIN, NOTICE) << "Main thread is updating Transceiver counters";</span><br><span style="color: hsl(120, 100%, 40%);">+        dev_rate_ctr_mutex.lock();</span><br><span style="color: hsl(120, 100%, 40%);">+    for (chan = 0; chan < chan_len; chan++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (trx_ctrs_pending[chan].chan == PENDING_CHAN_NONE)</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGCHAN(chan, DMAIN, INFO) << "rate_ctr update";</span><br><span style="color: hsl(120, 100%, 40%);">+              ctr = &rate_ctrs[chan]->ctr[TRX_CTR_TRX_TX_STALE_BURSTS];</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_add(ctr, trx_ctrs_pending[chan].tx_stale_bursts - ctr->current);</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Mark as done */</span><br><span style="color: hsl(120, 100%, 40%);">+            trx_ctrs_pending[chan].chan = PENDING_CHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (osmo_timerfd_disable(&trx_rate_ctr_timerfd) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGC(DMAIN, ERROR) << "Failed to disable timerfd";</span><br><span style="color: hsl(120, 100%, 40%);">+    trx_rate_ctr_mutex.unlock();</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Callback function to be called every time we receive a signal from DEVICE */</span><br><span> static int device_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span>                       void *handler_data, void *signal_data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct device_counters *ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct device_counters *dev_ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct trx_counters *trx_ctr;</span><br><span>        /* Delay sched around 20 ms, in case we receive several calls from several</span><br><span>    * channels batched */</span><br><span>       struct timespec next_sched = {.tv_sec = 0, .tv_nsec = 20*1000*1000};</span><br><span>@@ -163,15 +189,25 @@</span><br><span> </span><br><span>     switch (signal) {</span><br><span>    case S_DEVICE_COUNTER_CHANGE:</span><br><span style="color: hsl(0, 100%, 40%);">-           ctr = (struct device_counters *)signal_data;</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGCHAN(ctr->chan, DMAIN, NOTICE) << "Received counter change from radioDevice";</span><br><span style="color: hsl(120, 100%, 40%);">+           dev_ctr = (struct device_counters *)signal_data;</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGCHAN(dev_ctr->chan, DMAIN, NOTICE) << "Received counter change from radioDevice";</span><br><span>              dev_rate_ctr_mutex.lock();</span><br><span style="color: hsl(0, 100%, 40%);">-              dev_ctrs_pending[ctr->chan] = *ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+                dev_ctrs_pending[dev_ctr->chan] = *dev_ctr;</span><br><span>               if (osmo_timerfd_schedule(&dev_rate_ctr_timerfd, &next_sched, &intv_sched) < 0) {</span><br><span>                     LOGC(DMAIN, ERROR) << "Failed to schedule timerfd: " << errno << " = "<< strerror(errno);</span><br><span>                }</span><br><span>            dev_rate_ctr_mutex.unlock();</span><br><span>                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case S_TRX_COUNTER_CHANGE:</span><br><span style="color: hsl(120, 100%, 40%);">+            trx_ctr = (struct trx_counters *)signal_data;</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGCHAN(trx_ctr->chan, DMAIN, NOTICE) << "Received counter change from Transceiver";</span><br><span style="color: hsl(120, 100%, 40%);">+               trx_rate_ctr_mutex.lock();</span><br><span style="color: hsl(120, 100%, 40%);">+            trx_ctrs_pending[trx_ctr->chan] = *trx_ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (osmo_timerfd_schedule(&trx_rate_ctr_timerfd, &next_sched, &intv_sched) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGC(DMAIN, ERROR) << "Failed to schedule timerfd: " << errno << " = "<< strerror(errno);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             trx_rate_ctr_mutex.unlock();</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span>       default:</span><br><span>             break;</span><br><span>       }</span><br><span>@@ -273,10 +309,12 @@</span><br><span>    trx_rate_ctr_ctx = ctx;</span><br><span>      chan_len = trx_ctx->cfg.num_chans;</span><br><span>        dev_ctrs_pending = (struct device_counters*) talloc_zero_size(ctx, chan_len * sizeof(struct device_counters));</span><br><span style="color: hsl(120, 100%, 40%);">+        trx_ctrs_pending = (struct trx_counters*) talloc_zero_size(ctx, chan_len * sizeof(struct trx_counters));</span><br><span>     rate_ctrs = (struct rate_ctr_group**) talloc_zero_size(ctx, chan_len * sizeof(struct rate_ctr_group*));</span><br><span> </span><br><span>  for (i = 0; i < chan_len; i++) {</span><br><span>          dev_ctrs_pending[i].chan = PENDING_CHAN_NONE;</span><br><span style="color: hsl(120, 100%, 40%);">+         trx_ctrs_pending[i].chan = PENDING_CHAN_NONE;</span><br><span>                rate_ctrs[i] = rate_ctr_group_alloc(ctx, &trx_chan_ctr_group_desc, i);</span><br><span>           if (!rate_ctrs[i]) {</span><br><span>                         LOGCHAN(i, DMAIN, ERROR) << "Failed to allocate rate ctr";</span><br><span>@@ -288,6 +326,11 @@</span><br><span>            LOGC(DMAIN, ERROR) << "Failed to setup timerfd";</span><br><span>             exit(1);</span><br><span>     }</span><br><span style="color: hsl(120, 100%, 40%);">+     trx_rate_ctr_timerfd.fd = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (osmo_timerfd_setup(&trx_rate_ctr_timerfd, trx_rate_ctr_timerfd_cb, NULL) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGC(DMAIN, ERROR) << "Failed to setup timerfd";</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span>    osmo_signal_register_handler(SS_DEVICE, device_sig_cb, NULL);</span><br><span> </span><br><span>    /* Now set up threshold checks */</span><br><span>diff --git a/CommonLibs/trx_rate_ctr.h b/CommonLibs/trx_rate_ctr.h</span><br><span>index e122f99..588ac2f 100644</span><br><span>--- a/CommonLibs/trx_rate_ctr.h</span><br><span>+++ b/CommonLibs/trx_rate_ctr.h</span><br><span>@@ -10,6 +10,7 @@</span><br><span>       TRX_CTR_DEV_RX_DROP_SMPL,</span><br><span>    TRX_CTR_DEV_TX_DROP_EV,</span><br><span>      TRX_CTR_DEV_TX_DROP_SMPL,</span><br><span style="color: hsl(120, 100%, 40%);">+     TRX_CTR_TRX_TX_STALE_BURSTS,</span><br><span> };</span><br><span> </span><br><span> struct ctr_threshold {</span><br><span>diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c</span><br><span>index 3f875f5..f085d09 100644</span><br><span>--- a/CommonLibs/trx_vty.c</span><br><span>+++ b/CommonLibs/trx_vty.c</span><br><span>@@ -390,7 +390,7 @@</span><br><span>  return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define THRESHOLD_ARGS "(rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples|tx_drop_events|tx_drop_samples)"</span><br><span style="color: hsl(120, 100%, 40%);">+#define THRESHOLD_ARGS "(rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples|tx_drop_events|tx_drop_samples|tx_stale_bursts)"</span><br><span> #define THRESHOLD_STR_VAL(s) "Set threshold value for rate_ctr device:" OSMO_STRINGIFY_VAL(s) "\n"</span><br><span> #define THRESHOLD_STRS \</span><br><span>    THRESHOLD_STR_VAL(rx_overruns) \</span><br><span>@@ -398,7 +398,8 @@</span><br><span>       THRESHOLD_STR_VAL(rx_drop_events) \</span><br><span>  THRESHOLD_STR_VAL(rx_drop_samples) \</span><br><span>         THRESHOLD_STR_VAL(tx_drop_events) \</span><br><span style="color: hsl(0, 100%, 40%);">-     THRESHOLD_STR_VAL(tx_drop_samples)</span><br><span style="color: hsl(120, 100%, 40%);">+    THRESHOLD_STR_VAL(tx_drop_samples) \</span><br><span style="color: hsl(120, 100%, 40%);">+  THRESHOLD_STR_VAL(tx_stale_bursts)</span><br><span> #define INTV_ARGS "(per-second|per-minute|per-hour|per-day)"</span><br><span> #define INTV_STR_VAL(s) "Threshold value sampled " OSMO_STRINGIFY_VAL(s) "\n"</span><br><span> #define INTV_STRS \</span><br><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 7a81b7b..941b761 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -420,18 +420,29 @@</span><br><span>   std::vector<signalVector *> bursts(mChans);</span><br><span>   std::vector<bool> zeros(mChans);</span><br><span>   std::vector<bool> filler(mChans, true);</span><br><span style="color: hsl(120, 100%, 40%);">+  bool stale_bursts_changed;</span><br><span> </span><br><span>   for (size_t i = 0; i < mChans; i ++) {</span><br><span>     state = &mStates[i];</span><br><span style="color: hsl(120, 100%, 40%);">+    stale_bursts_changed = false;</span><br><span> </span><br><span>     while ((burst = mTxPriorityQueues[i].getStaleBurst(nowTime))) {</span><br><span>       LOGCHAN(i, DTRXDDL, NOTICE) << "dumping STALE burst in TRX->SDR interface ("</span><br><span>                   << burst->getTime() <<" vs " << nowTime << "), retrans=" << state->mRetrans;</span><br><span style="color: hsl(120, 100%, 40%);">+      state->ctrs.tx_stale_bursts++;</span><br><span style="color: hsl(120, 100%, 40%);">+      stale_bursts_changed = true;</span><br><span>       if (state->mRetrans)</span><br><span>         updateFillerTable(i, burst);</span><br><span>       delete burst;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    if (stale_bursts_changed) {</span><br><span style="color: hsl(120, 100%, 40%);">+      thread_enable_cancel(false);</span><br><span style="color: hsl(120, 100%, 40%);">+      state->ctrs.chan = i;</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_signal_dispatch(SS_DEVICE, S_TRX_COUNTER_CHANGE, &state->ctrs);</span><br><span style="color: hsl(120, 100%, 40%);">+      thread_enable_cancel(true);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     TN = nowTime.TN();</span><br><span>     modFN = nowTime.FN() % state->fillerModulus[TN];</span><br><span> </span><br><span>diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h</span><br><span>index 6e0d157..7ce5fa2 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -83,6 +83,9 @@</span><br><span> </span><br><span>   /* Shadowed downlink attenuation */</span><br><span>   int mPower;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* counters */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct trx_counters ctrs;</span><br><span> };</span><br><span> </span><br><span> /** The Transceiver class, responsible for physical layer of basestation */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/19051">change 19051</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-trx/+/19051"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id6df00da81f6d6884f4dddc5a2c4b354dca3af97 </div>
<div style="display:none"> Gerrit-Change-Number: 19051 </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>