From ad2c33c16c3ca332e295406a6320e1e6511f7a1a Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 16 Apr 2025 07:26:37 -0700 Subject: [PATCH] [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. --- src/core/net/dns_types.cpp | 9 +++++++++ src/core/net/dns_types.hpp | 12 ++++++++++++ src/core/net/dnssd_server.cpp | 16 ++-------------- src/core/net/dnssd_server.hpp | 1 - src/core/net/mdns.cpp | 21 +++++---------------- src/core/net/mdns.hpp | 1 - src/core/net/srp_client.cpp | 22 +++++----------------- src/core/net/srp_client.hpp | 1 - 8 files changed, 33 insertions(+), 50 deletions(-) diff --git a/src/core/net/dns_types.cpp b/src/core/net/dns_types.cpp index 6c037e27b..3f2fc3632 100644 --- a/src/core/net/dns_types.cpp +++ b/src/core/net/dns_types.cpp @@ -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; diff --git a/src/core/net/dns_types.hpp b/src/core/net/dns_types.hpp index 9055ffd94..54633854c 100644 --- a/src/core/net/dns_types.hpp +++ b/src/core/net/dns_types.hpp @@ -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. * diff --git a/src/core/net/dnssd_server.cpp b/src/core/net/dnssd_server.cpp index ff3176aa5..83cc54bbc 100644 --- a/src/core/net/dnssd_server.cpp +++ b/src/core/net/dnssd_server.cpp @@ -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) diff --git a/src/core/net/dnssd_server.hpp b/src/core/net/dnssd_server.hpp index d5e2daad2..f9eed8c0f 100644 --- a/src/core/net/dnssd_server.hpp +++ b/src/core/net/dnssd_server.hpp @@ -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); diff --git a/src/core/net/mdns.cpp b/src/core/net/mdns.cpp index c7993cdee..9248b5993 100644 --- a/src/core/net/mdns.cpp +++ b/src/core/net/mdns.cpp @@ -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); } diff --git a/src/core/net/mdns.hpp b/src/core/net/mdns.hpp index 64b626a37..663994460 100644 --- a/src/core/net/mdns.hpp +++ b/src/core/net/mdns.hpp @@ -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); diff --git a/src/core/net/srp_client.cpp b/src/core/net/srp_client.cpp index 121a29417..b9aba373b 100644 --- a/src/core/net/srp_client.cpp +++ b/src/core/net/srp_client.cpp @@ -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); diff --git a/src/core/net/srp_client.hpp b/src/core/net/srp_client.hpp index fd5a2b3e5..fd54fd6a3 100644 --- a/src/core/net/srp_client.hpp +++ b/src/core/net/srp_client.hpp @@ -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;