diff options
author | whd <7058128+superwhd@users.noreply.github.com> | 2022-06-28 11:29:00 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-27 20:29:00 -0700 |
commit | e4a197f3397024c3e02bc4dabded434ab865b2af (patch) | |
tree | 5ef27b733454e2a739788927552c229266c3a9eb /src/dbus | |
parent | 489f99934525294fa8b8818ac1f90be188839629 (diff) | |
download | ot-br-posix-e4a197f3397024c3e02bc4dabded434ab865b2af.tar.gz |
[dbus] add D-BUS API `GetMdnsInfo` (#1400)
Diffstat (limited to 'src/dbus')
-rw-r--r-- | src/dbus/client/thread_api_dbus.cpp | 5 | ||||
-rw-r--r-- | src/dbus/client/thread_api_dbus.hpp | 12 | ||||
-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 | 82 | ||||
-rw-r--r-- | src/dbus/server/dbus_agent.cpp | 9 | ||||
-rw-r--r-- | src/dbus/server/dbus_agent.hpp | 3 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.cpp | 16 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.hpp | 7 | ||||
-rw-r--r-- | src/dbus/server/introspect.xml | 46 |
10 files changed, 189 insertions, 6 deletions
diff --git a/src/dbus/client/thread_api_dbus.cpp b/src/dbus/client/thread_api_dbus.cpp index eef97000..cc9bb2be 100644 --- a/src/dbus/client/thread_api_dbus.cpp +++ b/src/dbus/client/thread_api_dbus.cpp @@ -638,6 +638,11 @@ ClientError ThreadApiDBus::GetSrpServerInfo(SrpServerInfo &aSrpServerInfo) return GetProperty(OTBR_DBUS_PROPERTY_SRP_SERVER_INFO, aSrpServerInfo); } +ClientError ThreadApiDBus::GetMdnsTelemetryInfo(MdnsTelemetryInfo &aMdnsTelemetryInfo) +{ + return GetProperty(OTBR_DBUS_PROPERTY_MDNS_TELEMETRY_INFO, aMdnsTelemetryInfo); +} + #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY ClientError ThreadApiDBus::GetDnssdCounters(DnssdCounters &aDnssdCounters) { diff --git a/src/dbus/client/thread_api_dbus.hpp b/src/dbus/client/thread_api_dbus.hpp index f43e1b10..8ab2bcaf 100644 --- a/src/dbus/client/thread_api_dbus.hpp +++ b/src/dbus/client/thread_api_dbus.hpp @@ -717,6 +717,18 @@ public: */ ClientError GetSrpServerInfo(SrpServerInfo &aSrpServerInfo); + /** + * This method gets the MDNS telemetry information. + * + * @param[out] aMdnsTelemetryInfo The MDNS telemetry information. + * + * @retval ERROR_NONE Successfully performed the dbus function call + * @retval ERROR_DBUS dbus encode/decode error + * @retval ... OpenThread defined error value otherwise + * + */ + ClientError GetMdnsTelemetryInfo(MdnsTelemetryInfo &aMdnsTelemetryInfo); + #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY /** * This method gets the DNS-SD counters. diff --git a/src/dbus/common/constants.hpp b/src/dbus/common/constants.hpp index 0aaf2d92..10d8fb56 100644 --- a/src/dbus/common/constants.hpp +++ b/src/dbus/common/constants.hpp @@ -98,6 +98,7 @@ #define OTBR_DBUS_PROPERTY_OT_RCP_VERSION "OtRcpVersion" #define OTBR_DBUS_PROPERTY_THREAD_VERSION "ThreadVersion" #define OTBR_DBUS_PROPERTY_EUI64 "Eui64" +#define OTBR_DBUS_PROPERTY_MDNS_TELEMETRY_INFO "MdnsTelemetryInfo" #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 2cb16322..9cc041e5 100644 --- a/src/dbus/common/dbus_message_helper.hpp +++ b/src/dbus/common/dbus_message_helper.hpp @@ -83,6 +83,10 @@ otbrError DBusMessageEncode(DBusMessageIter *aIter, const SrpServerInfo::Respons otbrError DBusMessageExtract(DBusMessageIter *aIter, SrpServerInfo::ResponseCounters &aResponseCounters); otbrError DBusMessageEncode(DBusMessageIter *aIter, const SrpServerInfo &aSrpServerInfo); otbrError DBusMessageExtract(DBusMessageIter *aIter, SrpServerInfo &aSrpServerInfo); +otbrError DBusMessageEncode(DBusMessageIter *aIter, const MdnsResponseCounters &aMdnsResponseCounters); +otbrError DBusMessageExtract(DBusMessageIter *aIter, MdnsResponseCounters &aMdnsResponseCounters); +otbrError DBusMessageEncode(DBusMessageIter *aIter, const MdnsTelemetryInfo &aMdnsTelemetryInfo); +otbrError DBusMessageExtract(DBusMessageIter *aIter, MdnsTelemetryInfo &aMdnsTelemetryInfo); otbrError DBusMessageEncode(DBusMessageIter *aIter, const DnssdCounters &aDnssdCounters); otbrError DBusMessageExtract(DBusMessageIter *aIter, DnssdCounters &aDnssdCounters); @@ -240,6 +244,16 @@ template <> struct DBusTypeTrait<SrpServerInfo> static constexpr const char *TYPE_AS_STRING = "(yqy(uutttt)(uutttt)(uuuuuu))"; }; +template <> struct DBusTypeTrait<MdnsTelemetryInfo> +{ + // struct of { struct of { uint32, uint32, uint32, uint32, uint32, uint32 }, + // struct of { uint32, uint32, uint32, uint32, uint32, uint32 }, + // struct of { uint32, uint32, uint32, uint32, uint32, uint32 }, + // struct of { uint32, uint32, uint32, uint32, uint32, uint32 }, + // uint32, uint32, uint32, uint32 } + static constexpr const char *TYPE_AS_STRING = "((uuuuuu)(uuuuuu)(uuuuuu)(uuuuuu)uuuu)"; +}; + template <> struct DBusTypeTrait<DnssdCounters> { // struct of { uint32, uint32, uint32, uint32, uint32, uint32, uint32 } diff --git a/src/dbus/common/dbus_message_helper_openthread.cpp b/src/dbus/common/dbus_message_helper_openthread.cpp index 29db6822..68f7c445 100644 --- a/src/dbus/common/dbus_message_helper_openthread.cpp +++ b/src/dbus/common/dbus_message_helper_openthread.cpp @@ -651,5 +651,87 @@ exit: return error; } +otbrError DBusMessageEncode(DBusMessageIter *aIter, const MdnsResponseCounters &aMdnsResponseCounters) +{ + 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, aMdnsResponseCounters.mSuccess)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsResponseCounters.mNotFound)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsResponseCounters.mInvalidArgs)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsResponseCounters.mDuplicated)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsResponseCounters.mNotImplemented)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsResponseCounters.mUnknownError)); + + VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS); +exit: + return error; +} + +otbrError DBusMessageExtract(DBusMessageIter *aIter, MdnsResponseCounters &aMdnsResponseCounters) +{ + DBusMessageIter sub; + otbrError error = OTBR_ERROR_NONE; + + dbus_message_iter_recurse(aIter, &sub); + + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsResponseCounters.mSuccess)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsResponseCounters.mNotFound)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsResponseCounters.mInvalidArgs)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsResponseCounters.mDuplicated)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsResponseCounters.mNotImplemented)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsResponseCounters.mUnknownError)); + + dbus_message_iter_next(aIter); +exit: + return error; +} + +otbrError DBusMessageEncode(DBusMessageIter *aIter, const MdnsTelemetryInfo &aMdnsTelemetryInfo) +{ + 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, aMdnsTelemetryInfo.mHostRegistrations)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mServiceRegistrations)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mHostResolutions)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mServiceResolutions)); + + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mHostRegistrationEmaLatency)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mServiceRegistrationEmaLatency)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mHostResolutionEmaLatency)); + SuccessOrExit(error = DBusMessageEncode(&sub, aMdnsTelemetryInfo.mServiceResolutionEmaLatency)); + + VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS); +exit: + return error; +} + +otbrError DBusMessageExtract(DBusMessageIter *aIter, MdnsTelemetryInfo &aMdnsTelemetryInfo) +{ + DBusMessageIter sub; + otbrError error = OTBR_ERROR_NONE; + + dbus_message_iter_recurse(aIter, &sub); + + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mHostRegistrations)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mServiceRegistrations)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mHostResolutions)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mServiceResolutions)); + + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mHostRegistrationEmaLatency)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mServiceRegistrationEmaLatency)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mHostResolutionEmaLatency)); + SuccessOrExit(error = DBusMessageExtract(&sub, aMdnsTelemetryInfo.mServiceResolutionEmaLatency)); + + dbus_message_iter_next(aIter); +exit: + return error; +} + } // namespace DBus } // namespace otbr diff --git a/src/dbus/server/dbus_agent.cpp b/src/dbus/server/dbus_agent.cpp index 905f3a30..de94927d 100644 --- a/src/dbus/server/dbus_agent.cpp +++ b/src/dbus/server/dbus_agent.cpp @@ -36,6 +36,7 @@ #include "common/logging.hpp" #include "dbus/common/constants.hpp" +#include "mdns/mdns.hpp" namespace otbr { namespace DBus { @@ -43,9 +44,10 @@ namespace DBus { const struct timeval DBusAgent::kPollTimeout = {0, 0}; constexpr std::chrono::seconds DBusAgent::kDBusWaitAllowance; -DBusAgent::DBusAgent(otbr::Ncp::ControllerOpenThread &aNcp) +DBusAgent::DBusAgent(otbr::Ncp::ControllerOpenThread &aNcp, Mdns::Publisher &aPublisher) : mInterfaceName(aNcp.GetInterfaceName()) , mNcp(aNcp) + , mPublisher(aPublisher) { } @@ -63,8 +65,9 @@ void DBusAgent::Init(void) VerifyOrDie(mConnection != nullptr, "Failed to get DBus connection"); - mThreadObject = std::unique_ptr<DBusThreadObject>(new DBusThreadObject(mConnection.get(), mInterfaceName, &mNcp)); - error = mThreadObject->Init(); + mThreadObject = + std::unique_ptr<DBusThreadObject>(new DBusThreadObject(mConnection.get(), mInterfaceName, &mNcp, &mPublisher)); + error = mThreadObject->Init(); VerifyOrDie(error == OTBR_ERROR_NONE, "Failed to initialize DBus Agent"); } diff --git a/src/dbus/server/dbus_agent.hpp b/src/dbus/server/dbus_agent.hpp index ae5ed126..d334a965 100644 --- a/src/dbus/server/dbus_agent.hpp +++ b/src/dbus/server/dbus_agent.hpp @@ -60,7 +60,7 @@ public: * @param[in] aNcp A reference to the NCP controller. * */ - DBusAgent(otbr::Ncp::ControllerOpenThread &aNcp); + DBusAgent(otbr::Ncp::ControllerOpenThread &aNcp, Mdns::Publisher &aPublisher); /** * This method initializes the dbus agent. @@ -87,6 +87,7 @@ private: std::unique_ptr<DBusThreadObject> mThreadObject; UniqueDBusConnection mConnection; otbr::Ncp::ControllerOpenThread & mNcp; + Mdns::Publisher & mPublisher; /** * This map is used to track DBusWatch-es. diff --git a/src/dbus/server/dbus_thread_object.cpp b/src/dbus/server/dbus_thread_object.cpp index 51727e7e..df7b76f5 100644 --- a/src/dbus/server/dbus_thread_object.cpp +++ b/src/dbus/server/dbus_thread_object.cpp @@ -95,9 +95,11 @@ namespace DBus { DBusThreadObject::DBusThreadObject(DBusConnection * aConnection, const std::string & aInterfaceName, - otbr::Ncp::ControllerOpenThread *aNcp) + otbr::Ncp::ControllerOpenThread *aNcp, + Mdns::Publisher * aPublisher) : DBusObject(aConnection, OTBR_DBUS_OBJECT_PREFIX + aInterfaceName) , mNcp(aNcp) + , mPublisher(aPublisher) { } @@ -222,6 +224,8 @@ otbrError DBusThreadObject::Init(void) std::bind(&DBusThreadObject::GetRadioRegionHandler, this, _1)); RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_SRP_SERVER_INFO, std::bind(&DBusThreadObject::GetSrpServerInfoHandler, this, _1)); + RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_MDNS_TELEMETRY_INFO, + std::bind(&DBusThreadObject::GetMdnsTelemetryInfoHandler, this, _1)); RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_DNSSD_COUNTERS, std::bind(&DBusThreadObject::GetDnssdCountersHandler, this, _1)); RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_OT_HOST_VERSION, @@ -1273,6 +1277,16 @@ exit: #endif // OTBR_ENABLE_SRP_ADVERTISING_PROXY } +otError DBusThreadObject::GetMdnsTelemetryInfoHandler(DBusMessageIter &aIter) +{ + otError error = OT_ERROR_NONE; + + VerifyOrExit(DBusMessageEncodeToVariant(&aIter, mPublisher->GetMdnsTelemetryInfo()) == OTBR_ERROR_NONE, + error = OT_ERROR_INVALID_ARGS); +exit: + return error; +} + otError DBusThreadObject::GetDnssdCountersHandler(DBusMessageIter &aIter) { #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY diff --git a/src/dbus/server/dbus_thread_object.hpp b/src/dbus/server/dbus_thread_object.hpp index daad87b4..e11c05bf 100644 --- a/src/dbus/server/dbus_thread_object.hpp +++ b/src/dbus/server/dbus_thread_object.hpp @@ -39,6 +39,7 @@ #include <openthread/link.h> #include "dbus/server/dbus_object.hpp" +#include "mdns/mdns.hpp" #include "ncp/ncp_openthread.hpp" namespace otbr { @@ -66,11 +67,13 @@ public: * @param[in] aConnection The dbus connection. * @param[in] aInterfaceName The dbus interface name. * @param[in] aNcp The ncp controller + * @param[in] aPublisher The Mdns::Publisher * */ DBusThreadObject(DBusConnection * aConnection, const std::string & aInterfaceName, - otbr::Ncp::ControllerOpenThread *aNcp); + otbr::Ncp::ControllerOpenThread *aNcp, + Mdns::Publisher * aPublisher); otbrError Init(void) override; @@ -140,6 +143,7 @@ private: otError GetActiveDatasetTlvsHandler(DBusMessageIter &aIter); otError GetRadioRegionHandler(DBusMessageIter &aIter); otError GetSrpServerInfoHandler(DBusMessageIter &aIter); + otError GetMdnsTelemetryInfoHandler(DBusMessageIter &aIter); otError GetDnssdCountersHandler(DBusMessageIter &aIter); otError GetOtHostVersionHandler(DBusMessageIter &aIter); otError GetOtRcpVersionHandler(DBusMessageIter &aIter); @@ -150,6 +154,7 @@ private: otbr::Ncp::ControllerOpenThread * mNcp; std::unordered_map<std::string, PropertyHandlerType> mGetPropertyHandlers; + otbr::Mdns::Publisher * mPublisher; }; } // namespace DBus diff --git a/src/dbus/server/introspect.xml b/src/dbus/server/introspect.xml index 8a28f2de..b644804f 100644 --- a/src/dbus/server/introspect.xml +++ b/src/dbus/server/introspect.xml @@ -578,6 +578,52 @@ <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> </property> + <!-- MdnsTelemetryInfo: The MDNS information + <literallayout> + struct { + struct { // host registration responses + uint32 success + uint32 not_found + uint32 invalid_args + uint32 duplicated + uint32 not_implemented + uint32 unknown_error + } + struct { // service registration responses + uint32 success + uint32 not_found + uint32 invalid_args + uint32 duplicated + uint32 not_implemented + uint32 unknown_error + } + struct { // host resolution responses + uint32 success + uint32 not_found + uint32 invalid_args + uint32 duplicated + uint32 not_implemented + uint32 unknown_error + } + struct { // service resolution responses + uint32 success + uint32 not_found + uint32 invalid_args + uint32 duplicated + uint32 not_implemented + uint32 unknown_error + } + uint32 host_registration_ema_latency + uint32 service_registration_ema_latency + uint32 host_resolution_ema_latency + uint32 service_resolution_ema_latency + } + </literallayout> + --> + <property name="MdnsTelemetryInfo" type="(uuuuuu)(uuuuuu)(uuuuuu)(uuuuuu)uuuu" access="read"> + <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> + </property> + <!-- OtHostVersion: The version string of the host build. --> <property name="OtHostVersion" type="s" access="read"> <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> |