diff options
author | jinran-google <jinran@google.com> | 2022-06-15 13:31:49 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-14 22:31:49 -0700 |
commit | 7b29edfb07951f3843a55fa49e0b872d1ebcb4f3 (patch) | |
tree | 8d139b91c9ba72b826ba7b48bd976c4ce4afa5e2 /src/dbus | |
parent | 5e2c703c5de13a2f91fa78136d3361268b088679 (diff) | |
download | ot-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.hpp | 4 | ||||
-rw-r--r-- | src/dbus/server/dbus_object.hpp | 16 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.cpp | 90 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.hpp | 11 | ||||
-rw-r--r-- | src/dbus/server/introspect.xml | 22 |
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"> |