aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Liu <benjasy1993@gmail.com>2024-01-09 12:29:23 +0800
committerGitHub <noreply@github.com>2024-01-08 20:29:23 -0800
commitf2b0c85c1b716b38254044422c4ffc86f15bf235 (patch)
tree151a51bf890582e835c582976f2023e602332ac5
parent7bae147dd710b01c1712a4bcf9c3e36f802fcce4 (diff)
downloadot-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.yml4
-rw-r--r--src/dbus/client/thread_api_dbus.cpp7
-rw-r--r--src/dbus/client/thread_api_dbus.hpp14
-rw-r--r--src/dbus/common/constants.hpp1
-rw-r--r--src/dbus/common/dbus_message_helper.hpp19
-rw-r--r--src/dbus/common/dbus_message_helper_openthread.cpp64
-rw-r--r--src/dbus/common/types.hpp16
-rw-r--r--src/dbus/server/dbus_thread_object.cpp30
-rw-r--r--src/dbus/server/dbus_thread_object.hpp1
-rw-r--r--src/proto/thread_telemetry.proto31
-rw-r--r--src/utils/thread_helper.cpp22
-rw-r--r--tests/dbus/test_dbus_client.cpp25
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());