diff --git a/src/core/instance/instance.cpp b/src/core/instance/instance.cpp index 4f6b28623..43527cd0b 100644 --- a/src/core/instance/instance.cpp +++ b/src/core/instance/instance.cpp @@ -44,11 +44,12 @@ namespace ot { #error "Exactly one of {OPENTHREAD_FTD, OPENTHREAD_MTD, OPENTHREAD_RADIO} MUST be set" #endif +// Size of `ot::Instance` in `uint64_t` unit (aligned). +constexpr size_t kInstanceSizeInUint64s = DivideAndRoundUp(sizeof(Instance), sizeof(uint64_t)); + #if !OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE - -// Define the raw storage used for OpenThread instance (in single-instance case). -OT_DEFINE_ALIGNED_VAR(gInstanceRaw, sizeof(Instance), uint64_t); - +// The raw storage used for OpenThread instance (in single-instance case) +uint64_t gInstanceRaw[kInstanceSizeInUint64s]; #endif #if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && OPENTHREAD_CONFIG_LOG_INSTANCE_AWARE_API_ENABLE @@ -58,11 +59,10 @@ Instance *gActiveInstance = nullptr; #if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE -#define INSTANCE_SIZE_ALIGNED OT_ALIGNED_VAR_SIZE(sizeof(ot::Instance), uint64_t) -#define MULTI_INSTANCE_SIZE (OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM * INSTANCE_SIZE_ALIGNED) +constexpr size_t kMultiInstanceSizeInUint64s = (Instance::kNumStaticInstances * kInstanceSizeInUint64s); // Define the raw storage used for OpenThread instance (in multi-instance case). -static uint64_t gMultiInstanceRaw[MULTI_INSTANCE_SIZE]; +static uint64_t gMultiInstanceRaw[kMultiInstanceSizeInUint64s]; #endif @@ -383,18 +383,19 @@ Instance &Instance::Get(void) } #else // #if !OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE + #if OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE Instance *Instance::InitMultiple(uint8_t aIdx) { size_t bufferSize; - uint64_t *instanceBuffer = gMultiInstanceRaw + aIdx * INSTANCE_SIZE_ALIGNED; + uint64_t *instanceBuffer = gMultiInstanceRaw + aIdx * kInstanceSizeInUint64s; Instance *instance = reinterpret_cast(instanceBuffer); - VerifyOrExit(aIdx < OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM); + VerifyOrExit(aIdx < kNumStaticInstances); VerifyOrExit(!instance->mIsInitialized); - bufferSize = (&gMultiInstanceRaw[MULTI_INSTANCE_SIZE] - instanceBuffer) * sizeof(uint64_t); + bufferSize = (&gMultiInstanceRaw[kMultiInstanceSizeInUint64s] - instanceBuffer) * sizeof(uint64_t); instance = Instance::Init(instanceBuffer, &bufferSize); exit: @@ -403,13 +404,13 @@ exit: Instance &Instance::Get(uint8_t aIdx) { - void *instance = gMultiInstanceRaw + aIdx * INSTANCE_SIZE_ALIGNED; + void *instance = gMultiInstanceRaw + aIdx * kInstanceSizeInUint64s; return *static_cast(instance); } uint8_t Instance::GetIdx(Instance *aInstance) { - return static_cast((reinterpret_cast(aInstance) - gMultiInstanceRaw) / INSTANCE_SIZE_ALIGNED); + return static_cast((reinterpret_cast(aInstance) - gMultiInstanceRaw) / kInstanceSizeInUint64s); } #endif // #if OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE @@ -420,8 +421,11 @@ Instance *Instance::Init(void *aBuffer, size_t *aBufferSize) VerifyOrExit(aBufferSize != nullptr); - // Make sure the input buffer is big enough - VerifyOrExit(sizeof(Instance) <= *aBufferSize, *aBufferSize = sizeof(Instance)); + if (sizeof(Instance) > *aBufferSize) + { + *aBufferSize = kInstanceSizeInUint64s * sizeof(uint64_t); + ExitNow(); + } VerifyOrExit(aBuffer != nullptr); diff --git a/src/core/instance/instance.hpp b/src/core/instance/instance.hpp index e459e7137..e66e10237 100644 --- a/src/core/instance/instance.hpp +++ b/src/core/instance/instance.hpp @@ -209,6 +209,11 @@ public: static Instance *Init(void *aBuffer, size_t *aBufferSize); #if OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE + /** + * Specifies number of static OpenThread instances. + */ + static constexpr uint16_t kNumStaticInstances = OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM; + /** * This static method initializes the OpenThread instance. *