aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
authorwhd <7058128+superwhd@users.noreply.github.com>2022-06-28 11:29:00 +0800
committerGitHub <noreply@github.com>2022-06-27 20:29:00 -0700
commite4a197f3397024c3e02bc4dabded434ab865b2af (patch)
tree5ef27b733454e2a739788927552c229266c3a9eb /src/dbus
parent489f99934525294fa8b8818ac1f90be188839629 (diff)
downloadot-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.cpp5
-rw-r--r--src/dbus/client/thread_api_dbus.hpp12
-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.cpp82
-rw-r--r--src/dbus/server/dbus_agent.cpp9
-rw-r--r--src/dbus/server/dbus_agent.hpp3
-rw-r--r--src/dbus/server/dbus_thread_object.cpp16
-rw-r--r--src/dbus/server/dbus_thread_object.hpp7
-rw-r--r--src/dbus/server/introspect.xml46
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"/>