diff --git a/include/openthread/dnssd_server.h b/include/openthread/dnssd_server.h index abcac362e..73666981a 100644 --- a/include/openthread/dnssd_server.h +++ b/include/openthread/dnssd_server.h @@ -147,6 +147,22 @@ typedef enum OT_DNSSD_QUERY_TYPE_RESOLVE_HOST = 3, ///< Service type resolve hostname. } otDnssdQueryType; +/** + * This structure contains the counters of DNS-SD server. + * + */ +typedef struct otDnssdCounters +{ + uint32_t mSuccessResponse; ///< The number of successful responses + uint32_t mServerFailureResponse; ///< The number of server failure responses + uint32_t mFormatErrorResponse; ///< The number of format error responses + uint32_t mNameErrorResponse; ///< The number of name error responses + uint32_t mNotImplementedResponse; ///< The number of 'not implemented' responses + uint32_t mOtherResponse; ///< The number of other responses + + uint32_t mResolvedBySrp; ///< The number of queries completely resolved by the local SRP server +} otDnssdCounters; + /** * This function sets DNS-SD server query callbacks. * @@ -219,6 +235,16 @@ const otDnssdQuery *otDnssdGetNextQuery(otInstance *aInstance, const otDnssdQuer */ otDnssdQueryType otDnssdGetQueryTypeAndName(const otDnssdQuery *aQuery, char (*aNameOutput)[OT_DNS_MAX_NAME_SIZE]); +/** + * This function returns the counters of the DNS-SD server. + * + * @param[in] aInstance The OpenThread instance structure. + * + * @returns A pointer to the counters of the DNS-SD server. + * + */ +const otDnssdCounters *otDnssdGetCounters(otInstance *aInstance); + /** * @} * diff --git a/include/openthread/instance.h b/include/openthread/instance.h index c946217c5..1148de43d 100644 --- a/include/openthread/instance.h +++ b/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (211) +#define OPENTHREAD_API_VERSION (212) /** * @addtogroup api-instance diff --git a/src/core/api/dns_server_api.cpp b/src/core/api/dns_server_api.cpp index b9e020cf6..5b094487d 100644 --- a/src/core/api/dns_server_api.cpp +++ b/src/core/api/dns_server_api.cpp @@ -81,4 +81,9 @@ otDnssdQueryType otDnssdGetQueryTypeAndName(const otDnssdQuery *aQuery, char (*a return MapEnum(Dns::ServiceDiscovery::Server::GetQueryTypeAndName(aQuery, *aNameOutput)); } +const otDnssdCounters *otDnssdGetCounters(otInstance *aInstance) +{ + return &AsCoreType(aInstance).Get().GetCounters(); +} + #endif // OPENTHREAD_CONFIG_DNSSD_SERVER_ENABLE diff --git a/src/core/net/dnssd_server.cpp b/src/core/net/dnssd_server.cpp index 40249ce7b..c996c153a 100644 --- a/src/core/net/dnssd_server.cpp +++ b/src/core/net/dnssd_server.cpp @@ -65,6 +65,7 @@ Server::Server(Instance &aInstance) , mQueryUnsubscribe(nullptr) , mTimer(aInstance, Server::HandleTimer) { + mCounters.Clear(); } Error Server::Start(void) @@ -173,11 +174,19 @@ void Server::ProcessQuery(const Header &aRequestHeader, Message &aRequestMessage #endif // Resolve the question using query callbacks if SRP server failed to resolve the questions. - if (responseHeader.GetAnswerCount() == 0 && - kErrorNone == ResolveByQueryCallbacks(responseHeader, *responseMessage, compressInfo, aMessageInfo)) + if (responseHeader.GetAnswerCount() == 0) { - resolveByQueryCallbacks = true; + if (kErrorNone == ResolveByQueryCallbacks(responseHeader, *responseMessage, compressInfo, aMessageInfo)) + { + resolveByQueryCallbacks = true; + } } +#if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE + else + { + ++mCounters.mResolvedBySrp; + } +#endif exit: if (error == kErrorNone && !resolveByQueryCallbacks) @@ -220,6 +229,8 @@ void Server::SendResponse(Header aHeader, { LogInfo("send DNS-SD reply: %s, RCODE=%d", ErrorToString(error), aResponseCode); } + + UpdateResponseCounters(aResponseCode); } Header::Response Server::AddQuestions(const Header & aRequestHeader, @@ -842,7 +853,7 @@ Server::QueryTransaction *Server::NewQuery(const Header & aResponseHead continue; } - query.Init(aResponseHeader, aResponseMessage, aCompressInfo, aMessageInfo); + query.Init(aResponseHeader, aResponseMessage, aCompressInfo, aMessageInfo, GetInstance()); ExitNow(newQuery = &query); } @@ -1194,10 +1205,12 @@ void Server::FinalizeQuery(QueryTransaction &aQuery, Header::Response aResponseC void Server::QueryTransaction::Init(const Header & aResponseHeader, Message & aResponseMessage, const NameCompressInfo &aCompressInfo, - const Ip6::MessageInfo &aMessageInfo) + const Ip6::MessageInfo &aMessageInfo, + Instance & aInstance) { OT_ASSERT(mResponseMessage == nullptr); + InstanceLocatorInit::Init(aInstance); mResponseHeader = aResponseHeader; mResponseMessage = &aResponseMessage; mCompressInfo = aCompressInfo; @@ -1209,10 +1222,35 @@ void Server::QueryTransaction::Finalize(Header::Response aResponseMessage, Ip6:: { OT_ASSERT(mResponseMessage != nullptr); - SendResponse(mResponseHeader, aResponseMessage, *mResponseMessage, mMessageInfo, aSocket); + Get().SendResponse(mResponseHeader, aResponseMessage, *mResponseMessage, mMessageInfo, aSocket); mResponseMessage = nullptr; } +void Server::UpdateResponseCounters(Header::Response aResponseCode) +{ + switch (aResponseCode) + { + case UpdateHeader::kResponseSuccess: + ++mCounters.mSuccessResponse; + break; + case UpdateHeader::kResponseServerFailure: + ++mCounters.mServerFailureResponse; + break; + case UpdateHeader::kResponseFormatError: + ++mCounters.mFormatErrorResponse; + break; + case UpdateHeader::kResponseNameError: + ++mCounters.mNameErrorResponse; + break; + case UpdateHeader::kResponseNotImplemented: + ++mCounters.mNotImplementedResponse; + break; + default: + ++mCounters.mOtherResponse; + break; + } +} + } // namespace ServiceDiscovery } // namespace Dns } // namespace ot diff --git a/src/core/net/dnssd_server.hpp b/src/core/net/dnssd_server.hpp index 2bab3b07e..de16c424e 100644 --- a/src/core/net/dnssd_server.hpp +++ b/src/core/net/dnssd_server.hpp @@ -67,6 +67,14 @@ class Server : public InstanceLocator, private NonCopyable friend class Srp::Server; public: + /** + * This class contains the counters of the DNS-SD server. + * + */ + class Counters : public otDnssdCounters, public Clearable + { + }; + /** * This enumeration specifies a DNS-SD query type. * @@ -155,6 +163,14 @@ public: */ static DnsQueryType GetQueryTypeAndName(const otDnssdQuery *aQuery, char (&aName)[Name::kMaxNameSize]); + /** + * This method returns the counters of the DNS-SD server. + * + * @returns A reference to the `Counters` instance. + * + */ + const Counters &GetCounters(void) const { return mCounters; }; + private: class NameCompressInfo : public Clearable { @@ -273,7 +289,7 @@ private: * This class contains the compress information for a dns packet. * */ - class QueryTransaction + class QueryTransaction : public InstanceLocatorInit { public: explicit QueryTransaction(void) @@ -284,7 +300,8 @@ private: void Init(const Header & aResponseHeader, Message & aResponseMessage, const NameCompressInfo &aCompressInfo, - const Ip6::MessageInfo &aMessageInfo); + const Ip6::MessageInfo &aMessageInfo, + Instance & aInstance); bool IsValid(void) const { return mResponseMessage != nullptr; } const Ip6::MessageInfo &GetMessageInfo(void) const { return mMessageInfo; } const Header & GetResponseHeader(void) const { return mResponseHeader; } @@ -347,7 +364,7 @@ private: static void IncResourceRecordCount(Header &aHeader, bool aAdditional); static Error FindNameComponents(const char *aName, const char *aDomain, NameComponentsOffsetInfo &aInfo); static Error FindPreviousLabel(const char *aName, uint8_t &aStart, uint8_t &aStop); - static void SendResponse(Header aHeader, + void SendResponse(Header aHeader, Header::Response aResponseCode, Message & aMessage, const Ip6::MessageInfo &aMessageInfo, @@ -392,6 +409,8 @@ private: void HandleTimer(void); void ResetTimer(void); + void UpdateResponseCounters(Header::Response aResponseCode); + static const char kDnssdProtocolUdp[]; static const char kDnssdProtocolTcp[]; static const char kDnssdSubTypeLabel[]; @@ -403,6 +422,8 @@ private: otDnssdQuerySubscribeCallback mQuerySubscribe; otDnssdQueryUnsubscribeCallback mQueryUnsubscribe; TimerMilli mTimer; + + Counters mCounters; }; } // namespace ServiceDiscovery