[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:
Abtin Keshavarzian
2025-04-16 08:26:37 -06:00
committed by GitHub
parent 247b353e16
commit ad2c33c16c
8 changed files with 33 additions and 50 deletions
+9
View File
@@ -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;
+12
View File
@@ -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.
*
+2 -14
View File
@@ -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)
-1
View File
@@ -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
View File
@@ -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);
}
-1
View File
@@ -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);
+5 -17
View File
@@ -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);
-1
View File
@@ -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;