mirror of
https://github.com/espressif/openthread.git
synced 2026-08-15 07:07:46 +00:00
[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:
@@ -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);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user