[dnssd-server] add otDnssdGetCounters for telemetry (#7708)

This commit implements `otDnssdGetCounters` to report the statistics
of the DNS-SD server.
This commit is contained in:
whd
2022-05-24 21:14:58 -07:00
committed by GitHub
parent 67c2c04f0e
commit 8210a02400
5 changed files with 100 additions and 10 deletions
+26
View File
@@ -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);
/**
* @}
*
+1 -1
View File
@@ -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
+5
View File
@@ -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<Dns::ServiceDiscovery::Server>().GetCounters();
}
#endif // OPENTHREAD_CONFIG_DNSSD_SERVER_ENABLE
+44 -6
View File
@@ -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<Server>().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
+24 -3
View File
@@ -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<Counters>
{
};
/**
* 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<NameCompressInfo>
{
@@ -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