aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
authorjinran-google <jinran@google.com>2022-07-22 12:50:45 +0800
committerGitHub <noreply@github.com>2022-07-21 21:50:45 -0700
commitec5f57bf7c05eb81fb104b38cb82995dc48465fd (patch)
treefa5dc56acec036efb07b5bc091eb2677968decb4 /src/dbus
parent9a03c5c6c82eed40a5d4476a9e269c9d03381b6f (diff)
downloadot-br-posix-ec5f57bf7c05eb81fb104b38cb82995dc48465fd.tar.gz
[dbus] add coex metrics property (#1468)
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/common/constants.hpp1
-rw-r--r--src/dbus/common/dbus_message_helper.hpp14
-rw-r--r--src/dbus/common/dbus_message_helper_openthread.cpp64
-rw-r--r--src/dbus/common/types.hpp27
-rw-r--r--src/dbus/server/dbus_thread_object.cpp37
-rw-r--r--src/dbus/server/dbus_thread_object.hpp1
-rw-r--r--src/dbus/server/introspect.xml29
7 files changed, 169 insertions, 4 deletions
diff --git a/src/dbus/common/constants.hpp b/src/dbus/common/constants.hpp
index eb9dc2b4..ce2e1a7f 100644
--- a/src/dbus/common/constants.hpp
+++ b/src/dbus/common/constants.hpp
@@ -102,6 +102,7 @@
#define OTBR_DBUS_PROPERTY_RADIO_SPINEL_METRICS "RadioSpinelMetrics"
#define OTBR_DBUS_PROPERTY_RCP_INTERFACE_METRICS "RcpInterfaceMetrics"
#define OTBR_DBUS_PROPERTY_UPTIME "Uptime"
+#define OTBR_DBUS_PROPERTY_RADIO_COEX_METRICS "RadioCoexMetrics"
#define OTBR_ROLE_NAME_DISABLED "disabled"
#define OTBR_ROLE_NAME_DETACHED "detached"
diff --git a/src/dbus/common/dbus_message_helper.hpp b/src/dbus/common/dbus_message_helper.hpp
index 10b9ee36..ccc81192 100644
--- a/src/dbus/common/dbus_message_helper.hpp
+++ b/src/dbus/common/dbus_message_helper.hpp
@@ -91,8 +91,10 @@ otbrError DBusMessageEncode(DBusMessageIter *aIter, const DnssdCounters &aDnssdC
otbrError DBusMessageExtract(DBusMessageIter *aIter, DnssdCounters &aDnssdCounters);
otbrError DBusMessageEncode(DBusMessageIter *aIter, const RadioSpinelMetrics &aRadioSpinelMetrics);
otbrError DBusMessageExtract(DBusMessageIter *aIter, RadioSpinelMetrics &RadioSpinelMetrics);
-otbrError DBusMessageEncode(DBusMessageIter *aIter, const RcpInterfaceMetrics &RcpInterfaceMetrics);
-otbrError DBusMessageExtract(DBusMessageIter *aIter, RcpInterfaceMetrics &RcpInterfaceMetrics);
+otbrError DBusMessageEncode(DBusMessageIter *aIter, const RcpInterfaceMetrics &aRcpInterfaceMetrics);
+otbrError DBusMessageExtract(DBusMessageIter *aIter, RcpInterfaceMetrics &aRcpInterfaceMetrics);
+otbrError DBusMessageEncode(DBusMessageIter *aIter, const RadioCoexMetrics &aRadioCoexMetrics);
+otbrError DBusMessageExtract(DBusMessageIter *aIter, RadioCoexMetrics &aRadioCoexMetrics);
template <typename T> struct DBusTypeTrait;
@@ -276,6 +278,14 @@ template <> struct DBusTypeTrait<RcpInterfaceMetrics>
static constexpr const char *TYPE_AS_STRING = "(yttttttt)";
};
+template <> struct DBusTypeTrait<RadioCoexMetrics>
+{
+ // struct of { uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32,
+ // uint32, uint32, uint32, uint32, uint32, uint32, uint32, uint32,
+ // uint32, uint32, bool }
+ static constexpr const char *TYPE_AS_STRING = "(uuuuuuuuuuuuuuuuuub)";
+};
+
template <> struct DBusTypeTrait<int8_t>
{
static constexpr int TYPE = DBUS_TYPE_BYTE;
diff --git a/src/dbus/common/dbus_message_helper_openthread.cpp b/src/dbus/common/dbus_message_helper_openthread.cpp
index 1b5497c8..b91c5479 100644
--- a/src/dbus/common/dbus_message_helper_openthread.cpp
+++ b/src/dbus/common/dbus_message_helper_openthread.cpp
@@ -809,5 +809,69 @@ exit:
return error;
}
+otbrError DBusMessageEncode(DBusMessageIter *aIter, const RadioCoexMetrics &aRadioCoexMetrics)
+{
+ DBusMessageIter sub;
+ otbrError error = OTBR_ERROR_NONE;
+
+ VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS);
+
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumGrantGlitch));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxRequest));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxGrantImmediate));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxGrantWait));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxGrantWaitActivated));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxGrantWaitTimeout));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxGrantDeactivatedDuringRequest));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumTxDelayedGrant));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mAvgTxRequestToGrantTime));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxRequest));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxGrantImmediate));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxGrantWait));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxGrantWaitActivated));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxGrantWaitTimeout));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxGrantDeactivatedDuringRequest));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxDelayedGrant));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mAvgRxRequestToGrantTime));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mNumRxGrantNone));
+ SuccessOrExit(error = DBusMessageEncode(&sub, aRadioCoexMetrics.mStopped));
+
+ VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
+exit:
+ return error;
+}
+
+otbrError DBusMessageExtract(DBusMessageIter *aIter, RadioCoexMetrics &aRadioCoexMetrics)
+{
+ DBusMessageIter sub;
+ otbrError error = OTBR_ERROR_NONE;
+
+ dbus_message_iter_recurse(aIter, &sub);
+
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumGrantGlitch));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxRequest));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxGrantImmediate));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxGrantWait));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxGrantWaitActivated));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxGrantWaitTimeout));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxGrantDeactivatedDuringRequest));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumTxDelayedGrant));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mAvgTxRequestToGrantTime));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxRequest));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxGrantImmediate));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxGrantWait));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxGrantWaitActivated));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxGrantWaitTimeout));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxGrantDeactivatedDuringRequest));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxDelayedGrant));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mAvgRxRequestToGrantTime));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mNumRxGrantNone));
+ SuccessOrExit(error = DBusMessageExtract(&sub, aRadioCoexMetrics.mStopped));
+
+ dbus_message_iter_next(aIter);
+exit:
+ return error;
+}
+
} // namespace DBus
} // namespace otbr
diff --git a/src/dbus/common/types.hpp b/src/dbus/common/types.hpp
index 4e2b2cb1..76c41034 100644
--- a/src/dbus/common/types.hpp
+++ b/src/dbus/common/types.hpp
@@ -584,7 +584,7 @@ struct RadioSpinelMetrics
uint32_t mSpinelParseErrorCount; ///< The number of spinel frame parse errors.
};
-typedef struct RcpInterfaceMetrics
+struct RcpInterfaceMetrics
{
uint8_t mRcpInterfaceType; ///< The RCP interface type.
uint64_t mTransferredFrameCount; ///< The number of transferred frames.
@@ -594,7 +594,30 @@ typedef struct RcpInterfaceMetrics
uint64_t mRxFrameByteCount; ///< The number of received bytes.
uint64_t mTxFrameCount; ///< The number of transmitted frames.
uint64_t mTxFrameByteCount; ///< The number of transmitted bytes.
-} RcpInterfaceMetrics;
+};
+
+struct RadioCoexMetrics
+{
+ uint32_t mNumGrantGlitch; ///< Number of grant glitches.
+ uint32_t mNumTxRequest; ///< Number of tx requests.
+ uint32_t mNumTxGrantImmediate; ///< Number of tx requests while grant was active.
+ uint32_t mNumTxGrantWait; ///< Number of tx requests while grant was inactive.
+ uint32_t mNumTxGrantWaitActivated; ///< Number of tx requests while grant was inactive that were ultimately granted.
+ uint32_t mNumTxGrantWaitTimeout; ///< Number of tx requests while grant was inactive that timed out.
+ uint32_t mNumTxGrantDeactivatedDuringRequest; ///< Number of tx that were in progress when grant was deactivated.
+ uint32_t mNumTxDelayedGrant; ///< Number of tx requests that were not granted within 50us.
+ uint32_t mAvgTxRequestToGrantTime; ///< Average time in usec from tx request to grant.
+ uint32_t mNumRxRequest; ///< Number of rx requests.
+ uint32_t mNumRxGrantImmediate; ///< Number of rx requests while grant was active.
+ uint32_t mNumRxGrantWait; ///< Number of rx requests while grant was inactive.
+ uint32_t mNumRxGrantWaitActivated; ///< Number of rx requests while grant was inactive that were ultimately granted.
+ uint32_t mNumRxGrantWaitTimeout; ///< Number of rx requests while grant was inactive that timed out.
+ uint32_t mNumRxGrantDeactivatedDuringRequest; ///< Number of rx that were in progress when grant was deactivated.
+ uint32_t mNumRxDelayedGrant; ///< Number of rx requests that were not granted within 50us.
+ uint32_t mAvgRxRequestToGrantTime; ///< Average time in usec from rx request to grant.
+ uint32_t mNumRxGrantNone; ///< Number of rx requests that completed without receiving grant.
+ bool mStopped; ///< Stats collection stopped due to saturation.
+};
} // namespace DBus
} // namespace otbr
diff --git a/src/dbus/server/dbus_thread_object.cpp b/src/dbus/server/dbus_thread_object.cpp
index 0e43e3fa..b5b99f85 100644
--- a/src/dbus/server/dbus_thread_object.cpp
+++ b/src/dbus/server/dbus_thread_object.cpp
@@ -242,6 +242,8 @@ otbrError DBusThreadObject::Init(void)
std::bind(&DBusThreadObject::GetRcpInterfaceMetricsHandler, this, _1));
RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_UPTIME,
std::bind(&DBusThreadObject::GetUptimeHandler, this, _1));
+ RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_RADIO_COEX_METRICS,
+ std::bind(&DBusThreadObject::GetRadioCoexMetrics, this, _1));
SuccessOrExit(error = Signal(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_SIGNAL_READY, std::make_tuple()));
@@ -1478,6 +1480,41 @@ exit:
return error;
}
+otError DBusThreadObject::GetRadioCoexMetrics(DBusMessageIter &aIter)
+{
+ otError error = OT_ERROR_NONE;
+ otRadioCoexMetrics otRadioCoexMetrics;
+ RadioCoexMetrics radioCoexMetrics;
+
+ SuccessOrExit(error = otPlatRadioGetCoexMetrics(mNcp->GetInstance(), &otRadioCoexMetrics));
+
+ radioCoexMetrics.mNumGrantGlitch = otRadioCoexMetrics.mNumGrantGlitch;
+ radioCoexMetrics.mNumTxRequest = otRadioCoexMetrics.mNumTxRequest;
+ radioCoexMetrics.mNumTxGrantImmediate = otRadioCoexMetrics.mNumTxGrantImmediate;
+ radioCoexMetrics.mNumTxGrantWait = otRadioCoexMetrics.mNumTxGrantWait;
+ radioCoexMetrics.mNumTxGrantWaitActivated = otRadioCoexMetrics.mNumTxGrantWaitActivated;
+ radioCoexMetrics.mNumTxGrantWaitTimeout = otRadioCoexMetrics.mNumTxGrantWaitTimeout;
+ radioCoexMetrics.mNumTxGrantDeactivatedDuringRequest = otRadioCoexMetrics.mNumTxGrantDeactivatedDuringRequest;
+ radioCoexMetrics.mNumTxDelayedGrant = otRadioCoexMetrics.mNumTxDelayedGrant;
+ radioCoexMetrics.mAvgTxRequestToGrantTime = otRadioCoexMetrics.mAvgTxRequestToGrantTime;
+ radioCoexMetrics.mNumRxRequest = otRadioCoexMetrics.mNumRxRequest;
+ radioCoexMetrics.mNumRxGrantImmediate = otRadioCoexMetrics.mNumRxGrantImmediate;
+ radioCoexMetrics.mNumRxGrantWait = otRadioCoexMetrics.mNumRxGrantWait;
+ radioCoexMetrics.mNumRxGrantWaitActivated = otRadioCoexMetrics.mNumRxGrantWaitActivated;
+ radioCoexMetrics.mNumRxGrantWaitTimeout = otRadioCoexMetrics.mNumRxGrantWaitTimeout;
+ radioCoexMetrics.mNumRxGrantDeactivatedDuringRequest = otRadioCoexMetrics.mNumRxGrantDeactivatedDuringRequest;
+ radioCoexMetrics.mNumRxDelayedGrant = otRadioCoexMetrics.mNumRxDelayedGrant;
+ radioCoexMetrics.mAvgRxRequestToGrantTime = otRadioCoexMetrics.mAvgRxRequestToGrantTime;
+ radioCoexMetrics.mNumRxGrantNone = otRadioCoexMetrics.mNumRxGrantNone;
+ radioCoexMetrics.mStopped = otRadioCoexMetrics.mStopped;
+
+ VerifyOrExit(DBusMessageEncodeToVariant(&aIter, radioCoexMetrics) == OTBR_ERROR_NONE,
+ error = OT_ERROR_INVALID_ARGS);
+
+exit:
+ return error;
+}
+
void DBusThreadObject::ActiveDatasetChangeHandler(const otOperationalDatasetTlvs &aDatasetTlvs)
{
std::vector<uint8_t> value(aDatasetTlvs.mLength);
diff --git a/src/dbus/server/dbus_thread_object.hpp b/src/dbus/server/dbus_thread_object.hpp
index bf1f9017..91ebb77c 100644
--- a/src/dbus/server/dbus_thread_object.hpp
+++ b/src/dbus/server/dbus_thread_object.hpp
@@ -151,6 +151,7 @@ private:
otError GetRadioSpinelMetricsHandler(DBusMessageIter &aIter);
otError GetRcpInterfaceMetricsHandler(DBusMessageIter &aIter);
otError GetUptimeHandler(DBusMessageIter &aIter);
+ otError GetRadioCoexMetrics(DBusMessageIter &aIter);
void ReplyScanResult(DBusRequest &aRequest, otError aError, const std::vector<otActiveScanResult> &aResult);
void ReplyEnergyScanResult(DBusRequest &aRequest, otError aError, const std::vector<otEnergyScanResult> &aResult);
diff --git a/src/dbus/server/introspect.xml b/src/dbus/server/introspect.xml
index bc47a63b..46dfe8c3 100644
--- a/src/dbus/server/introspect.xml
+++ b/src/dbus/server/introspect.xml
@@ -681,6 +681,35 @@
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
</property>
+ <!-- RadioCoexMetrics: The radio coexistence metrics
+ <literallayout>
+ struct {
+ uint32_t mNumGrantGlitch; // Number of grant glitches.
+ uint32_t mNumTxRequest; // Number of tx requests.
+ uint32_t mNumTxGrantImmediate; // Number of tx requests while grant was active.
+ uint32_t mNumTxGrantWait; // Number of tx requests while grant was inactive.
+ uint32_t mNumTxGrantWaitActivated; // Number of tx requests while grant was inactive that were ultimately granted.
+ uint32_t mNumTxGrantWaitTimeout; // Number of tx requests while grant was inactive that timed out.
+ uint32_t mNumTxGrantDeactivatedDuringRequest; // Number of tx that were in progress when grant was deactivated.
+ uint32_t mNumTxDelayedGrant; // Number of tx requests that were not granted within 50us.
+ uint32_t mAvgTxRequestToGrantTime; // Average time in usec from tx request to grant.
+ uint32_t mNumRxRequest; // Number of rx requests.
+ uint32_t mNumRxGrantImmediate; // Number of rx requests while grant was active.
+ uint32_t mNumRxGrantWait; // Number of rx requests while grant was inactive.
+ uint32_t mNumRxGrantWaitActivated; // Number of rx requests while grant was inactive that were ultimately granted.
+ uint32_t mNumRxGrantWaitTimeout; // Number of rx requests while grant was inactive that timed out.
+ uint32_t mNumRxGrantDeactivatedDuringRequest; // Number of rx that were in progress when grant was deactivated.
+ uint32_t mNumRxDelayedGrant; // Number of rx requests that were not granted within 50us.
+ uint32_t mAvgRxRequestToGrantTime; // Average time in usec from rx request to grant.
+ uint32_t mNumRxGrantNone; // Number of rx requests that completed without receiving grant.
+ bool mStopped; // Stats collection stopped due to saturation.
+ }
+ </literallayout>
+ -->
+ <property name="RadioCoexMetrics" type="(uuuuuuuuuuuuuuuuuub)" access="read">
+ <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
+ </property>
+
</interface>
<interface name="org.freedesktop.DBus.Properties">