diff options
author | Yang Liu <benjasy1993@gmail.com> | 2024-01-09 12:29:23 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-08 20:29:23 -0800 |
commit | f2b0c85c1b716b38254044422c4ffc86f15bf235 (patch) | |
tree | 151a51bf890582e835c582976f2023e602332ac5 | |
parent | 7bae147dd710b01c1712a4bcf9c3e36f802fcce4 (diff) | |
download | ot-br-posix-f2b0c85c1b716b38254044422c4ffc86f15bf235.tar.gz |
[dbus] implement D-BUS API GetTrelInfo (#2131)
Introduce D-BUS API GetTrelInfo to support getting TREL telemetry.
-rw-r--r-- | .github/workflows/build.yml | 4 | ||||
-rw-r--r-- | src/dbus/client/thread_api_dbus.cpp | 7 | ||||
-rw-r--r-- | src/dbus/client/thread_api_dbus.hpp | 14 | ||||
-rw-r--r-- | src/dbus/common/constants.hpp | 1 | ||||
-rw-r--r-- | src/dbus/common/dbus_message_helper.hpp | 19 | ||||
-rw-r--r-- | src/dbus/common/dbus_message_helper_openthread.cpp | 64 | ||||
-rw-r--r-- | src/dbus/common/types.hpp | 16 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.cpp | 30 | ||||
-rw-r--r-- | src/dbus/server/dbus_thread_object.hpp | 1 | ||||
-rw-r--r-- | src/proto/thread_telemetry.proto | 31 | ||||
-rw-r--r-- | src/utils/thread_helper.cpp | 22 | ||||
-rw-r--r-- | tests/dbus/test_dbus_client.cpp | 25 |
12 files changed, 232 insertions, 2 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 27035df6..f90ced17 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,7 +62,7 @@ jobs: BUILD_TARGET: check OTBR_BUILD_TYPE: ${{ matrix.build_type }} OTBR_MDNS: ${{ matrix.mdns }} - OTBR_OPTIONS: "-DOTBR_SRP_ADVERTISING_PROXY=ON -DOTBR_BORDER_ROUTING=ON -DOTBR_NAT64=ON -DOTBR_DHCP6_PD=ON -DOTBR_SRP_SERVER_AUTO_ENABLE=OFF" + OTBR_OPTIONS: "-DOTBR_SRP_ADVERTISING_PROXY=ON -DOTBR_BORDER_ROUTING=ON -DOTBR_NAT64=ON -DOTBR_DHCP6_PD=ON -DOTBR_SRP_SERVER_AUTO_ENABLE=OFF -DOTBR_TREL=ON" OTBR_COVERAGE: 1 steps: - uses: actions/checkout@v4 @@ -85,7 +85,7 @@ jobs: BUILD_TARGET: check OTBR_REST: ${{ matrix.rest }} OTBR_MDNS: mDNSResponder - OTBR_OPTIONS: "-DOTBR_SRP_ADVERTISING_PROXY=ON -DOTBR_DNSSD_DISCOVERY_PROXY=ON" + OTBR_OPTIONS: "-DOTBR_SRP_ADVERTISING_PROXY=ON -DOTBR_DNSSD_DISCOVERY_PROXY=ON -DOTBR_TREL=ON" OTBR_COVERAGE: 1 steps: - uses: actions/checkout@v4 diff --git a/src/dbus/client/thread_api_dbus.cpp b/src/dbus/client/thread_api_dbus.cpp index 0a6c36e6..944c23f5 100644 --- a/src/dbus/client/thread_api_dbus.cpp +++ b/src/dbus/client/thread_api_dbus.cpp @@ -659,6 +659,13 @@ ClientError ThreadApiDBus::GetSrpServerInfo(SrpServerInfo &aSrpServerInfo) return GetProperty(OTBR_DBUS_PROPERTY_SRP_SERVER_INFO, aSrpServerInfo); } +#if OTBR_ENABLE_TREL +ClientError ThreadApiDBus::GetTrelInfo(TrelInfo &aTrelInfo) +{ + return GetProperty(OTBR_DBUS_PROPERTY_TREL_INFO, aTrelInfo); +} +#endif + ClientError ThreadApiDBus::GetMdnsTelemetryInfo(MdnsTelemetryInfo &aMdnsTelemetryInfo) { return GetProperty(OTBR_DBUS_PROPERTY_MDNS_TELEMETRY_INFO, aMdnsTelemetryInfo); diff --git a/src/dbus/client/thread_api_dbus.hpp b/src/dbus/client/thread_api_dbus.hpp index 622faec7..b47aaedc 100644 --- a/src/dbus/client/thread_api_dbus.hpp +++ b/src/dbus/client/thread_api_dbus.hpp @@ -769,6 +769,20 @@ public: */ ClientError GetSrpServerInfo(SrpServerInfo &aSrpServerInfo); +#if OTBR_ENABLE_TREL + /** + * This method gets the TREL information. + * + * @param[out] aTrelInfo The TREL information. + * + * @retval ERROR_NONE Successfully performed the dbus function call + * @retval ERROR_DBUS dbus encode/decode error + * @retval ... OpenThread defined error value otherwise + * + */ + ClientError GetTrelInfo(TrelInfo &aTrelInfo); +#endif + /** * This method gets the MDNS telemetry information. * diff --git a/src/dbus/common/constants.hpp b/src/dbus/common/constants.hpp index 561be710..a8e16482 100644 --- a/src/dbus/common/constants.hpp +++ b/src/dbus/common/constants.hpp @@ -97,6 +97,7 @@ #define OTBR_DBUS_PROPERTY_FEATURE_FLAG_LIST_DATA "FeatureFlagListData" #define OTBR_DBUS_PROPERTY_RADIO_REGION "RadioRegion" #define OTBR_DBUS_PROPERTY_SRP_SERVER_INFO "SrpServerInfo" +#define OTBR_DBUS_PROPERTY_TREL_INFO "TrelInfo" #define OTBR_DBUS_PROPERTY_DNSSD_COUNTERS "DnssdCounters" #define OTBR_DBUS_PROPERTY_OTBR_VERSION "OtbrVersion" #define OTBR_DBUS_PROPERTY_OT_HOST_VERSION "OtHostVersion" diff --git a/src/dbus/common/dbus_message_helper.hpp b/src/dbus/common/dbus_message_helper.hpp index 8bca15da..60d19534 100644 --- a/src/dbus/common/dbus_message_helper.hpp +++ b/src/dbus/common/dbus_message_helper.hpp @@ -115,6 +115,10 @@ otbrError DBusMessageEncode(DBusMessageIter *aIter, const Nat64ErrorCounters &aC otbrError DBusMessageExtract(DBusMessageIter *aIter, Nat64ErrorCounters &aCounters); otbrError DBusMessageEncode(DBusMessageIter *aIter, const InfraLinkInfo &aInfraLinkInfo); otbrError DBusMessageExtract(DBusMessageIter *aIter, InfraLinkInfo &aInfraLinkInfo); +otbrError DBusMessageEncode(DBusMessageIter *aIter, const TrelInfo &aTrelInfo); +otbrError DBusMessageExtract(DBusMessageIter *aIter, TrelInfo &aTrelInfo); +otbrError DBusMessageEncode(DBusMessageIter *aIter, const TrelInfo::TrelPacketCounters &aCounters); +otbrError DBusMessageExtract(DBusMessageIter *aIter, TrelInfo::TrelPacketCounters &aCounters); template <typename T> struct DBusTypeTrait; @@ -382,6 +386,21 @@ template <> struct DBusTypeTrait<Nat64ErrorCounters> static constexpr const char *TYPE_AS_STRING = "((tt)(tt)(tt)(tt))"; }; +template <> struct DBusTypeTrait<TrelInfo> +{ + // struct of { bool, + // uint16, + // struct of { + // uint64, uint64, uint64, uint64, uint64 } } + static constexpr const char *TYPE_AS_STRING = "(bq(ttttt))"; +}; + +template <> struct DBusTypeTrait<TrelInfo::TrelPacketCounters> +{ + // struct of { uint64, uint64, uint64, uint64, uint64 } + static constexpr const char *TYPE_AS_STRING = "(ttttt)"; +}; + template <> struct DBusTypeTrait<InfraLinkInfo> { // struct of { string, bool, bool, bool, uint32, uint32, uint32 } diff --git a/src/dbus/common/dbus_message_helper_openthread.cpp b/src/dbus/common/dbus_message_helper_openthread.cpp index caf246c4..d0d77700 100644 --- a/src/dbus/common/dbus_message_helper_openthread.cpp +++ b/src/dbus/common/dbus_message_helper_openthread.cpp @@ -1194,5 +1194,69 @@ exit: return error; } +otbrError DBusMessageEncode(DBusMessageIter *aIter, const TrelInfo &aTrelInfo) +{ + 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, aTrelInfo.mEnabled)); + SuccessOrExit(error = DBusMessageEncode(&sub, aTrelInfo.mNumTrelPeers)); + SuccessOrExit(error = DBusMessageEncode(&sub, aTrelInfo.mTrelCounters)); + + VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS); +exit: + return error; +} + +otbrError DBusMessageExtract(DBusMessageIter *aIter, TrelInfo &aTrelInfo) +{ + DBusMessageIter sub; + otbrError error = OTBR_ERROR_NONE; + + dbus_message_iter_recurse(aIter, &sub); + + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelInfo.mEnabled)); + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelInfo.mNumTrelPeers)); + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelInfo.mTrelCounters)); + + dbus_message_iter_next(aIter); +exit: + return error; +} + +otbrError DBusMessageEncode(DBusMessageIter *aIter, const TrelInfo::TrelPacketCounters &aTrelCounters) +{ + DBusMessageIter sub; + otbrError error = OTBR_ERROR_NONE; + auto args = std::tie(aTrelCounters.mTxPackets, aTrelCounters.mTxBytes, aTrelCounters.mTxFailure, + aTrelCounters.mRxPackets, aTrelCounters.mRxBytes); + + VerifyOrExit(dbus_message_iter_open_container(aIter, DBUS_TYPE_STRUCT, nullptr, &sub), error = OTBR_ERROR_DBUS); + SuccessOrExit(error = ConvertToDBusMessage(&sub, args)); + VerifyOrExit(dbus_message_iter_close_container(aIter, &sub) == true, error = OTBR_ERROR_DBUS); +exit: + return error; +} + +otbrError DBusMessageExtract(DBusMessageIter *aIter, TrelInfo::TrelPacketCounters &aTrelCounters) +{ + DBusMessageIter sub; + otbrError error = OTBR_ERROR_NONE; + + dbus_message_iter_recurse(aIter, &sub); + + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelCounters.mTxPackets)); + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelCounters.mTxBytes)); + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelCounters.mTxFailure)); + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelCounters.mRxPackets)); + SuccessOrExit(error = DBusMessageExtract(&sub, aTrelCounters.mRxBytes)); + + 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 15a49abc..14f7fc29 100644 --- a/src/dbus/common/types.hpp +++ b/src/dbus/common/types.hpp @@ -703,6 +703,22 @@ struct InfraLinkInfo uint32_t mGlobalUnicastAddresses; ///< The number of global unicast addresses on the infra network interface. }; +struct TrelInfo +{ + struct TrelPacketCounters + { + uint64_t mTxPackets; ///< Number of packets transmitted through TREL. + uint64_t mTxBytes; ///< Sum of size of packets transmitted through TREL. + uint64_t mTxFailure; ///< Number of packet transmission failures through TREL. + uint64_t mRxPackets; ///< Number of packets received through TREL. + uint64_t mRxBytes; ///< Sum of size of packets received through TREL. + }; + + bool mEnabled; ///< Whether TREL is enabled. + u_int16_t mNumTrelPeers; ///< The number of TREL peers. + TrelPacketCounters mTrelCounters; ///< The TREL counters. +}; + } // namespace DBus } // namespace otbr diff --git a/src/dbus/server/dbus_thread_object.cpp b/src/dbus/server/dbus_thread_object.cpp index 70e480bc..a0fe8426 100644 --- a/src/dbus/server/dbus_thread_object.cpp +++ b/src/dbus/server/dbus_thread_object.cpp @@ -42,6 +42,7 @@ #include <openthread/openthread-system.h> #include <openthread/srp_server.h> #include <openthread/thread_ftd.h> +#include <openthread/trel.h> #include <openthread/platform/radio.h> #include "common/api_strings.hpp" @@ -270,6 +271,8 @@ otbrError DBusThreadObject::Init(void) std::bind(&DBusThreadObject::GetNat64Cidr, this, _1)); RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_INFRA_LINK_INFO, std::bind(&DBusThreadObject::GetInfraLinkInfo, this, _1)); + RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_TREL_INFO, + std::bind(&DBusThreadObject::GetTrelInfoHandler, this, _1)); RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_DNS_UPSTREAM_QUERY_STATE, std::bind(&DBusThreadObject::GetDnsUpstreamQueryState, this, _1)); RegisterGetPropertyHandler(OTBR_DBUS_THREAD_INTERFACE, OTBR_DBUS_PROPERTY_TELEMETRY_DATA, @@ -1407,6 +1410,33 @@ exit: #endif // OTBR_ENABLE_DNSSD_DISCOVERY_PROXY } +otError DBusThreadObject::GetTrelInfoHandler(DBusMessageIter &aIter) +{ +#if OTBR_ENABLE_TREL + auto instance = mNcp->GetThreadHelper()->GetInstance(); + otError error = OT_ERROR_NONE; + TrelInfo trelInfo; + otTrelCounters otTrelCounters = *otTrelGetCounters(instance); + + trelInfo.mTrelCounters.mTxPackets = otTrelCounters.mTxPackets; + trelInfo.mTrelCounters.mTxBytes = otTrelCounters.mTxBytes; + trelInfo.mTrelCounters.mTxFailure = otTrelCounters.mTxFailure; + trelInfo.mTrelCounters.mRxPackets = otTrelCounters.mRxPackets; + trelInfo.mTrelCounters.mRxBytes = otTrelCounters.mRxBytes; + + trelInfo.mNumTrelPeers = otTrelGetNumberOfPeers(instance); + trelInfo.mEnabled = otTrelIsEnabled(instance); + + SuccessOrExit(DBusMessageEncodeToVariant(&aIter, trelInfo), error = OT_ERROR_INVALID_ARGS); +exit: + return error; +#else // OTBR_ENABLE_TREL + OTBR_UNUSED_VARIABLE(aIter); + + return OT_ERROR_NOT_IMPLEMENTED; +#endif // OTBR_ENABLE_TREL +} + otError DBusThreadObject::GetTelemetryDataHandler(DBusMessageIter &aIter) { #if OTBR_ENABLE_TELEMETRY_DATA_API diff --git a/src/dbus/server/dbus_thread_object.hpp b/src/dbus/server/dbus_thread_object.hpp index 6b5e7c8b..c3fa8d56 100644 --- a/src/dbus/server/dbus_thread_object.hpp +++ b/src/dbus/server/dbus_thread_object.hpp @@ -162,6 +162,7 @@ private: otError GetRadioSpinelMetricsHandler(DBusMessageIter &aIter); otError GetRcpInterfaceMetricsHandler(DBusMessageIter &aIter); otError GetUptimeHandler(DBusMessageIter &aIter); + otError GetTrelInfoHandler(DBusMessageIter &aIter); otError GetRadioCoexMetrics(DBusMessageIter &aIter); otError GetBorderRoutingCountersHandler(DBusMessageIter &aIter); otError GetNat64State(DBusMessageIter &aIter); diff --git a/src/proto/thread_telemetry.proto b/src/proto/thread_telemetry.proto index 9c056a76..d76871a1 100644 --- a/src/proto/thread_telemetry.proto +++ b/src/proto/thread_telemetry.proto @@ -339,6 +339,34 @@ message TelemetryData { optional SrpServerResponseCounters response_counters = 6; } + message TrelPacketCounters { + // The number of packets successfully transmitted through TREL + optional uint64 trel_tx_packets = 1; + + // The number of bytes successfully transmitted through TREL + optional uint64 trel_tx_bytes = 2; + + // The number of packet transmission failures through TREL + optional uint64 trel_tx_packets_failed = 3; + + // The number of packets successfully received through TREL + optional uint64 tre_rx_packets = 4; + + // The number of bytes successfully received through TREL + optional uint64 trel_rx_bytes = 5; + } + + message TrelInfo { + // Whether TREL is enabled. + optional bool is_trel_enabled = 1; + + // The number of TREL peers. + optional uint32 num_trel_peers = 2; + + // TREL packet counters + optional TrelPacketCounters counters = 3; + } + message DnsServerResponseCounters { // The number of successful responses optional uint32 success_count = 1; @@ -470,6 +498,9 @@ message TelemetryData { // DHCPv6 PD processed RA Info optional PdProcessedRaInfo pd_processed_ra_info= 10; + + // Information about TREL. + optional TrelInfo trel_info = 11; } message RcpStabilityStatistics { diff --git a/src/utils/thread_helper.cpp b/src/utils/thread_helper.cpp index aba4589f..847693d2 100644 --- a/src/utils/thread_helper.cpp +++ b/src/utils/thread_helper.cpp @@ -58,6 +58,9 @@ #include <openthread/srp_server.h> #endif #include <openthread/thread_ftd.h> +#if OTBR_ENABLE_TREL +#include <openthread/trel.h> +#endif #include <openthread/platform/radio.h> #include "common/byteswap.hpp" @@ -1240,6 +1243,25 @@ otError ThreadHelper::RetrieveTelemetryData(Mdns::Publisher *aPublisher, threadn #endif // OTBR_ENABLE_NAT64 // End of BorderRoutingCounters section. +#if OTBR_ENABLE_TREL + // Begin of TrelInfo section. + { + auto trelInfo = wpanBorderRouter->mutable_trel_info(); + auto otTrelCounters = otTrelGetCounters(mInstance); + auto trelCounters = trelInfo->mutable_counters(); + + trelInfo->set_is_trel_enabled(otTrelIsEnabled(mInstance)); + trelInfo->set_num_trel_peers(otTrelGetNumberOfPeers(mInstance)); + + trelCounters->set_trel_tx_packets(otTrelCounters->mTxPackets); + trelCounters->set_trel_tx_bytes(otTrelCounters->mTxBytes); + trelCounters->set_trel_tx_packets_failed(otTrelCounters->mTxFailure); + trelCounters->set_tre_rx_packets(otTrelCounters->mRxPackets); + trelCounters->set_trel_rx_bytes(otTrelCounters->mRxBytes); + } + // End of TrelInfo section. +#endif // OTBR_ENABLE_TREL + #if OTBR_ENABLE_SRP_ADVERTISING_PROXY // Begin of SrpServerInfo section. { diff --git a/tests/dbus/test_dbus_client.cpp b/tests/dbus/test_dbus_client.cpp index 0b826a43..486e5e13 100644 --- a/tests/dbus/test_dbus_client.cpp +++ b/tests/dbus/test_dbus_client.cpp @@ -182,6 +182,24 @@ void CheckSrpServerInfo(ThreadApiDBus *aApi) TEST_ASSERT(srpServerInfo.mResponseCounters.mOther == 0); } +void CheckTrelInfo(ThreadApiDBus *aApi) +{ + OTBR_UNUSED_VARIABLE(aApi); + +#if OTBR_ENABLE_TREL + otbr::DBus::TrelInfo trelInfo; + + TEST_ASSERT(aApi->GetTrelInfo(trelInfo) == OTBR_ERROR_NONE); + TEST_ASSERT(trelInfo.mEnabled); + TEST_ASSERT(trelInfo.mNumTrelPeers == 0); + TEST_ASSERT(trelInfo.mTrelCounters.mTxPackets == 0); + TEST_ASSERT(trelInfo.mTrelCounters.mTxBytes == 0); + TEST_ASSERT(trelInfo.mTrelCounters.mTxFailure == 0); + TEST_ASSERT(trelInfo.mTrelCounters.mRxPackets == 0); + TEST_ASSERT(trelInfo.mTrelCounters.mRxBytes == 0); +#endif +} + void CheckDnssdCounters(ThreadApiDBus *aApi) { OTBR_UNUSED_VARIABLE(aApi); @@ -281,6 +299,12 @@ void CheckTelemetryData(ThreadApiDBus *aApi) #if OTBR_ENABLE_DNSSD_DISCOVERY_PROXY TEST_ASSERT(telemetryData.wpan_border_router().dns_server().response_counters().server_failure_count() == 0); #endif +#if OTBR_ENABLE_TREL + TEST_ASSERT(telemetryData.wpan_border_router().trel_info().is_trel_enabled()); + TEST_ASSERT(telemetryData.wpan_border_router().trel_info().has_counters()); + TEST_ASSERT(telemetryData.wpan_border_router().trel_info().counters().trel_tx_packets() == 0); + TEST_ASSERT(telemetryData.wpan_border_router().trel_info().counters().trel_tx_bytes() == 0); +#endif TEST_ASSERT(telemetryData.wpan_border_router().mdns().service_registration_responses().success_count() > 0); #if OTBR_ENABLE_NAT64 TEST_ASSERT(telemetryData.wpan_border_router().nat64_state().prefix_manager_state() == @@ -423,6 +447,7 @@ int main() TEST_ASSERT(api->GetRadioTxPower(txPower) == OTBR_ERROR_NONE); TEST_ASSERT(api->GetActiveDatasetTlvs(activeDataset) == OTBR_ERROR_NONE); CheckSrpServerInfo(api.get()); + CheckTrelInfo(api.get()); CheckMdnsInfo(api.get()); CheckDnssdCounters(api.get()); CheckNat64(api.get()); |