mirror of
https://github.com/espressif/openthread.git
synced 2026-08-13 22:27:47 +00:00
[dns-types] add template variants of reading DNS names or labels (#9720)
This commit introduces template variants for `ReadName()` and other related methods, allowing flexible reading of DNS names and labels from messages into a given array buffer. This simplifies the code and improves readability. Additionally, this commit defines new types, `Dns::Name::Buffer` and `Dns::Name::LabelBuffer`, as arrays of char with fixed sizes to hold DNS names and labels, respectively.
This commit is contained in:
@@ -511,8 +511,24 @@ public:
|
||||
*/
|
||||
static constexpr uint8_t kMaxLabelLength = kMaxLabelSize - 1;
|
||||
|
||||
/**
|
||||
* Dot character separating labels in a name.
|
||||
*
|
||||
*/
|
||||
static constexpr char kLabelSeparatorChar = '.';
|
||||
|
||||
/**
|
||||
* Represents a string buffer (with `kMaxNameSize`) intended to hold a DNS name.
|
||||
*
|
||||
*/
|
||||
typedef char Buffer[kMaxNameSize];
|
||||
|
||||
/**
|
||||
* Represents a string buffer (with `kMaxLabelSize`) intended to hold a DNS label.
|
||||
*
|
||||
*/
|
||||
typedef char LabelBuffer[kMaxLabelSize];
|
||||
|
||||
/**
|
||||
* Represents the name type.
|
||||
*
|
||||
@@ -821,6 +837,35 @@ public:
|
||||
*/
|
||||
static Error ReadName(const Message &aMessage, uint16_t &aOffset, char *aNameBuffer, uint16_t aNameBufferSize);
|
||||
|
||||
/**
|
||||
* Reads a full name from a message.
|
||||
*
|
||||
* On successful read, the read name follows "<label1>.<label2>.<label3>.", i.e., a sequence of labels separated by
|
||||
* dot '.' character. The read name will ALWAYS end with a dot.
|
||||
*
|
||||
* Verifies that the labels after the first label in message do not contain any dot character. If they do,
|
||||
* returns `kErrorParse`.
|
||||
*
|
||||
* @tparam kNameBufferSize Size of the string buffer array.
|
||||
*
|
||||
* @param[in] aMessage The message to read the name from. `aMessage.GetOffset()` MUST point to
|
||||
* the start of DNS header (this is used to handle compressed names).
|
||||
* @param[in,out] aOffset On input, the offset in @p aMessage pointing to the start of the name field.
|
||||
* On exit (when parsed successfully), @p aOffset is updated to point to the byte
|
||||
* after the end of name field.
|
||||
* @param[out] aNameBuffer Reference to a name string buffer to output the read name.
|
||||
*
|
||||
* @retval kErrorNone Successfully read the name, @p aNameBuffer and @p Offset are updated.
|
||||
* @retval kErrorParse Name could not be parsed (invalid format).
|
||||
* @retval kErrorNoBufs Name could not fit in @p aNameBuffer.
|
||||
*
|
||||
*/
|
||||
template <uint16_t kNameBufferSize>
|
||||
static Error ReadName(const Message &aMessage, uint16_t &aOffset, char (&aNameBuffer)[kNameBufferSize])
|
||||
{
|
||||
return ReadName(aMessage, aOffset, aNameBuffer, kNameBufferSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares a single name label from a message with a given label string.
|
||||
*
|
||||
@@ -946,6 +991,30 @@ public:
|
||||
*/
|
||||
static Error ExtractLabels(const char *aName, const char *aSuffixName, char *aLabels, uint16_t aLabelsSize);
|
||||
|
||||
/**
|
||||
* Extracts label(s) from a full name by checking that it contains a given suffix name (e.g., suffix name can be
|
||||
* a domain name) and removing it.
|
||||
*
|
||||
* Both @p aName and @p aSuffixName must be full DNS name and end with ('.'), otherwise the behavior of this method
|
||||
* is undefined.
|
||||
*
|
||||
* @tparam kLabelsBufferSize Size of the buffer string.
|
||||
*
|
||||
* @param[in] aName The full name to extract labels from.
|
||||
* @param[in] aSuffixName The suffix name (e.g. can be domain name).
|
||||
* @param[out] aLabelsBuffer A buffer to copy the extracted labels.
|
||||
*
|
||||
* @retval kErrorNone Successfully extracted the labels, @p aLabels is updated.
|
||||
* @retval kErrorParse @p aName does not contain @p aSuffixName.
|
||||
* @retval kErrorNoBufs Could not fit the labels in @p aLabels.
|
||||
*
|
||||
*/
|
||||
template <uint16_t kLabelsBufferSize>
|
||||
static Error ExtractLabels(const char *aName, const char *aSuffixName, char (&aLabels)[kLabelsBufferSize])
|
||||
{
|
||||
return ExtractLabels(aName, aSuffixName, aLabels, kLabelsBufferSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a DNS name is a sub-domain of a given domain.
|
||||
*
|
||||
@@ -1660,6 +1729,36 @@ public:
|
||||
char *aNameBuffer,
|
||||
uint16_t aNameBufferSize) const;
|
||||
|
||||
/**
|
||||
* Parses and reads the PTR name from a message.
|
||||
*
|
||||
* This is a template variation of the previous method with name and label buffer sizes as template parameters.
|
||||
*
|
||||
* @tparam kLabelBufferSize The size of label buffer.
|
||||
* @tparam kNameBufferSize The size of name buffer.
|
||||
*
|
||||
* @param[in] aMessage The message to read from. `aMessage.GetOffset()` MUST point to the start of
|
||||
* DNS header.
|
||||
* @param[in,out] aOffset On input, the offset in @p aMessage to the start of PTR name field.
|
||||
* On exit, when successfully read, @p aOffset is updated to point to the byte
|
||||
* after the entire PTR record (skipping over the record).
|
||||
* @param[out] aLabelBuffer A char array buffer to output the first label as a null-terminated C string.
|
||||
* @param[out] aNameBuffer A char array to output the rest of name (after first label).
|
||||
*
|
||||
* @retval kErrorNone The PTR name was read successfully. @p aOffset, @aLabelBuffer and @aNameBuffer are updated.
|
||||
* @retval kErrorParse The PTR record in @p aMessage could not be parsed (invalid format).
|
||||
* @retval kErrorNoBufs Either label or name could not fit in the related given buffers.
|
||||
*
|
||||
*/
|
||||
template <uint16_t kLabelBufferSize, uint16_t kNameBufferSize>
|
||||
Error ReadPtrName(const Message &aMessage,
|
||||
uint16_t &aOffset,
|
||||
char (&aLabelBuffer)[kLabelBufferSize],
|
||||
char (&aNameBuffer)[kNameBufferSize]) const
|
||||
{
|
||||
return ReadPtrName(aMessage, aOffset, aLabelBuffer, kLabelBufferSize, aNameBuffer, kNameBufferSize);
|
||||
}
|
||||
|
||||
} OT_TOOL_PACKED_END;
|
||||
|
||||
/**
|
||||
@@ -1868,6 +1967,32 @@ public:
|
||||
/* aSkipRecord */ true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses and reads the SRV target host name from a message.
|
||||
*
|
||||
* Also verifies that the SRV record is well-formed (e.g., the record data length `GetLength()` matches
|
||||
* the SRV encoded name).
|
||||
*
|
||||
* @tparam kNameBufferSize Size of the name buffer.
|
||||
*
|
||||
* @param[in] aMessage The message to read from. `aMessage.GetOffset()` MUST point to the start of
|
||||
* DNS header.
|
||||
* @param[in,out] aOffset On input, the offset in @p aMessage to start of target host name field.
|
||||
* On exit when successfully read, @p aOffset is updated to point to the byte
|
||||
* after the entire SRV record (skipping over the record).
|
||||
* @param[out] aNameBuffer A char array to output the read name as a null-terminated C string
|
||||
*
|
||||
* @retval kErrorNone The host name was read successfully. @p aOffset and @p aNameBuffer are updated.
|
||||
* @retval kErrorParse The SRV record in @p aMessage could not be parsed (invalid format).
|
||||
* @retval kErrorNoBufs Name could not fit in @p aNameBuffer.
|
||||
*
|
||||
*/
|
||||
template <uint16_t kNameBufferSize>
|
||||
Error ReadTargetHostName(const Message &aMessage, uint16_t &aOffset, char (&aNameBuffer)[kNameBufferSize]) const
|
||||
{
|
||||
return ReadTargetHostName(aMessage, aOffset, aNameBuffer, kNameBufferSize);
|
||||
}
|
||||
|
||||
private:
|
||||
uint16_t mPriority;
|
||||
uint16_t mWeight;
|
||||
|
||||
@@ -412,12 +412,12 @@ Error Server::Response::ParseQueryName(void)
|
||||
// Parses and validates the query name and updates
|
||||
// the name compression offsets.
|
||||
|
||||
Error error = kErrorNone;
|
||||
DnsName name;
|
||||
uint16_t offset;
|
||||
Error error = kErrorNone;
|
||||
Name::Buffer name;
|
||||
uint16_t offset;
|
||||
|
||||
offset = sizeof(Header);
|
||||
SuccessOrExit(error = Name::ReadName(*mMessage, offset, name, sizeof(name)));
|
||||
SuccessOrExit(error = Name::ReadName(*mMessage, offset, name));
|
||||
|
||||
switch (mType)
|
||||
{
|
||||
@@ -446,9 +446,9 @@ Error Server::Response::ParseQueryName(void)
|
||||
|
||||
while (true)
|
||||
{
|
||||
DnsLabel label;
|
||||
uint8_t labelLength = sizeof(label);
|
||||
uint16_t comapreOffset;
|
||||
Name::LabelBuffer label;
|
||||
uint8_t labelLength = sizeof(label);
|
||||
uint16_t comapreOffset;
|
||||
|
||||
SuccessOrExit(error = Name::ReadLabel(*mMessage, offset, label, labelLength));
|
||||
|
||||
@@ -472,7 +472,7 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
void Server::Response::ReadQueryName(DnsName &aName) const { Server::ReadQueryName(*mMessage, aName); }
|
||||
void Server::Response::ReadQueryName(Name::Buffer &aName) const { Server::ReadQueryName(*mMessage, aName); }
|
||||
|
||||
bool Server::Response::QueryNameMatches(const char *aName) const { return Server::QueryNameMatches(*mMessage, aName); }
|
||||
|
||||
@@ -526,12 +526,12 @@ Error Server::Response::AppendSrvRecord(const char *aHostName,
|
||||
uint16_t aWeight,
|
||||
uint16_t aPort)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
SrvRecord srvRecord;
|
||||
uint16_t recordOffset;
|
||||
DnsName hostLabels;
|
||||
Error error = kErrorNone;
|
||||
SrvRecord srvRecord;
|
||||
uint16_t recordOffset;
|
||||
Name::Buffer hostLabels;
|
||||
|
||||
SuccessOrExit(error = Name::ExtractLabels(aHostName, kDefaultDomainName, hostLabels, sizeof(hostLabels)));
|
||||
SuccessOrExit(error = Name::ExtractLabels(aHostName, kDefaultDomainName, hostLabels));
|
||||
|
||||
srvRecord.Init();
|
||||
srvRecord.SetTtl(aTtl);
|
||||
@@ -674,7 +674,7 @@ uint8_t Server::GetNameLength(const char *aName)
|
||||
#if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_INFO)
|
||||
void Server::Response::Log(void) const
|
||||
{
|
||||
DnsName name;
|
||||
Name::Buffer name;
|
||||
|
||||
ReadQueryName(name);
|
||||
LogInfo("%s query for '%s'", QueryTypeToString(mType), name);
|
||||
@@ -830,16 +830,16 @@ exit:
|
||||
#if OPENTHREAD_CONFIG_DNS_UPSTREAM_QUERY_ENABLE
|
||||
bool Server::ShouldForwardToUpstream(const Request &aRequest)
|
||||
{
|
||||
bool shouldForward = false;
|
||||
uint16_t readOffset;
|
||||
DnsName name;
|
||||
bool shouldForward = false;
|
||||
uint16_t readOffset;
|
||||
Name::Buffer name;
|
||||
|
||||
VerifyOrExit(aRequest.mHeader.IsRecursionDesiredFlagSet());
|
||||
readOffset = sizeof(Header);
|
||||
|
||||
for (uint16_t i = 0; i < aRequest.mHeader.GetQuestionCount(); i++)
|
||||
{
|
||||
SuccessOrExit(Name::ReadName(*aRequest.mMessage, readOffset, name, sizeof(name)));
|
||||
SuccessOrExit(Name::ReadName(*aRequest.mMessage, readOffset, name));
|
||||
readOffset += sizeof(Question);
|
||||
|
||||
VerifyOrExit(!Name::IsSubDomainOf(name, kDefaultDomainName));
|
||||
@@ -915,7 +915,7 @@ void Server::ResolveByProxy(Response &aResponse, const Ip6::MessageInfo &aMessag
|
||||
{
|
||||
ProxyQuery *query;
|
||||
ProxyQueryInfo info;
|
||||
DnsName name;
|
||||
Name::Buffer name;
|
||||
|
||||
VerifyOrExit(mQuerySubscribe.IsSet());
|
||||
|
||||
@@ -950,11 +950,11 @@ exit:
|
||||
return;
|
||||
}
|
||||
|
||||
void Server::ReadQueryName(const Message &aQuery, DnsName &aName)
|
||||
void Server::ReadQueryName(const Message &aQuery, Name::Buffer &aName)
|
||||
{
|
||||
uint16_t offset = sizeof(Header);
|
||||
|
||||
IgnoreError(Name::ReadName(aQuery, offset, aName, sizeof(aName)));
|
||||
IgnoreError(Name::ReadName(aQuery, offset, aName));
|
||||
}
|
||||
|
||||
bool Server::QueryNameMatches(const Message &aQuery, const char *aName)
|
||||
@@ -979,20 +979,20 @@ void Server::ProxyQueryInfo::UpdateIn(ProxyQuery &aQuery) const
|
||||
aQuery.Write(aQuery.GetLength() - sizeof(ProxyQueryInfo), *this);
|
||||
}
|
||||
|
||||
Error Server::Response::ExtractServiceInstanceLabel(const char *aInstanceName, DnsLabel &aLabel)
|
||||
Error Server::Response::ExtractServiceInstanceLabel(const char *aInstanceName, Name::LabelBuffer &aLabel)
|
||||
{
|
||||
uint16_t offset;
|
||||
DnsName serviceName;
|
||||
uint16_t offset;
|
||||
Name::Buffer serviceName;
|
||||
|
||||
offset = mOffsets.mServiceName;
|
||||
IgnoreError(Name::ReadName(*mMessage, offset, serviceName, sizeof(serviceName)));
|
||||
IgnoreError(Name::ReadName(*mMessage, offset, serviceName));
|
||||
|
||||
return Name::ExtractLabels(aInstanceName, serviceName, aLabel, sizeof(aLabel));
|
||||
return Name::ExtractLabels(aInstanceName, serviceName, aLabel);
|
||||
}
|
||||
|
||||
void Server::RemoveQueryAndPrepareResponse(ProxyQuery &aQuery, const ProxyQueryInfo &aInfo, Response &aResponse)
|
||||
{
|
||||
DnsName name;
|
||||
Name::Buffer name;
|
||||
|
||||
mProxyQueries.Dequeue(aQuery);
|
||||
aInfo.RemoveFrom(aQuery);
|
||||
@@ -1021,7 +1021,7 @@ void Server::Response::Answer(const ServiceInstanceInfo &aInstanceInfo, const Ip
|
||||
|
||||
if (mType == kPtrQuery)
|
||||
{
|
||||
DnsLabel instanceLabel;
|
||||
Name::LabelBuffer instanceLabel;
|
||||
|
||||
SuccessOrExit(error = ExtractServiceInstanceLabel(aInstanceInfo.mFullName, instanceLabel));
|
||||
mSection = kAnswerSection;
|
||||
@@ -1148,7 +1148,7 @@ const otDnssdQuery *Server::GetNextQuery(const otDnssdQuery *aQuery) const
|
||||
return (query == nullptr) ? mProxyQueries.GetHead() : query->GetNext();
|
||||
}
|
||||
|
||||
Server::DnsQueryType Server::GetQueryTypeAndName(const otDnssdQuery *aQuery, char (&aName)[Name::kMaxNameSize])
|
||||
Server::DnsQueryType Server::GetQueryTypeAndName(const otDnssdQuery *aQuery, Dns::Name::Buffer &aName)
|
||||
{
|
||||
const ProxyQuery *query = static_cast<const ProxyQuery *>(aQuery);
|
||||
ProxyQueryInfo info;
|
||||
|
||||
@@ -258,7 +258,7 @@ public:
|
||||
* @returns The DNS-SD query type.
|
||||
*
|
||||
*/
|
||||
static DnsQueryType GetQueryTypeAndName(const otDnssdQuery *aQuery, char (&aName)[Name::kMaxNameSize]);
|
||||
static DnsQueryType GetQueryTypeAndName(const otDnssdQuery *aQuery, Dns::Name::Buffer &aName);
|
||||
|
||||
/**
|
||||
* Returns the counters of the DNS-SD server.
|
||||
@@ -297,8 +297,6 @@ private:
|
||||
static constexpr uint16_t kMaxConcurrentUpstreamQueries = 32;
|
||||
|
||||
typedef Header::Response ResponseCode;
|
||||
typedef char DnsName[Name::kMaxNameSize];
|
||||
typedef char DnsLabel[Name::kMaxLabelSize];
|
||||
|
||||
typedef Message ProxyQuery;
|
||||
typedef MessageQueue ProxyQueryList;
|
||||
@@ -347,7 +345,7 @@ private:
|
||||
void SetResponseCode(ResponseCode aResponseCode) { mHeader.SetResponseCode(aResponseCode); }
|
||||
ResponseCode AddQuestionsFrom(const Request &aRequest);
|
||||
Error ParseQueryName(void);
|
||||
void ReadQueryName(DnsName &aName) const;
|
||||
void ReadQueryName(Name::Buffer &aName) const;
|
||||
bool QueryNameMatches(const char *aName) const;
|
||||
Error AppendQueryName(void);
|
||||
Error AppendPtrRecord(const char *aInstanceLabel, uint32_t aTtl);
|
||||
@@ -367,7 +365,7 @@ private:
|
||||
void Send(const Ip6::MessageInfo &aMessageInfo);
|
||||
void Answer(const HostInfo &aHostInfo, const Ip6::MessageInfo &aMessageInfo);
|
||||
void Answer(const ServiceInstanceInfo &aInstanceInfo, const Ip6::MessageInfo &aMessageInfo);
|
||||
Error ExtractServiceInstanceLabel(const char *aInstanceName, DnsLabel &aLabel);
|
||||
Error ExtractServiceInstanceLabel(const char *aInstanceName, Name::LabelBuffer &aLabel);
|
||||
#if OPENTHREAD_CONFIG_SRP_SERVER_ENABLE
|
||||
Error ResolveBySrp(void);
|
||||
bool QueryNameMatchesService(const Srp::Server::Service &aService) const;
|
||||
@@ -408,7 +406,7 @@ private:
|
||||
void ResolveByProxy(Response &aResponse, const Ip6::MessageInfo &aMessageInfo);
|
||||
void RemoveQueryAndPrepareResponse(ProxyQuery &aQuery, const ProxyQueryInfo &aInfo, Response &aResponse);
|
||||
void Finalize(ProxyQuery &aQuery, ResponseCode aResponseCode);
|
||||
static void ReadQueryName(const Message &aQuery, DnsName &aName);
|
||||
static void ReadQueryName(const Message &aQuery, Name::Buffer &aName);
|
||||
static bool QueryNameMatches(const Message &aQuery, const char *aName);
|
||||
|
||||
#if OPENTHREAD_CONFIG_DNS_UPSTREAM_QUERY_ENABLE
|
||||
|
||||
+33
-35
@@ -796,13 +796,13 @@ exit:
|
||||
|
||||
Error Server::ProcessZoneSection(const Message &aMessage, MessageMetadata &aMetadata) const
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
char name[Dns::Name::kMaxNameSize];
|
||||
uint16_t offset = aMetadata.mOffset;
|
||||
Error error = kErrorNone;
|
||||
Dns::Name::Buffer name;
|
||||
uint16_t offset = aMetadata.mOffset;
|
||||
|
||||
VerifyOrExit(aMetadata.mDnsHeader.GetZoneRecordCount() == 1, error = kErrorParse);
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name, sizeof(name)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name));
|
||||
// TODO: return `Dns::kResponseNotAuth` for not authorized zone names.
|
||||
VerifyOrExit(StringMatch(name, GetDomain(), kStringCaseInsensitiveMatch), error = kErrorSecurity);
|
||||
SuccessOrExit(error = aMessage.Read(offset, aMetadata.mDnsZone));
|
||||
@@ -861,10 +861,10 @@ Error Server::ProcessHostDescriptionInstruction(Host &aHost,
|
||||
|
||||
for (uint16_t numRecords = aMetadata.mDnsHeader.GetUpdateRecordCount(); numRecords > 0; numRecords--)
|
||||
{
|
||||
char name[Dns::Name::kMaxNameSize];
|
||||
Dns::Name::Buffer name;
|
||||
Dns::ResourceRecord record;
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name, sizeof(name)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name));
|
||||
|
||||
SuccessOrExit(error = aMessage.Read(offset, record));
|
||||
|
||||
@@ -952,9 +952,9 @@ Error Server::ProcessServiceDiscoveryInstructions(Host &aHost,
|
||||
|
||||
for (uint16_t numRecords = aMetadata.mDnsHeader.GetUpdateRecordCount(); numRecords > 0; numRecords--)
|
||||
{
|
||||
char serviceName[Dns::Name::kMaxNameSize];
|
||||
char instanceLabel[Dns::Name::kMaxLabelSize];
|
||||
char instanceServiceName[Dns::Name::kMaxNameSize];
|
||||
Dns::Name::Buffer serviceName;
|
||||
Dns::Name::LabelBuffer instanceLabel;
|
||||
Dns::Name::Buffer instanceServiceName;
|
||||
String<Dns::Name::kMaxNameSize> instanceName;
|
||||
Dns::PtrRecord ptrRecord;
|
||||
const char *subServiceName;
|
||||
@@ -962,7 +962,7 @@ Error Server::ProcessServiceDiscoveryInstructions(Host &aHost,
|
||||
bool isSubType;
|
||||
bool isDelete;
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, serviceName, sizeof(serviceName)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, serviceName));
|
||||
VerifyOrExit(Dns::Name::IsSubDomainOf(serviceName, GetDomain()), error = kErrorSecurity);
|
||||
|
||||
error = Dns::ResourceRecord::ReadRecord(aMessage, offset, ptrRecord);
|
||||
@@ -977,8 +977,7 @@ Error Server::ProcessServiceDiscoveryInstructions(Host &aHost,
|
||||
|
||||
SuccessOrExit(error);
|
||||
|
||||
SuccessOrExit(error = ptrRecord.ReadPtrName(aMessage, offset, instanceLabel, sizeof(instanceLabel),
|
||||
instanceServiceName, sizeof(instanceServiceName)));
|
||||
SuccessOrExit(error = ptrRecord.ReadPtrName(aMessage, offset, instanceLabel, instanceServiceName));
|
||||
instanceName.Append("%s.%s", instanceLabel, instanceServiceName);
|
||||
|
||||
// Class None indicates "Delete an RR from an RRset".
|
||||
@@ -1076,11 +1075,11 @@ Error Server::ProcessServiceDescriptionInstructions(Host &aHost,
|
||||
|
||||
for (uint16_t numRecords = aMetadata.mDnsHeader.GetUpdateRecordCount(); numRecords > 0; numRecords--)
|
||||
{
|
||||
char name[Dns::Name::kMaxNameSize];
|
||||
Dns::Name::Buffer name;
|
||||
Dns::ResourceRecord record;
|
||||
Service *service;
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name, sizeof(name)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name));
|
||||
SuccessOrExit(error = aMessage.Read(offset, record));
|
||||
|
||||
if (record.GetClass() == Dns::ResourceRecord::kClassAny)
|
||||
@@ -1102,9 +1101,8 @@ Error Server::ProcessServiceDescriptionInstructions(Host &aHost,
|
||||
|
||||
if (record.GetType() == Dns::ResourceRecord::kTypeSrv)
|
||||
{
|
||||
Dns::SrvRecord srvRecord;
|
||||
char hostName[Dns::Name::kMaxNameSize];
|
||||
uint16_t hostNameLength = sizeof(hostName);
|
||||
Dns::SrvRecord srvRecord;
|
||||
Dns::Name::Buffer hostName;
|
||||
|
||||
VerifyOrExit(record.GetClass() == aMetadata.mDnsZone.GetClass(), error = kErrorFailed);
|
||||
|
||||
@@ -1113,7 +1111,7 @@ Error Server::ProcessServiceDescriptionInstructions(Host &aHost,
|
||||
SuccessOrExit(error = aMessage.Read(offset, srvRecord));
|
||||
offset += sizeof(srvRecord);
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, hostName, hostNameLength));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, hostName));
|
||||
VerifyOrExit(Dns::Name::IsSubDomainOf(name, GetDomain()), error = kErrorSecurity);
|
||||
VerifyOrExit(aHost.Matches(hostName), error = kErrorFailed);
|
||||
|
||||
@@ -1179,22 +1177,22 @@ bool Server::IsValidDeleteAllRecord(const Dns::ResourceRecord &aRecord)
|
||||
|
||||
Error Server::ProcessAdditionalSection(Host *aHost, const Message &aMessage, MessageMetadata &aMetadata) const
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
Dns::OptRecord optRecord;
|
||||
Dns::LeaseOption leaseOption;
|
||||
Dns::SigRecord sigRecord;
|
||||
char name[2]; // The root domain name (".") is expected.
|
||||
uint16_t offset = aMetadata.mOffset;
|
||||
uint16_t sigOffset;
|
||||
uint16_t sigRdataOffset;
|
||||
char signerName[Dns::Name::kMaxNameSize];
|
||||
uint16_t signatureLength;
|
||||
Error error = kErrorNone;
|
||||
Dns::OptRecord optRecord;
|
||||
Dns::LeaseOption leaseOption;
|
||||
Dns::SigRecord sigRecord;
|
||||
char name[2]; // The root domain name (".") is expected.
|
||||
uint16_t offset = aMetadata.mOffset;
|
||||
uint16_t sigOffset;
|
||||
uint16_t sigRdataOffset;
|
||||
Dns::Name::Buffer signerName;
|
||||
uint16_t signatureLength;
|
||||
|
||||
VerifyOrExit(aMetadata.mDnsHeader.GetAdditionalRecordCount() == 2, error = kErrorFailed);
|
||||
|
||||
// EDNS(0) Update Lease Option.
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name, sizeof(name)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name));
|
||||
SuccessOrExit(error = aMessage.Read(offset, optRecord));
|
||||
|
||||
SuccessOrExit(error = leaseOption.ReadFrom(aMessage, offset + sizeof(optRecord), optRecord.GetLength()));
|
||||
@@ -1221,7 +1219,7 @@ Error Server::ProcessAdditionalSection(Host *aHost, const Message &aMessage, Mes
|
||||
// SIG(0).
|
||||
|
||||
sigOffset = offset;
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name, sizeof(name)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, name));
|
||||
SuccessOrExit(error = aMessage.Read(offset, sigRecord));
|
||||
VerifyOrExit(sigRecord.IsValid(), error = kErrorParse);
|
||||
|
||||
@@ -1232,7 +1230,7 @@ Error Server::ProcessAdditionalSection(Host *aHost, const Message &aMessage, Mes
|
||||
// implemented because the end device may not be able to get
|
||||
// the synchronized date/time.
|
||||
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, signerName, sizeof(signerName)));
|
||||
SuccessOrExit(error = Dns::Name::ReadName(aMessage, offset, signerName));
|
||||
|
||||
signatureLength = sigRecord.GetLength() - (offset - sigRdataOffset);
|
||||
offset += signatureLength;
|
||||
@@ -1383,9 +1381,9 @@ void Server::InformUpdateHandlerOrCommit(Error aError, Host &aHost, const Messag
|
||||
|
||||
for (const Heap::String &subType : service.mSubTypes)
|
||||
{
|
||||
char label[Dns::Name::kMaxLabelSize];
|
||||
Dns::Name::LabelBuffer label;
|
||||
|
||||
IgnoreError(Service::ParseSubTypeServiceName(subType.AsCString(), label, sizeof(label)));
|
||||
IgnoreError(Service::ParseSubTypeServiceName(subType.AsCString(), label));
|
||||
LogInfo(" sub-type: %s", label);
|
||||
}
|
||||
}
|
||||
@@ -1892,9 +1890,9 @@ void Server::Service::Log(Action aAction) const
|
||||
|
||||
for (const Heap::String &subType : mSubTypes)
|
||||
{
|
||||
char label[Dns::Name::kMaxLabelSize];
|
||||
Dns::Name::LabelBuffer label;
|
||||
|
||||
IgnoreError(ParseSubTypeServiceName(subType.AsCString(), label, sizeof(label)));
|
||||
IgnoreError(ParseSubTypeServiceName(subType.AsCString(), label));
|
||||
LogInfo(" sub-type: %s", subType.AsCString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -407,6 +407,12 @@ public:
|
||||
bool Matches(const char *aInstanceName) const;
|
||||
void Log(Action aAction) const;
|
||||
|
||||
template <uint16_t kLabelSize>
|
||||
static Error ParseSubTypeServiceName(const char *aSubTypeServiceName, char (&aLabel)[kLabelSize])
|
||||
{
|
||||
return ParseSubTypeServiceName(aSubTypeServiceName, aLabel, kLabelSize);
|
||||
}
|
||||
|
||||
Service *mNext;
|
||||
Heap::String mInstanceName;
|
||||
Heap::String mInstanceLabel;
|
||||
|
||||
+37
-37
@@ -56,20 +56,20 @@ void TestDnsName(void)
|
||||
const char *mExpectedReadName;
|
||||
};
|
||||
|
||||
Instance *instance;
|
||||
MessagePool *messagePool;
|
||||
Message *message;
|
||||
uint8_t buffer[kMaxSize];
|
||||
uint16_t len;
|
||||
uint16_t offset;
|
||||
char label[Dns::Name::kMaxLabelSize];
|
||||
uint8_t labelLength;
|
||||
char name[Dns::Name::kMaxNameSize];
|
||||
const char *subDomain;
|
||||
const char *domain;
|
||||
const char *domain2;
|
||||
const char *fullName;
|
||||
const char *suffixName;
|
||||
Instance *instance;
|
||||
MessagePool *messagePool;
|
||||
Message *message;
|
||||
uint8_t buffer[kMaxSize];
|
||||
uint16_t len;
|
||||
uint16_t offset;
|
||||
Dns::Name::LabelBuffer label;
|
||||
uint8_t labelLength;
|
||||
Dns::Name::Buffer name;
|
||||
const char *subDomain;
|
||||
const char *domain;
|
||||
const char *domain2;
|
||||
const char *fullName;
|
||||
const char *suffixName;
|
||||
|
||||
static const uint8_t kEncodedName1[] = {7, 'e', 'x', 'a', 'm', 'p', 'l', 'e', 3, 'c', 'o', 'm', 0};
|
||||
static const uint8_t kEncodedName2[] = {3, 'f', 'o', 'o', 1, 'a', 2, 'b', 'b', 3, 'e', 'd', 'u', 0};
|
||||
@@ -254,42 +254,42 @@ void TestDnsName(void)
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "default.service.arpa.";
|
||||
SuccessOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name));
|
||||
VerifyOrQuit(strcmp(name, "my-service._ipps._tcp") == 0);
|
||||
|
||||
fullName = "my.service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "_ipps._tcp.default.service.arpa.";
|
||||
SuccessOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name));
|
||||
VerifyOrQuit(strcmp(name, "my.service") == 0);
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "DeFault.SerVice.ARPA.";
|
||||
SuccessOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name));
|
||||
VerifyOrQuit(strcmp(name, "my-service._ipps._tcp") == 0);
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "efault.service.arpa.";
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)) == kErrorParse);
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name) == kErrorParse);
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "xdefault.service.arpa.";
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)) == kErrorParse);
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name) == kErrorParse);
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = ".default.service.arpa.";
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)) == kErrorParse);
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name) == kErrorParse);
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "default.service.arp.";
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)) == kErrorParse);
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name) == kErrorParse);
|
||||
|
||||
fullName = "default.service.arpa.";
|
||||
suffixName = "default.service.arpa.";
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)) == kErrorParse);
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name) == kErrorParse);
|
||||
|
||||
fullName = "efault.service.arpa.";
|
||||
suffixName = "default.service.arpa.";
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name, sizeof(name)) == kErrorParse);
|
||||
VerifyOrQuit(Dns::Name::ExtractLabels(fullName, suffixName, name) == kErrorParse);
|
||||
|
||||
fullName = "my-service._ipps._tcp.default.service.arpa.";
|
||||
suffixName = "default.service.arpa.";
|
||||
@@ -342,7 +342,7 @@ void TestDnsName(void)
|
||||
|
||||
// Read entire name
|
||||
offset = 0;
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name));
|
||||
|
||||
printf("Read name =\"%s\"\n", name);
|
||||
|
||||
@@ -633,7 +633,7 @@ void TestDnsCompressedName(void)
|
||||
"Name::ReadLabel() failed at end of the name");
|
||||
|
||||
offset = name1Offset;
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name));
|
||||
printf("Read name =\"%s\"\n", name);
|
||||
VerifyOrQuit(strcmp(name, kExpectedReadName1) == 0, "Name::ReadName() did not return expected name");
|
||||
VerifyOrQuit(offset == name1Offset + sizeof(kEncodedName), "Name::ReadName() returned incorrect offset");
|
||||
@@ -690,7 +690,7 @@ void TestDnsCompressedName(void)
|
||||
"Name::ReadLabel() failed at end of the name");
|
||||
|
||||
offset = name2Offset;
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name));
|
||||
printf("Read name =\"%s\"\n", name);
|
||||
VerifyOrQuit(strcmp(name, kExpectedReadName2) == 0, "Name::ReadName() did not return expected name");
|
||||
VerifyOrQuit(offset == name2Offset + kName2EncodedSize, "Name::ReadName() returned incorrect offset");
|
||||
@@ -747,7 +747,7 @@ void TestDnsCompressedName(void)
|
||||
"Name::ReadLabel() failed at end of the name");
|
||||
|
||||
offset = name3Offset;
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name));
|
||||
printf("Read name =\"%s\"\n", name);
|
||||
VerifyOrQuit(strcmp(name, kExpectedReadName3) == 0, "Name::ReadName() did not return expected name");
|
||||
VerifyOrQuit(offset == name3Offset + kName3EncodedSize, "Name::ReadName() returned incorrect offset");
|
||||
@@ -801,7 +801,7 @@ void TestDnsCompressedName(void)
|
||||
|
||||
// `ReadName()` for name-4 should still succeed since only the first label contains dot char
|
||||
offset = name4Offset;
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message, offset, name));
|
||||
printf("Read name =\"%s\"\n", name);
|
||||
VerifyOrQuit(strcmp(name, kExpectedReadName4) == 0, "Name::ReadName() did not return expected name");
|
||||
VerifyOrQuit(offset == name4Offset + kName4EncodedSize, "Name::ParseName() returned incorrect offset");
|
||||
@@ -848,11 +848,11 @@ void TestDnsCompressedName(void)
|
||||
SuccessOrQuit(Dns::Name::CompareName(*message2, offset, dnsName4));
|
||||
|
||||
offset = 0;
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message2, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message2, offset, name));
|
||||
printf("- Name1 after `AppendTo()`: \"%s\"\n", name);
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message2, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message2, offset, name));
|
||||
printf("- Name2 after `AppendTo()`: \"%s\"\n", name);
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message2, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(Dns::Name::ReadName(*message2, offset, name));
|
||||
printf("- Name3 after `AppendTo()`: \"%s\"\n", name);
|
||||
// `ReadName()` for name-4 will fail due to first label containing dot char.
|
||||
|
||||
@@ -913,9 +913,9 @@ void TestHeaderAndResourceRecords(void)
|
||||
Dns::ResourceRecord record;
|
||||
Ip6::Address hostAddress;
|
||||
|
||||
char label[Dns::Name::kMaxLabelSize];
|
||||
char name[Dns::Name::kMaxNameSize];
|
||||
uint8_t buffer[kMaxSize];
|
||||
Dns::Name::LabelBuffer label;
|
||||
Dns::Name::Buffer name;
|
||||
uint8_t buffer[kMaxSize];
|
||||
|
||||
printf("================================================================\n");
|
||||
printf("TestHeaderAndResourceRecords()\n");
|
||||
@@ -1050,7 +1050,7 @@ void TestHeaderAndResourceRecords(void)
|
||||
SuccessOrQuit(Dns::ResourceRecord::ReadRecord(*message, offset, ptrRecord));
|
||||
VerifyOrQuit(ptrRecord.GetTtl() == kTtl, "Read PTR is incorrect");
|
||||
|
||||
SuccessOrQuit(ptrRecord.ReadPtrName(*message, offset, label, sizeof(label), name, sizeof(name)));
|
||||
SuccessOrQuit(ptrRecord.ReadPtrName(*message, offset, label, name));
|
||||
VerifyOrQuit(strcmp(label, instanceLabel) == 0, "Inst label is incorrect");
|
||||
VerifyOrQuit(strcmp(name, kServiceName) == 0);
|
||||
|
||||
@@ -1077,7 +1077,7 @@ void TestHeaderAndResourceRecords(void)
|
||||
VerifyOrQuit(numRecords == prevNumRecords - 1, "Incorrect num records");
|
||||
SuccessOrQuit(Dns::ResourceRecord::ReadRecord(*message, offset, ptrRecord));
|
||||
VerifyOrQuit(ptrRecord.GetTtl() == kTtl, "Read PTR is incorrect");
|
||||
SuccessOrQuit(ptrRecord.ReadPtrName(*message, offset, label, sizeof(label), name, sizeof(name)));
|
||||
SuccessOrQuit(ptrRecord.ReadPtrName(*message, offset, label, name));
|
||||
printf(" \"%s\" PTR %u %d inst:\"%s\" at \"%s\"\n", kServiceName, ptrRecord.GetTtl(), ptrRecord.GetLength(),
|
||||
label, name);
|
||||
}
|
||||
@@ -1125,7 +1125,7 @@ void TestHeaderAndResourceRecords(void)
|
||||
VerifyOrQuit(srvRecord.GetPort() == kSrvPort);
|
||||
VerifyOrQuit(srvRecord.GetWeight() == kSrvWeight);
|
||||
VerifyOrQuit(srvRecord.GetPriority() == kSrvPriority);
|
||||
SuccessOrQuit(srvRecord.ReadTargetHostName(*message, offset, name, sizeof(name)));
|
||||
SuccessOrQuit(srvRecord.ReadTargetHostName(*message, offset, name));
|
||||
VerifyOrQuit(strcmp(name, kHostName) == 0);
|
||||
printf(" \"%s\" SRV %u %d %d %d %d \"%s\"\n", instanceName, srvRecord.GetTtl(), srvRecord.GetLength(),
|
||||
srvRecord.GetPort(), srvRecord.GetWeight(), srvRecord.GetPriority(), name);
|
||||
|
||||
@@ -357,10 +357,10 @@ struct BrowseInfo
|
||||
{
|
||||
void Reset(void) { mCallbackCount = 0; }
|
||||
|
||||
uint16_t mCallbackCount;
|
||||
Error mError;
|
||||
char mServiceName[Dns::Name::kMaxNameSize];
|
||||
uint16_t mNumInstances;
|
||||
uint16_t mCallbackCount;
|
||||
Error mError;
|
||||
Dns::Name::Buffer mServiceName;
|
||||
uint16_t mNumInstances;
|
||||
};
|
||||
|
||||
static BrowseInfo sBrowseInfo;
|
||||
@@ -384,8 +384,8 @@ void BrowseCallback(otError aError, const otDnsBrowseResponse *aResponse, void *
|
||||
|
||||
for (uint16_t index = 0;; index++)
|
||||
{
|
||||
char instLabel[Dns::Name::kMaxLabelSize];
|
||||
Error error;
|
||||
Dns::Name::LabelBuffer instLabel;
|
||||
Error error;
|
||||
|
||||
error = response.GetServiceInstance(index, instLabel, sizeof(instLabel));
|
||||
|
||||
@@ -423,7 +423,7 @@ struct ResolveServiceInfo
|
||||
uint16_t mCallbackCount;
|
||||
Error mError;
|
||||
Dns::Client::ServiceInfo mInfo;
|
||||
char mNameBuffer[Dns::Name::kMaxNameSize];
|
||||
Dns::Name::Buffer mNameBuffer;
|
||||
uint8_t mTxtBuffer[kMaxTxtBuffer];
|
||||
Ip6::Address mHostAddresses[kMaxHostAddresses];
|
||||
uint8_t mNumHostAddresses;
|
||||
@@ -434,8 +434,8 @@ static ResolveServiceInfo sResolveServiceInfo;
|
||||
void ServiceCallback(otError aError, const otDnsServiceResponse *aResponse, void *aContext)
|
||||
{
|
||||
const Dns::Client::ServiceResponse &response = AsCoreType(aResponse);
|
||||
char instLabel[Dns::Name::kMaxLabelSize];
|
||||
char serviceName[Dns::Name::kMaxNameSize];
|
||||
Dns::Name::LabelBuffer instLabel;
|
||||
Dns::Name::Buffer serviceName;
|
||||
|
||||
Log("ServiceCallback");
|
||||
Log(" Error: %s", ErrorToString(aError));
|
||||
@@ -912,8 +912,8 @@ void TestDnsClient(void)
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
char sLastSubscribeName[Dns::Name::kMaxNameSize];
|
||||
char sLastUnsubscribeName[Dns::Name::kMaxNameSize];
|
||||
Dns::Name::Buffer sLastSubscribeName;
|
||||
Dns::Name::Buffer sLastUnsubscribeName;
|
||||
|
||||
void QuerySubscribe(void *aContext, const char *aFullName)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user