Skip to content

Commit

Permalink
[telemetry] add support for getting border agent telemetry data
Browse files Browse the repository at this point in the history
  • Loading branch information
sunytt committed Aug 20, 2024
1 parent 92ac6cb commit 85a7a4c
Show file tree
Hide file tree
Showing 6 changed files with 335 additions and 2 deletions.
35 changes: 35 additions & 0 deletions src/dbus/common/dbus_message_helper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,12 @@ 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);
otbrError DBusMessageEncode(DBusMessageIter *aIter, const AdministrationInfo &aAdministrationInfo);
otbrError DBusMessageExtract(DBusMessageIter *aIter, AdministrationInfo &aAdministrationInfo);
otbrError DBusMessageEncode(DBusMessageIter *aIter, const AdministrationInfo::EpskcInfo &aEpskcInfo);
otbrError DBusMessageExtract(DBusMessageIter *aIter, AdministrationInfo::EpskcInfo &aEpskcInfo);
otbrError DBusMessageEncode(DBusMessageIter *aIter, const AdministrationInfo::PskcInfo &aPskcInfo);
otbrError DBusMessageExtract(DBusMessageIter *aIter, AdministrationInfo::PskcInfo &aPskcInfo);

template <typename T> struct DBusTypeTrait;

Expand Down Expand Up @@ -407,6 +413,35 @@ template <> struct DBusTypeTrait<InfraLinkInfo>
static constexpr const char *TYPE_AS_STRING = "(sbbbuuu)";
};

template <> struct DBusTypeTrait<EpskcState>
{
static constexpr int TYPE = DBUS_TYPE_BYTE;
static constexpr const char *TYPE_AS_STRING = DBUS_TYPE_BYTE_AS_STRING;
};

template <> struct DBusTypeTrait<AdministrationInfo>
{
// struct of { struct of {uint8, uint32, uint32, uint32, uint32, uint32,
// uint32, uint32, uint32, uint32, uint32, uint32 },
// struct of {uint32, uint32, uint32},
// uint32,
// uint32 }
static constexpr const char *TYPE_AS_STRING = "((yuuuuuuuuuuu)(uuu)uu)";
};

template <> struct DBusTypeTrait<AdministrationInfo::EpskcInfo>
{
// struct of {uint8, uint32, uint32, uint32, uint32, uint32, uint32,
// uint32, uint32, uint32, uint32, uint32 }
static constexpr const char *TYPE_AS_STRING = "(yuuuuuuuuuuu)";
};

template <> struct DBusTypeTrait<AdministrationInfo::PskcInfo>
{
// struct of {uint32, uint32, uint32 }
static constexpr const char *TYPE_AS_STRING = "(uuu)";
};

template <> struct DBusTypeTrait<int8_t>
{
static constexpr int TYPE = DBUS_TYPE_BYTE;
Expand Down
116 changes: 116 additions & 0 deletions src/dbus/common/dbus_message_helper_openthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1258,5 +1258,121 @@ otbrError DBusMessageExtract(DBusMessageIter *aIter, TrelInfo::TrelPacketCounter
return error;
}

otbrError DBusMessageEncode(DBusMessageIter *aIter, const AdministrationInfo &aAdministrationInfo)
{
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, aAdministrationInfo.mEpskcInfo));
SuccessOrExit(error = DBusMessageEncode(&sub, aAdministrationInfo.mPskcInfo));
SuccessOrExit(error = DBusMessageEncode(&sub, aAdministrationInfo.mMgmtActiveGetCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aAdministrationInfo.mMgmtPendingGetCount));

VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
exit:
return error;
}

otbrError DBusMessageExtract(DBusMessageIter *aIter, AdministrationInfo &aAdministrationInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;

dbus_message_iter_recurse(aIter, &sub);

SuccessOrExit(error = DBusMessageExtract(&sub, aAdministrationInfo.mEpskcInfo));
SuccessOrExit(error = DBusMessageExtract(&sub, aAdministrationInfo.mPskcInfo));
SuccessOrExit(error = DBusMessageExtract(&sub, aAdministrationInfo.mMgmtActiveGetCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aAdministrationInfo.mMgmtPendingGetCount));

dbus_message_iter_next(aIter);
exit:
return error;
}

otbrError DBusMessageEncode(DBusMessageIter *aIter, const AdministrationInfo::EpskcInfo &aEpskcInfo)
{
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, aEpskcInfo.mState));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mActivationCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mDeactivationClearCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mDeactivationTimeoutCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mDeactivationMaxConnectionReachedCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mDeactivationDisconnectCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mInvalidBaStateErrorCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mInvalidArgsErrorCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mStartSecureSessionErrorCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mSecureSessionSuccessCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mSecureSessionFailureCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aEpskcInfo.mCommissionerPetitionCount));

VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
exit:
return error;
}

