mirror of
https://github.com/espressif/openthread.git
synced 2026-06-05 21:14:49 +00:00
[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.
This commit is contained in:
@@ -202,6 +202,12 @@ otError otThreadSetNetworkName(otInstance *aInstance, const char *aNetworkName)
|
||||
|
||||
VerifyOrExit(AsCoreType(aInstance).Get<Mle::MleRouter>().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<MeshCoP::NetworkNameManager>().SetNetworkName(aNetworkName);
|
||||
AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Clear();
|
||||
AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Clear();
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<uint8_t>(StringLength(data.GetBuffer(), data.GetLength()));
|
||||
|
||||
VerifyOrExit((0 < newLen) && (newLen <= kMaxSize), error = kErrorInvalidArgs);
|
||||
VerifyOrExit(newLen <= kMaxSize, error = kErrorInvalidArgs);
|
||||
|
||||
data.SetLength(newLen);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user