diff --git a/include/openthread/dataset.h b/include/openthread/dataset.h index 50b174a0e6fb..07477b48e821 100644 --- a/include/openthread/dataset.h +++ b/include/openthread/dataset.h @@ -310,6 +310,7 @@ typedef enum otMeshcopTlvType OT_MESHCOP_TLV_PERIOD = 55, ///< meshcop Period TLV OT_MESHCOP_TLV_SCAN_DURATION = 56, ///< meshcop Scan Duration TLV OT_MESHCOP_TLV_ENERGY_LIST = 57, ///< meshcop Energy List TLV + OT_MESHCOP_TLV_THREAD_DOMAIN_NAME = 59, ///< meshcop Thread Domain Name TLV OT_MESHCOP_TLV_DISCOVERYREQUEST = 128, ///< meshcop Discovery Request TLV OT_MESHCOP_TLV_DISCOVERYRESPONSE = 129, ///< meshcop Discovery Response TLV OT_MESHCOP_TLV_JOINERADVERTISEMENT = 241, ///< meshcop Joiner Advertisement TLV diff --git a/include/openthread/instance.h b/include/openthread/instance.h index 3d005568efa2..aef8c65cb95f 100644 --- a/include/openthread/instance.h +++ b/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (446) +#define OPENTHREAD_API_VERSION (447) /** * @addtogroup api-instance diff --git a/src/core/meshcop/meshcop_tlvs.hpp b/src/core/meshcop/meshcop_tlvs.hpp index 9d9b6f3a2a21..89429c88f3aa 100644 --- a/src/core/meshcop/meshcop_tlvs.hpp +++ b/src/core/meshcop/meshcop_tlvs.hpp @@ -111,6 +111,7 @@ class Tlv : public ot::Tlv kPeriod = OT_MESHCOP_TLV_PERIOD, ///< Period TLV kScanDuration = OT_MESHCOP_TLV_SCAN_DURATION, ///< Scan Duration TLV kEnergyList = OT_MESHCOP_TLV_ENERGY_LIST, ///< Energy List TLV + kThreadDomainName = OT_MESHCOP_TLV_THREAD_DOMAIN_NAME, ///< Thread Domain Name TLV kDiscoveryRequest = OT_MESHCOP_TLV_DISCOVERYREQUEST, ///< Discovery Request TLV kDiscoveryResponse = OT_MESHCOP_TLV_DISCOVERYRESPONSE, ///< Discovery Response TLV kJoinerAdvertisement = OT_MESHCOP_TLV_JOINERADVERTISEMENT, ///< Joiner Advertisement TLV @@ -122,11 +123,12 @@ class Tlv : public ot::Tlv */ static constexpr uint8_t kMaxProvisioningUrlLength = OT_PROVISIONING_URL_MAX_SIZE; - static constexpr uint8_t kMaxCommissionerIdLength = 64; ///< Max length of Commissioner ID TLV. - static constexpr uint8_t kMaxVendorNameLength = 32; ///< Max length of Vendor Name TLV. - static constexpr uint8_t kMaxVendorModelLength = 32; ///< Max length of Vendor Model TLV. - static constexpr uint8_t kMaxVendorSwVersionLength = 16; ///< Max length of Vendor SW Version TLV. - static constexpr uint8_t kMaxVendorDataLength = 64; ///< Max length of Vendor Data TLV. + static constexpr uint8_t kMaxCommissionerIdLength = 64; ///< Max length of Commissioner ID TLV. + static constexpr uint8_t kMaxVendorNameLength = 32; ///< Max length of Vendor Name TLV. + static constexpr uint8_t kMaxVendorModelLength = 32; ///< Max length of Vendor Model TLV. + static constexpr uint8_t kMaxVendorSwVersionLength = 16; ///< Max length of Vendor SW Version TLV. + static constexpr uint8_t kMaxVendorDataLength = 64; ///< Max length of Vendor Data TLV. + static constexpr uint8_t kMaxThreadDomainNameLength = 16; ///< Max length of Thread Domain Name TLV. /** * Returns the Type value. @@ -1039,6 +1041,11 @@ class UdpEncapsulationTlvHeader // Followed by the UDP Payload. } OT_TOOL_PACKED_END; +/** + * Implements Thread Domain Name TLV type. + */ +typedef StringTlvInfo ThreadDomainNameTlv; + /** * Implements Discovery Request TLV generation and parsing. * diff --git a/src/core/meshcop/network_name.cpp b/src/core/meshcop/network_name.cpp index ac07bec37598..172bd89991ca 100644 --- a/src/core/meshcop/network_name.cpp +++ b/src/core/meshcop/network_name.cpp @@ -34,6 +34,7 @@ #include "network_name.hpp" +#include "common/string.hpp" #include "instance/instance.hpp" namespace ot { @@ -158,6 +159,11 @@ Error NetworkNameManager::SetDomainName(const NameData &aNameData) return (error == kErrorAlready) ? kErrorNone : error; } + +bool NetworkNameManager::IsDefaultDomainNameSet() +{ + return StringMatch(mDomainName.GetAsCString(), NetworkName::kDomainNameInit); +} #endif // (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2) } // namespace MeshCoP diff --git a/src/core/meshcop/network_name.hpp b/src/core/meshcop/network_name.hpp index 3e1ad367401a..a872abfec4e1 100644 --- a/src/core/meshcop/network_name.hpp +++ b/src/core/meshcop/network_name.hpp @@ -108,7 +108,7 @@ class NetworkName : public otNetworkName, public Unequatable { public: static constexpr const char *kNetworkNameInit = "OpenThread"; - static constexpr const char *kDomainNameInit = "DefaultDomain"; + static constexpr const char *kDomainNameInit = "DefaultDomain"; // Section 5.22 Thread spec, MUST NOT change. /** * This constant specified the maximum number of chars in Network Name (excludes null char). @@ -260,6 +260,14 @@ class NetworkNameManager : public InstanceLocator, private NonCopyable * */ Error SetDomainName(const NameData &aNameData); + + /** + * Checks whether the Thread Domain Name is currently set to the default name. + * + * @returns true if Thread Domain Name equals "DefaultDomain", false otherwise. + */ + bool IsDefaultDomainNameSet(); + #endif // (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2) private: diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 3f83b090d409..988fa1841446 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -2758,6 +2758,14 @@ Error MleRouter::SendDiscoveryResponse(const Ip6::Address &aDestination, const M SuccessOrExit( error = Tlv::Append(*message, Get().GetJoinerUdpPort())); +#if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_4) + if (!Get().IsDefaultDomainNameSet()) + { + SuccessOrExit(error = Tlv::Append( + *message, Get().GetDomainName().GetAsCString())); + } +#endif + tlv.SetLength(static_cast(message->GetLength() - startOffset)); message->Write(startOffset - sizeof(tlv), tlv);