otbrError DBusMessageExtract(DBusMessageIter *aIter, AdministrationInfo::EpskcInfo &aEpskcInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;

dbus_message_iter_recurse(aIter, &sub);

SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mState));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mActivationCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mDeactivationClearCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mDeactivationTimeoutCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mDeactivationMaxConnectionReachedCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mDeactivationDisconnectCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mInvalidBaStateErrorCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mInvalidArgsErrorCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mStartSecureSessionErrorCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mSecureSessionSuccessCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mSecureSessionFailureCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aEpskcInfo.mCommissionerPetitionCount));

dbus_message_iter_next(aIter);
exit:
return error;
}

otbrError DBusMessageEncode(DBusMessageIter *aIter, const AdministrationInfo::PskcInfo &aPskcInfo)
{
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, aPskcInfo.mSecureSessionSuccessCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aPskcInfo.mSecureSessionFailureCount));
SuccessOrExit(error = DBusMessageEncode(&sub, aPskcInfo.mCommissionerPetitionCount));

VerifyOrExit(dbus_message_iter_close_container(aIter, &sub), error = OTBR_ERROR_DBUS);
exit:
return error;
}

otbrError DBusMessageExtract(DBusMessageIter *aIter, AdministrationInfo::PskcInfo &aPskcInfo)
{
DBusMessageIter sub;
otbrError error = OTBR_ERROR_NONE;

dbus_message_iter_recurse(aIter, &sub);

SuccessOrExit(error = DBusMessageExtract(&sub, aPskcInfo.mSecureSessionSuccessCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aPskcInfo.mSecureSessionFailureCount));
SuccessOrExit(error = DBusMessageExtract(&sub, aPskcInfo.mCommissionerPetitionCount));

dbus_message_iter_next(aIter);
exit:
return error;
}

} // namespace DBus
} // namespace otbr
38 changes: 38 additions & 0 deletions src/dbus/common/types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,44 @@ struct TrelInfo
TrelPacketCounters mTrelCounters; ///< The TREL counters.
};

enum EpskcState : uint8_t
{
EPSKC_STATE_READY_FOR_CONNECTION = 0, ///< The ephemeral key is set and ready for secure connection.
EPSKC_STATE_CONNECTED = 1, ///< The ephemeral key is active with a commissioner connected.
EPSKC_STATE_INACTIVE = 2, ///< The ephemeral key is inactive.
};

struct AdministrationInfo
{
struct EpskcInfo
{
EpskcState mState;
uint64_t mActivationCount;
uint64_t mDeactivationClearCount;
uint64_t mDeactivationTimeoutCount;
uint64_t mDeactivationMaxConnectionReachedCount;
uint64_t mDeactivationDisconnectCount;
uint64_t mInvalidBaStateErrorCount;
uint64_t mInvalidArgsErrorCount;
uint64_t mStartSecureSessionErrorCount;
uint64_t mSecureSessionSuccessCount;
uint64_t mSecureSessionFailureCount;
uint64_t mCommissionerPetitionCount;
};

struct PskcInfo
{
uint64_t mSecureSessionSuccessCount;
uint64_t mSecureSessionFailureCount;
uint64_t mCommissionerPetitionCount;
};

EpskcInfo mEpskcInfo;
PskcInfo mPskcInfo;
uint64_t mMgmtActiveGetCount;
uint64_t mMgmtPendingGetCount;
};

} // namespace DBus
} // namespace otbr

Expand Down
68 changes: 68 additions & 0 deletions src/proto/thread_telemetry.proto
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,71 @@ message TelemetryData {
optional bool has_others_route_added = 3;
}

enum EpskcState {
EPSKC_STATE_READY_FOR_CONNECTION = 0;
EPSKC_STATE_CONNECTED = 1;
EPSKC_STATE_INACTIVE = 2;
}

message EpskcInfo {
// Whether there is an active ePSKc
optional EpskcState state = 1;

// The number of ePSKc activations
optional uint32 activation_count = 2;

// The number of ePSKc deactivations due to cleared via API
optional uint32 deactivation_clear_count = 3;

// The number of ePSKc deactivations due to timeout
optional uint32 deactivation_timeout_count = 4;

// The number of ePSKc deactivations due to max connection attempts reached
optional uint32 deactivation_max_connection_reached_count = 5;

// The number of ePSKc deactivations due to commissioner disconnected
optional uint32 deactivation_disconnect_count = 6;

// The number of ePSKc activation failures caused by invalid border agent state
optional uint32 invalid_ba_state_error_count = 7;

// The number of ePSKc activation failures caused by invalid argument
optional uint32 invalid_args_error_count = 8;

// The number of ePSKc activation failures caused by failed to start secure session
optional uint32 start_secure_session_error_count = 9;

// The number of successful secure session establishment with ePSKc
optional uint32 secure_session_success_count = 10;

// The number of failed secure session establishement with ePSKc
optional uint32 secure_session_failure_count = 11;

// The number of active commissioner petitioned over secure session establishment with ePSKc
optional uint32 commissioner_petition_count = 12;
}

