diff --git a/src/core/common/data.hpp b/src/core/common/data.hpp index 1fb0078c2..c8e57daf9 100644 --- a/src/core/common/data.hpp +++ b/src/core/common/data.hpp @@ -145,6 +145,14 @@ public: */ LengthType GetLength(void) const { return mLength; } + /** + * This method sets the data length. + * + * @param[in] aLength The data length (number of bytes). + * + */ + void SetLength(LengthType aLength) { mLength = aLength; } + /** * This method copies the `Data` bytes to a given buffer. * @@ -153,7 +161,20 @@ public: * @param[out] aBuffer The buffer to copy the bytes into. * */ - void CopyBytesTo(uint8_t *aBuffer) const { memcpy(aBuffer, mBuffer, mLength); } + void CopyBytesTo(void *aBuffer) const { memcpy(aBuffer, mBuffer, mLength); } + + /** + * This method compares the `Data` content with the bytes from a given buffer. + * + * It is up to the caller to ensure that @p aBuffer has enough bytes to compare with the current data length. + * + * @param[in] aBuffer A pointer to a buffer to compare with the data. + * + * @retval TRUE The `Data` content matches the bytes in @p aBuffer. + * @retval FALSE The `Data` content does not match the byes in @p aBuffer. + * + */ + bool MatchesBytesIn(const void *aBuffer) const { return memcmp(mBuffer, aBuffer, mLength) == 0; } /** * This method overloads operator `==` to compare the `Data` content with the content from another one. @@ -166,7 +187,7 @@ public: */ bool operator==(const Data &aOtherData) const { - return (mLength == aOtherData.mLength) && (memcmp(mBuffer, aOtherData.mBuffer, mLength) == 0); + return (mLength == aOtherData.mLength) && MatchesBytesIn(aOtherData.mBuffer); } /** @@ -183,7 +204,7 @@ public: */ bool StartsWith(const Data &aOtherData) const { - return (mLength >= aOtherData.mLength) && (memcmp(mBuffer, aOtherData.mBuffer, aOtherData.mLength) == 0); + return (mLength >= aOtherData.mLength) && aOtherData.MatchesBytesIn(mBuffer); } private: diff --git a/src/core/common/message.cpp b/src/core/common/message.cpp index e69bf49e6..28c90f221 100644 --- a/src/core/common/message.cpp +++ b/src/core/common/message.cpp @@ -410,7 +410,7 @@ Error Message::AppendBytesFromMessage(const Message &aMessage, uint16_t aOffset, while (chunk.GetLength() > 0) { - WriteBytes(writeOffset, chunk.GetData(), chunk.GetLength()); + WriteBytes(writeOffset, chunk.GetBytes(), chunk.GetLength()); writeOffset += chunk.GetLength(); aMessage.GetNextChunk(aLength, chunk); } @@ -475,12 +475,12 @@ void Message::GetFirstChunk(uint16_t aOffset, uint16_t &aLength, Chunk &aChunk) { // This method gets the first message chunk (contiguous data // buffer) corresponding to a given offset and length. On exit - // `aChunk` is updated such that `aChunk.GetData()` gives the + // `aChunk` is updated such that `aChunk.GetBytes()` gives the // pointer to the start of chunk and `aChunk.GetLength()` gives // its length. The `aLength` is also decreased by the chunk // length. - VerifyOrExit(aOffset < GetLength(), aChunk.mLength = 0); + VerifyOrExit(aOffset < GetLength(), aChunk.SetLength(0)); if (aOffset + aLength >= GetLength()) { @@ -489,14 +489,13 @@ void Message::GetFirstChunk(uint16_t aOffset, uint16_t &aLength, Chunk &aChunk) aOffset += GetReserved(); - aChunk.mBuffer = this; + aChunk.SetBuffer(this); // Special case for the first buffer if (aOffset < kHeadBufferDataSize) { - aChunk.mData = GetFirstData() + aOffset; - aChunk.mLength = kHeadBufferDataSize - aOffset; + aChunk.Init(GetFirstData() + aOffset, kHeadBufferDataSize - aOffset); ExitNow(); } @@ -506,13 +505,13 @@ void Message::GetFirstChunk(uint16_t aOffset, uint16_t &aLength, Chunk &aChunk) while (true) { - aChunk.mBuffer = aChunk.mBuffer->GetNextBuffer(); - OT_ASSERT(aChunk.mBuffer != nullptr); + aChunk.SetBuffer(aChunk.GetBuffer()->GetNextBuffer()); + + OT_ASSERT(aChunk.GetBuffer() != nullptr); if (aOffset < kBufferDataSize) { - aChunk.mData = aChunk.mBuffer->GetData() + aOffset; - aChunk.mLength = kBufferDataSize - aOffset; + aChunk.Init(aChunk.GetBuffer()->GetData() + aOffset, kBufferDataSize - aOffset); ExitNow(); } @@ -520,12 +519,12 @@ void Message::GetFirstChunk(uint16_t aOffset, uint16_t &aLength, Chunk &aChunk) } exit: - if (aChunk.mLength > aLength) + if (aChunk.GetLength() > aLength) { - aChunk.mLength = aLength; + aChunk.SetLength(aLength); } - aLength -= aChunk.mLength; + aLength -= aChunk.GetLength(); } void Message::GetNextChunk(uint16_t &aLength, Chunk &aChunk) const @@ -536,20 +535,20 @@ void Message::GetNextChunk(uint16_t &aLength, Chunk &aChunk) const // is decreased by the chunk length. If there is no more // chunk, `aChunk.GetLength()` would be zero. - VerifyOrExit(aLength > 0, aChunk.mLength = 0); + VerifyOrExit(aLength > 0, aChunk.SetLength(0)); - aChunk.mBuffer = aChunk.mBuffer->GetNextBuffer(); - OT_ASSERT(aChunk.mBuffer != nullptr); + aChunk.SetBuffer(aChunk.GetBuffer()->GetNextBuffer()); - aChunk.mData = aChunk.mBuffer->GetData(); - aChunk.mLength = kBufferDataSize; + OT_ASSERT(aChunk.GetBuffer() != nullptr); - if (aChunk.mLength > aLength) + aChunk.Init(aChunk.GetBuffer()->GetData(), kBufferDataSize); + + if (aChunk.GetLength() > aLength) { - aChunk.mLength = aLength; + aChunk.SetLength(aLength); } - aLength -= aChunk.mLength; + aLength -= aChunk.GetLength(); exit: return; @@ -564,7 +563,7 @@ uint16_t Message::ReadBytes(uint16_t aOffset, void *aBuf, uint16_t aLength) cons while (chunk.GetLength() > 0) { - memcpy(bufPtr, chunk.GetData(), chunk.GetLength()); + chunk.CopyBytesTo(bufPtr); bufPtr += chunk.GetLength(); GetNextChunk(aLength, chunk); } @@ -587,7 +586,7 @@ bool Message::CompareBytes(uint16_t aOffset, const void *aBuf, uint16_t aLength) while (chunk.GetLength() > 0) { - VerifyOrExit(memcmp(bufPtr, chunk.GetData(), chunk.GetLength()) == 0); + VerifyOrExit(chunk.MatchesBytesIn(bufPtr)); bufPtr += chunk.GetLength(); bytesToCompare -= chunk.GetLength(); GetNextChunk(aLength, chunk); @@ -609,7 +608,7 @@ bool Message::CompareBytes(uint16_t aOffset, while (chunk.GetLength() > 0) { - VerifyOrExit(aOtherMessage.CompareBytes(aOtherOffset, chunk.GetData(), chunk.GetLength())); + VerifyOrExit(aOtherMessage.CompareBytes(aOtherOffset, chunk.GetBytes(), chunk.GetLength())); aOtherOffset += chunk.GetLength(); bytesToCompare -= chunk.GetLength(); GetNextChunk(aLength, chunk); @@ -622,7 +621,7 @@ exit: void Message::WriteBytes(uint16_t aOffset, const void *aBuf, uint16_t aLength) { const uint8_t *bufPtr = reinterpret_cast(aBuf); - WritableChunk chunk; + MutableChunk chunk; OT_ASSERT(aOffset + aLength <= GetLength()); @@ -630,7 +629,7 @@ void Message::WriteBytes(uint16_t aOffset, const void *aBuf, uint16_t aLength) while (chunk.GetLength() > 0) { - memmove(chunk.GetData(), bufPtr, chunk.GetLength()); + memmove(chunk.GetBytes(), bufPtr, chunk.GetLength()); bufPtr += chunk.GetLength(); GetNextChunk(aLength, chunk); } @@ -652,7 +651,7 @@ uint16_t Message::CopyTo(uint16_t aSourceOffset, uint16_t aDestinationOffset, ui while (chunk.GetLength() > 0) { - aMessage.WriteBytes(aDestinationOffset, chunk.GetData(), chunk.GetLength()); + aMessage.WriteBytes(aDestinationOffset, chunk.GetBytes(), chunk.GetLength()); aDestinationOffset += chunk.GetLength(); bytesCopied += chunk.GetLength(); GetNextChunk(aLength, chunk); diff --git a/src/core/common/message.hpp b/src/core/common/message.hpp index 5416a8ece..e9e419d4d 100644 --- a/src/core/common/message.hpp +++ b/src/core/common/message.hpp @@ -43,6 +43,7 @@ #include "common/code_utils.hpp" #include "common/const_cast.hpp" +#include "common/data.hpp" #include "common/encoding.hpp" #include "common/linked_list.hpp" #include "common/locator.hpp" @@ -1208,30 +1209,31 @@ protected: void SetReserved(uint16_t aReservedHeader) { GetMetadata().mReserved = aReservedHeader; } private: - struct Chunk + class Chunk : public Data { - const uint8_t *GetData(void) const { return mData; } - uint16_t GetLength(void) const { return mLength; } + public: + const Buffer *GetBuffer(void) const { return mBuffer; } + void SetBuffer(const Buffer *aBuffer) { mBuffer = aBuffer; } - const uint8_t *mData; // Pointer to start of chunk data buffer. - uint16_t mLength; // Length of chunk data (in bytes). - const Buffer * mBuffer; // Buffer containing the chunk + private: + const Buffer *mBuffer; // Buffer containing the chunk }; - struct WritableChunk : public Chunk + class MutableChunk : public Chunk { - uint8_t *GetData(void) const { return AsNonConst(mData); } + public: + uint8_t *GetBytes(void) { return AsNonConst(Chunk::GetBytes()); } }; - void GetFirstChunk(uint16_t aOffset, uint16_t &aLength, Chunk &chunk) const; + void GetFirstChunk(uint16_t aOffset, uint16_t &aLength, Chunk &aChunk) const; void GetNextChunk(uint16_t &aLength, Chunk &aChunk) const; - void GetFirstChunk(uint16_t aOffset, uint16_t &aLength, WritableChunk &aChunk) + void GetFirstChunk(uint16_t aOffset, uint16_t &aLength, MutableChunk &aChunk) { AsConst(this)->GetFirstChunk(aOffset, aLength, static_cast(aChunk)); } - void GetNextChunk(uint16_t &aLength, WritableChunk &aChunk) + void GetNextChunk(uint16_t &aLength, MutableChunk &aChunk) { AsConst(this)->GetNextChunk(aLength, static_cast(aChunk)); } diff --git a/src/core/crypto/hmac_sha256.cpp b/src/core/crypto/hmac_sha256.cpp index 4279e5ebb..e9a5f2e03 100644 --- a/src/core/crypto/hmac_sha256.cpp +++ b/src/core/crypto/hmac_sha256.cpp @@ -81,7 +81,7 @@ void HmacSha256::Update(const Message &aMessage, uint16_t aOffset, uint16_t aLen while (chunk.GetLength() > 0) { - Update(chunk.GetData(), chunk.GetLength()); + Update(chunk.GetBytes(), chunk.GetLength()); aMessage.GetNextChunk(aLength, chunk); } } diff --git a/src/core/crypto/sha256.cpp b/src/core/crypto/sha256.cpp index dce510183..59116d5c8 100644 --- a/src/core/crypto/sha256.cpp +++ b/src/core/crypto/sha256.cpp @@ -76,7 +76,7 @@ void Sha256::Update(const Message &aMessage, uint16_t aOffset, uint16_t aLength) while (chunk.GetLength() > 0) { - Update(chunk.GetData(), chunk.GetLength()); + Update(chunk.GetBytes(), chunk.GetLength()); aMessage.GetNextChunk(aLength, chunk); } } diff --git a/src/core/net/checksum.cpp b/src/core/net/checksum.cpp index 9f28db324..7c532ff4c 100644 --- a/src/core/net/checksum.cpp +++ b/src/core/net/checksum.cpp @@ -110,7 +110,7 @@ void Checksum::Calculate(const Ip6::Address &aSource, while (chunk.GetLength() > 0) { - AddData(chunk.GetData(), chunk.GetLength()); + AddData(chunk.GetBytes(), chunk.GetLength()); aMessage.GetNextChunk(length, chunk); } } diff --git a/tests/unit/test_data.cpp b/tests/unit/test_data.cpp index 6c896976a..d1c89488d 100644 --- a/tests/unit/test_data.cpp +++ b/tests/unit/test_data.cpp @@ -66,6 +66,7 @@ template void TestData(void) data.CopyBytesTo(buffer); VerifyOrQuit(memcmp(buffer, kData, sizeof(kData)) == 0); VerifyOrQuit(buffer[sizeof(kData)] == 0); + VerifyOrQuit(data.MatchesBytesIn(buffer)); data2.InitFrom(kDataCopy); VerifyOrQuit(data2.GetLength() == sizeof(kDataCopy)); @@ -74,7 +75,10 @@ template void TestData(void) VerifyOrQuit(data.StartsWith(data2)); VerifyOrQuit(data2.StartsWith(data)); - data2.Init(kDataCopy, sizeof(kDataCopy) - 1); + data2.SetLength(sizeof(kDataCopy) - 1); + VerifyOrQuit(data2.GetLength() == sizeof(kDataCopy) - 1); + VerifyOrQuit(data2.GetBytes() == &kDataCopy[0]); + VerifyOrQuit(data2.MatchesBytesIn(kDataCopy)); VerifyOrQuit(data != data2); VerifyOrQuit(data.StartsWith(data2)); VerifyOrQuit(!data2.StartsWith(data));