aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CommonLibs/osmo_signal.h3
-rw-r--r--CommonLibs/trx_rate_ctr.cpp16
-rw-r--r--CommonLibs/trx_rate_ctr.h3
-rw-r--r--CommonLibs/trx_vty.c7
-rw-r--r--Transceiver52M/device/lms/LMSDevice.cpp86
-rw-r--r--Transceiver52M/device/lms/LMSDevice.h3
-rw-r--r--doc/manuals/chapters/counters_generated.adoc17
-rw-r--r--doc/manuals/vty/trx_vty_reference.xml22
8 files changed, 104 insertions, 53 deletions
diff --git a/CommonLibs/osmo_signal.h b/CommonLibs/osmo_signal.h
index ee7e2a4..ceb7d6f 100644
--- a/CommonLibs/osmo_signal.h
+++ b/CommonLibs/osmo_signal.h
@@ -48,9 +48,10 @@ enum SS_DEVICE {
/* signal cb for signal <SS_DEVICE,S_DEVICE_COUNTER_CHANGE> */
struct device_counters {
size_t chan;
- unsigned int rx_underruns;
unsigned int rx_overruns;
unsigned int tx_underruns;
unsigned int rx_dropped_events;
unsigned int rx_dropped_samples;
+ unsigned int tx_dropped_events;
+ unsigned int tx_dropped_samples;
};
diff --git a/CommonLibs/trx_rate_ctr.cpp b/CommonLibs/trx_rate_ctr.cpp
index 43e4189..a9ef88c 100644
--- a/CommonLibs/trx_rate_ctr.cpp
+++ b/CommonLibs/trx_rate_ctr.cpp
@@ -93,20 +93,22 @@ const struct value_string rate_ctr_intv[] = {
};
const struct value_string trx_chan_ctr_names[] = {
- { TRX_CTR_RX_UNDERRUNS, "rx_underruns" },
{ TRX_CTR_RX_OVERRUNS, "rx_overruns" },
{ TRX_CTR_TX_UNDERRUNS, "tx_underruns" },
{ TRX_CTR_RX_DROP_EV, "rx_drop_events" },
{ TRX_CTR_RX_DROP_SMPL, "rx_drop_samples" },
+ { TRX_CTR_TX_DROP_EV, "tx_drop_events" },
+ { TRX_CTR_TX_DROP_SMPL, "tx_drop_samples" },
{ 0, NULL }
};
static const struct rate_ctr_desc trx_chan_ctr_desc[] = {
- [TRX_CTR_RX_UNDERRUNS] = { "device:rx_underruns", "Number of Rx underruns" },
- [TRX_CTR_RX_OVERRUNS] = { "device:rx_overruns", "Number of Rx overruns" },
- [TRX_CTR_TX_UNDERRUNS] = { "device:tx_underruns", "Number of Tx underruns" },
+ [TRX_CTR_RX_OVERRUNS] = { "device:rx_overruns", "Number of Rx overruns in FIFO queue" },
+ [TRX_CTR_TX_UNDERRUNS] = { "device:tx_underruns", "Number of Tx underruns in FIFO queue" },
[TRX_CTR_RX_DROP_EV] = { "device:rx_drop_events", "Number of times Rx samples were dropped by HW" },
[TRX_CTR_RX_DROP_SMPL] = { "device:rx_drop_samples", "Number of Rx samples dropped by HW" },
+ [TRX_CTR_TX_DROP_EV] = { "device:tx_drop_events", "Number of times Tx samples were dropped by HW" },
+ [TRX_CTR_TX_DROP_SMPL] = { "device:tx_drop_samples", "Number of Tx samples dropped by HW" }
};
static const struct rate_ctr_group_desc trx_chan_ctr_group_desc = {
@@ -126,8 +128,6 @@ static int rate_ctr_timerfd_cb(struct osmo_fd *ofd, unsigned int what) {
if (ctrs_pending[chan].chan == PENDING_CHAN_NONE)
continue;
LOGCHAN(chan, DMAIN, INFO) << "rate_ctr update";
- ctr = &rate_ctrs[chan]->ctr[TRX_CTR_RX_UNDERRUNS];
- rate_ctr_add(ctr, ctrs_pending[chan].rx_underruns - ctr->current);
ctr = &rate_ctrs[chan]->ctr[TRX_CTR_RX_OVERRUNS];
rate_ctr_add(ctr, ctrs_pending[chan].rx_overruns - ctr->current);
ctr = &rate_ctrs[chan]->ctr[TRX_CTR_TX_UNDERRUNS];
@@ -136,6 +136,10 @@ static int rate_ctr_timerfd_cb(struct osmo_fd *ofd, unsigned int what) {
rate_ctr_add(ctr, ctrs_pending[chan].rx_dropped_events - ctr->current);
ctr = &rate_ctrs[chan]->ctr[TRX_CTR_RX_DROP_SMPL];
rate_ctr_add(ctr, ctrs_pending[chan].rx_dropped_samples - ctr->current);
+ ctr = &rate_ctrs[chan]->ctr[TRX_CTR_TX_DROP_EV];
+ rate_ctr_add(ctr, ctrs_pending[chan].tx_dropped_events - ctr->current);
+ ctr = &rate_ctrs[chan]->ctr[TRX_CTR_TX_DROP_SMPL];
+ rate_ctr_add(ctr, ctrs_pending[chan].tx_dropped_samples - ctr->current);
/* Mark as done */
ctrs_pending[chan].chan = PENDING_CHAN_NONE;
diff --git a/CommonLibs/trx_rate_ctr.h b/CommonLibs/trx_rate_ctr.h
index 6e4fa4d..155f413 100644
--- a/CommonLibs/trx_rate_ctr.h
+++ b/CommonLibs/trx_rate_ctr.h
@@ -4,11 +4,12 @@
#include <osmocom/vty/command.h>
enum TrxCtr {
- TRX_CTR_RX_UNDERRUNS,
TRX_CTR_RX_OVERRUNS,
TRX_CTR_TX_UNDERRUNS,
TRX_CTR_RX_DROP_EV,
TRX_CTR_RX_DROP_SMPL,
+ TRX_CTR_TX_DROP_EV,
+ TRX_CTR_TX_DROP_SMPL,
};
struct ctr_threshold {
diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c
index e184f49..bac9653 100644
--- a/CommonLibs/trx_vty.c
+++ b/CommonLibs/trx_vty.c
@@ -384,14 +384,15 @@ static int vty_intv_name_2_id(const char* str) {
return -1;
}
-#define THRESHOLD_ARGS "(rx_underruns|rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples)"
+#define THRESHOLD_ARGS "(rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples|tx_drop_events|tx_drop_samples)"
#define THRESHOLD_STR_VAL(s) "Set threshold value for rate_ctr device:" OSMO_STRINGIFY_VAL(s) "\n"
#define THRESHOLD_STRS \
- THRESHOLD_STR_VAL(rx_underruns) \
THRESHOLD_STR_VAL(rx_overruns) \
THRESHOLD_STR_VAL(tx_underruns) \
THRESHOLD_STR_VAL(rx_drop_events) \
- THRESHOLD_STR_VAL(rx_drop_samples)
+ THRESHOLD_STR_VAL(rx_drop_samples) \
+ THRESHOLD_STR_VAL(tx_drop_events) \
+ THRESHOLD_STR_VAL(tx_drop_samples)
#define INTV_ARGS "(per-second|per-minute|per-hour|per-day)"
#define INTV_STR_VAL(s) "Threshold value sampled " OSMO_STRINGIFY_VAL(s) "\n"
#define INTV_STRS \
diff --git a/Transceiver52M/device/lms/LMSDevice.cpp b/Transceiver52M/device/lms/LMSDevice.cpp
index 0eaf0a3..f55b555 100644
--- a/Transceiver52M/device/lms/LMSDevice.cpp
+++ b/Transceiver52M/device/lms/LMSDevice.cpp
@@ -574,38 +574,37 @@ GSM::Time LMSDevice::minLatency() {
/* UNUSED on limesdr (only used on usrp1/2) */
return GSM::Time(0,0);
}
-
-void LMSDevice::update_stream_stats(size_t chan, bool * underrun, bool * overrun)
+/*!
+ * Issue tracking description of several events: https://github.com/myriadrf/LimeSuite/issues/265
+ */
+void LMSDevice::update_stream_stats_rx(size_t chan, bool *overrun)
{
lms_stream_status_t status;
bool changed = false;
if (LMS_GetStreamStatus(&m_lms_stream_rx[chan], &status) != 0) {
- LOGCHAN(chan, DDEV, ERROR) << "LMS_GetStreamStatus failed";
+ LOGCHAN(chan, DDEV, ERROR) << "Rx LMS_GetStreamStatus failed";
return;
}
- if (status.underrun) {
- changed = true;
- *underrun = true;
- LOGCHAN(chan, DDEV, ERROR) << "recv Underrun! ("
- << m_ctr[chan].rx_underruns << " -> "
- << status.underrun << ")";
- }
- m_ctr[chan].rx_underruns += status.underrun;
-
+ /* FIFO overrun is counted when Rx FIFO is full but new data comes from
+ the board and oldest samples in FIFO are overwritte. Value count
+ since the last call to LMS_GetStreamStatus(stream). */
if (status.overrun) {
changed = true;
*overrun = true;
- LOGCHAN(chan, DDEV, ERROR) << "recv Overrun! ("
+ LOGCHAN(chan, DDEV, ERROR) << "Rx Overrun! ("
<< m_ctr[chan].rx_overruns << " -> "
<< status.overrun << ")";
}
m_ctr[chan].rx_overruns += status.overrun;
+ /* Dropped packets in Rx are counted when gaps in Rx timestamps are
+ detected (likely because buffer oveflow in hardware). Value count
+ since the last call to LMS_GetStreamStatus(stream). */
if (status.droppedPackets) {
changed = true;
- LOGCHAN(chan, DDEV, ERROR) << "recv Dropped packets by HW! ("
+ LOGCHAN(chan, DDEV, ERROR) << "Rx Dropped packets by HW! ("
<< m_ctr[chan].rx_dropped_samples << " -> "
<< m_ctr[chan].rx_dropped_samples +
status.droppedPackets
@@ -653,7 +652,7 @@ int LMSDevice::readSamples(std::vector < short *>&bufs, int len, bool * overrun,
while ((avail_smpls = rx_buffers[i]->avail_smpls(timestamp)) < len) {
thread_enable_cancel(false);
num_smpls = LMS_RecvStream(&m_lms_stream_rx[i], bufs[i], len - avail_smpls, &rx_metadata, 100);
- update_stream_stats(i, underrun, overrun);
+ update_stream_stats_rx(i, overrun);
thread_enable_cancel(true);
if (num_smpls <= 0) {
LOGCHAN(i, DDEV, ERROR) << "Device receive timed out (" << rc << " vs exp " << len << ").";
@@ -697,13 +696,53 @@ int LMSDevice::readSamples(std::vector < short *>&bufs, int len, bool * overrun,
return len;
}
+void LMSDevice::update_stream_stats_tx(size_t chan, bool *underrun)
+{
+ lms_stream_status_t status;
+ bool changed = false;
+
+ if (LMS_GetStreamStatus(&m_lms_stream_tx[chan], &status) != 0) {
+ LOGCHAN(chan, DDEV, ERROR) << "Tx LMS_GetStreamStatus failed";
+ return;
+ }
+
+ /* FIFO underrun is counted when Tx is running but FIFO is empty for
+ >100 ms (500ms in older versions). Value count since the last call to
+ LMS_GetStreamStatus(stream). */
+ if (status.underrun) {
+ changed = true;
+ *underrun = true;
+ LOGCHAN(chan, DDEV, ERROR) << "Tx Underrun! ("
+ << m_ctr[chan].tx_underruns << " -> "
+ << status.underrun << ")";
+ }
+ m_ctr[chan].tx_underruns += status.underrun;
+
+ /* Dropped packets in Tx are counted only when timestamps are enabled
+ and SDR drops packet because of late timestamp. Value count since the
+ last call to LMS_GetStreamStatus(stream). */
+ if (status.droppedPackets) {
+ changed = true;
+ LOGCHAN(chan, DDEV, ERROR) << "Tx Dropped packets by HW! ("
+ << m_ctr[chan].tx_dropped_samples << " -> "
+ << m_ctr[chan].tx_dropped_samples +
+ status.droppedPackets
+ << ")";
+ m_ctr[chan].tx_dropped_events++;
+ }
+ m_ctr[chan].tx_dropped_samples += status.droppedPackets;
+
+ if (changed)
+ osmo_signal_dispatch(SS_DEVICE, S_DEVICE_COUNTER_CHANGE, &m_ctr[chan]);
+
+}
+
int LMSDevice::writeSamples(std::vector < short *>&bufs, int len,
bool * underrun, unsigned long long timestamp,
bool isControl)
{
int rc = 0;
unsigned int i;
- lms_stream_status_t status;
lms_stream_meta_t tx_metadata = {};
tx_metadata.flushPartialPacket = false;
tx_metadata.waitForTimestamp = true;
@@ -725,19 +764,12 @@ int LMSDevice::writeSamples(std::vector < short *>&bufs, int len,
LOGCHAN(i, DDEV, DEBUG) << "send buffer of len " << len << " timestamp " << std::hex << tx_metadata.timestamp;
thread_enable_cancel(false);
rc = LMS_SendStream(&m_lms_stream_tx[i], bufs[i], len, &tx_metadata, 100);
+ update_stream_stats_tx(i, underrun);
+ thread_enable_cancel(true);
if (rc != len) {
- LOGCHAN(i, DDEV, ERROR) << "LMS: Device send timed out";
+ LOGCHAN(i, DDEV, ERROR) << "LMS: Device Tx timed out (" << rc << " vs exp " << len << ").";
+ return -1;
}
-
- if (LMS_GetStreamStatus(&m_lms_stream_tx[i], &status) == 0) {
- if (status.underrun > m_ctr[i].tx_underruns) {
- *underrun = true;
- m_ctr[i].tx_underruns = status.underrun;
- osmo_signal_dispatch(SS_DEVICE, S_DEVICE_COUNTER_CHANGE, &m_ctr[i]);
- }
-
- }
- thread_enable_cancel(true);
}
return rc;
diff --git a/Transceiver52M/device/lms/LMSDevice.h b/Transceiver52M/device/lms/LMSDevice.h
index 906fbee..bc79f97 100644
--- a/Transceiver52M/device/lms/LMSDevice.h
+++ b/Transceiver52M/device/lms/LMSDevice.h
@@ -65,7 +65,8 @@ private:
bool do_filters(size_t chan);
int get_ant_idx(const std::string & name, bool dir_tx, size_t chan);
bool flush_recv(size_t num_pkts);
- void update_stream_stats(size_t chan, bool * underrun, bool * overrun);
+ void update_stream_stats_rx(size_t chan, bool *overrun);
+ void update_stream_stats_tx(size_t chan, bool *underrun);
public:
diff --git a/doc/manuals/chapters/counters_generated.adoc b/doc/manuals/chapters/counters_generated.adoc
index 6955b18..98634ff 100644
--- a/doc/manuals/chapters/counters_generated.adoc
+++ b/doc/manuals/chapters/counters_generated.adoc
@@ -1,5 +1,6 @@
+
// autogenerated by show asciidoc counters
-These counters and their description based on OsmoTRX 1.0.0.43-3f7c0 (OsmoTRX).
+These counters and their description are based on OsmoTRX 1.0.0.95-9527 (OsmoTRX).
=== Rate Counters
@@ -9,9 +10,17 @@ These counters and their description based on OsmoTRX 1.0.0.43-3f7c0 (OsmoTRX).
[options="header"]
|===
| Name | Reference | Description
-| device:rx_underruns | <<trx:chan_device:rx_underruns>> | Number of Rx underruns
-| device:rx_overruns | <<trx:chan_device:rx_overruns>> | Number of Rx overruns
-| device:tx_underruns | <<trx:chan_device:tx_underruns>> | Number of Tx underruns
+| device:rx_overruns | <<trx:chan_device:rx_overruns>> | Number of Rx overruns in FIFO queue
+| device:tx_underruns | <<trx:chan_device:tx_underruns>> | Number of Tx underruns in FIFO queue
| device:rx_drop_events | <<trx:chan_device:rx_drop_events>> | Number of times Rx samples were dropped by HW
| device:rx_drop_samples | <<trx:chan_device:rx_drop_samples>> | Number of Rx samples dropped by HW
+| device:tx_drop_events | <<trx:chan_device:tx_drop_events>> | Number of times Tx samples were dropped by HW
+| device:tx_drop_samples | <<trx:chan_device:tx_drop_samples>> | Number of Tx samples dropped by HW
|===
+== Osmo Stat Items
+
+// generating tables for osmo_stat_items
+== Osmo Counters
+
+// generating tables for osmo_counters
+// there are no ungrouped osmo_counters
diff --git a/doc/manuals/vty/trx_vty_reference.xml b/doc/manuals/vty/trx_vty_reference.xml
index ce6d335..38d64c1 100644
--- a/doc/manuals/vty/trx_vty_reference.xml
+++ b/doc/manuals/vty/trx_vty_reference.xml
@@ -1247,26 +1247,21 @@
<param name='&lt;1-32&gt;' doc='Real time priority' />
</params>
</command>
- <command id='stack-size &lt;0-2147483647&gt;'>
- <params>
- <param name='stack-size' doc='Set the stack size for the spawned threads' />
- <param name='&lt;0-2147483647&gt;' doc='Stack size in BYTE' />
- </params>
- </command>
<command id='filler dummy'>
<params>
<param name='filler' doc='Enable C0 filler table' />
<param name='dummy' doc='Dummy method' />
</params>
</command>
- <command id='ctr-error-threshold (rx_underruns|rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples) &lt;0-65535&gt; (per-second|per-minute|per-hour|per-day)'>
+ <command id='ctr-error-threshold (rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples|tx_drop_events|tx_drop_samples) &lt;0-65535&gt; (per-second|per-minute|per-hour|per-day)'>
<params>
<param name='ctr-error-threshold' doc='Threshold rate for error counter' />
- <param name='rx_underruns' doc='Set threshold value for rate_ctr device:rx_underruns' />
<param name='rx_overruns' doc='Set threshold value for rate_ctr device:rx_overruns' />
<param name='tx_underruns' doc='Set threshold value for rate_ctr device:tx_underruns' />
<param name='rx_drop_events' doc='Set threshold value for rate_ctr device:rx_drop_events' />
<param name='rx_drop_samples' doc='Set threshold value for rate_ctr device:rx_drop_samples' />
+ <param name='tx_drop_events' doc='Set threshold value for rate_ctr device:tx_drop_events' />
+ <param name='tx_drop_samples' doc='Set threshold value for rate_ctr device:tx_drop_samples' />
<param name='&lt;0-65535&gt;' doc='Value to set for threshold' />
<param name='per-second' doc='Threshold value sampled per-second' />
<param name='per-minute' doc='Threshold value sampled per-minute' />
@@ -1274,15 +1269,16 @@
<param name='per-day' doc='Threshold value sampled per-day' />
</params>
</command>
- <command id='no ctr-error-threshold (rx_underruns|rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples) &lt;0-65535&gt; (per-second|per-minute|per-hour|per-day)'>
+ <command id='no ctr-error-threshold (rx_overruns|tx_underruns|rx_drop_events|rx_drop_samples|tx_drop_events|tx_drop_samples) &lt;0-65535&gt; (per-second|per-minute|per-hour|per-day)'>
<params>
<param name='no' doc='Negate a command or set its defaults' />
<param name='ctr-error-threshold' doc='Threshold rate for error counter' />
- <param name='rx_underruns' doc='Set threshold value for rate_ctr device:rx_underruns' />
<param name='rx_overruns' doc='Set threshold value for rate_ctr device:rx_overruns' />
<param name='tx_underruns' doc='Set threshold value for rate_ctr device:tx_underruns' />
<param name='rx_drop_events' doc='Set threshold value for rate_ctr device:rx_drop_events' />
<param name='rx_drop_samples' doc='Set threshold value for rate_ctr device:rx_drop_samples' />
+ <param name='tx_drop_events' doc='Set threshold value for rate_ctr device:tx_drop_events' />
+ <param name='tx_drop_samples' doc='Set threshold value for rate_ctr device:tx_drop_samples' />
<param name='&lt;0-65535&gt;' doc='Value to set for threshold' />
<param name='per-second' doc='Threshold value sampled per-second' />
<param name='per-minute' doc='Threshold value sampled per-minute' />
@@ -1290,6 +1286,12 @@
<param name='per-day' doc='Threshold value sampled per-day' />
</params>
</command>
+ <command id='stack-size &lt;0-2147483647&gt;'>
+ <params>
+ <param name='stack-size' doc='Set the stack size per thread in BYTE, 0 = OS default' />
+ <param name='&lt;0-2147483647&gt;' doc='Stack size per thread in BYTE' />
+ </params>
+ </command>
<command id='chan &lt;0-100&gt;'>
<params>
<param name='chan' doc='Select a channel to configure' />