From 9c6b45c1dce97f60e946a1e5557d9725b86239ef Mon Sep 17 00:00:00 2001 From: Tom Rebbert <109624508+trebbert-lutron@users.noreply.github.com> Date: Tue, 11 Oct 2022 16:22:57 -0600 Subject: [PATCH] [meshcop] support a zero-length network name for backwards compatibility (#8241) Add a configuration option to support a zero-length network name within the OT stack. --- src/core/api/thread_api.cpp | 6 ++++++ src/core/config/misc.h | 10 ++++++++++ src/core/meshcop/meshcop_tlvs.cpp | 2 +- src/core/meshcop/network_name.cpp | 5 ++++- tests/unit/test_network_name.cpp | 5 ++--- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/core/api/thread_api.cpp b/src/core/api/thread_api.cpp index d5342d5cb..d31a205db 100644 --- a/src/core/api/thread_api.cpp +++ b/src/core/api/thread_api.cpp @@ -202,6 +202,12 @@ otError otThreadSetNetworkName(otInstance *aInstance, const char *aNetworkName) VerifyOrExit(AsCoreType(aInstance).Get().IsDisabled(), error = kErrorInvalidState); +#if !OPENTHREAD_CONFIG_ALLOW_EMPTY_NETWORK_NAME + // Thread interfaces support a zero length name internally for backwards compatibility, but new names + // must be at least one valid character long. + VerifyOrExit(nullptr != aNetworkName && aNetworkName[0] != '\0', error = kErrorInvalidArgs); +#endif + error = AsCoreType(aInstance).Get().SetNetworkName(aNetworkName); AsCoreType(aInstance).Get().Clear(); AsCoreType(aInstance).Get().Clear(); diff --git a/src/core/config/misc.h b/src/core/config/misc.h index f825a104a..01d217577 100644 --- a/src/core/config/misc.h +++ b/src/core/config/misc.h @@ -631,4 +631,14 @@ #define OPENTHREAD_CONFIG_NEIGHBOR_DISCOVERY_AGENT_ENABLE 0 #endif +/** + * @def OPENTHREAD_CONFIG_ALLOW_EMPTY_NETWORK_NAME + * + * Define as 1 to enable support for an empty network name (zero-length: "") + * + */ +#ifndef OPENTHREAD_CONFIG_ALLOW_EMPTY_NETWORK_NAME +#define OPENTHREAD_CONFIG_ALLOW_EMPTY_NETWORK_NAME 0 +#endif + #endif // CONFIG_MISC_H_ diff --git a/src/core/meshcop/meshcop_tlvs.cpp b/src/core/meshcop/meshcop_tlvs.cpp index ffd93b6b3..456cc1939 100644 --- a/src/core/meshcop/meshcop_tlvs.cpp +++ b/src/core/meshcop/meshcop_tlvs.cpp @@ -138,7 +138,7 @@ void NetworkNameTlv::SetNetworkName(const NameData &aNameData) bool NetworkNameTlv::IsValid(void) const { - return GetLength() >= 1 && IsValidUtf8String(mNetworkName, GetLength()); + return IsValidUtf8String(mNetworkName, GetLength()); } void SteeringDataTlv::CopyTo(SteeringData &aSteeringData) const diff --git a/src/core/meshcop/network_name.cpp b/src/core/meshcop/network_name.cpp index e4ae56211..8d23c962e 100644 --- a/src/core/meshcop/network_name.cpp +++ b/src/core/meshcop/network_name.cpp @@ -71,6 +71,9 @@ Error NetworkName::Set(const char *aNameString) // chars. The `+ 1` ensures that a `aNameString` with length // longer than `kMaxSize` is correctly rejected (returning error // `kErrorInvalidArgs`). + // Additionally, no minimum length is verified in order to ensure + // backwards compatibility with previous versions that allowed + // a zero-length name. Error error; NameData data(aNameString, kMaxSize + 1); @@ -89,7 +92,7 @@ Error NetworkName::Set(const NameData &aNameData) NameData data = aNameData; uint8_t newLen = static_cast(StringLength(data.GetBuffer(), data.GetLength())); - VerifyOrExit((0 < newLen) && (newLen <= kMaxSize), error = kErrorInvalidArgs); + VerifyOrExit(newLen <= kMaxSize, error = kErrorInvalidArgs); data.SetLength(newLen); diff --git a/tests/unit/test_network_name.cpp b/tests/unit/test_network_name.cpp index c1f448fe4..874efe181 100644 --- a/tests/unit/test_network_name.cpp +++ b/tests/unit/test_network_name.cpp @@ -72,7 +72,8 @@ void TestNetworkName(void) SuccessOrQuit(networkName.Set(MeshCoP::NameData(kName2, sizeof(kName2)))); CompareNetworkName(networkName, kName2); - VerifyOrQuit(networkName.Set(MeshCoP::NameData(kEmptyName, 0)) == kErrorInvalidArgs); + SuccessOrQuit(networkName.Set(MeshCoP::NameData(kEmptyName, 0))); + CompareNetworkName(networkName, kEmptyName); SuccessOrQuit(networkName.Set(MeshCoP::NameData(kLongName, sizeof(kLongName)))); CompareNetworkName(networkName, kLongName); @@ -80,8 +81,6 @@ void TestNetworkName(void) VerifyOrQuit(networkName.Set(MeshCoP::NameData(kLongName, sizeof(kLongName) - 1)) == kErrorAlready, "failed to detect duplicate"); - VerifyOrQuit(networkName.Set(kEmptyName) == kErrorInvalidArgs); - SuccessOrQuit(networkName.Set(MeshCoP::NameData(kName1, sizeof(kName1)))); VerifyOrQuit(networkName.Set(MeshCoP::NameData(kTooLongName, sizeof(kTooLongName))) == kErrorInvalidArgs,