fix: add explicit route send failure results

This commit is contained in:
2026-04-23 18:06:02 +08:00
parent 22bc6a7fef
commit c1a0822227
2 changed files with 107 additions and 46 deletions
+68 -15
View File
@@ -12,6 +12,22 @@ typedef struct {
static route_slot_t g_route_slots[ROUTE_MSG_POOL_SIZE];
const char *route_send_result_to_str(route_send_result_t result)
{
switch (result) {
case ROUTE_SEND_OK:
return "ok";
case ROUTE_SEND_INVALID_INPUT:
return "invalid";
case ROUTE_SEND_POOL_EXHAUSTED:
return "pool";
case ROUTE_SEND_QUEUE_FULL:
return "queue";
default:
return "unknown";
}
}
void route_msg_init(void)
{
memset(g_route_slots, 0, sizeof(g_route_slots));
@@ -108,7 +124,7 @@ void route_msg_free_from_isr(route_msg_t *msg)
taskEXIT_CRITICAL_FROM_ISR(saved_interrupt_status);
}
static bool route_prepare(route_msg_t *msg,
static route_send_result_t route_prepare(route_msg_t *msg,
uint8_t src_id,
uint8_t dst_mask,
uint8_t conn_type,
@@ -116,7 +132,7 @@ static bool route_prepare(route_msg_t *msg,
uint16_t len)
{
if (msg == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) {
return false;
return ROUTE_SEND_INVALID_INPUT;
}
msg->src_id = src_id;
@@ -124,10 +140,21 @@ static bool route_prepare(route_msg_t *msg,
msg->conn_type = conn_type;
msg->len = len;
memcpy(msg->data, data, len);
return true;
return ROUTE_SEND_OK;
}
bool route_send(QueueHandle_t queue,
static route_send_result_t route_validate_args(QueueHandle_t queue,
const uint8_t *data,
uint16_t len)
{
if (queue == NULL || data == NULL || len == 0u || len > ROUTE_MSG_MAX_PAYLOAD) {
return ROUTE_SEND_INVALID_INPUT;
}
return ROUTE_SEND_OK;
}
route_send_result_t route_send(QueueHandle_t queue,
uint8_t src_id,
uint8_t dst_mask,
uint8_t conn_type,
@@ -135,22 +162,35 @@ bool route_send(QueueHandle_t queue,
uint16_t len,
TickType_t wait_ticks)
{
route_msg_t *msg = route_msg_alloc(wait_ticks);
route_send_result_t result;
route_msg_t *msg;
if (!route_prepare(msg, src_id, dst_mask, conn_type, data, len)) {
result = route_validate_args(queue, data, len);
if (result != ROUTE_SEND_OK) {
return result;
}
msg = route_msg_alloc(wait_ticks);
if (msg == NULL) {
return ROUTE_SEND_POOL_EXHAUSTED;
}
result = route_prepare(msg, src_id, dst_mask, conn_type, data, len);
if (result != ROUTE_SEND_OK) {
route_msg_free(msg);
return false;
return result;
}
if (xQueueSend(queue, &msg, wait_ticks) != pdPASS) {
route_msg_free(msg);
return false;
return ROUTE_SEND_QUEUE_FULL;
}
return true;
return ROUTE_SEND_OK;
}
bool route_send_from_isr(QueueHandle_t queue,
route_send_result_t route_send_from_isr(QueueHandle_t queue,
uint8_t src_id,
uint8_t dst_mask,
uint8_t conn_type,
@@ -158,17 +198,30 @@ bool route_send_from_isr(QueueHandle_t queue,
uint16_t len,
BaseType_t *xHigherPriorityTaskWoken)
{
route_msg_t *msg = route_msg_alloc_from_isr(xHigherPriorityTaskWoken);
route_send_result_t result;
route_msg_t *msg;
if (!route_prepare(msg, src_id, dst_mask, conn_type, data, len)) {
result = route_validate_args(queue, data, len);
if (result != ROUTE_SEND_OK) {
return result;
}
msg = route_msg_alloc_from_isr(xHigherPriorityTaskWoken);
if (msg == NULL) {
return ROUTE_SEND_POOL_EXHAUSTED;
}
result = route_prepare(msg, src_id, dst_mask, conn_type, data, len);
if (result != ROUTE_SEND_OK) {
route_msg_free_from_isr(msg);
return false;
return result;
}
if (xQueueSendFromISR(queue, &msg, xHigherPriorityTaskWoken) != pdPASS) {
route_msg_free_from_isr(msg);
return false;
return ROUTE_SEND_QUEUE_FULL;
}
return true;
return ROUTE_SEND_OK;
}
+10 -2
View File
@@ -29,6 +29,13 @@ typedef enum {
ROUTE_CONN_C2
} route_conn_type_t;
typedef enum {
ROUTE_SEND_OK = 0,
ROUTE_SEND_INVALID_INPUT,
ROUTE_SEND_POOL_EXHAUSTED,
ROUTE_SEND_QUEUE_FULL
} route_send_result_t;
typedef struct {
uint8_t src_id;
uint8_t dst_mask;
@@ -42,14 +49,15 @@ route_msg_t *route_msg_alloc(TickType_t wait_ticks);
route_msg_t *route_msg_alloc_from_isr(BaseType_t *xHigherPriorityTaskWoken);
void route_msg_free(route_msg_t *msg);
void route_msg_free_from_isr(route_msg_t *msg);
bool route_send(QueueHandle_t queue,
const char *route_send_result_to_str(route_send_result_t result);
route_send_result_t route_send(QueueHandle_t queue,
uint8_t src_id,
uint8_t dst_mask,
uint8_t conn_type,
const uint8_t *data,
uint16_t len,
TickType_t wait_ticks);
bool route_send_from_isr(QueueHandle_t queue,
route_send_result_t route_send_from_isr(QueueHandle_t queue,
uint8_t src_id,
uint8_t dst_mask,
uint8_t conn_type,