diff --git a/include/openthread/dnssd_server.h b/include/openthread/dnssd_server.h index 98f83d694..c008e3266 100644 --- a/include/openthread/dnssd_server.h +++ b/include/openthread/dnssd_server.h @@ -147,20 +147,33 @@ typedef enum OT_DNSSD_QUERY_TYPE_RESOLVE_HOST = 3, ///< Service type resolve hostname. } otDnssdQueryType; +/** + * Represents the count of queries, responses, failures handled by upstream DNS server. + * + * Requires `OPENTHREAD_CONFIG_DNS_UPSTREAM_QUERY_ENABLE`. + */ +typedef struct otUpstreamDnsCounters +{ + uint32_t mQueries; ///< The number of queries forwarded. + uint32_t mResponses; ///< The number of responses forwarded. + uint32_t mFailures; ///< The number of upstream DNS failures. +} otUpstreamDnsCounters; + /** * 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 + 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 resolved by the local SRP server. + otUpstreamDnsCounters mUpstreamDnsCounters; ///< The number of queries, responses, + ///< failures handled by upstream DNS server. } otDnssdCounters; /** diff --git a/include/openthread/instance.h b/include/openthread/instance.h index 2fa848528..e394abc96 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 (385) +#define OPENTHREAD_API_VERSION (386) /** * @addtogroup api-instance diff --git a/src/core/net/dnssd_server.cpp b/src/core/net/dnssd_server.cpp index 33aabbd66..385eb88f3 100644 --- a/src/core/net/dnssd_server.cpp +++ b/src/core/net/dnssd_server.cpp @@ -866,6 +866,10 @@ void Server::OnUpstreamQueryDone(UpstreamQueryTransaction &aQueryTransaction, Me { error = mSocket.SendTo(*aResponseMessage, aQueryTransaction.GetMessageInfo()); } + else + { + error = kErrorResponseTimeout; + } ResetUpstreamQueryTransaction(aQueryTransaction, error); @@ -886,7 +890,7 @@ Server::UpstreamQueryTransaction *Server::AllocateUpstreamQueryTransaction(const } } - VerifyOrExit(newTxn != nullptr); + VerifyOrExit(newTxn != nullptr, mCounters.mUpstreamDnsCounters.mFailures++); newTxn->Init(aMessageInfo); LogInfo("Upstream query transaction %d initialized.", static_cast(newTxn - mUpstreamQueryTransactions)); @@ -905,6 +909,7 @@ Error Server::ResolveByUpstream(const Request &aRequest) VerifyOrExit(txn != nullptr, error = kErrorNoBufs); otPlatDnsStartUpstreamQuery(&GetInstance(), txn, aRequest.mMessage); + mCounters.mUpstreamDnsCounters.mQueries++; exit: return error; @@ -1277,10 +1282,12 @@ void Server::ResetUpstreamQueryTransaction(UpstreamQueryTransaction &aTxn, Error OT_UNUSED_VARIABLE(index); if (aError == kErrorNone) { + mCounters.mUpstreamDnsCounters.mResponses++; LogInfo("Upstream query transaction %d completed.", index); } else { + mCounters.mUpstreamDnsCounters.mFailures++; LogWarn("Upstream query transaction %d closed: %s.", index, ErrorToString(aError)); } aTxn.Reset();