diff options
author | jinran-google <jinran@google.com> | 2022-07-22 12:50:45 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-21 21:50:45 -0700 |
commit | ec5f57bf7c05eb81fb104b38cb82995dc48465fd (patch) | |
tree | fa5dc56acec036efb07b5bc091eb2677968decb4 /src/dbus | |
parent | 9a03c5c6c82eed40a5d4476a9e269c9d03381b6f (diff) | |
download | ot-br-posix-ec5f57bf7c05eb81fb104b38cb82995dc48465fd.tar.gz |
[dbus] add coex metrics property (#1468)
Diffstat (limited to 'src/dbus')
-rw-r--r-- | src/dbus/common/constants.hpp | 1 | ||||
-rw-r--r-- | src/dbus/common/dbus_message_helper.hpp | 14 | ||||
-rw-r--r-- | src/dbus/common/dbus_message_helper_openthread.cpp | 64 | ||||
-rw-r--r-- | src/dbus/common/types.hpp | 27 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.cpp | 37 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.hpp | 1 | ||||
-rw-r--r-- | src/dbus/server/introspect.xml | 29 |
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"> |