Currently, `CONFIG_OPENTHREAD_LOG_LEVEL` is used to set log level in OT and register log modules in Zephyr. OpenThread allows 5 levels, causing issues when `OPENTHREAD_LOG_LEVEL_DEBG` is selected ad we are trying to register modules with unknown lvl. This commit adds `CONFIG_OPENTHREAD_MODULE_LOG_LEVEL` which is aligned for Zephyr's log levels. Signed-off-by: Maciej Baczmanski <maciej.baczmanski@nordicsemi.no>
69 lines
1.9 KiB
C
69 lines
1.9 KiB
C
/*
|
|
* Copyright (c) 2024 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/logging/log.h>
|
|
|
|
#include <openthread/platform/messagepool.h>
|
|
|
|
#define LOG_MODULE_NAME net_otPlat_messagepool
|
|
#define LOG_LEVEL CONFIG_OPENTHREAD_PLATFORM_LOG_LEVEL
|
|
|
|
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
|
|
|
|
#define BUF_TIMEOUT K_MSEC(50)
|
|
|
|
#define MESSAGE_POOL_SIZE \
|
|
(CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS * CONFIG_OPENTHREAD_MESSAGE_BUFFER_SIZE)
|
|
#define MAX_ALIGNMENT __alignof__(z_max_align_t)
|
|
|
|
BUILD_ASSERT(CONFIG_OPENTHREAD_MESSAGE_BUFFER_SIZE % MAX_ALIGNMENT == 0,
|
|
"Invalid message buffer size");
|
|
|
|
static struct k_mem_slab message_pool;
|
|
__aligned(MAX_ALIGNMENT) static uint8_t message_pool_buffer[MESSAGE_POOL_SIZE];
|
|
|
|
void otPlatMessagePoolInit(otInstance *aInstance, uint16_t aMinNumFreeBuffers, size_t aBufferSize)
|
|
{
|
|
ARG_UNUSED(aInstance);
|
|
|
|
__ASSERT(aBufferSize == CONFIG_OPENTHREAD_MESSAGE_BUFFER_SIZE,
|
|
"Message buffer size does not match configuration");
|
|
|
|
if (aMinNumFreeBuffers > CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS) {
|
|
LOG_WRN("Minimum number of free buffers (%d) is greater than number of allocated "
|
|
"buffers (%d)",
|
|
aMinNumFreeBuffers, CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS);
|
|
}
|
|
|
|
if (k_mem_slab_init(&message_pool, message_pool_buffer, aBufferSize,
|
|
CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS) != 0) {
|
|
__ASSERT(false, "Failed to initialize message pool");
|
|
}
|
|
}
|
|
|
|
otMessageBuffer *otPlatMessagePoolNew(otInstance *aInstance)
|
|
{
|
|
ARG_UNUSED(aInstance);
|
|
|
|
otMessageBuffer *buffer;
|
|
|
|
if (k_mem_slab_alloc(&message_pool, (void **)&buffer, BUF_TIMEOUT) != 0) {
|
|
LOG_ERR("Failed to allocate message buffer");
|
|
return NULL;
|
|
}
|
|
|
|
buffer->mNext = NULL;
|
|
return buffer;
|
|
}
|
|
|
|
void otPlatMessagePoolFree(otInstance *aInstance, otMessageBuffer *aBuffer)
|
|
{
|
|
ARG_UNUSED(aInstance);
|
|
|
|
k_mem_slab_free(&message_pool, (void *)aBuffer);
|
|
}
|