aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
authorjinran-google <jinran@google.com>2022-06-15 13:31:49 +0800
committerGitHub <noreply@github.com>2022-06-14 22:31:49 -0700
commit7b29edfb07951f3843a55fa49e0b872d1ebcb4f3 (patch)
tree8d139b91c9ba72b826ba7b48bd976c4ce4afa5e2 /src/dbus
parent5e2c703c5de13a2f91fa78136d3361268b088679 (diff)
downloadot-br-posix-7b29edfb07951f3843a55fa49e0b872d1ebcb4f3.tar.gz
[dbus] add DBus API to get multiple properties (#1423)
This commit adds a DBus API `GetProperties`, which can get multiple properties in one call. Also adds properties `OtHostVersion`, `OtRcpVersion`, and `ThreadVersion`.
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/common/constants.hpp4
-rw-r--r--src/dbus/server/dbus_object.hpp16
-rw-r--r--src/dbus/server/dbus_thread_object.cpp90
-rw-r--r--src/dbus/server/dbus_thread_object.hpp11
-rw-r--r--src/dbus/server/introspect.xml22
5 files changed, 134 insertions, 9 deletions
diff --git a/src/dbus/common/constants.hpp b/src/dbus/common/constants.hpp
index 8ab5c624..ba5f7ef9 100644
--- a/src/dbus/common/constants.hpp
+++ b/src/dbus/common/constants.hpp
@@ -59,6 +59,7 @@
#define OTBR_DBUS_REMOVE_EXTERNAL_ROUTE_METHOD "RemoveExternalRoute"
#define OTBR_DBUS_ATTACH_ALL_NODES_TO_METHOD "AttachAllNodesTo"
#define OTBR_DBUS_UPDATE_VENDOR_MESHCOP_TXT_METHOD "UpdateVendorMeshCopTxtEntries"
+#define OTBR_DBUS_GET_PROPERTIES_METHOD "GetProperties"
#define OTBR_DBUS_PROPERTY_MESH_LOCAL_PREFIX "MeshLocalPrefix"
#define OTBR_DBUS_PROPERTY_LEGACY_ULA_PREFIX "LegacyULAPrefix"
@@ -93,6 +94,9 @@
#define OTBR_DBUS_PROPERTY_RADIO_REGION "RadioRegion"
#define OTBR_DBUS_PROPERTY_SRP_SERVER_INFO "SrpServerInfo"
#define OTBR_DBUS_PROPERTY_DNSSD_COUNTERS "DnssdCounters"
+#define OTBR_DBUS_PROPERTY_OT_HOST_VERSION "OtHostVersion"
+#define OTBR_DBUS_PROPERTY_OT_RCP_VERSION "OtRcpVersion"
+#define OTBR_DBUS_PROPERTY_THREAD_VERSION "ThreadVersion"
#define OTBR_ROLE_NAME_DISABLED "disabled"
#define OTBR_ROLE_NAME_DETACHED "detached"
diff --git a/src/dbus/server/dbus_object.hpp b/src/dbus/server/dbus_object.hpp
index 0958ed22..91fe56e8 100644
--- a/src/dbus/server/dbus_object.hpp
+++ b/src/dbus/server/dbus_object.hpp
@@ -103,25 +103,25 @@ public:
* This method registers the get handler for a property.
*
* @param[in] aInterfaceName The interface name.
- * @param[in] aMethodName The method name.
+ * @param[in] aPropertyName The property name.
* @param[in] aHandler The method handler.
*
*/
- void RegisterGetPropertyHandler(const std::string & aInterfaceName,
- const std::string & aMethodName,
- const PropertyHandlerType &aHandler);
+ virtual void RegisterGetPropertyHandler(const std::string & aInterfaceName,
+ const std::string & aPropertyName,
+ const PropertyHandlerType &aHandler);
/**
* This method registers the set handler for a property.
*
* @param[in] aInterfaceName The interface name.
- * @param[in] aMethodName The method name.
+ * @param[in] aPropertyName The property name.
* @param[in] aHandler The method handler.
*
*/
- void RegisterSetPropertyHandler(const std::string & aInterfaceName,
- const std::string & aPropertyName,
- const PropertyHandlerType &aHandler);
+ virtual void RegisterSetPropertyHandler(const std::string & aInterfaceName,
+ const std::string & aPropertyName,
+ const PropertyHandlerType &aHandler);
/**
* This method sends a signal.
diff --git a/src/dbus/server/dbus_thread_object.cpp b/src/dbus/server/dbus_thread_object.cpp
index 4db8222b..0f4c65bb 100644
--- a/src/dbus/server/dbus_thread_object.cpp
+++ b/src/dbus/server/dbus_thread_object.cpp
@@ -139,6 +139,8 @@ otbrError DBusThreadObject::Init(void)
std::bind(&DBusThreadObject::AttachAllNodesToHandler, this, _1));
RegisterMethod(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_UPDATE_VENDOR_MESHCOP_TXT_METHOD,
std::bind(&DBusThreadObject::UpdateMeshCopTxtHandler, this, _1));
+ RegisterMethod(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_GET_PROPERTIES_METHOD,
+ std::bind(&DBusThreadObject::GetPropertiesHandler, this, _1));
RegisterMethod(DBUS_INTERFACE_INTROSPECTABLE, DBUS_INTROSPECT_METHOD,
std::bind(&DBusThreadObject::IntrospectHandler, this, _1));
@@ -219,6 +221,12 @@ otbrError DBusThreadObject::Init(void)
std::bind(&DBusThreadObject::GetSrpServerInfoHandler, 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,
+ std::bind(&DBusThreadObject::GetOtHostVersionHandler, this, _1));
+ RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_OT_RCP_VERSION,
+ std::bind(&DBusThreadObject::GetOtRcpVersionHandler, this, _1));
+ RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_THREAD_VERSION,
+ std::bind(&DBusThreadObject::GetThreadVersionHandler, this, _1));
return error;
}
@@ -1280,6 +1288,88 @@ exit:
#endif // OTBR_ENABLE_DNSSD_DISCOVERY_PROXY
}
+void DBusThreadObject::GetPropertiesHandler(DBusRequest &aRequest)
+{
+ UniqueDBusMessage reply(dbus_message_new_method_return(aRequest.GetMessage()));
+ DBusMessageIter iter;
+ DBusMessageIter replyIter;
+ DBusMessageIter replySubIter;
+ std::vector<std::string> propertyNames;
+ otError error = OT_ERROR_NONE;
+
+ VerifyOrExit(reply != nullptr, error = OT_ERROR_NO_BUFS);
+ VerifyOrExit(dbus_message_iter_init(aRequest.GetMessage(), &iter), error = OT_ERROR_FAILED);
+ VerifyOrExit(DBusMessageExtract(&iter, propertyNames) == OTBR_ERROR_NONE, error = OT_ERROR_PARSE);
+
+ dbus_message_iter_init_append(reply.get(), &replyIter);
+ VerifyOrExit(
+ dbus_message_iter_open_container(&replyIter, DBUS_TYPE_ARRAY, DBUS_TYPE_VARIANT_AS_STRING, &replySubIter),
+ error = OT_ERROR_NO_BUFS);
+
+ for (const std::string &propertyName : propertyNames)
+ {
+ auto handlerIter = mGetPropertyHandlers.find(propertyName);
+
+ otbrLogInfo("GetPropertiesHandler getting property: %s", propertyName.c_str());
+ VerifyOrExit(handlerIter != mGetPropertyHandlers.end(), error = OT_ERROR_NOT_FOUND);
+
+ SuccessOrExit(error = handlerIter->second(replySubIter));
+ }
+
+ VerifyOrExit(dbus_message_iter_close_container(&replyIter, &replySubIter), error = OT_ERROR_NO_BUFS);
+
+exit:
+ if (error == OT_ERROR_NONE)
+ {
+ dbus_connection_send(aRequest.GetConnection(), reply.get(), nullptr);
+ }
+ else
+ {
+ aRequest.ReplyOtResult(error);
+ }
+}
+
+void DBusThreadObject::RegisterGetPropertyHandler(const std::string & aInterfaceName,
+ const std::string & aPropertyName,
+ const PropertyHandlerType &aHandler)
+{
+ DBusObject::RegisterGetPropertyHandler(aInterfaceName, aPropertyName, aHandler);
+ mGetPropertyHandlers[aPropertyName] = aHandler;
+}
+
+otError DBusThreadObject::GetOtHostVersionHandler(DBusMessageIter &aIter)
+{
+ otError error = OT_ERROR_NONE;
+ std::string version = otGetVersionString();
+
+ VerifyOrExit(DBusMessageEncodeToVariant(&aIter, version) == OTBR_ERROR_NONE, error = OT_ERROR_FAILED);
+
+exit:
+ return error;
+}
+
+otError DBusThreadObject::GetOtRcpVersionHandler(DBusMessageIter &aIter)
+{
+ auto threadHelper = mNcp->GetThreadHelper();
+ otError error = OT_ERROR_NONE;
+ std::string version = otGetRadioVersionString(threadHelper->GetInstance());
+
+ VerifyOrExit(DBusMessageEncodeToVariant(&aIter, version) == OTBR_ERROR_NONE, error = OT_ERROR_FAILED);
+
+exit:
+ return error;
+}
+
+otError DBusThreadObject::GetThreadVersionHandler(DBusMessageIter &aIter)
+{
+ otError error = OT_ERROR_NONE;
+
+ VerifyOrExit(DBusMessageEncodeToVariant(&aIter, otThreadGetVersion()) == OTBR_ERROR_NONE, error = OT_ERROR_FAILED);
+
+exit:
+ return error;
+}
+
static_assert(OTBR_SRP_SERVER_STATE_DISABLED == static_cast<uint8_t>(OT_SRP_SERVER_STATE_DISABLED),
"OTBR_SRP_SERVER_STATE_DISABLED value is incorrect");
static_assert(OTBR_SRP_SERVER_STATE_RUNNING == static_cast<uint8_t>(OT_SRP_SERVER_STATE_RUNNING),
diff --git a/src/dbus/server/dbus_thread_object.hpp b/src/dbus/server/dbus_thread_object.hpp
index 6f79c745..6d6ec705 100644
--- a/src/dbus/server/dbus_thread_object.hpp
+++ b/src/dbus/server/dbus_thread_object.hpp
@@ -74,6 +74,10 @@ public:
otbrError Init(void) override;
+ void RegisterGetPropertyHandler(const std::string & aInterfaceName,
+ const std::string & aPropertyName,
+ const PropertyHandlerType &aHandler) override;
+
private:
void DeviceRoleHandler(otDeviceRole aDeviceRole);
void NcpResetHandler(void);
@@ -94,6 +98,7 @@ private:
void AddExternalRouteHandler(DBusRequest &aRequest);
void RemoveExternalRouteHandler(DBusRequest &aRequest);
void UpdateMeshCopTxtHandler(DBusRequest &aRequest);
+ void GetPropertiesHandler(DBusRequest &aRequest);
void IntrospectHandler(DBusRequest &aRequest);
@@ -134,11 +139,15 @@ private:
otError GetRadioRegionHandler(DBusMessageIter &aIter);
otError GetSrpServerInfoHandler(DBusMessageIter &aIter);
otError GetDnssdCountersHandler(DBusMessageIter &aIter);
+ otError GetOtHostVersionHandler(DBusMessageIter &aIter);
+ otError GetOtRcpVersionHandler(DBusMessageIter &aIter);
+ otError GetThreadVersionHandler(DBusMessageIter &aIter);
void ReplyScanResult(DBusRequest &aRequest, otError aError, const std::vector<otActiveScanResult> &aResult);
void ReplyEnergyScanResult(DBusRequest &aRequest, otError aError, const std::vector<otEnergyScanResult> &aResult);
- otbr::Ncp::ControllerOpenThread *mNcp;
+ otbr::Ncp::ControllerOpenThread * mNcp;
+ std::unordered_map<std::string, PropertyHandlerType> mGetPropertyHandlers;
};
} // namespace DBus
diff --git a/src/dbus/server/introspect.xml b/src/dbus/server/introspect.xml
index c5bfcb99..bd29c125 100644
--- a/src/dbus/server/introspect.xml
+++ b/src/dbus/server/introspect.xml
@@ -202,6 +202,13 @@
<arg name="update" type="a(say)" direction="in"/>
</method>
+ <!-- GetProperties: Get one or more OpenThread properties.
+ @properties: Names of properties.
+ -->
+ <method name="GetProperties">
+ <arg name="properties" type="as" direction="in"/>
+ </method>
+
<!-- MeshLocalPrefix: The /64 mesh-local prefix. -->
<property name="MeshLocalPrefix" type="ay" access="readwrite">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
@@ -564,6 +571,21 @@
<property name="DnssdCounters" type="(uuuuuuu)" 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"/>
+ </property>
+
+ <!-- OtRcpVersion: The version string of the RCP firmware. -->
+ <property name="OtRcpVersion" type="s" access="read">
+ <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
+ </property>
+
+ <!-- ThreadVersion: The Thread protocol version. -->
+ <property name="ThreadVersion" type="q" access="read">
+ <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/>
+ </property>
</interface>
<interface name="org.freedesktop.DBus.Properties">