mirror of
https://github.com/espressif/openthread.git
synced 2026-08-11 05:07:47 +00:00
[dns] add a common helper UpdateRecordLengthInMessage() (#11409)
This commit adds `ResourceRecord::UpdateRecordLengthInMessage()` helper method in `dns_types.hpp`. This common helper is then used in the SRP client, DNSSD server, and mDNS modules, replacing similar methods previously implemented within these modules.
This commit is contained in:
@@ -805,6 +805,15 @@ bool Name::IsSameDomain(const char *aDomain1, const char *aDomain2)
|
||||
return IsSubDomainOf(aDomain1, aDomain2) && IsSubDomainOf(aDomain2, aDomain1);
|
||||
}
|
||||
|
||||
void ResourceRecord::UpdateRecordLengthInMessage(Message &aMessage, uint16_t aOffset)
|
||||
{
|
||||
ResourceRecord record;
|
||||
|
||||
IgnoreError(aMessage.Read(aOffset, record));
|
||||
record.SetLength(aMessage.GetLength() - aOffset - sizeof(ResourceRecord));
|
||||
aMessage.Write(aOffset, record);
|
||||
}
|
||||
|
||||
Error ResourceRecord::ParseRecords(const Message &aMessage, uint16_t &aOffset, uint16_t aNumRecords)
|
||||
{
|
||||
Error error = kErrorNone;
|
||||
|
||||
@@ -1377,6 +1377,18 @@ public:
|
||||
*/
|
||||
uint32_t GetSize(void) const { return sizeof(ResourceRecord) + GetLength(); }
|
||||
|
||||
/**
|
||||
* Updates the record length in a message.
|
||||
*
|
||||
* This method should be called after all the record data fields are appended to the message. It uses the current
|
||||
* message length along with @p aOffset to determine the record length and then updates it within the @p aMessage.
|
||||
* The @p aOffset should point to to the start of the `ResourceRecord` in @p aMessage.
|
||||
*
|
||||
* @param[in] aMessage The message to update.
|
||||
* @param[in] aOffset The offset to the start of `ResourceRecord` in @p aMessage.
|
||||
*/
|
||||
static void UpdateRecordLengthInMessage(Message &aMessage, uint16_t aOffset);
|
||||
|
||||
/**
|
||||
* Parses and skips over a given number of resource records in a message from a given offset.
|
||||
*
|
||||
|
||||
@@ -502,7 +502,7 @@ Error Server::Response::AppendPtrRecord(const char *aInstanceLabel, uint32_t aTt
|
||||
SuccessOrExit(error = Name::AppendLabel(aInstanceLabel, *mMessage));
|
||||
SuccessOrExit(error = Name::AppendPointerLabel(mOffsets.mServiceName, *mMessage));
|
||||
|
||||
UpdateRecordLength(ptrRecord, recordOffset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(*mMessage, recordOffset);
|
||||
|
||||
IncResourceRecordCount();
|
||||
|
||||
@@ -554,7 +554,7 @@ Error Server::Response::AppendSrvRecord(const char *aHostName,
|
||||
SuccessOrExit(error = Name::AppendMultipleLabels(hostLabels, *mMessage));
|
||||
SuccessOrExit(error = Name::AppendPointerLabel(mOffsets.mDomainName, *mMessage));
|
||||
|
||||
UpdateRecordLength(srvRecord, recordOffset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(*mMessage, recordOffset);
|
||||
|
||||
IncResourceRecordCount();
|
||||
|
||||
@@ -692,18 +692,6 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
void Server::Response::UpdateRecordLength(ResourceRecord &aRecord, uint16_t aOffset)
|
||||
{
|
||||
// Calculates RR DATA length and updates and re-writes it in the
|
||||
// response message. This should be called immediately
|
||||
// after all the fields in the record are written in the message.
|
||||
// `aOffset` gives the offset in the message to the start of the
|
||||
// record.
|
||||
|
||||
aRecord.SetLength(mMessage->GetLength() - aOffset - sizeof(Dns::ResourceRecord));
|
||||
mMessage->Write(aOffset, aRecord);
|
||||
}
|
||||
|
||||
void Server::Response::IncResourceRecordCount(void)
|
||||
{
|
||||
switch (mSection)
|
||||
|
||||
@@ -412,7 +412,6 @@ private:
|
||||
Error AppendHostAddresses(AddrType aAddrType, const Ip6::Address *aAddrs, uint16_t aAddrsLength, uint32_t aTtl);
|
||||
Error AppendAaaaRecord(const Ip6::Address &aAddress, uint32_t aTtl);
|
||||
Error AppendARecord(const Ip6::Address &aAddress, uint32_t aTtl);
|
||||
void UpdateRecordLength(ResourceRecord &aRecord, uint16_t aOffset);
|
||||
void IncResourceRecordCount(void);
|
||||
void Send(const Ip6::MessageInfo &aMessageInfo);
|
||||
void Answer(const HostInfo &aHostInfo, const Ip6::MessageInfo &aMessageInfo);
|
||||
|
||||
+5
-16
@@ -463,17 +463,6 @@ void Core::UpdateCacheFlushFlagIn(ResourceRecord &aResourceRecord, Section aSect
|
||||
}
|
||||
}
|
||||
|
||||
void Core::UpdateRecordLengthInMessage(ResourceRecord &aRecord, Message &aMessage, uint16_t aOffset)
|
||||
{
|
||||
// Determines the records DATA length and updates it in a message.
|
||||
// Should be called immediately after all the fields in the
|
||||
// record are appended to the message. `aOffset` gives the offset
|
||||
// in the message to the start of the record.
|
||||
|
||||
aRecord.SetLength(aMessage.GetLength() - aOffset - sizeof(ResourceRecord));
|
||||
aMessage.Write(aOffset, aRecord);
|
||||
}
|
||||
|
||||
void Core::UpdateCompressOffset(uint16_t &aOffset, uint16_t aNewOffset)
|
||||
{
|
||||
if ((aOffset == kUnspecifiedOffset) && (aNewOffset != kUnspecifiedOffset))
|
||||
@@ -1484,7 +1473,7 @@ void Core::Entry::AppendNsecRecordTo(TxMessage &aTxMessage,
|
||||
|
||||
SuccessOrAssert(message.AppendBytes(&bitmap, bitmap.GetSize()));
|
||||
|
||||
UpdateRecordLengthInMessage(nsec, message, offset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(message, offset);
|
||||
aTxMessage.IncrementRecordCount(aSection);
|
||||
|
||||
mAppendedNsec = true;
|
||||
@@ -2981,7 +2970,7 @@ void Core::ServiceEntry::AppendSrvRecordTo(TxMessage &aTxMessage, Section aSecti
|
||||
offset = message->GetLength();
|
||||
SuccessOrAssert(message->Append(srv));
|
||||
AppendHostNameTo(aTxMessage, aSection);
|
||||
UpdateRecordLengthInMessage(srv, *message, offset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(*message, offset);
|
||||
|
||||
aTxMessage.IncrementRecordCount(aSection);
|
||||
|
||||
@@ -3046,7 +3035,7 @@ void Core::ServiceEntry::AppendPtrRecordTo(TxMessage &aTxMessage, Section aSecti
|
||||
offset = message->GetLength();
|
||||
SuccessOrAssert(message->Append(ptr));
|
||||
AppendServiceNameTo(aTxMessage, aSection);
|
||||
UpdateRecordLengthInMessage(ptr, *message, offset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(*message, offset);
|
||||
|
||||
aTxMessage.IncrementRecordCount(aSection);
|
||||
|
||||
@@ -3382,7 +3371,7 @@ void Core::ServiceType::AppendPtrRecordTo(TxMessage &aResponse, uint16_t aServic
|
||||
offset = message->GetLength();
|
||||
SuccessOrAssert(message->Append(ptr));
|
||||
aResponse.AppendServiceType(kAnswerSection, mServiceType.AsCString(), aServiceTypeOffset);
|
||||
UpdateRecordLengthInMessage(ptr, *message, offset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(*message, offset);
|
||||
|
||||
aResponse.IncrementRecordCount(kAnswerSection);
|
||||
|
||||
@@ -5945,7 +5934,7 @@ void Core::BrowseCache::AppendKnownAnswer(TxMessage &aTxMessage, const PtrEntry
|
||||
SuccessOrAssert(Name::AppendLabel(aPtrEntry.mServiceInstance.AsCString(), message));
|
||||
aTxMessage.AppendServiceType(kAnswerSection, mServiceType.AsCString(), mServiceTypeOffset);
|
||||
|
||||
UpdateRecordLengthInMessage(ptr, message, offset);
|
||||
ResourceRecord::UpdateRecordLengthInMessage(message, offset);
|
||||
|
||||
aTxMessage.IncrementRecordCount(kAnswerSection);
|
||||
}
|
||||
|
||||
@@ -2229,7 +2229,6 @@ private:
|
||||
static void UpdateCacheFlushFlagIn(ResourceRecord &aResourceRecord,
|
||||
Section aSection,
|
||||
bool aIsLegacyUnicast = false);
|
||||
static void UpdateRecordLengthInMessage(ResourceRecord &aRecord, Message &aMessage, uint16_t aOffset);
|
||||
static void UpdateCompressOffset(uint16_t &aOffset, uint16_t aNewOffse);
|
||||
static bool QuestionMatches(uint16_t aQuestionRrType, uint16_t aRrType);
|
||||
static bool RrClassIsInternetOrAny(uint16_t aRrClass);
|
||||
|
||||
@@ -1400,7 +1400,7 @@ Error Client::AppendServiceInstruction(Service &aService, MsgInfo &aInfo)
|
||||
SuccessOrExit(error = Dns::Name::AppendLabel(aService.GetInstanceName(), *aInfo.mMessage));
|
||||
SuccessOrExit(error = Dns::Name::AppendPointerLabel(serviceNameOffset, *aInfo.mMessage));
|
||||
|
||||
UpdateRecordLengthInMessage(rr, offset, *aInfo.mMessage);
|
||||
Dns::ResourceRecord::UpdateRecordLengthInMessage(*aInfo.mMessage, offset);
|
||||
aInfo.mRecordCount++;
|
||||
|
||||
if (aService.HasSubType() && !removing)
|
||||
@@ -1430,7 +1430,7 @@ Error Client::AppendServiceInstruction(Service &aService, MsgInfo &aInfo)
|
||||
SuccessOrExit(error = aInfo.mMessage->Append(rr));
|
||||
|
||||
SuccessOrExit(error = Dns::Name::AppendPointerLabel(instanceNameOffset, *aInfo.mMessage));
|
||||
UpdateRecordLengthInMessage(rr, offset, *aInfo.mMessage);
|
||||
Dns::ResourceRecord::UpdateRecordLengthInMessage(*aInfo.mMessage, offset);
|
||||
aInfo.mRecordCount++;
|
||||
}
|
||||
}
|
||||
@@ -1457,7 +1457,7 @@ Error Client::AppendServiceInstruction(Service &aService, MsgInfo &aInfo)
|
||||
offset = aInfo.mMessage->GetLength();
|
||||
SuccessOrExit(error = aInfo.mMessage->Append(srv));
|
||||
SuccessOrExit(error = AppendHostName(aInfo));
|
||||
UpdateRecordLengthInMessage(srv, offset, *aInfo.mMessage);
|
||||
Dns::ResourceRecord::UpdateRecordLengthInMessage(*aInfo.mMessage, offset);
|
||||
aInfo.mRecordCount++;
|
||||
|
||||
// TXT RR
|
||||
@@ -1468,7 +1468,7 @@ Error Client::AppendServiceInstruction(Service &aService, MsgInfo &aInfo)
|
||||
SuccessOrExit(error = aInfo.mMessage->Append(rr));
|
||||
SuccessOrExit(
|
||||
error = Dns::TxtEntry::AppendEntries(aService.GetTxtEntries(), aService.GetNumTxtEntries(), *aInfo.mMessage));
|
||||
UpdateRecordLengthInMessage(rr, offset, *aInfo.mMessage);
|
||||
Dns::ResourceRecord::UpdateRecordLengthInMessage(*aInfo.mMessage, offset);
|
||||
aInfo.mRecordCount++;
|
||||
|
||||
#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
|
||||
@@ -1733,24 +1733,12 @@ Error Client::AppendSignature(MsgInfo &aInfo)
|
||||
SuccessOrExit(error = aInfo.mMessage->Append(sig));
|
||||
SuccessOrExit(error = AppendHostName(aInfo));
|
||||
SuccessOrExit(error = aInfo.mMessage->Append(signature));
|
||||
UpdateRecordLengthInMessage(sig, offset, *aInfo.mMessage);
|
||||
Dns::ResourceRecord::UpdateRecordLengthInMessage(*aInfo.mMessage, offset);
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
void Client::UpdateRecordLengthInMessage(Dns::ResourceRecord &aRecord, uint16_t aOffset, Message &aMessage) const
|
||||
{
|
||||
// This method is used to calculate an RR DATA length and update
|
||||
// (rewrite) it in a message. This should be called immediately
|
||||
// after all the fields in the record are written in the message.
|
||||
// `aOffset` gives the offset in the message to the start of the
|
||||
// record.
|
||||
|
||||
aRecord.SetLength(aMessage.GetLength() - aOffset - sizeof(Dns::ResourceRecord));
|
||||
aMessage.Write(aOffset, aRecord);
|
||||
}
|
||||
|
||||
void Client::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
OT_UNUSED_VARIABLE(aMessageInfo);
|
||||
|
||||
@@ -1028,7 +1028,6 @@ private:
|
||||
Error AppendAaaaRecord(const Ip6::Address &aAddress, MsgInfo &aInfo) const;
|
||||
Error AppendUpdateLeaseOptRecord(MsgInfo &aInfo);
|
||||
Error AppendSignature(MsgInfo &aInfo);
|
||||
void UpdateRecordLengthInMessage(Dns::ResourceRecord &aRecord, uint16_t aOffset, Message &aMessage) const;
|
||||
void HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
|
||||
void ProcessResponse(Message &aMessage);
|
||||
bool IsResponseMessageIdValid(uint16_t aId) const;
|
||||
|
||||
Reference in New Issue
Block a user