message PskcInfo {
// The number of successful secure session establishment with PSKc
optional uint32 secure_session_success_count = 1;

// The number of failed secure session establishement with PSKc
optional uint32 secure_session_failure_count = 2;

// The number of active commissioner petitioned over secure session establishment with PSKc
optional uint32 commissioner_petition_count = 3;
}

message AdministrationInfo {
optional EpskcInfo epskc_info = 1;

optional PskcInfo pskc_info = 2;

optional uint32 mgmt_active_get_count = 3;

optional uint32 mgmt_pending_get_count = 4;
}

message WpanBorderRouter {
// Border routing counters
optional BorderRoutingCounters border_routing_counters = 1;
Expand Down Expand Up @@ -552,6 +617,9 @@ message TelemetryData {

// Information about the external routes in network data.
optional ExternalRoutes external_route_info = 13;

// Information about the Thread administration procedures
optional AdministrationInfo administration_info = 14;
}

message RcpStabilityStatistics {
Expand Down
47 changes: 45 additions & 2 deletions src/utils/thread_helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <string.h>
#include <time.h>

#include <openthread/border_agent.h>
#include <openthread/border_router.h>
#include <openthread/channel_manager.h>
#include <openthread/dataset_ftd.h>
Expand Down Expand Up @@ -224,6 +225,21 @@ void CopyMdnsResponseCounters(const MdnsResponseCounters &from, threadnetwork::T
to->set_aborted_count(from.mAborted);
to->set_invalid_state_count(from.mInvalidState);
}

threadnetwork::TelemetryData_EpskcState GetEpskcState(otInstance *aInstance)
{
if (!otBorderAgentIsEphemeralKeyActive(aInstance))
{
return threadnetwork::TelemetryData::EPSKC_STATE_INACTIVE;
}

if (otBorderAgentGetState(aInstance) == OT_BORDER_AGENT_STATE_ACTIVE)
{
return threadnetwork::TelemetryData::EPSKC_STATE_CONNECTED;
}

return threadnetwork::TelemetryData::EPSKC_STATE_READY_FOR_CONNECTION;
}
#endif // OTBR_ENABLE_TELEMETRY_DATA_API
} // namespace

Expand Down Expand Up @@ -1596,8 +1612,35 @@ otError ThreadHelper::RetrieveTelemetryData(Mdns::Publisher *aPublisher, threadn
#endif // OTBR_ENABLE_NAT64
#if OTBR_ENABLE_DHCP6_PD
RetrievePdInfo(wpanBorderRouter);
#endif // OTBR_ENABLE_DHCP6_PD
// End of WpanBorderRouter section.
#endif //
{
auto administrationInfo = wpanBorderRouter->mutable_administration_info();
auto epskcInfo = administrationInfo->mutable_epskc_info();
auto pskcInfo = administrationInfo->mutable_pskc_info();
auto otBorderAgentCounters = *otBorderAgentGetCounters(mInstance);

epskcInfo->set_state(GetEpskcState(mInstance));
epskcInfo->set_activation_count(otBorderAgentCounters.mEpskcActivations);
epskcInfo->set_deactivation_clear_count(otBorderAgentCounters.mEpskcDeactivationClears);
epskcInfo->set_deactivation_timeout_count(otBorderAgentCounters.mEpskcDeactivationTimeouts);
epskcInfo->set_deactivation_max_connection_reached_count(
otBorderAgentCounters.mEpskcDeactivationMaxAttempts);
epskcInfo->set_deactivation_disconnect_count(otBorderAgentCounters.mEpskcDeactivationDisconnects);
epskcInfo->set_invalid_ba_state_error_count(otBorderAgentCounters.mEpskcInvalidBaStateErrors);
epskcInfo->set_invalid_args_error_count(otBorderAgentCounters.mEpskcInvalidArgsErrors);
epskcInfo->set_start_secure_session_error_count(otBorderAgentCounters.mEpskcStartSecureSessionErrors);
epskcInfo->set_secure_session_success_count(otBorderAgentCounters.mEpskcSecureSessionSuccesses);
epskcInfo->set_secure_session_failure_count(otBorderAgentCounters.mEpskcSecureSessionFailures);
epskcInfo->set_commissioner_petition_count(otBorderAgentCounters.mEpskcCommissionerPetitions);

pskcInfo->set_secure_session_success_count(otBorderAgentCounters.mPskcSecureSessionSuccesses);
pskcInfo->set_secure_session_failure_count(otBorderAgentCounters.mPskcSecureSessionFailures);
pskcInfo->set_commissioner_petition_count(otBorderAgentCounters.mPskcCommissionerPetitions);

administrationInfo->set_mgmt_active_get_count(otBorderAgentCounters.mMgmtActiveGets);
administrationInfo->set_mgmt_pending_get_count(otBorderAgentCounters.mMgmtPendingGets);
}
// End of WpanBorderRouter section.

// Start of WpanRcp section.
{
Expand Down
Loading

0 comments on commit 85a7a4c

Please sign in to comment.