Skip to content

Commit

Permalink
[dns] add otDnsEncodeTxtData() API (openthread#9214)
Browse files Browse the repository at this point in the history
This commit adds the `otDnsEncodeTxtData()` public API, which encodes
a given list of TXT record entries (key/value pairs) into TXT data
(following the format specified by RFC 6763). The decoding of TXT
data was previously provided by the `otDnsGetNextTxtEntry()` API.
  • Loading branch information
abtink authored Jun 29, 2023
1 parent 9fd1da5 commit 77d1f3d
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 8 deletions.
18 changes: 18 additions & 0 deletions include/openthread/dns.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,24 @@ void otDnsInitTxtEntryIterator(otDnsTxtEntryIterator *aIterator, const uint8_t *
*/
otError otDnsGetNextTxtEntry(otDnsTxtEntryIterator *aIterator, otDnsTxtEntry *aEntry);

/**
* Encodes a given list of TXT record entries (key/value pairs) into TXT data (following format specified by RFC 6763).
*
* @param[in] aTxtEntries Pointer to an array of `otDnsTxtEntry`.
* @param[in] aNumTxtEntries Number of entries in @p aTxtEntries array.
* @param[out] aTxtData A pointer to a buffer to output the encoded TXT data.
* @param[in,out] aTxtDataLength On input, size of buffer @p aTxtData. On output, length of the encoded TXT data.
*
* @retval OT_ERROR_NONE Encoded TXT data successfully, @p aTxtData and @p aTxtDataLength are updated.
* @retval OT_ERROR_INVALID_ARGS The @p aTxtEntries is not valid.
* @retval OT_ERROR_NO_BUS Could not fit the encoded data in @p aTxtData buffer with its @p aTxtDataLength.
*
*/
otError otDnsEncodeTxtData(const otDnsTxtEntry *aTxtEntries,
uint16_t aNumTxtEntries,
uint8_t *aTxtData,
uint16_t *aTxtDataLength);

/**
* Enables/disables the "DNS name compression" mode.
*
Expand Down
2 changes: 1 addition & 1 deletion include/openthread/instance.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ extern "C" {
* @note This number versions both OpenThread platform and user APIs.
*
*/
#define OPENTHREAD_API_VERSION (335)
#define OPENTHREAD_API_VERSION (336)

/**
* @addtogroup api-instance
Expand Down
20 changes: 20 additions & 0 deletions src/core/api/dns_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,26 @@ otError otDnsGetNextTxtEntry(otDnsTxtEntryIterator *aIterator, otDnsTxtEntry *aE
return AsCoreType(aIterator).GetNextEntry(AsCoreType(aEntry));
}

otError otDnsEncodeTxtData(const otDnsTxtEntry *aTxtEntries,
uint8_t aNumTxtEntries,
uint8_t *aTxtData,
uint16_t *aTxtDataLength)
{
Error error;
MutableData<kWithUint16Length> data;

AssertPointerIsNotNull(aTxtEntries);
AssertPointerIsNotNull(aTxtData);
AssertPointerIsNotNull(aTxtDataLength);

data.Init(aTxtData, *aTxtDataLength);
SuccessOrExit(error = Dns::TxtEntry::AppendEntries(AsCoreTypePtr(aTxtEntries), aNumTxtEntries, data));
*aTxtDataLength = data.GetLength();

exit:
return error;
}

#if OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE
void otDnsSetNameCompressionEnabled(bool aEnabled) { Instance::SetDnsNameCompressionEnabled(aEnabled); }

Expand Down
8 changes: 4 additions & 4 deletions src/core/net/dns_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1037,14 +1037,14 @@ Error TxtEntry::AppendTo(Appender &aAppender) const
return error;
}

Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, Message &aMessage)
Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint16_t aNumEntries, Message &aMessage)
{
Appender appender(aMessage);

return AppendEntries(aEntries, aNumEntries, appender);
}

Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, MutableData<kWithUint16Length> &aData)
Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint16_t aNumEntries, MutableData<kWithUint16Length> &aData)
{
Error error;
Appender appender(aData.GetBytes(), aData.GetLength());
Expand All @@ -1056,11 +1056,11 @@ Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, Mut
return error;
}

Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, Appender &aAppender)
Error TxtEntry::AppendEntries(const TxtEntry *aEntries, uint16_t aNumEntries, Appender &aAppender)
{
Error error = kErrorNone;

for (uint8_t index = 0; index < aNumEntries; index++)
for (uint16_t index = 0; index < aNumEntries; index++)
{
SuccessOrExit(error = aEntries[index].AppendTo(aAppender));
}
Expand Down
6 changes: 3 additions & 3 deletions src/core/net/dns_types.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,7 @@ class TxtEntry : public otDnsTxtEntry
* @retval kErrorNoBufs Insufficient available buffers to grow the message.
*
*/
static Error AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, Message &aMessage);
static Error AppendEntries(const TxtEntry *aEntries, uint16_t aNumEntries, Message &aMessage);

/**
* Appends an array of `TxtEntry` items to a `MutableData` buffer.
Expand All @@ -1206,11 +1206,11 @@ class TxtEntry : public otDnsTxtEntry
* @retval kErrorNoBufs Insufficient available buffers.
*
*/
static Error AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, MutableData<kWithUint16Length> &aData);
static Error AppendEntries(const TxtEntry *aEntries, uint16_t aNumEntries, MutableData<kWithUint16Length> &aData);

private:
Error AppendTo(Appender &aAppender) const;
static Error AppendEntries(const TxtEntry *aEntries, uint8_t aNumEntries, Appender &aAppender);
static Error AppendEntries(const TxtEntry *aEntries, uint16_t aNumEntries, Appender &aAppender);

static constexpr uint8_t kMaxKeyValueEncodedSize = 255;
static constexpr char kKeyValueSeparator = '=';
Expand Down

0 comments on commit 77d1f3d

Please sign in to comment.